From: David Lazar Date: Wed, 19 Apr 2017 16:57:52 +0000 (-0400) Subject: cmd/compile: don't inline functions that call runtime.getcaller{pc,sp} X-Git-Tag: go1.9beta1~571 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2397cd0fbfd5ede1a52575f5e6dfa4456e967cc4;p=gostls13.git cmd/compile: don't inline functions that call runtime.getcaller{pc,sp} runtime.getcaller{pc,sp} expect their argument to be a pointer to the caller's first function argument. This assumption breaks when the caller is inlined. For example, with -l=4, calls to runtime.entersyscall (which calls getcallerpc) are inlined and that breaks multiple cgo tests. This change modifies the compiler to refuse to inline functions that call runtime.getcaller{pc,sp}. Alternatively, we could mark these functions //go:noinline but that limits optimization opportunities if the calls to getcaller{pc,sp} are eliminated as dead code. Previously TestCgoPprofPIE, TestCgoPprof, and TestCgoCallbackGC failed with -l=4. Now all of the runtime tests pass with -l=4. Change-Id: I258bca9025e20fc451e673a18f862b5da1e07ae7 Reviewed-on: https://go-review.googlesource.com/40998 Run-TryBot: David Lazar TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky Reviewed-by: Austin Clements --- diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index c9d1a0c035..464b6e0e65 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -206,6 +206,16 @@ func ishairy(n *Node, budget *int32, reason *string) bool { *budget-- break } + // Functions that call runtime.getcaller{pc,sp} can not be inlined + // because getcaller{pc,sp} expect a pointer to the caller's first argument. + if n.Left.Op == ONAME && n.Left.Class == PFUNC && isRuntimePkg(n.Left.Sym.Pkg) { + fn := n.Left.Sym.Name + if fn == "getcallerpc" || fn == "getcallersp" { + *reason = "call to " + fn + return true + } + } + if fn := n.Left.Func; fn != nil && fn.Inl.Len() != 0 { *budget -= fn.InlCost break