Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 12 Apr 2001 23:03:41 +0000 (23:03 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 12 Apr 2001 23:03:41 +0000 (23:03 +0000)
* sysdeps/i386/Makefile: Make sure gcc uses a frame pointer for
all the files which use CURRENT_STACK_FRAME.

linuxthreads/ChangeLog
linuxthreads/sysdeps/i386/Makefile
sysdeps/sparc/sparc64/dl-machine.h

index 3dfc5c7..d51bcd4 100644 (file)
@@ -1,5 +1,8 @@
 2001-04-12  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/i386/Makefile: Make sure gcc uses a frame pointer for
+       all the files which use CURRENT_STACK_FRAME.
+
        * sysdeps/i386/pt-machine.h (CURRENT_STACK_FRAME): Define using
        __builtin_frame_address.
        * sysdeps/i386/i686/pt-machine.h: Likewise.
index 811a799..854eacb 100644 (file)
@@ -2,4 +2,17 @@ ifeq ($(subdir),linuxthreads)
 # On i686 we must avoid generating the trampoline functions generated
 # to get the GOT pointer.
 CFLAGS-pt-initfini.s += -march=i386 -mcpu=i386
+
+# Most files must not be compiled without frame pointer since we need
+# the frame base address which is stored in %ebp unless the frame pointer
+# is optimized out.
+CFLAGS-cancel.c += -fno-omit-frame-pointer
+CFLAGS-condvar.c += -fno-omit-frame-pointer
+CFLAGS-join.c += -fno-omit-frame-pointer
+CFLAGS-manager.c += -fno-omit-frame-pointer
+CFLAGS-oldsemaphore.c += -fno-omit-frame-pointer
+CFLAGS-pthreads.c += -fno-omit-frame-pointer
+CFLAGS-ptlongjmp.c += -fno-omit-frame-pointer
+CFLAGS-semaphore.c += -fno-omit-frame-pointer
+CFLAGS-signals.c += -fno-omit-frame-pointer
 endif
index b4785c7..c420bbd 100644 (file)
@@ -49,19 +49,37 @@ elf_machine_dynamic (void)
 static inline Elf64_Addr
 elf_machine_load_address (void)
 {
-  register Elf64_Addr elf_pic_register __asm__("%l7");
-  Elf64_Addr pc, la;
-
-  /* Utilize the fact that a local .got entry will be partially
-     initialized at startup awaiting its RELATIVE fixup.  */
-
-  __asm("sethi %%hi(.Load_address), %1\n"
-       ".Load_address:\n\t"
-       "rd %%pc, %0\n\t"
-       "or %1, %%lo(.Load_address), %1\n\t"
-       : "=r"(pc), "=r"(la));
+  register Elf64_Addr *elf_pic_register __asm__("%l7");
 
-  return pc - *(Elf64_Addr *)(elf_pic_register + la);
+  /* We used to utilize the fact that a local .got entry will
+     be partially initialized at startup awaiting its RELATIVE
+     fixup:
+
+     Elf64_Addr pc, la;
+
+     __asm("sethi %%hi(.Load_address), %1\n"
+          ".Load_address:\n\t"
+          "rd %%pc, %0\n\t"
+          "or %1, %%lo(.Load_address), %1\n\t"
+          : "=r"(pc), "=r"(la));
+
+     return pc - *(Elf64_Addr *)(elf_pic_register + la);
+     
+     Unfortunately as binutils tries to work around Solaris
+     dynamic linker bug which resolves R_SPARC_RELATIVE as X += B + A
+     instead of X = B + A this does not work any longer, since ld
+     clears it.
+     
+     The following method relies on the fact that sparcv9 ABI maximal
+     page length is 1MB and all ELF segments on sparc64 are aligned
+     to 1MB.  Also, it relies on _DYNAMIC coming after _GLOBAL_OFFSET_TABLE_
+     and assumes that they both fit into the first 1MB of the RW segment.
+     This should be true for some time unless ld.so grows too much, at the
+     moment the whole stripped ld.so is 128KB and only smaller part of that
+     is in the RW segment.  */
+
+  return ((Elf64_Addr)elf_pic_register - *elf_pic_register + 0xfffff)
+        & ~0xfffffUL;
 }
 
 /* We have 4 cases to handle.  And we code different code sequences