aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2021-03-02 10:27:18 -0500
committerCherry Zhang <cherryyz@google.com>2021-03-05 23:13:20 +0000
commitfb03be9d5577a3d22834a25b3b62916aee30db2a (patch)
tree2405dd64192e0196ceb9d3417aeed35000149b49
parenta22bd3dc73bfcc9bf37cbd651933c54c82799c2a (diff)
downloadgo-fb03be9d5577a3d22834a25b3b62916aee30db2a.tar.gz
go-fb03be9d5577a3d22834a25b3b62916aee30db2a.zip
cmd/compile: use getcallersp for gorecover "fp" arg
Currently, the compiler synthesize a special ".fp" node, which points to the FP of the current frame, be to used to call gorecover. Later that node turns to an Arg in SSA that is not really an arg, causing problems for the new ABI work which changes the handling of Args, so we have to special-case that node. This CL changes the compiler to get the FP by using getcallersp, which is an intrinsic in SSA and works on all platforms. As we need the FP, not the caller SP, one drawback is that we have to add FixedFrameSize for LR machines. But it does allow us to remove that special node. Change-Id: Ie721d51efca8116c9d23cc4f79738fffcf847df8 Reviewed-on: https://go-review.googlesource.com/c/go/+/297930 Trust: Cherry Zhang <cherryyz@google.com> Reviewed-by: David Chase <drchase@google.com>
-rw-r--r--src/cmd/compile/internal/ir/name.go2
-rw-r--r--src/cmd/compile/internal/ssagen/pgen.go7
-rw-r--r--src/cmd/compile/internal/ssagen/ssa.go4
-rw-r--r--src/cmd/compile/internal/typecheck/builtin.go1
-rw-r--r--src/cmd/compile/internal/typecheck/builtin/runtime.go1
-rw-r--r--src/cmd/compile/internal/typecheck/universe.go5
-rw-r--r--src/cmd/compile/internal/walk/expr.go9
7 files changed, 11 insertions, 18 deletions
diff --git a/src/cmd/compile/internal/ir/name.go b/src/cmd/compile/internal/ir/name.go
index 035c9cd3d0..16c30324e5 100644
--- a/src/cmd/compile/internal/ir/name.go
+++ b/src/cmd/compile/internal/ir/name.go
@@ -509,5 +509,3 @@ func NewPkgName(pos src.XPos, sym *types.Sym, pkg *types.Pkg) *PkgName {
p.pos = pos
return p
}
-
-var RegFP *Name
diff --git a/src/cmd/compile/internal/ssagen/pgen.go b/src/cmd/compile/internal/ssagen/pgen.go
index 7e15f54299..d12e12947e 100644
--- a/src/cmd/compile/internal/ssagen/pgen.go
+++ b/src/cmd/compile/internal/ssagen/pgen.go
@@ -93,12 +93,7 @@ func (s *ssafn) AllocFrame(f *ssa.Func) {
for _, v := range b.Values {
if n, ok := v.Aux.(*ir.Name); ok {
switch n.Class {
- case ir.PPARAM, ir.PPARAMOUT:
- // Don't modify RegFP; it is a global.
- if n != ir.RegFP {
- n.SetUsed(true)
- }
- case ir.PAUTO:
+ case ir.PPARAM, ir.PPARAMOUT, ir.PAUTO:
n.SetUsed(true)
}
}
diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go
index 961cae419a..cc79c07af7 100644
--- a/src/cmd/compile/internal/ssagen/ssa.go
+++ b/src/cmd/compile/internal/ssagen/ssa.go
@@ -5176,10 +5176,6 @@ func (s *state) addr(n ir.Node) *ssa.Value {
if v != nil {
return v
}
- if n == ir.RegFP {
- // Special arg that points to the frame pointer (Used by ORECOVER).
- return s.entryNewValue2A(ssa.OpLocalAddr, t, n, s.sp, s.startmem)
- }
s.Fatalf("addr of undeclared ONAME %v. declared: %v", n, s.decladdrs)
return nil
case ir.PAUTO:
diff --git a/src/cmd/compile/internal/typecheck/builtin.go b/src/cmd/compile/internal/typecheck/builtin.go
index ddec26df59..3421c44588 100644
--- a/src/cmd/compile/internal/typecheck/builtin.go
+++ b/src/cmd/compile/internal/typecheck/builtin.go
@@ -178,6 +178,7 @@ var runtimeDecls = [...]struct {
{"uint32tofloat64", funcTag, 117},
{"complex128div", funcTag, 118},
{"getcallerpc", funcTag, 119},
+ {"getcallersp", funcTag, 119},
{"racefuncenter", funcTag, 31},
{"racefuncexit", funcTag, 9},
{"raceread", funcTag, 31},
diff --git a/src/cmd/compile/internal/typecheck/builtin/runtime.go b/src/cmd/compile/internal/typecheck/builtin/runtime.go
index 8575148b5b..614bd46177 100644
--- a/src/cmd/compile/internal/typecheck/builtin/runtime.go
+++ b/src/cmd/compile/internal/typecheck/builtin/runtime.go
@@ -226,6 +226,7 @@ func uint32tofloat64(uint32) float64
func complex128div(num complex128, den complex128) (quo complex128)
func getcallerpc() uintptr
+func getcallersp() uintptr
// race detection
func racefuncenter(uintptr)
diff --git a/src/cmd/compile/internal/typecheck/universe.go b/src/cmd/compile/internal/typecheck/universe.go
index c4c034184b..f04dcb671c 100644
--- a/src/cmd/compile/internal/typecheck/universe.go
+++ b/src/cmd/compile/internal/typecheck/universe.go
@@ -354,9 +354,4 @@ func DeclareUniverse() {
s1.Def = s.Def
s1.Block = s.Block
}
-
- ir.RegFP = NewName(Lookup(".fp"))
- ir.RegFP.SetType(types.Types[types.TINT32])
- ir.RegFP.Class = ir.PPARAM
- ir.RegFP.SetUsed(true)
}
diff --git a/src/cmd/compile/internal/walk/expr.go b/src/cmd/compile/internal/walk/expr.go
index 7b65db5100..1d90029298 100644
--- a/src/cmd/compile/internal/walk/expr.go
+++ b/src/cmd/compile/internal/walk/expr.go
@@ -158,7 +158,14 @@ func walkExpr1(n ir.Node, init *ir.Nodes) ir.Node {
case ir.ORECOVER:
n := n.(*ir.CallExpr)
- return mkcall("gorecover", n.Type(), init, typecheck.NodAddr(ir.RegFP))
+ // Call gorecover with the FP of this frame.
+ // FP is equal to caller's SP plus FixedFrameSize().
+ var fp ir.Node = mkcall("getcallersp", types.Types[types.TUINTPTR], init)
+ if off := base.Ctxt.FixedFrameSize(); off != 0 {
+ fp = ir.NewBinaryExpr(fp.Pos(), ir.OADD, fp, ir.NewInt(off))
+ }
+ fp = ir.NewConvExpr(fp.Pos(), ir.OCONVNOP, types.NewPtr(types.Types[types.TINT32]), fp)
+ return mkcall("gorecover", n.Type(), init, fp)
case ir.OCFUNC:
return n