From: Matthew Dempsky Date: Fri, 20 Oct 2017 21:20:48 +0000 (-0700) Subject: cmd/compile: prevent inlining go:yeswritebarrierrec functions X-Git-Tag: go1.10beta1~646 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4e64ee423c3a755ed31c3c98bfba98adc5995b4a;p=gostls13.git cmd/compile: prevent inlining go:yeswritebarrierrec functions Fixes #22342. Change-Id: Ic942162e98dce5749e381a31d58b0bf16c7d6f98 Reviewed-on: https://go-review.googlesource.com/72132 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index f172492128..5772ebe806 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -117,6 +117,15 @@ func caninl(fn *Node) { return } + // The nowritebarrierrec checker currently works at function + // granularity, so inlining yeswritebarrierrec functions can + // confuse it (#22342). As a workaround, disallow inlining + // them for now. + if fn.Func.Pragma&Yeswritebarrierrec != 0 { + reason = "marked go:yeswritebarrierrec" + return + } + // If fn has no body (is defined outside of Go), cannot inline it. if fn.Nbody.Len() == 0 { reason = "no function body"