On Fri, Feb 8, 2019 at 10:41 AM Tom de Vries <tdevr...@suse.de> wrote: > > Hi, > > 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)). > > OK for trunk?
OK. Richard. > Thanks, > - Tom > > [libbacktrace] Declare external backtrace fns noinline > > 2019-02-08 Tom de Vries <tdevr...@suse.de> > > * backtrace.c (backtrace_full): Declare with > __attribute__((noinline)). > * print.c (backtrace_print): Same. > * simple.c (backtrace_simple): Same. > > --- > libbacktrace/backtrace.c | 2 +- > libbacktrace/print.c | 2 +- > libbacktrace/simple.c | 2 +- > 3 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/libbacktrace/backtrace.c b/libbacktrace/backtrace.c > index 29204c63313..c579e803825 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 b2f45446443..0767facecae 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 d439fcee8e2..118936397da 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)