mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[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:
commit
e707fbe1d7
318 changed files with 17788 additions and 16035 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue