runtime: use the call instruction's PC for panic-in-runtime detection
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 29 Jan 2019 00:49:23 +0000 (00:49 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 29 Jan 2019 00:49:23 +0000 (00:49 +0000)
    If a panic happens in the runtime we turn that into a fatal error.
    We use the caller's PC to determine if the panic call is inside
    the runtime. getcallerpc returns the PC immediately after the
    call instruction. If the call is the very last instruction of a
    function, it may not find this PC belong to a runtime function,
    giving false result. We need to back off the PC by 1 to the call
    instruction.

    The gc runtime doesn't do this because the gc compiler always
    emit an instruction following a panic call, presumably an UNDEF
    instruction which turns into an architecture-specific illegal
    instruction. Our compiler doesn't do this.

    Reviewed-on: https://go-review.googlesource.com/c/159437

From-SVN: r268358

gcc/go/gofrontend/MERGE
libgo/go/runtime/panic.go
libgo/runtime/go-runtime-error.c

index 4bdcf96c7b7969f78764b9e7fb252adbdfd620d7..0eff5eba6a82972b6808204aeb1b8ddf6aa648c2 100644 (file)
@@ -1,4 +1,4 @@
-5ccb2d8593963e06ec3a35d362b384e82301d9f0
+c2cac0ba0a92e74d5675c3c9f4e53d2567dbc903
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index bfd2f2d542bde520e648d14ce53a56fb08c54a9a..9b8ffb91859d7585e632ec9a0077eaeb167285d7 100644 (file)
@@ -53,7 +53,7 @@ var indexError = error(errorString("index out of range"))
 // entire runtime stack for easier debugging.
 
 func panicindex() {
-       name, _, _ := funcfileline(getcallerpc(), -1)
+       name, _, _ := funcfileline(getcallerpc()-1, -1)
        if hasPrefix(name, "runtime.") {
                throw(string(indexError.(errorString)))
        }
@@ -64,7 +64,7 @@ func panicindex() {
 var sliceError = error(errorString("slice bounds out of range"))
 
 func panicslice() {
-       name, _, _ := funcfileline(getcallerpc(), -1)
+       name, _, _ := funcfileline(getcallerpc()-1, -1)
        if hasPrefix(name, "runtime.") {
                throw(string(sliceError.(errorString)))
        }
index f1c16502d97d4c58dbd8b16c3ab7d2b215dd655b..5db355564dc83e57df8dd78dc67330bdcedc04f1 100644 (file)
@@ -63,7 +63,7 @@ __go_runtime_error (int32 i)
   struct funcfileline_return fileline;
   bool in_runtime;
 
-  fileline = runtime_funcfileline ((uintptr) runtime_getcallerpc(), 0);
+  fileline = runtime_funcfileline ((uintptr) runtime_getcallerpc()-1, 0);
   in_runtime = (fileline.retfn.len > 0
                && (__builtin_strncmp ((const char *) fileline.retfn.str,
                                      "runtime.", 8)