[libbacktrace] Declare external backtrace fns noinline
authorTom de Vries <tdevries@suse.de>
Fri, 8 Feb 2019 09:49:06 +0000 (09:49 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Fri, 8 Feb 2019 09:49:06 +0000 (09:49 +0000)
The backtrace functions backtrace_full, backtrace_print and backtrace_simple
walk the call stack, but make sure to skip the first entry, in order to skip
over the functions themselves, and start the backtrace at the caller of the
functions.

When compiling with -flto, the functions may be inlined, causing them to skip
over the caller instead.

Fix this by declaring the functions with __attribute__((noinline)).

2019-02-08  Tom de Vries  <tdevries@suse.de>

* backtrace.c (backtrace_full): Declare with __attribute__((noinline)).
* print.c (backtrace_print): Same.
* simple.c (backtrace_simple): Same.

From-SVN: r268668

libbacktrace/ChangeLog
libbacktrace/backtrace.c
libbacktrace/print.c
libbacktrace/simple.c

index 06fa109a675f2544c48257a03cf98ca6c2944e7d..e1f20074f22b14400e1e84cc31167eaed53a48c1 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-08  Tom de Vries  <tdevries@suse.de>
+
+       * backtrace.c (backtrace_full): Declare with __attribute__((noinline)).
+       * print.c (backtrace_print): Same.
+       * simple.c (backtrace_simple): Same.
+
 2019-02-08  Tom de Vries  <tdevries@suse.de>
 
        PR libbacktrace/78063
index 29204c633137ab6c3168d75a6cca64334ad4f29d..c579e8038252069a24da71325c258986d152e13b 100644 (file)
@@ -98,7 +98,7 @@ unwind (struct _Unwind_Context *context, void *vdata)
 
 /* Get a stack backtrace.  */
 
-int
+int __attribute__((noinline))
 backtrace_full (struct backtrace_state *state, int skip,
                backtrace_full_callback callback,
                backtrace_error_callback error_callback, void *data)
index b2f454464435eda21acb010831ec0861f302ae6c..0767facecaec779fe65d6a98c5d4546f333b0009 100644 (file)
@@ -80,7 +80,7 @@ error_callback (void *data, const char *msg, int errnum)
 
 /* Print a backtrace.  */
 
-void
+void __attribute__((noinline))
 backtrace_print (struct backtrace_state *state, int skip, FILE *f)
 {
   struct print_data data;
index d439fcee8e299ae91ff79b90d27507ba966b9c01..118936397da26e8940d285a8b92bde1c4efccdb4 100644 (file)
@@ -90,7 +90,7 @@ simple_unwind (struct _Unwind_Context *context, void *vdata)
 
 /* Get a simple stack backtrace.  */
 
-int
+int __attribute__((noinline))
 backtrace_simple (struct backtrace_state *state, int skip,
                  backtrace_simple_callback callback,
                  backtrace_error_callback error_callback, void *data)