[go] cmd/compile: use getcallersp for gorecover "fp" arg

15 views
Skip to first unread message

Cherry Zhang (Gerrit)

unread,
Mar 5, 2021, 6:13:25 PM3/5/21
to goph...@pubsubhelper.golang.org, golang-...@googlegroups.com, David Chase, Go Bot, golang-co...@googlegroups.com

Cherry Zhang submitted this change.

View Change

Approvals: David Chase: Looks good to me, approved Cherry Zhang: Trusted
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 <cher...@google.com>
Reviewed-by: David Chase <drc...@google.com>
---
M src/cmd/compile/internal/ir/name.go
M src/cmd/compile/internal/ssagen/pgen.go
M src/cmd/compile/internal/ssagen/ssa.go
M src/cmd/compile/internal/typecheck/builtin.go
M src/cmd/compile/internal/typecheck/builtin/runtime.go
M src/cmd/compile/internal/typecheck/universe.go
M src/cmd/compile/internal/walk/expr.go
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 035c9cd..16c3032 100644
--- a/src/cmd/compile/internal/ir/name.go
+++ b/src/cmd/compile/internal/ir/name.go
@@ -509,5 +509,3 @@
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 7e15f54..d12e129 100644
--- a/src/cmd/compile/internal/ssagen/pgen.go
+++ b/src/cmd/compile/internal/ssagen/pgen.go
@@ -93,12 +93,7 @@
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 961cae4..cc79c07 100644
--- a/src/cmd/compile/internal/ssagen/ssa.go
+++ b/src/cmd/compile/internal/ssagen/ssa.go
@@ -5176,10 +5176,6 @@
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 ddec26d..3421c44 100644
--- a/src/cmd/compile/internal/typecheck/builtin.go
+++ b/src/cmd/compile/internal/typecheck/builtin.go
@@ -178,6 +178,7 @@
{"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 8575148..614bd46 100644
--- a/src/cmd/compile/internal/typecheck/builtin/runtime.go
+++ b/src/cmd/compile/internal/typecheck/builtin/runtime.go
@@ -226,6 +226,7 @@
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 c4c0341..f04dcb6 100644
--- a/src/cmd/compile/internal/typecheck/universe.go
+++ b/src/cmd/compile/internal/typecheck/universe.go
@@ -354,9 +354,4 @@
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 7b65db5..1d90029 100644
--- a/src/cmd/compile/internal/walk/expr.go
+++ b/src/cmd/compile/internal/walk/expr.go
@@ -158,7 +158,14 @@

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

2 is the latest approved patch-set. The change was submitted with unreviewed changes in the following files: The name of the file: src/cmd/compile/internal/walk/expr.go Insertions: 2, Deletions: 0. ``` @@ +160:162 @@ + // Call gorecover with the FP of this frame. + // FP is equal to caller's SP plus FixedFrameSize(). ```

To view, visit change 297930. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: go
Gerrit-Branch: master
Gerrit-Change-Id: Ie721d51efca8116c9d23cc4f79738fffcf847df8
Gerrit-Change-Number: 297930
Gerrit-PatchSet: 5
Gerrit-Owner: Cherry Zhang <cher...@google.com>
Gerrit-Reviewer: Cherry Zhang <cher...@google.com>
Gerrit-Reviewer: David Chase <drc...@google.com>
Gerrit-Reviewer: Go Bot <go...@golang.org>
Gerrit-MessageType: merged
Reply all
Reply to author
Forward
0 new messages