Commit fe27291c authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/compile: reduce garbage from autolabel

Follow-up to CL 26661

Change-Id: I67c58d17313094675cf0f30ce50d486818ae0dcb
Reviewed-on: https://go-review.googlesource.com/27113
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 77e68ea7
...@@ -766,7 +766,7 @@ func mkinlcall1(n *Node, fn *Node, isddd bool) *Node { ...@@ -766,7 +766,7 @@ func mkinlcall1(n *Node, fn *Node, isddd bool) *Node {
ninit.Append(as) ninit.Append(as)
} }
retlabel := autolabel("i") retlabel := autolabel(".i")
retlabel.Etype = 1 // flag 'safe' for escape analysis (no backjumps) retlabel.Etype = 1 // flag 'safe' for escape analysis (no backjumps)
inlgen++ inlgen++
......
...@@ -248,16 +248,21 @@ func LookupN(prefix string, n int) *Sym { ...@@ -248,16 +248,21 @@ func LookupN(prefix string, n int) *Sym {
// autolabel generates a new Name node for use with // autolabel generates a new Name node for use with
// an automatically generated label. // an automatically generated label.
// prefix is a short mnemonic (e.g. "s" for switch) // prefix is a short mnemonic (e.g. ".s" for switch)
// to help with debugging. // to help with debugging.
// It should begin with "." to avoid conflicts with
// user labels.
func autolabel(prefix string) *Node { func autolabel(prefix string) *Node {
if prefix[0] != '.' {
Fatalf("autolabel prefix must start with '.', have %q", prefix)
}
fn := Curfn fn := Curfn
if Curfn == nil { if Curfn == nil {
Fatalf("autolabel outside function") Fatalf("autolabel outside function")
} }
n := fn.Func.Label n := fn.Func.Label
fn.Func.Label++ fn.Func.Label++
return newname(LookupN("."+prefix, int(n))) return newname(LookupN(prefix, int(n)))
} }
var initSyms []*Sym var initSyms []*Sym
......
...@@ -358,7 +358,7 @@ func casebody(sw *Node, typeswvar *Node) { ...@@ -358,7 +358,7 @@ func casebody(sw *Node, typeswvar *Node) {
n.Op = OCASE n.Op = OCASE
needvar := n.List.Len() != 1 || n.List.First().Op == OLITERAL needvar := n.List.Len() != 1 || n.List.First().Op == OLITERAL
jmp := Nod(OGOTO, autolabel("s"), nil) jmp := Nod(OGOTO, autolabel(".s"), nil)
if n.List.Len() == 0 { if n.List.Len() == 0 {
if def != nil { if def != nil {
Yyerror("more than one default case") Yyerror("more than one default case")
...@@ -577,7 +577,7 @@ func (s *typeSwitch) walk(sw *Node) { ...@@ -577,7 +577,7 @@ func (s *typeSwitch) walk(sw *Node) {
i.Nbody.Set1(typenil) i.Nbody.Set1(typenil)
} else { } else {
// Jump to default case. // Jump to default case.
lbl := autolabel("s") lbl := autolabel(".s")
i.Nbody.Set1(Nod(OGOTO, lbl, nil)) i.Nbody.Set1(Nod(OGOTO, lbl, nil))
// Wrap default case with label. // Wrap default case with label.
blk := Nod(OBLOCK, nil, nil) blk := Nod(OBLOCK, nil, nil)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment