mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
77e68ea78a
commit
fe27291c00
3 changed files with 10 additions and 5 deletions
|
|
@ -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 {
|
||||||
|
|
||||||
// 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) {
|
||||||
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) {
|
||||||
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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue