sal/osl/unx/backtrace.c | 2 +- sal/osl/unx/backtrace.h | 2 -- sal/osl/unx/diagnose.c | 42 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 38 insertions(+), 8 deletions(-)
New commits: commit 87451f66edfa425e51289ac6f12ee110d7109a02 Author: Damjan Jovanovic <dam...@apache.org> Date: Thu Nov 26 19:02:59 2015 +0000 Implement osl_diagnose_backtrace_Impl() on FreeBSD. Also fix the value of FRAME_PTR_OFFSET in both backtrace.c and diagnose.c - it's 3 because of the EBP/RBP register's position in the jmp_buf (https://github.com/freebsd/freebsd/blob/master/lib/libc/amd64/gen/_setjmp.S and https://github.com/freebsd/freebsd/blob/master/lib/libc/i386/gen/_setjmp.S). This gets backtracing to fully work on FreeBSD. Patch by: me diff --git a/sal/osl/unx/backtrace.c b/sal/osl/unx/backtrace.c index 2e57fb6..1b0b8a8 100644 --- a/sal/osl/unx/backtrace.c +++ b/sal/osl/unx/backtrace.c @@ -143,7 +143,7 @@ void backtrace_symbols_fd( void **buffer, int size, int fd ) #include <stdio.h> #include "backtrace.h" -#define FRAME_PTR_OFFSET 1 +#define FRAME_PTR_OFFSET 3 #define FRAME_OFFSET 0 int backtrace( void **buffer, int max_frames ) diff --git a/sal/osl/unx/diagnose.c b/sal/osl/unx/diagnose.c index b1bcb0d..0f05fbe 100644 --- a/sal/osl/unx/diagnose.c +++ b/sal/osl/unx/diagnose.c @@ -26,9 +26,9 @@ #ifndef HAVE_DLFCN_H -#if defined(LINUX) || defined(SOLARIS) +#if defined(LINUX) || defined(SOLARIS) || defined(FREEBSD) #define HAVE_DLFCN_H -#endif /* LINUX || SOLARIS */ +#endif /* LINUX || SOLARIS || FREEBSD */ #endif /* HAVE_DLFCN_H */ @@ -73,7 +73,7 @@ static void osl_diagnose_backtrace_Impl ( #define OSL_DIAGNOSE_OUTPUTMESSAGE(f, s) \ ((f != 0) ? (*(f))((s)) : (void)fprintf(stderr, "%s", (s))) -#if defined (LINUX) || defined (SOLARIS) +#if defined (LINUX) || defined (SOLARIS) || defined(FREEBSD) /************************************************************************/ /* osl_diagnose_frame_Impl */ /************************************************************************/ @@ -194,14 +194,46 @@ static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f) } } -#else /* (LINUX || SOLARIS) */ +#elif defined(FREEBSD) + +#include <setjmp.h> +#include "backtrace.h" /* for struct frame */ + +#if defined(X86) || defined(X86_64) + +#define FRAME_PTR_OFFSET 3 +#define FRAME_OFFSET 0 + +#endif /* (X86 || X86_64) */ + +static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f) +{ + struct frame * fp; + jmp_buf ctx; + int i; + + setjmp (ctx); + fp = (struct frame*)(((long*)(ctx))[FRAME_PTR_OFFSET]); + + for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++) + fp = fp->fr_savfp; + + for (i = 0; (fp != 0) && (fp->fr_savpc != 0); i++) + { + struct frame * prev = fp->fr_savfp; + osl_diagnose_frame_Impl (f, i, (void*)(fp->fr_savpc)); + fp = (prev > fp) ? prev : 0; + } +} + +#else /* (LINUX || SOLARIS || FREEBSD) */ static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f) { /* not yet implemented */ } -#endif /* (LINUX || SOLARIS) */ +#endif /* (LINUX || SOLARIS || FREEBSD) */ /************************************************************************/ /* osl_assertFailedLine */ commit 0faee39deac292694d036d753b7dc1c4513e045f Author: Damjan Jovanovic <dam...@apache.org> Date: Thu Nov 26 18:33:01 2015 +0000 Fix the stack frame layout for backtraces on FreeBSD. Patch by: me diff --git a/sal/osl/unx/backtrace.h b/sal/osl/unx/backtrace.h index 29bf3e0..a3667e6 100644 --- a/sal/osl/unx/backtrace.h +++ b/sal/osl/unx/backtrace.h @@ -37,8 +37,6 @@ void backtrace_symbols_fd( void **buffer, int size, int fd ); /* no frame.h on FreeBSD */ #if defined FREEBSD struct frame { - long arg0[8]; - long arg1[6]; struct frame *fr_savfp; long fr_savpc; }; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits