[dev.ssa] Merge remote-tracking branch 'origin/master' into mbranch

Semi-regular merge of tip into dev.ssa.

Change-Id: Iec8e4266426bed233892e7dbe4448d16c8b89018
This commit is contained in:
Keith Randall 2015-06-11 10:20:39 -07:00
commit e707fbe1d7
318 changed files with 17788 additions and 16035 deletions

View file

@ -130,7 +130,7 @@ func gcsymdup(s *Sym) {
}
func emitptrargsmap() {
sym := Lookup(fmt.Sprintf("%s.args_stackmap", Curfn.Nname.Sym.Name))
sym := Lookup(fmt.Sprintf("%s.args_stackmap", Curfn.Func.Nname.Sym.Name))
nptr := int(Curfn.Type.Argwid / int64(Widthptr))
bv := bvalloc(int32(nptr) * 2)
@ -217,6 +217,11 @@ func cmpstackvar(a *Node, b *Node) int {
return stringsCompare(a.Sym.Name, b.Sym.Name)
}
// stkdelta records the stack offset delta for a node
// during the compaction of the stack frame to remove
// unused stack slots.
var stkdelta = map[*Node]int64{}
// TODO(lvd) find out where the PAUTO/OLITERAL nodes come from.
func allocauto(ptxt *obj.Prog) {
Stksize = 0
@ -284,7 +289,7 @@ func allocauto(ptxt *obj.Prog) {
Yyerror("stack frame too large (>2GB)")
}
n.Stkdelta = -Stksize - n.Xoffset
stkdelta[n] = -Stksize - n.Xoffset
}
Stksize = Rnd(Stksize, int64(Widthreg))
@ -297,8 +302,8 @@ func allocauto(ptxt *obj.Prog) {
if ll.N.Class != PAUTO || ll.N.Op != ONAME {
continue
}
ll.N.Xoffset += ll.N.Stkdelta
ll.N.Stkdelta = 0
ll.N.Xoffset += stkdelta[ll.N]
delete(stkdelta, ll.N)
}
}
@ -351,8 +356,8 @@ func compile(fn *Node) {
var gclocals *Sym
var ssafn *ssa.Func
if fn.Nbody == nil {
if pure_go != 0 || strings.HasPrefix(fn.Nname.Sym.Name, "init.") {
Yyerror("missing function body for %q", fn.Nname.Sym.Name)
if pure_go != 0 || strings.HasPrefix(fn.Func.Nname.Sym.Name, "init.") {
Yyerror("missing function body for %q", fn.Func.Nname.Sym.Name)
goto ret
}
@ -403,7 +408,7 @@ func compile(fn *Node) {
// Build an SSA backend function
{
name := Curfn.Nname.Sym.Name
name := Curfn.Func.Nname.Sym.Name
if len(name) > 4 && name[len(name)-4:] == "_ssa" {
ssafn = buildssa(Curfn)
}
@ -413,16 +418,17 @@ func compile(fn *Node) {
breakpc = nil
pl = newplist()
pl.Name = Linksym(Curfn.Nname.Sym)
pl.Name = Linksym(Curfn.Func.Nname.Sym)
setlineno(Curfn)
Nodconst(&nod1, Types[TINT32], 0)
nam = Curfn.Nname
nam = Curfn.Func.Nname
if isblank(nam) {
nam = nil
}
ptxt = Thearch.Gins(obj.ATEXT, nam, &nod1)
ptxt.From3 = new(obj.Addr)
if fn.Func.Dupok {
ptxt.From3.Offset |= obj.DUPOK
}
@ -440,20 +446,20 @@ func compile(fn *Node) {
// See test/recover.go for test cases and src/reflect/value.go
// for the actual functions being considered.
if myimportpath != "" && myimportpath == "reflect" {
if Curfn.Nname.Sym.Name == "callReflect" || Curfn.Nname.Sym.Name == "callMethod" {
if Curfn.Func.Nname.Sym.Name == "callReflect" || Curfn.Func.Nname.Sym.Name == "callMethod" {
ptxt.From3.Offset |= obj.WRAPPER
}
}
Afunclit(&ptxt.From, Curfn.Nname)
Afunclit(&ptxt.From, Curfn.Func.Nname)
ginit()
gcargs = makefuncdatasym("gcargs·%d", obj.FUNCDATA_ArgsPointerMaps)
gclocals = makefuncdatasym("gclocals·%d", obj.FUNCDATA_LocalsPointerMaps)
for t := Curfn.Paramfld; t != nil; t = t.Down {
gtrack(tracksym(t.Type))
for _, t := range Curfn.Func.Fieldtrack {
gtrack(tracksym(t))
}
for l := fn.Func.Dcl; l != nil; l = l.Next {