Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 12 Apr 2003 20:32:01 +0000 (20:32 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 12 Apr 2003 20:32:01 +0000 (20:32 +0000)
2003-04-12  Ulrich Drepper  <drepper@redhat.com>

* sysdeps/x86_64/tls.h (THREAD_SETMEM): Word around compiler bug
which mishandles loading of global object addresses in PIC.
(THREAD_SETMEM_NC): Likewise.

nptl/Banner
nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
nptl/sysdeps/x86_64/tls.h
sysdeps/generic/dl-tls.c
sysdeps/unix/sysv/linux/kernel-features.h

index 288d93d..28d8ef6 100644 (file)
@@ -1 +1 @@
-NPTL 0.34 by Ulrich Drepper
+NPTL 0.35 by Ulrich Drepper
index d40118b..d6aa004 100644 (file)
@@ -1,3 +1,9 @@
+2003-04-12  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/x86_64/tls.h (THREAD_SETMEM): Word around compiler bug
+       which mishandles loading of global object addresses in PIC.
+       (THREAD_SETMEM_NC): Likewise.
+
 2003-04-11  Ulrich Drepper  <drepper@redhat.com>
 
        * pthread.h: Define new data structure for cleanup buffer.  Declare
index b7009d7..09a294b 100644 (file)
    cancellation state value is saved.  */
 # define EH_FRAME_0(name) \
     .byte 4;                                                                 \
-    .long L(PUSHSTATE)-name;                                                 \
+    .long L(PUSHSTATE)-L(name##START);                                       \
     .byte 14;                                                                \
     .uleb128 8;                                                                      \
     .byte 4;                                                                 \
    also to save the content of the %ebx register.  */
 # define EH_FRAME_3(name) \
     .byte 4;                                                                 \
-    .long L(PUSHBX1)-name;                                                   \
+    .long L(PUSHBX1)-L(name##START);                                         \
     .byte 14;                                                                \
     .uleb128 8;                                                                      \
     .byte 4;                                                                 \
 /* With four parameters the syscall wrappers have to save %ebx and %esi.  */
 # define EH_FRAME_4(name) \
     .byte 4;                                                                 \
-    .long L(PUSHSI1)-name;                                                   \
+    .long L(PUSHSI1)-L(name##START);                                         \
     .byte 14;                                                                \
     .uleb128 8;                                                                      \
     .byte 4;                                                                 \
    and %edi.  */
 # define EH_FRAME_5(name) \
     .byte 4;                                                                 \
-    .long L(PUSHDI1)-name;                                                   \
+    .long L(PUSHDI1)-L(name##START);                                         \
     .byte 14;                                                                \
     .uleb128 8;                                                                      \
     .byte 4;                                                                 \
index dec1b5d..975d20f 100644 (file)
@@ -204,6 +204,15 @@ typedef struct
      __value; })
 
 
+/* Loading addresses of objects on x86-64 needs to be treated special
+   when generating PIC code.  */
+#ifdef __pic__
+# define IMM_MODE "nr"
+#else
+# define IMM_MODE "ir"
+#endif
+
+
 /* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
 # define THREAD_SETMEM(descr, member, value) \
   ({ if (sizeof (descr->member) == 1)                                        \
@@ -212,7 +221,7 @@ typedef struct
                       "i" (offsetof (struct pthread, member)));              \
      else if (sizeof (descr->member) == 4)                                   \
        asm volatile ("movl %0,%%fs:%P1" :                                    \
-                    : "ir" (value),                                          \
+                    : IMM_MODE (value),                                      \
                       "i" (offsetof (struct pthread, member)));              \
      else                                                                    \
        {                                                                     \
@@ -222,7 +231,7 @@ typedef struct
           abort ();                                                          \
                                                                              \
         asm volatile ("movq %q0,%%fs:%P1" :                                  \
-                      : "ir" ((unsigned long int) value),                    \
+                      : IMM_MODE ((unsigned long int) value),                \
                         "i" (offsetof (struct pthread, member)));            \
        }})
 
@@ -236,7 +245,7 @@ typedef struct
                       "r" (idx));                                            \
      else if (sizeof (descr->member[0]) == 4)                                \
        asm volatile ("movl %0,%%fs:%P1(,%q2,4)" :                            \
-                    : "ir" (value),                                          \
+                    : IMM_MODE (value),                                      \
                       "i" (offsetof (struct pthread, member[0])),            \
                       "r" (idx));                                            \
      else                                                                    \
@@ -247,7 +256,7 @@ typedef struct
           abort ();                                                          \
                                                                              \
         asm volatile ("movq %q0,%%fs:%P1(,%q2,8)" :                          \
-                      : "r" ((unsigned long int) value),                     \
+                      : IMM_MODE ((unsigned long int) value),                \
                         "i" (offsetof (struct pthread, member[0])),          \
                         "r" (idx));                                          \
        }})
index 19cf0aa..746d9a2 100644 (file)
@@ -370,7 +370,7 @@ _dl_allocate_tls_init (void *result)
          assert (map->l_tls_modid == cnt);
          assert (map->l_tls_blocksize >= map->l_tls_initimage_size);
 # if TLS_TCB_AT_TP
-         assert (map->l_tls_offset >= map->l_tls_blocksize);
+         assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize);
          dest = (char *) result - map->l_tls_offset;
 # elif TLS_DTV_AT_TP
          dest = (char *) result + map->l_tls_offset;
index 168715e..56b68ff 100644 (file)
 # define __ASSUME_NETLINK_SUPPORT      1
 #endif
 
+/* For x86, support for the sysenter instruction was available in
+   2.5.53.  */
+#if __LINUX_KERNEL_VERSION >= 132405 && defined __i386__
+# define __ASSUME_VSYSCALL     1
+#endif