From afedc99bd2e1f2c8b64e3deaf5ef4e1231a756af Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 22 Feb 2018 18:52:33 +0000 Subject: [PATCH] runtime: funcfileline: get missing function name from symbol table Copy the idea of https://golang.org/cl/92756 to funcfileline, which is used by runtime.FuncForPC, runtime.(*Frames).Next, and others. Reviewed-on: https://go-review.googlesource.com/96175 From-SVN: r257913 --- gcc/go/gofrontend/MERGE | 2 +- libgo/runtime/go-caller.c | 14 +++++++++++--- libgo/runtime/go-callers.c | 19 ++++++++++--------- libgo/runtime/runtime.h | 3 ++- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index f5d71f57d33..b708cb7c603 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -b4d61f028dd1623142df4130b6c660bb77474b7b +ed8647cc99652db2d689215c05f31ad038438a7e The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/runtime/go-caller.c b/libgo/runtime/go-caller.c index ee8abdc67fe..6b26ddccbcf 100644 --- a/libgo/runtime/go-caller.c +++ b/libgo/runtime/go-caller.c @@ -129,18 +129,26 @@ __go_get_backtrace_state () is the entry on the stack of inlined functions; -1 means the last one. */ -_Bool +static _Bool __go_file_line (uintptr pc, int index, String *fn, String *file, intgo *line) { struct caller c; + struct backtrace_state *state; runtime_memclr (&c, sizeof c); c.index = index; - backtrace_pcinfo (__go_get_backtrace_state (), pc, callback, - error_callback, &c); + state = __go_get_backtrace_state (); + backtrace_pcinfo (state, pc, callback, error_callback, &c); *fn = c.fn; *file = c.file; *line = c.line; + + // If backtrace_pcinfo didn't get the function name from the debug + // info, try to get it from the symbol table. + if (fn->len == 0) + backtrace_syminfo (state, pc, __go_syminfo_fnname_callback, + error_callback, fn); + return c.file.len > 0; } diff --git a/libgo/runtime/go-callers.c b/libgo/runtime/go-callers.c index 590315376e3..b16ae0c4036 100644 --- a/libgo/runtime/go-callers.c +++ b/libgo/runtime/go-callers.c @@ -145,16 +145,17 @@ callback (void *data, uintptr_t pc, const char *filename, int lineno, /* Syminfo callback. */ -static void -syminfo_fnname_callback (void *data, uintptr_t pc __attribute__ ((unused)), - const char *symname, - uintptr_t address __attribute__ ((unused)), - uintptr_t size __attribute__ ((unused))) +void +__go_syminfo_fnname_callback (void *data, + uintptr_t pc __attribute__ ((unused)), + const char *symname, + uintptr_t address __attribute__ ((unused)), + uintptr_t size __attribute__ ((unused))) { - Location* locptr = (Location*) data; + String* strptr = (String*) data; if (symname != NULL) - locptr->function = runtime_gostringnocopy ((const byte *) symname); + *strptr = runtime_gostringnocopy ((const byte *) symname); } /* Error callback. */ @@ -228,8 +229,8 @@ runtime_callers (int32 skip, Location *locbuf, int32 m, bool keep_thunks) for (i = 0; i < data.index; ++i) { if (locbuf[i].function.len == 0 && locbuf[i].pc != 0) - backtrace_syminfo (state, locbuf[i].pc, syminfo_fnname_callback, - error_callback, &locbuf[i]); + backtrace_syminfo (state, locbuf[i].pc, __go_syminfo_fnname_callback, + error_callback, &locbuf[i].function); } return data.index; diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h index 0fafe821441..0ffcf4bde9e 100644 --- a/libgo/runtime/runtime.h +++ b/libgo/runtime/runtime.h @@ -456,7 +456,8 @@ extern uintptr runtime_stacks_sys; struct backtrace_state; extern struct backtrace_state *__go_get_backtrace_state(void); -extern _Bool __go_file_line(uintptr, int, String*, String*, intgo *); +extern void __go_syminfo_fnname_callback(void*, uintptr_t, const char*, + uintptr_t, uintptr_t); extern void runtime_main(void*) __asm__(GOSYM_PREFIX "runtime.main"); -- 2.30.2