diff options
| author | Alan Donovan <adonovan@google.com> | 2024-05-09 18:16:59 -0400 |
|---|---|---|
| committer | Alan Donovan <adonovan@google.com> | 2024-05-15 17:29:46 +0000 |
| commit | bf0b605dfbc36b3555eef3315b15facca1c08bdb (patch) | |
| tree | 5cb241b240181f29d7a532a5c8b2fefaccaa4f9e /src/runtime/panic.go | |
| parent | 90b15211382ca10bd3256b17a6d9cc02da169d6a (diff) | |
| download | go-bf0b605dfbc36b3555eef3315b15facca1c08bdb.tar.xz | |
runtime: make convTstring write barrier unreachable from throw
CL 581215 changed 'throw' so that instead of print(s) it called
a more complicated function, printpanicval, that statically
appeared to have convTstring in its call graph, even though this
isn't dynamically reachable when called with a string argument.
However, this caused the link-time static callgraph test to point
out that throw (which is called in nowritebarrierrec contexts
such as markgc) reaches a write barrier.
The solution is to inline and specialize the printpanicval
function for strings; it reduces to printindented.
Thanks to mpratt for pointing out that the reachability
check is on the fully lowered code, and is thus sensitive
to optimizations such as inlining.
I added an explanatory comment on the line that generates
the error message to help future users confused as I was.
Fixes golang/go#67274
Change-Id: Ief110d554de365ce4c09509dceee000cbee30ad9
Reviewed-on: https://go-review.googlesource.com/c/go/+/584617
Reviewed-by: Than McIntosh <thanm@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/runtime/panic.go')
| -rw-r--r-- | src/runtime/panic.go | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 122fc30df2..ff9c64113f 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -1014,13 +1014,12 @@ func sync_fatal(s string) { // issue #67274, so as to fix longtest builders. // //go:nosplit -//go:noinline func throw(s string) { // Everything throw does should be recursively nosplit so it // can be called even when it's unsafe to grow the stack. systemstack(func() { print("fatal error: ") - printpanicval(s) + printindented(s) // logically printpanicval(s), but avoids convTstring write barrier print("\n") }) @@ -1041,7 +1040,7 @@ func fatal(s string) { // can be called even when it's unsafe to grow the stack. systemstack(func() { print("fatal error: ") - printpanicval(s) + printindented(s) // logically printpanicval(s), but avoids convTstring write barrier print("\n") }) |
