mirror of https://github.com/golang/go.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 <lazard@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
bb6309cd63
commit
2397cd0fbf
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue