- Add port for boehm-gc garbage collector variant with malloc redirection.

This port will install only shared libraries with malloc redirection enabled,
  that will allow for easy dependency handling for ports that required libgc
  build with specific features and will allow to avoid hacks of building own
  version of libgc library.
This commit is contained in:
Stanislav Sedov 2009-12-18 04:07:24 +00:00
parent 0db1ed5e69
commit 006d834cf5
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=246110
9 changed files with 279 additions and 0 deletions

View file

@ -110,6 +110,7 @@
SUBDIR += bnfc
SUBDIR += boaconstructor
SUBDIR += boehm-gc
SUBDIR += boehm-gc-redirect
SUBDIR += bonobo
SUBDIR += bonobo-conf
SUBDIR += boost-all

View file

@ -0,0 +1,61 @@
# New ports collection makefile for: boehm-gc-redirect
# Date created: 12/17/2009
# Whom: stas
#
# $FreeBSD$
#
PORTNAME= boehm-gc
PORTVERSION= 7.1
CATEGORIES= devel
MASTER_SITES= http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/
PKGNAMESUFFIX= -${GC_VARIANT}
DISTNAME= gc-${PORTVERSION:S/.a/alpha/}
MAINTAINER= stas@FreeBSD.org
COMMENT= Garbage collection and memory leak detection for C and C++
RUN_DEPENDS= ${PREFIX}/include/gc/gc.h:${PORTSDIR}/devel/boehm-gc
GNU_CONFIGURE= yes
USE_GNOME= gnometarget
USE_LDCONFIG= yes
CONFIGURE_ARGS= --enable-cplusplus --disable-static --disable-threads \
--enable-redirect-malloc
CONFIGURE_ENV= CFLAGSS="${CFLAGS} LIBS="${LIBS}
MAKE_JOBS_UNSAFE= yes
INSTLIBS= cord gc gccpp
GC_VARIANT= redirect
SOVER= 1
OPTIONS= FULLDEBUG "Debugging support (see documentation)" off
PLIST_FILES= ${INSTLIBS:S,^,lib/lib,g:S,$,-${GC_VARIANT}.so.${SOVER},g} \
${INSTLIBS:S,^,lib/lib,g:S,$,-${GC_VARIANT}.so,g}
.include <bsd.port.pre.mk>
.if ${ARCH} == "ia64"
BROKEN= Does not compile on ia64
.endif
.if defined(WITH_FULLDEBUG)
CONFIGURE_ARGS+= --enable-gc-debug
PKGNAMESUFFIX:= ${PKGNAMESUFFIX}+fulldebug
.endif
post-patch:
${REINPLACE_CMD} -E -e 's,libgc\.la,libgc-${GC_VARIANT}.la,g' \
-e 's,libgccpp\.la,libgccpp-${GC_VARIANT}.la,g' \
-e 's,libcord\.la,libcord-${GC_VARIANT}.la,g' \
${WRKSRC}/Makefile.in
do-install:
.for LIB in ${INSTLIBS}
${INSTALL_DATA} ${WRKSRC}/.libs/lib${LIB}-${GC_VARIANT}.so.${SOVER} \
${PREFIX}/lib/lib${LIB}-${GC_VARIANT}.so.${SOVER}
@(cd ${PREFIX}/lib && ${LN} -s lib${LIB}-${GC_VARIANT}.so.${SOVER} \
lib${LIB}-${GC_VARIANT}.so)
.endfor
.include <bsd.port.post.mk>

View file

@ -0,0 +1,3 @@
MD5 (gc-7.1.tar.gz) = 2ff9924c7249ef7f736ecfe6f08f3f9b
SHA256 (gc-7.1.tar.gz) = e3cef6028fe3efe7de3bcf4107c880eae50b3ee79841450d885467c09bcebf30
SIZE (gc-7.1.tar.gz) = 1077714

View file

@ -0,0 +1,77 @@
--- dbg_mlc.c.orig 2009-10-20 00:34:39.000000000 +0400
+++ dbg_mlc.c 2009-10-20 00:41:22.000000000 +0400
@@ -456,10 +456,34 @@
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 @@
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 @@
}
#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);
}

View file

@ -0,0 +1,15 @@
--- dyn_load.c.orig Thu May 6 08:03:06 2004
+++ dyn_load.c Sun Oct 31 01:53:01 2004
@@ -97,6 +97,12 @@
# 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

View file

@ -0,0 +1,10 @@
--- include/gc.h.orig Wed Jun 4 17:07:33 2003
+++ include/gc.h Wed May 12 20:03:22 2004
@@ -487,6 +487,7 @@
/* 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

View file

@ -0,0 +1,63 @@
--- include/private/gcconfig.h.orig 2008-02-20 22:23:00.000000000 +0300
+++ include/private/gcconfig.h 2009-10-20 01:08:38.000000000 +0400
@@ -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
@@ -334,10 +334,26 @@
# 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
@@ -1771,6 +1787,16 @@
# 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[];
@@ -1800,6 +1826,7 @@
# define OS_TYPE "MSWINCE"
# define DATAEND /* not needed */
# endif
+
# ifdef LINUX
# define OS_TYPE "LINUX"
# define LINUX_STACKBOTTOM

View file

@ -0,0 +1,29 @@
--- os_dep.c.orig 2008-02-29 22:01:28.000000000 +0300
+++ os_dep.c 2009-10-20 00:48:39.000000000 +0400
@@ -816,7 +816,7 @@
|| 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 @@
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 @@
# 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. */

View file

@ -0,0 +1,20 @@
The Boehm-Weiser garbage collection package, for C and C++ -
garbage collection and memory leak detection libraries.
A garbage collector is something which automatically frees malloc'd
memory for you by working out what parts of memory your program
no longer has pointers to. As a result, garbage collectors can also
inform you of memory leaks (if they find memory they can free, it means
you have lost all of your pointers to it, but you didn't free it).
C programs may be linked against either of these, and should run (with
GC or leak detection) without change. C++ programs must include a header
to use garbage collection, though leak detection should work without
such source code modifications. See the man page and header files.
This package only brings Boehm-GC libraries with malloc redirection.
-- Mike McGaughey <mmcg@cs.monash.edu.au>
ps: garbage collection is addictive.
WWW: http://www.hpl.hp.com/personal/Hans_Boehm/gc/