Skip to content

Commit ea7126f

Browse files
committed
cmd/compile: use a Sym type instead of interface{} for symbolic offsets
Will help with strongly typed rewrite rules. Change-Id: Ifbf316a49f4081322b3b8f13bc962713437d9aba Reviewed-on: https://go-review.googlesource.com/c/go/+/227785 Run-TryBot: Keith Randall <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Daniel Martí <[email protected]>
1 parent 782fcb4 commit ea7126f

File tree

9 files changed

+81
-53
lines changed

9 files changed

+81
-53
lines changed

src/cmd/compile/internal/amd64/ssa.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
11011101
p.From.Reg = x86.REG_AX
11021102
p.To.Type = obj.TYPE_MEM
11031103
p.To.Reg = v.Args[0].Reg()
1104-
gc.AddAux(&p.To, v)
11051104
if logopt.Enabled() {
11061105
logopt.LogOpt(v.Pos, "nilcheck", "genssa", v.Block.Func.Name)
11071106
}

src/cmd/compile/internal/gc/ssa.go

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6346,20 +6346,6 @@ func (s *SSAGenState) FPJump(b, next *ssa.Block, jumps *[2][2]FloatingEQNEJump)
63466346
}
63476347
}
63486348

6349-
func AuxOffset(v *ssa.Value) (offset int64) {
6350-
if v.Aux == nil {
6351-
return 0
6352-
}
6353-
n, ok := v.Aux.(*Node)
6354-
if !ok {
6355-
v.Fatalf("bad aux type in %s\n", v.LongString())
6356-
}
6357-
if n.Class() == PAUTO {
6358-
return n.Xoffset
6359-
}
6360-
return 0
6361-
}
6362-
63636349
// AddAux adds the offset in the aux fields (AuxInt and Aux) of v to a.
63646350
func AddAux(a *obj.Addr, v *ssa.Value) {
63656351
AddAux2(a, v, v.AuxInt)

src/cmd/compile/internal/gc/syntax.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,10 @@ func (n *Node) pkgFuncName() string {
311311
return p + "." + s.Name
312312
}
313313

314+
// The compiler needs *Node to be assignable to cmd/compile/internal/ssa.Sym.
315+
func (n *Node) CanBeAnSSASym() {
316+
}
317+
314318
// Name holds Node fields used only by named nodes (ONAME, OTYPE, OPACK, OLABEL, some OLITERAL).
315319
type Name struct {
316320
Pack *Node // real package for import . names

src/cmd/compile/internal/ppc64/ssa.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -654,15 +654,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
654654
case ssa.OpPPC64ANDCCconst:
655655
p := s.Prog(v.Op.Asm())
656656
p.Reg = v.Args[0].Reg()
657-
658-
if v.Aux != nil {
659-
p.From.Type = obj.TYPE_CONST
660-
p.From.Offset = gc.AuxOffset(v)
661-
} else {
662-
p.From.Type = obj.TYPE_CONST
663-
p.From.Offset = v.AuxInt
664-
}
665-
657+
p.From.Type = obj.TYPE_CONST
658+
p.From.Offset = v.AuxInt
666659
p.To.Type = obj.TYPE_REG
667660
p.To.Reg = ppc64.REGTMP // discard result
668661

src/cmd/compile/internal/ssa/gen/rulegen.go

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -479,11 +479,15 @@ func (u *unusedInspector) node(node ast.Node) {
479479
u.exprs(node.Lhs)
480480
break
481481
}
482-
if len(node.Lhs) != 1 {
482+
lhs := node.Lhs
483+
if len(lhs) == 2 && lhs[1].(*ast.Ident).Name == "_" {
484+
lhs = lhs[:1]
485+
}
486+
if len(lhs) != 1 {
483487
panic("no support for := with multiple names")
484488
}
485489

486-
name := node.Lhs[0].(*ast.Ident)
490+
name := lhs[0].(*ast.Ident)
487491
obj := &object{
488492
name: name.Name,
489493
pos: name.NamePos,
@@ -615,6 +619,16 @@ func fprint(w io.Writer, n Node) {
615619
fprint(w, n)
616620
}
617621
fmt.Fprintf(w, "}\n")
622+
case *If:
623+
fmt.Fprintf(w, "if ")
624+
fprint(w, n.expr)
625+
fmt.Fprintf(w, " {\n")
626+
fprint(w, n.stmt)
627+
if n.alt != nil {
628+
fmt.Fprintf(w, "} else {\n")
629+
fprint(w, n.alt)
630+
}
631+
fmt.Fprintf(w, "}\n")
618632
case *Case:
619633
fmt.Fprintf(w, "case ")
620634
fprint(w, n.expr)
@@ -657,6 +671,10 @@ func fprint(w io.Writer, n Node) {
657671
fmt.Fprintf(w, "%s := ", n.name)
658672
fprint(w, n.value)
659673
fmt.Fprintln(w)
674+
case *Declare2:
675+
fmt.Fprintf(w, "%s, %s := ", n.name1, n.name2)
676+
fprint(w, n.value)
677+
fmt.Fprintln(w)
660678
case *CondBreak:
661679
fmt.Fprintf(w, "if ")
662680
fprint(w, n.expr)
@@ -721,7 +739,7 @@ func (w *bodyBase) add(node Statement) {
721739
w.list = append(w.list, node)
722740
}
723741

724-
// declared reports if the body contains a Declare with the given name.
742+
// declared reports if the body contains a Declare or Declare2 with the given name.
725743
func (w *bodyBase) declared(name string) bool {
726744
if name == "nil" {
727745
// Treat "nil" as having already been declared.
@@ -732,6 +750,9 @@ func (w *bodyBase) declared(name string) bool {
732750
if decl, ok := s.(*Declare); ok && decl.name == name {
733751
return true
734752
}
753+
if decl, ok := s.(*Declare2); ok && (decl.name1 == name || decl.name2 == name) {
754+
return true
755+
}
735756
}
736757
return false
737758
}
@@ -754,6 +775,11 @@ type (
754775
suffix string
755776
arglen int32 // if kind == "Value", number of args for this op
756777
}
778+
If struct {
779+
expr ast.Expr
780+
stmt Statement
781+
alt Statement
782+
}
757783
Switch struct {
758784
bodyBase // []*Case
759785
expr ast.Expr
@@ -776,6 +802,11 @@ type (
776802
name string
777803
value ast.Expr
778804
}
805+
Declare2 struct {
806+
name1, name2 string
807+
value ast.Expr
808+
}
809+
// TODO: implement CondBreak as If + Break instead?
779810
CondBreak struct {
780811
expr ast.Expr
781812
insideCommuteLoop bool
@@ -816,6 +847,12 @@ func declf(name, format string, a ...interface{}) *Declare {
816847
return &Declare{name, exprf(format, a...)}
817848
}
818849

850+
// decl2f constructs a simple "name1, name2 := value" declaration, using exprf for its
851+
// value.
852+
func decl2f(name1, name2, format string, a ...interface{}) *Declare2 {
853+
return &Declare2{name1, name2, exprf(format, a...)}
854+
}
855+
819856
// breakf constructs a simple "if cond { break }" statement, using exprf for its
820857
// condition.
821858
func breakf(format string, a ...interface{}) *CondBreak {
@@ -1006,12 +1043,11 @@ func genMatch0(rr *RuleRewrite, arch arch, match, v string, cnt map[string]int,
10061043
if !token.IsIdentifier(e.name) || rr.declared(e.name) {
10071044
switch e.field {
10081045
case "Aux":
1009-
if e.dclType == "interface{}" {
1010-
// see TODO above
1011-
rr.add(breakf("%s.%s != %s", v, e.field, e.dclType, e.name))
1012-
} else {
1013-
rr.add(breakf("%s.%s.(%s) != %s", v, e.field, e.dclType, e.name))
1014-
}
1046+
rr.add(&If{
1047+
expr: exprf("%s.%s == nil", v, e.field),
1048+
stmt: breakf("%s == nil", e.name),
1049+
alt: breakf("%s.%s.(%s) == %s", v, e.field, e.dclType, e.name),
1050+
})
10151051
case "AuxInt":
10161052
rr.add(breakf("%s(%s.%s) != %s", e.dclType, v, e.field, e.name))
10171053
case "Type":
@@ -1020,9 +1056,9 @@ func genMatch0(rr *RuleRewrite, arch arch, match, v string, cnt map[string]int,
10201056
} else {
10211057
switch e.field {
10221058
case "Aux":
1023-
if e.dclType == "interface{}" {
1059+
if e.dclType == "Sym" {
10241060
// TODO: kind of a hack - allows nil interface through
1025-
rr.add(declf(e.name, "%s.%s", v, e.field))
1061+
rr.add(decl2f(e.name, "_", "%s.Aux.(Sym)", v))
10261062
} else {
10271063
rr.add(declf(e.name, "%s.%s.(%s)", v, e.field, e.dclType))
10281064
}
@@ -1719,13 +1755,11 @@ func (op opData) auxType() string {
17191755
return "string"
17201756
case "Sym":
17211757
// Note: a Sym can be an *obj.LSym, a *gc.Node, or nil.
1722-
// TODO: provide an interface for this. Use a singleton to
1723-
// represent "no offset".
1724-
return "interface{}"
1758+
return "Sym"
17251759
case "SymOff":
1726-
return "interface{}"
1760+
return "Sym"
17271761
case "SymValAndOff":
1728-
return "interface{}"
1762+
return "Sym"
17291763
case "Typ":
17301764
return "*types.Type"
17311765
case "TypSize":

src/cmd/compile/internal/ssa/op.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ const (
7878
auxFloat32 // auxInt is a float32 (encoded with math.Float64bits)
7979
auxFloat64 // auxInt is a float64 (encoded with math.Float64bits)
8080
auxString // aux is a string
81-
auxSym // aux is a symbol (a *gc.Node for locals or an *obj.LSym for globals)
81+
auxSym // aux is a symbol (a *gc.Node for locals, an *obj.LSym for globals, or nil for none)
8282
auxSymOff // aux is a symbol, auxInt is an offset
8383
auxSymValAndOff // aux is a symbol, auxInt is a ValAndOff
8484
auxTyp // aux is a type
@@ -102,6 +102,16 @@ const (
102102
SymNone SymEffect = 0
103103
)
104104

105+
// A Sym represents a symbolic offset from a base register.
106+
// Currently a Sym can be one of 3 things:
107+
// - a *gc.Node, for an offset from SP (the stack pointer)
108+
// - a *obj.LSym, for an offset from SB (the global pointer)
109+
// - nil, for no offset
110+
type Sym interface {
111+
String() string
112+
CanBeAnSSASym()
113+
}
114+
105115
// A ValAndOff is used by the several opcodes. It holds
106116
// both a value and a pointer offset.
107117
// A ValAndOff is intended to be encoded into an AuxInt field.

src/cmd/compile/internal/ssa/rewriteAMD64.go

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmd/compile/internal/ssa/rewritegeneric.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmd/internal/obj/link.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -601,12 +601,14 @@ func (a Attribute) TextAttrString() string {
601601
return s
602602
}
603603

604-
// The compiler needs LSym to satisfy fmt.Stringer, because it stores
605-
// an LSym in ssa.ExternSymbol.
606604
func (s *LSym) String() string {
607605
return s.Name
608606
}
609607

608+
// The compiler needs *LSym to be assignable to cmd/compile/internal/ssa.Sym.
609+
func (s *LSym) CanBeAnSSASym() {
610+
}
611+
610612
type Pcln struct {
611613
Pcsp Pcdata
612614
Pcfile Pcdata

0 commit comments

Comments
 (0)