Commit afedc99b by Ian Lance Taylor

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
parent 35e7db41
b4d61f028dd1623142df4130b6c660bb77474b7b ed8647cc99652db2d689215c05f31ad038438a7e
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -129,18 +129,26 @@ __go_get_backtrace_state () ...@@ -129,18 +129,26 @@ __go_get_backtrace_state ()
is the entry on the stack of inlined functions; -1 means the last is the entry on the stack of inlined functions; -1 means the last
one. */ one. */
_Bool static _Bool
__go_file_line (uintptr pc, int index, String *fn, String *file, intgo *line) __go_file_line (uintptr pc, int index, String *fn, String *file, intgo *line)
{ {
struct caller c; struct caller c;
struct backtrace_state *state;
runtime_memclr (&c, sizeof c); runtime_memclr (&c, sizeof c);
c.index = index; c.index = index;
backtrace_pcinfo (__go_get_backtrace_state (), pc, callback, state = __go_get_backtrace_state ();
error_callback, &c); backtrace_pcinfo (state, pc, callback, error_callback, &c);
*fn = c.fn; *fn = c.fn;
*file = c.file; *file = c.file;
*line = c.line; *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; return c.file.len > 0;
} }
......
...@@ -145,16 +145,17 @@ callback (void *data, uintptr_t pc, const char *filename, int lineno, ...@@ -145,16 +145,17 @@ callback (void *data, uintptr_t pc, const char *filename, int lineno,
/* Syminfo callback. */ /* Syminfo callback. */
static void void
syminfo_fnname_callback (void *data, uintptr_t pc __attribute__ ((unused)), __go_syminfo_fnname_callback (void *data,
const char *symname, uintptr_t pc __attribute__ ((unused)),
uintptr_t address __attribute__ ((unused)), const char *symname,
uintptr_t size __attribute__ ((unused))) uintptr_t address __attribute__ ((unused)),
uintptr_t size __attribute__ ((unused)))
{ {
Location* locptr = (Location*) data; String* strptr = (String*) data;
if (symname != NULL) if (symname != NULL)
locptr->function = runtime_gostringnocopy ((const byte *) symname); *strptr = runtime_gostringnocopy ((const byte *) symname);
} }
/* Error callback. */ /* Error callback. */
...@@ -228,8 +229,8 @@ runtime_callers (int32 skip, Location *locbuf, int32 m, bool keep_thunks) ...@@ -228,8 +229,8 @@ runtime_callers (int32 skip, Location *locbuf, int32 m, bool keep_thunks)
for (i = 0; i < data.index; ++i) for (i = 0; i < data.index; ++i)
{ {
if (locbuf[i].function.len == 0 && locbuf[i].pc != 0) if (locbuf[i].function.len == 0 && locbuf[i].pc != 0)
backtrace_syminfo (state, locbuf[i].pc, syminfo_fnname_callback, backtrace_syminfo (state, locbuf[i].pc, __go_syminfo_fnname_callback,
error_callback, &locbuf[i]); error_callback, &locbuf[i].function);
} }
return data.index; return data.index;
......
...@@ -456,7 +456,8 @@ extern uintptr runtime_stacks_sys; ...@@ -456,7 +456,8 @@ extern uintptr runtime_stacks_sys;
struct backtrace_state; struct backtrace_state;
extern struct backtrace_state *__go_get_backtrace_state(void); 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*) extern void runtime_main(void*)
__asm__(GOSYM_PREFIX "runtime.main"); __asm__(GOSYM_PREFIX "runtime.main");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment