runtime: use the call instruction's PC for panic-in-runtime detection

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
This commit is contained in:
Ian Lance Taylor 2019-01-29 00:49:23 +00:00
parent 45e7df858b
commit 053a1f2320
3 changed files with 4 additions and 4 deletions

View 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.

View 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)))
}

View 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)