]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
runtime: funcfileline: get missing function name from symbol table
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 22 Feb 2018 18:52:33 +0000 (18:52 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 22 Feb 2018 18:52:33 +0000 (18:52 +0000)
    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
libgo/runtime/go-caller.c
libgo/runtime/go-callers.c
libgo/runtime/runtime.h

index f5d71f57d3339d004a4aea8bd0590779a391d6af..b708cb7c603dee203160a5654e04e20a5c3817a5 100644 (file)
@@ -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.
index ee8abdc67feb453bfc8f6c16a8697c5d43711e56..6b26ddccbcf2e6bbe0942f1ce984d0302f2e72b7 100644 (file)
@@ -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;
 }
 
index 590315376e379acc6acabb7ad805cafdb3f6c916..b16ae0c40368c0a4af914e4e3f7b7beaaad08eae 100644 (file)
@@ -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;
index 0fafe82144189d743a5674f3ccdf05967fc9353f..0ffcf4bde9e92cb6e79ea17ae22e0d55ebb1dd3d 100644 (file)
@@ -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");