summaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/pass.go
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2020-08-28 17:10:32 +0000
committerKeith Randall <khr@golang.org>2020-08-31 17:36:08 +0000
commit9e70564f639252aade60369b51a121f3325e9d6c (patch)
tree61ada3ce0f0d3bed08f9f1014bd271ea980df516 /src/cmd/internal/obj/pass.go
parentba0fab3cb731fe9a383bd61c3480cccfe32bb1f4 (diff)
downloadgo-git-9e70564f639252aade60369b51a121f3325e9d6c.tar.gz
cmd/compile,cmd/asm: simplify recording of branch targets, take 2
We currently use two fields to store the targets of branches. Some phases use p.To.Val, some use p.Pcond. Rewrite so that every branch instruction uses p.To.Val. p.From.Val is also used in rare instances. Introduce a Pool link for use by arm/arm64, instead of repurposing Pcond. This is a cleanup CL in preparation for some stack frame CLs. Change-Id: If8239177e4b1ea2bccd0608eb39553d23210d405 Reviewed-on: https://go-review.googlesource.com/c/go/+/251437 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/internal/obj/pass.go')
-rw-r--r--src/cmd/internal/obj/pass.go17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go
index 4f156d969b..09d520b4e9 100644
--- a/src/cmd/internal/obj/pass.go
+++ b/src/cmd/internal/obj/pass.go
@@ -36,8 +36,8 @@ package obj
// In the case of an infinite loop, brloop returns nil.
func brloop(p *Prog) *Prog {
c := 0
- for q := p; q != nil; q = q.Pcond {
- if q.As != AJMP || q.Pcond == nil {
+ for q := p; q != nil; q = q.To.Target() {
+ if q.As != AJMP || q.To.Target() == nil {
return q
}
c++
@@ -132,8 +132,6 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) {
continue
}
if p.To.Val != nil {
- // TODO: Remove To.Val.(*Prog) in favor of p->pcond.
- p.Pcond = p.To.Val.(*Prog)
continue
}
@@ -158,8 +156,7 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) {
p.To.Type = TYPE_NONE
}
- p.To.Val = q
- p.Pcond = q
+ p.To.SetTarget(q)
}
if !ctxt.Flag_optimize {
@@ -168,12 +165,12 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) {
// Collapse series of jumps to jumps.
for p := sym.Func.Text; p != nil; p = p.Link {
- if p.Pcond == nil {
+ if p.To.Target() == nil {
continue
}
- p.Pcond = brloop(p.Pcond)
- if p.Pcond != nil && p.To.Type == TYPE_BRANCH {
- p.To.Offset = p.Pcond.Pc
+ p.To.SetTarget(brloop(p.To.Target()))
+ if p.To.Target() != nil && p.To.Type == TYPE_BRANCH {
+ p.To.Offset = p.To.Target().Pc
}
}
}