]> granicus.if.org Git - gc/commitdiff
FreeBSD New ports collection for boehm-gc v7.1 gc7_1-freebsd
authorMike McGaughey <mmcg@cs.monash.edu.au>
Sun, 21 Jul 2013 11:47:53 +0000 (15:47 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sun, 21 Jul 2013 11:47:53 +0000 (15:47 +0400)
(Imported from freebsd-ports/devel/boehm-gc)

* Makefile.in (pkgdatadir): Move to "doc" folder.
* configure (Configuration of machine-dependent code): Handle
sparc64-*-freebsd*.
* dbg_mlc.c (GC_caller_func_offset): New function (empty unless
FreeBSD).
* dbg_mlc.c (GC_debug_malloc, GC_debug_realloc): Invoke
GC_caller_func_offset if GC_ADD_CALLER.
* dbg_mlc.c (RA): Define to GC_RETURN_ADDR_PARENT (if the latter is
defined).
* dbg_mlc.c (GC_debug_malloc_replacement,
GC_debug_realloc_replacement): Pass NULL (instead of "unknown") to
GC_debug_malloc/realloc.
* doc/gc.man: Add "PORT INFORMATION".
* dyn_load.c (ElfW): Define for FreeBSD.
* include/private/gcconfig.h (X86_64, IA64, POWERPC, ARM32,
mach_type_known, ALIGNMENT, OS_TYPE, DYNAMIC_LOADING, HEURISTIC2,
etext, SEARCH_FOR_DATA_START): Likewise.
* os_dep.c (old_bus_act): Likewise.
* include/gc.h (GC_RETURN_ADDR_PARENT): New macro.
* os_dep.c (GC_set_and_save_fault_handler): Invoke sigaction(SIGBUS)
for FreeBSD.
* os_dep.c (AIM): Define before include machine/trap.h if FreeBSD/ppc.
* os_dep.c (CODE_OK): Define to test "code" against EXC_DSI (instead
of BUS_PAGE_FAULT) if FreeBSD/ppc.

Makefile.in
configure
dbg_mlc.c
doc/gc.man
dyn_load.c
include/gc.h
include/private/gcconfig.h
os_dep.c

index 1fd6164e91ac51a213d0383ebf56f7a92eb1960c..54b0b50d41c7585219112c1a9f8057b92c185d09 100644 (file)
@@ -75,7 +75,7 @@
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
 VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
+pkgdatadir = $(datadir)/doc/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 top_builddir = .
index 603b587b10fad10a651214475673a0c8aad9e02a..fd84b55b7d508c70e7d9f4f1aed80ef15bbfedd9 100755 (executable)
--- a/configure
+++ b/configure
@@ -6161,6 +6161,9 @@ _ACEOF
  sparc-*-netbsd*)
     machdep="mach_dep.lo sparc_netbsd_mach_dep.lo"
     ;;
+ sparc64-*-freebsd*)
+    machdep="mach_dep.lo sparc_mach_dep.lo"
+    ;;
  sparc-sun-solaris2.3)
     machdep="mach_dep.lo sparc_mach_dep.lo"
     cat >>confdefs.h <<\_ACEOF
index 4bb0e136d13a2eba7e0bb35efd150b42f69b74da..5ffcd9b7e99410d7e3dea423260fcf1b52f8259d 100644 (file)
--- a/dbg_mlc.c
+++ b/dbg_mlc.c
@@ -456,10 +456,34 @@ void GC_debug_register_displacement(size_t offset)
     GC_register_displacement((word)sizeof(oh) + offset);
 }
 
+#if defined(__FreeBSD__)
+#include <dlfcn.h>
+static void GC_caller_func_offset(ad, symp, offp)
+const GC_word ad;
+const char **symp;
+int *offp;
+{
+    Dl_info caller;
+    if (dladdr((const void *)ad, &caller) && caller.dli_sname != NULL) {
+      *symp = caller.dli_sname;
+      *offp = (const char *)ad - (const char *)caller.dli_saddr;
+    }
+}
+#else
+#define GC_caller_func(ad, symp, offp)
+#endif
+
 void * GC_debug_malloc(size_t lb, GC_EXTRA_PARAMS)
 {
     void * result = GC_malloc(lb + DEBUG_BYTES);
-    
+
+#ifdef GC_ADD_CALLER
+    if (s == NULL) {
+      GC_caller_func_offset(ra, &s, &i);
+      if (s == NULL)
+        s = "unknown";
+    }
+#endif
     if (result == 0) {
         GC_err_printf("GC_debug_malloc(%lu) returning NIL (",
                      (unsigned long) lb);
@@ -764,6 +788,13 @@ void * GC_debug_realloc(void * p, size_t lb, GC_EXTRA_PARAMS)
     size_t old_sz;
     hdr * hhdr;
     
+#ifdef GC_ADD_CALLER
+    if (s == NULL) {
+      GC_caller_func_offset(ra, &s, &i);
+      if (s == NULL)
+        s = "unknown";
+    }
+#endif
     if (p == 0) return(GC_debug_malloc(lb, OPT_RA s, i));
     if (base == 0) {
         GC_err_printf("Attempt to reallocate invalid pointer %p\n", p);
@@ -1041,17 +1072,21 @@ void GC_debug_register_finalizer_ignore_self
 }
 
 #ifdef GC_ADD_CALLER
-# define RA GC_RETURN_ADDR,
+# ifdef GC_RETURN_ADDR_PARENT
+#  define RA GC_RETURN_ADDR_PARENT,
+# else
+#  define RA GC_RETURN_ADDR,
+# endif
 #else
 # define RA
 #endif
 
 void * GC_debug_malloc_replacement(size_t lb)
 {
-    return GC_debug_malloc(lb, RA "unknown", 0);
+    return GC_debug_malloc(lb, RA NULL, 0);
 }
 
 void * GC_debug_realloc_replacement(void *p, size_t lb)
 {
-    return GC_debug_realloc(p, lb, RA "unknown", 0);
+    return GC_debug_realloc(p, lb, RA NULL, 0);
 }
index 2a550c71247e399ddbd36137a3aad57e9e915d7c..faef0052cfc81b1e56e2b30df397886e10ee6716 100644 (file)
@@ -11,7 +11,7 @@ void GC_free(void *ptr);
 void * GC_realloc(void *ptr, size_t size);
 .br
 .sp
-cc ... gc.a
+cc ... -lgc
 .LP
 .SH DESCRIPTION
 .I GC_malloc
@@ -82,6 +82,48 @@ This may temporarily write protect pages in the heap.  See the README file for m
 .LP
 Other facilities not discussed here include limited facilities to support incremental collection on machines without appropriate VM support, provisions for providing more explicit object layout information to the garbage collector, more direct support for ``weak'' pointers, support for ``abortable'' garbage collections during idle time, etc.
 .LP
+.SH "PORT INFORMATION"
+.LP
+In this (FreeBSD package) installation,
+.I gc.h
+and
+.I gc_cpp.h
+will probably be found in
+.I %%PREFIX%%/include,
+and the library in
+.I %%PREFIX%%/lib.
+.LP
+This library has been compiled as drop-in replacements
+for malloc and free (which is to say, all malloc
+calls will allocate garbage-collectable data).
+There is no need to include "gc.h" in your C files unless you want
+access to the debugging (and other) functions defined there,
+or unless you want to explicitly use
+.I GC_malloc_uncollectable
+for some allocations.
+Just link against them whenever you want either garbage
+collection or leak detection.
+.LP
+The C++ header file, "gc_cpp.h",
+.I is
+necessary for C++ programs, to obtain the appropriate
+definitions of the
+.I new
+and
+.I delete
+operators.
+The comments in both of these header files presently
+provide far better documentation
+for the package than this man page;
+look there for more information.
+.LP
+This library is compiled without (explicit) support
+for the experimental
+.I gc
+extension of
+.I g++.
+This may or may not make a difference.
+.LP
 .SH "SEE ALSO"
 The README and gc.h files in the distribution.  More detailed definitions of the functions exported by the collector are given there.  (The above list is not complete.)
 .LP
index 53469284553828910a39f008abcad31c0a139506..bb3b15db745cd9ade2bc8b41d3f295a1a9526c89 100644 (file)
@@ -105,6 +105,12 @@ static int (*GC_has_static_roots)(const char *, void *, size_t);
 #      else
 #        define ElfW(type) Elf64_##type
 #      endif
+#    elif defined(__FreeBSD__)
+#      if __ELF_WORD_SIZE == 32
+#        define ElfW(type) Elf32_##type
+#      else
+#        define ElfW(type) Elf64_##type
+#      endif
 #    else
 #      if !defined(ELF_CLASS) || ELF_CLASS == ELFCLASS32
 #        define ElfW(type) Elf32_##type
index 4d9285bf396ca8c05f6c3bb17bb7206b61897085..3cca0f3dd100cc8f61d22b7e1d2a158f62721e56 100644 (file)
@@ -505,6 +505,7 @@ GC_API void * GC_malloc_atomic_ignore_off_page(size_t lb);
     /* gcc knows how to retrieve return address, but we don't know */
     /* how to generate call stacks.                               */
 #   define GC_RETURN_ADDR (GC_word)__builtin_return_address(0)
+#   define GC_RETURN_ADDR_PARENT (GC_word)__builtin_return_address(1)
 # else
     /* Just pass 0 for gcc compatibility. */
 #   define GC_RETURN_ADDR 0
index a7128f148910d5af538a2298cab26a845baa064d..6d4766182ad334766d575b841b751b8745994bbe 100644 (file)
@@ -64,7 +64,7 @@
 /* Determine the machine type: */
 # if defined(__arm__) || defined(__thumb__)
 #    define ARM32
-#    if !defined(LINUX) && !defined(NETBSD)
+#    if !defined(LINUX) && !defined(NETBSD) && !defined(FREEBSD)
 #      define NOSYS
 #      define mach_type_known
 #    endif
 #    define X86_64
 #    define mach_type_known
 # endif
+# if defined(__FreeBSD__) && defined(__amd64__)
+#    define X86_64
+#    define mach_type_known
+# endif
+# if defined(__FreeBSD__) && defined(__ia64__)
+#    define IA64
+#    define mach_type_known
+# endif
 # if defined(FREEBSD) && defined(__sparc__)
 #    define SPARC
 #    define mach_type_known
 # endif
+# if defined(FREEBSD) && defined(__powerpc__)
+#    define POWERPC
+#    define mach_type_known
+# endif
+# if defined(FREEBSD) && defined(__arm__)
+#    define ARM32
+#    define mach_type_known
+# endif
 # if defined(bsdi) && (defined(i386) || defined(__i386__))
 #    define I386
 #    define BSDI
 #     define OS_TYPE "MSWINCE"
 #     define DATAEND /* not needed */
 #   endif
+#   ifdef FREEBSD
+#   define ALIGNMENT 4
+#       define OS_TYPE "FREEBSD"
+#       ifdef __ELF__
+#           define DYNAMIC_LOADING
+#       endif
+#      define HEURISTIC2
+       extern char etext[];
+#      define SEARCH_FOR_DATA_START
+#   endif
 #   ifdef NOSYS
       /* __data_start is usually defined in the target linker script.  */
       extern int __data_start[];
 #     define OS_TYPE "MSWINCE"
 #     define DATAEND /* not needed */
 #   endif
+                  
 #   ifdef LINUX
 #     define OS_TYPE "LINUX"
 #     define LINUX_STACKBOTTOM
index f40337565004d5068f9f92158c3f95d8eb2096ee..77acb85542cc364623da93ca455f1e2a41c4db93 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -816,7 +816,7 @@ ptr_t GC_get_main_stack_base(void)
     || defined(HURD) || defined(NETBSD)
        static struct sigaction old_segv_act;
 #      if defined(_sigargs) /* !Irix6.x */ || defined(HPUX) \
-       || defined(HURD) || defined(NETBSD)
+       || defined(HURD) || defined(NETBSD) || defined(FREEBSD)
            static struct sigaction old_bus_act;
 #      endif
 #   else
@@ -826,7 +826,7 @@ ptr_t GC_get_main_stack_base(void)
     void GC_set_and_save_fault_handler(handler h)
     {
 #      if defined(SUNOS5SIGS) || defined(IRIX5)  \
-        || defined(OSF1) || defined(HURD) || defined(NETBSD)
+        || defined(OSF1) || defined(HURD) || defined(NETBSD) || defined(FREEBSD)
          struct sigaction      act;
 
          act.sa_handler        = h;
@@ -846,7 +846,7 @@ ptr_t GC_get_main_stack_base(void)
 #        else
                (void) sigaction(SIGSEGV, &act, &old_segv_act);
 #              if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
-                  || defined(HPUX) || defined(HURD) || defined(NETBSD)
+                  || defined(HPUX) || defined(HURD) || defined(NETBSD) || defined(FREEBSD)
                    /* Under Irix 5.x or HP/UX, we may get SIGBUS.      */
                    /* Pthreads doesn't exist under Irix 5.x, so we     */
                    /* don't have to worry in the threads case.         */
@@ -2713,7 +2713,13 @@ GC_bool GC_old_segv_handler_used_si;
 #   include <errno.h>
 #   if defined(FREEBSD)
 #     define SIG_OK TRUE
-#     define CODE_OK (code == BUS_PAGE_FAULT)
+#     if defined(POWERPC)
+#      define AIM      /* Pretend that we're AIM. */
+#      include <machine/trap.h>
+#       define CODE_OK (code == EXC_DSI)
+#     else
+#       define CODE_OK (code == BUS_PAGE_FAULT)
+#     endif
 #   elif defined(OSF1)
 #     define SIG_OK (sig == SIGSEGV)
 #     define CODE_OK (code == 2 /* experimentally determined */)