re PR go/64999 (s390x libgo test failure in TestMemoryProfiler)
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 17 Apr 2015 19:29:28 +0000 (19:29 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 17 Apr 2015 19:29:28 +0000 (19:29 +0000)
PR go/64999
PR go/65180
runtime: Adjust libbacktrace PC value to what runtime.Callers expects.

From Lynn Boger.

From-SVN: r222196

libgo/runtime/go-callers.c

index 34a21188e3a89d4c21f4463aa3bc907991eb7314..b5ab3be6473e5f8a1b4680379af15943b69c44f6 100644 (file)
@@ -83,7 +83,20 @@ callback (void *data, uintptr_t pc, const char *filename, int lineno,
     }
 
   loc = &arg->locbuf[arg->index];
-  loc->pc = pc;
+
+  /* On the call to backtrace_full the pc value was most likely
+     decremented if there was a normal call, since the pc referred to
+     the instruction where the call returned and not the call itself.
+     This was done so that the line number referred to the call
+     instruction.  To make sure the actual pc from the call stack is
+     used, it is incremented here.
+
+     In the case of a signal, the pc was not decremented by
+     backtrace_full but still incremented here.  That doesn't really
+     hurt anything since the line number is right and the pc refers to
+     the same instruction.  */
+
+  loc->pc = pc + 1;
 
   /* The libbacktrace library says that these strings might disappear,
      but with the current implementation they won't.  We can't easily