+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
/* 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)
}
}
- * (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
# 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"
# 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 */)
/* 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)