]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR go/52583 (Several new go testsuite failues on Solaris)
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 13 Jun 2014 13:56:14 +0000 (13:56 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 13 Jun 2014 13:56:14 +0000 (13:56 +0000)
PR go/52583
runtime: Stop backtrace at a few recognized functions.

On x86_64 Solaris the makecontext function does not properly
indicate that it is at the top of the stack.  Attempting to
unwind the stack past a call to makecontext tends to crash.
This patch changes libgo to look for certain functions that
are always found at the top of the stack, and to stop
unwinding when it reaches one of those functions.  There is
never anything interesting past these functions--that is,
there is never any code written by the user.

From-SVN: r211640

libgo/runtime/go-callers.c

index ae411d9c83a7c1db74fd5b7e1d6dcfeb60848985..213686933d9c5adb2ae3ede364c840c05183bf9b 100644 (file)
@@ -93,6 +93,32 @@ callback (void *data, uintptr_t pc, const char *filename, int lineno,
 
   loc->lineno = lineno;
   ++arg->index;
+
+  /* There is no point to tracing past certain runtime functions.
+     Stopping the backtrace here can avoid problems on systems that
+     don't provide proper unwind information for makecontext, such as
+     Solaris (http://gcc.gnu.org/PR52583 comment #21).  */
+  if (function != NULL)
+    {
+      if (__builtin_strcmp (function, "makecontext") == 0)
+       return 1;
+      if (filename != NULL)
+       {
+         const char *p;
+
+         p = strrchr (filename, '/');
+         if (p == NULL)
+           p = filename;
+         if (__builtin_strcmp (p, "/proc.c") == 0)
+           {
+             if (__builtin_strcmp (function, "kickoff") == 0
+                 || __builtin_strcmp (function, "runtime_mstart") == 0
+                 || __builtin_strcmp (function, "runtime_main") == 0)
+               return 1;
+           }
+       }
+    }
+
   return arg->index >= arg->max;
 }