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

Reply via email to