aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2019-02-08 09:49:06 +0000
committerTom de Vries <vries@gcc.gnu.org>2019-02-08 09:49:06 +0000
commit4af50e13a035804b80551e4649cc2b055588ffc8 (patch)
treeb74316f8166f219c2fee18d534d8eb67b014e69c
parent2536d696a3fc101af0b731c10351777c4c0f0bc1 (diff)
downloadgcc-4af50e13a035804b80551e4649cc2b055588ffc8.zip
gcc-4af50e13a035804b80551e4649cc2b055588ffc8.tar.gz
gcc-4af50e13a035804b80551e4649cc2b055588ffc8.tar.bz2
[libbacktrace] Declare external backtrace fns noinline
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
-rw-r--r--libbacktrace/ChangeLog6
-rw-r--r--libbacktrace/backtrace.c2
-rw-r--r--libbacktrace/print.c2
-rw-r--r--libbacktrace/simple.c2
4 files changed, 9 insertions, 3 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog
index 06fa109..e1f2007 100644
--- a/libbacktrace/ChangeLog
+++ b/libbacktrace/ChangeLog
@@ -1,5 +1,11 @@
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
* dwarf.c (build_address_map): Keep all parsed units.
(read_referenced_name_from_attr): Handle DW_FORM_ref_addr.
diff --git a/libbacktrace/backtrace.c b/libbacktrace/backtrace.c
index 29204c6..c579e80 100644
--- a/libbacktrace/backtrace.c
+++ b/libbacktrace/backtrace.c
@@ -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)
diff --git a/libbacktrace/print.c b/libbacktrace/print.c
index b2f4544..0767fac 100644
--- a/libbacktrace/print.c
+++ b/libbacktrace/print.c
@@ -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;
diff --git a/libbacktrace/simple.c b/libbacktrace/simple.c
index d439fce..1189363 100644
--- a/libbacktrace/simple.c
+++ b/libbacktrace/simple.c
@@ -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)