OSDN Git Service

2005-04-17 David S. Miller <davem@davemloft.net>
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 17 Apr 2005 22:01:21 +0000 (22:01 +0000)
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 17 Apr 2005 22:01:21 +0000 (22:01 +0000)
* include/private/gcconfig.h (sparc-linux): Use LINUX_STACKBOTTOM.
* os_dep.c (GC_linux_stack_base): Check for bug present in some
Sparc glibc variants where __libc_stack_end is erroneously set
to "1".  Fallback to procfs code in that case.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98303 138bc75d-0d04-0410-961f-82ee72b054a4

boehm-gc/ChangeLog
boehm-gc/include/private/gcconfig.h
boehm-gc/os_dep.c

index bc73cc4..87ca45c 100644 (file)
@@ -1,3 +1,10 @@
+2005-04-17  David S. Miller  <davem@davemloft.net>
+
+       * include/private/gcconfig.h (sparc-linux): Use LINUX_STACKBOTTOM.
+       * os_dep.c (GC_linux_stack_base): Check for bug present in some
+       Sparc glibc variants where __libc_stack_end is erroneously set
+       to "1".  Fallback to procfs code in that case.
+
 2005-04-12  Mike Stump  <mrs@apple.com>
 
        * configure: Regenerate.
index 7f3b63e..a9ed717 100644 (file)
       extern ptr_t GC_SysVGetDataStart();
 #     ifdef __arch64__
 #      define DATASTART GC_SysVGetDataStart(0x100000, _etext)
-       /* libc_stack_end is not set reliably for sparc64 */
-#       define STACKBOTTOM ((ptr_t) 0x80000000000ULL)
 #     else
 #       define DATASTART GC_SysVGetDataStart(0x10000, _etext)
-#      define LINUX_STACKBOTTOM
 #     endif
+#     define LINUX_STACKBOTTOM
 #   endif
 #   ifdef OPENBSD
 #     define OS_TYPE "OPENBSD"
index 21d0563..30c2b8b 100644 (file)
@@ -945,8 +945,17 @@ ptr_t GC_get_stack_base()
          } /* Otherwise it's not safe to add 16 bytes and we fall      */
            /* back to using /proc.                                     */
 #      else 
+#      ifdef SPARC
+         /* Older versions of glibc for 64-bit Sparc do not set
+          * this variable correctly, it gets set to either zero
+          * or one.
+          */
+         if (__libc_stack_end != (ptr_t) (unsigned long)0x1)
+           return __libc_stack_end;
+#      else
          return __libc_stack_end;
 #      endif
+#      endif
       }
     f = open("/proc/self/stat", O_RDONLY);
     if (f < 0 || STAT_READ(f, stat_buf, STAT_BUF_SIZE) < 2 * STAT_SKIP) {