]> granicus.if.org Git - gc/commitdiff
2010-09-11 Ivan Maidanski <ivmai@mail.ru>
authorivmai <ivmai>
Sat, 11 Sep 2010 10:38:25 +0000 (10:38 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 26 Jul 2011 17:06:54 +0000 (21:06 +0400)
* dyn_load.c (DL_ITERATE_PHDR_STRONG): New macro (define for
FreeBSD).
* dyn_load.c (GC_register_main_static_data): Move the definition
above GC_register_dynamic_libraries_dl_iterate_phdr one (FreeBSD
case); unconditionally return FALSE if DL_ITERATE_PHDR_STRONG.
* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr): Test
GC_register_main_static_data() result (instead of direct testing
of dl_iterate_phdr (to prevent a compiler warning).
* os_dep.c (CODE_OK): Test si_code also for the value of 2
(FreeBSD case; required for FreeBSD v7+).
* os_dep.c (CODE_OK): Properly use parentheses (HPUX case).
* include/private/gcconfig.h (DATASTART): Cast etext argument in
GC_FreeBSDGetDataStart() call; remove unnecessary "&" (FreeBSD
case).

ChangeLog
dyn_load.c
include/private/gcconfig.h
os_dep.c

index 85b95b57c1a7b08a5be2e2d30c7b40dfa292d2e0..5eb7bdc5fd0f062a83ecb64b5103fa97fed0ee5b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2010-09-11  Ivan Maidanski <ivmai@mail.ru>
+
+       * dyn_load.c (DL_ITERATE_PHDR_STRONG): New macro (define for
+       FreeBSD).
+       * dyn_load.c (GC_register_main_static_data): Move the definition
+       above GC_register_dynamic_libraries_dl_iterate_phdr one (FreeBSD
+       case); unconditionally return FALSE if DL_ITERATE_PHDR_STRONG.
+       * dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr): Test
+       GC_register_main_static_data() result (instead of direct testing
+       of dl_iterate_phdr (to prevent a compiler warning).
+       * os_dep.c (CODE_OK): Test si_code also for the value of 2
+       (FreeBSD case; required for FreeBSD v7+).
+       * os_dep.c (CODE_OK): Properly use parentheses (HPUX case).
+       * include/private/gcconfig.h (DATASTART): Cast etext argument in
+       GC_FreeBSDGetDataStart() call; remove unnecessary "&" (FreeBSD
+       case).
+
 2010-09-09  Ivan Maidanski <ivmai@mail.ru> (with input from Ludovic Courtes)
 
        * include/private/specific.h (quick_thread_id): Define thru
index eab59ffa244dbd28f0bd2919240e7545dd9fa0c0..8893d3464abfae311a9f2a79a95f7632411d608e 100644 (file)
@@ -399,6 +399,7 @@ GC_INNER GC_bool GC_register_main_static_data(void)
 /* On the FreeBSD system, any target system at major version 7 shall    */
 /* have dl_iterate_phdr; therefore, we need not make it weak as above.  */
 #define HAVE_DL_ITERATE_PHDR
+#define DL_ITERATE_PHDR_STRONG
 #endif
 
 #if defined(HAVE_DL_ITERATE_PHDR)
@@ -508,59 +509,65 @@ STATIC int GC_register_dynlib_callback(struct dl_phdr_info * info,
     }
   }
 
-  * (int *)ptr = 1;     /* Signal that we were called */
+  *(int *)ptr = 1;     /* Signal that we were called */
   return 0;
 }
 
-/* Return TRUE if we succeed, FALSE if dl_iterate_phdr wasn't there. */
+/* Do we need to separately register the main static data segment? */
+GC_INNER GC_bool GC_register_main_static_data(void)
+{
+# ifdef DL_ITERATE_PHDR_STRONG
+    /* If dl_iterate_phdr is not a weak symbol then don't test against  */
+    /* zero (otherwise a compiler might issue a warning).               */
+    return FALSE;
+# else
+    return (dl_iterate_phdr == 0);
+# endif
+}
 
+/* Return TRUE if we succeed, FALSE if dl_iterate_phdr wasn't there. */
 STATIC GC_bool GC_register_dynamic_libraries_dl_iterate_phdr(void)
 {
-  if (dl_iterate_phdr) {
-    int did_something = 0;
+  int did_something;
+  if (GC_register_main_static_data())
+    return FALSE;
 
+# ifdef PT_GNU_RELRO
+    {
+      static GC_bool excluded_segs = FALSE;
+      n_load_segs = 0;
+      if (!excluded_segs) {
+        GC_exclude_static_roots_inner((ptr_t)load_segs,
+                                      (ptr_t)load_segs + sizeof(load_segs));
+        excluded_segs = TRUE;
+      }
+    }
+# endif
+
+  did_something = 0;
+  dl_iterate_phdr(GC_register_dynlib_callback, &did_something);
+  if (did_something) {
 #   ifdef PT_GNU_RELRO
-        static GC_bool excluded_segs = FALSE;
-        n_load_segs = 0;
-        if (!excluded_segs) {
-          GC_exclude_static_roots_inner((ptr_t)load_segs,
-                                        (ptr_t)load_segs + sizeof(load_segs));
-          excluded_segs = TRUE;
-        }
-#   endif
-    dl_iterate_phdr(GC_register_dynlib_callback, &did_something);
-    if (did_something) {
-#     ifdef PT_GNU_RELRO
-        size_t i;
+      size_t i;
 
-        for (i = 0; i < n_load_segs; ++i) {
-          if (load_segs[i].end > load_segs[i].start) {
-            GC_add_roots_inner(load_segs[i].start, load_segs[i].end, TRUE);
-          }
-          if (load_segs[i].end2 > load_segs[i].start2) {
-            GC_add_roots_inner(load_segs[i].start2, load_segs[i].end2, TRUE);
-          }
+      for (i = 0; i < n_load_segs; ++i) {
+        if (load_segs[i].end > load_segs[i].start) {
+          GC_add_roots_inner(load_segs[i].start, load_segs[i].end, TRUE);
         }
-#     endif
-    } else {
-        /* dl_iterate_phdr may forget the static data segment in        */
-        /* statically linked executables.                               */
-        GC_add_roots_inner(DATASTART, (char *)(DATAEND), TRUE);
-#       if defined(DATASTART2)
-          GC_add_roots_inner(DATASTART2, (char *)(DATAEND2), TRUE);
-#       endif
-    }
-
-    return TRUE;
+        if (load_segs[i].end2 > load_segs[i].start2) {
+          GC_add_roots_inner(load_segs[i].start2, load_segs[i].end2, TRUE);
+        }
+      }
+#   endif
   } else {
-    return FALSE;
+      /* dl_iterate_phdr may forget the static data segment in  */
+      /* statically linked executables.                         */
+      GC_add_roots_inner(DATASTART, (char *)(DATAEND), TRUE);
+#     if defined(DATASTART2)
+        GC_add_roots_inner(DATASTART2, (char *)(DATAEND2), TRUE);
+#     endif
   }
-}
-
-/* Do we need to separately register the main static data segment? */
-GC_INNER GC_bool GC_register_main_static_data(void)
-{
-  return (dl_iterate_phdr == 0);
+  return TRUE;
 }
 
 #define HAVE_REGISTER_MAIN_STATIC_DATA
index ac60774bef88fbd285cda09e1d5085357b518837..b21912fd431f2d251696e3162fded37e5b533cdd 100644 (file)
 #           define DYNAMIC_LOADING
 #       endif
         extern char etext[];
-        ptr_t GC_FreeBSDGetDataStart(size_t max_page_size, ptr_t etext_addr);
-#       define DATASTART GC_FreeBSDGetDataStart(0x1000, &etext)
+        ptr_t GC_FreeBSDGetDataStart(size_t, ptr_t);
+#       define DATASTART GC_FreeBSDGetDataStart(0x1000, (ptr_t)etext)
 #   endif
 #   ifdef NETBSD
 #     define ALIGNMENT 4
 #           define DYNAMIC_LOADING
 #       endif
         extern char etext[];
-        ptr_t GC_FreeBSDGetDataStart(size_t max_page_size, ptr_t etext_addr);
-#       define DATASTART GC_FreeBSDGetDataStart(0x1000, &etext)
+        ptr_t GC_FreeBSDGetDataStart(size_t, ptr_t);
+#       define DATASTART GC_FreeBSDGetDataStart(0x1000, (ptr_t)etext)
 #   endif
 #   ifdef NETBSD
 #       define OS_TYPE "NETBSD"
index b5a3b36a3bf25973db84cbc8af31d86528a9d58d..eec623c482925c22aec50febff2e22320aab366a 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -3013,7 +3013,8 @@ GC_INNER void GC_remove_protection(struct hblk *h, word nblocks,
 #   include <errno.h>
 #   if defined(FREEBSD)
 #     define SIG_OK TRUE
-#     define CODE_OK (si -> si_code == BUS_PAGE_FAULT)
+#     define CODE_OK (si -> si_code == BUS_PAGE_FAULT \
+                      || si -> si_code == 2 /* experimentally determined */)
 #   elif defined(OSF1)
 #     define SIG_OK (sig == SIGSEGV)
 #     define CODE_OK (si -> si_code == 2 /* experimentally determined */)
@@ -3031,11 +3032,11 @@ GC_INNER void GC_remove_protection(struct hblk *h, word nblocks,
         /* architectures.                                               */
 #   elif defined(HPUX)
 #     define SIG_OK (sig == SIGSEGV || sig == SIGBUS)
-#     define CODE_OK (si -> si_code == SEGV_ACCERR) \
-                     || (si -> si_code == BUS_ADRERR) \
-                     || (si -> si_code == BUS_UNKNOWN) \
-                     || (si -> si_code == SEGV_UNKNOWN) \
-                     || (si -> si_code == BUS_OBJERR)
+#     define CODE_OK (si -> si_code == SEGV_ACCERR \
+                      || si -> si_code == BUS_ADRERR \
+                      || si -> si_code == BUS_UNKNOWN \
+                      || si -> si_code == SEGV_UNKNOWN \
+                      || si -> si_code == BUS_OBJERR)
 #   elif defined(SUNOS5SIGS)
 #     define SIG_OK (sig == SIGSEGV)
 #     define CODE_OK (si -> si_code == SEGV_ACCERR)