summaryrefslogtreecommitdiff
path: root/lang/gauche/files/patch-gc__dbg_mlc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lang/gauche/files/patch-gc__dbg_mlc.c')
-rw-r--r--lang/gauche/files/patch-gc__dbg_mlc.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/lang/gauche/files/patch-gc__dbg_mlc.c b/lang/gauche/files/patch-gc__dbg_mlc.c
new file mode 100644
index 000000000000..12f08d7a68f7
--- /dev/null
+++ b/lang/gauche/files/patch-gc__dbg_mlc.c
@@ -0,0 +1,82 @@
+--- ./gc/dbg_mlc.c.orig Sat Mar 4 12:55:43 2006
++++ ./gc/dbg_mlc.c Tue May 9 14:38:56 2006
+@@ -477,6 +477,23 @@
+ 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
++
+ # ifdef __STDC__
+ GC_PTR GC_debug_malloc(size_t lb, GC_EXTRA_PARAMS)
+ # else
+@@ -491,6 +508,13 @@
+ {
+ GC_PTR 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_printf1("GC_debug_malloc(%ld) returning NIL (",
+ (unsigned long) lb);
+@@ -880,6 +904,13 @@
+ register size_t old_sz;
+ register 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_printf1(
+@@ -1188,7 +1219,11 @@
+ }
+
+ #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
+@@ -1196,12 +1231,12 @@
+ GC_PTR GC_debug_malloc_replacement(lb)
+ size_t lb;
+ {
+- return GC_debug_malloc(lb, RA "unknown", 0);
++ return GC_debug_malloc(lb, RA NULL, 0);
+ }
+
+ GC_PTR GC_debug_realloc_replacement(p, lb)
+ GC_PTR p;
+ size_t lb;
+ {
+- return GC_debug_realloc(p, lb, RA "unknown", 0);
++ return GC_debug_realloc(p, lb, RA NULL, 0);
+ }