Commit bb2bbfa0 authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: split Addrconst out of Naddr

There are only three Prog types that we were creating with an OLITERAL
Node: ATEXT, ATYPE, and AFUNCDATA. ATEXT's value we later overwrite in
defframe, and ATYPE's we don't even need. AFUNCDATA only needs integer
constants, so get rid of all the non-int constant logic and skip
creating a Node representation for the constant.

While here, there are a few other Naddr code paths that are no longer
needed, so turn those into Fatalfs.

Passes toolstash/buildall.

Change-Id: I4cc9b92c3011890afd4f31ebeba8b1b42b753cab
Reviewed-on: https://go-review.googlesource.com/30074
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 214bf680
...@@ -177,72 +177,45 @@ func Naddr(a *obj.Addr, n *Node) { ...@@ -177,72 +177,45 @@ func Naddr(a *obj.Addr, n *Node) {
return return
} }
switch n.Op { if n.Op != ONAME {
default:
a := a // copy to let escape into Ctxt.Dconv
Debug['h'] = 1 Debug['h'] = 1
Dump("naddr", n) Dump("naddr", n)
Fatalf("naddr: bad %v %v", n.Op, Ctxt.Dconv(a)) Fatalf("naddr: bad %v %v", n.Op, Ctxt.Dconv(a))
}
case ONAME: a.Offset = n.Xoffset
a.Offset = n.Xoffset s := n.Sym
s := n.Sym a.Node = n.Orig
a.Node = n.Orig
//if(a->node >= (Node*)&n)
// fatal("stack node");
if s == nil {
s = lookup(".noname")
}
if n.Name.Method && n.Type != nil && n.Type.Sym != nil && n.Type.Sym.Pkg != nil {
s = Pkglookup(s.Name, n.Type.Sym.Pkg)
}
a.Type = obj.TYPE_MEM
switch n.Class {
default:
Fatalf("naddr: ONAME class %v %d\n", n.Sym, n.Class)
case PEXTERN, PFUNC:
a.Name = obj.NAME_EXTERN
case PAUTO:
a.Name = obj.NAME_AUTO
case PPARAM, PPARAMOUT: if s == nil {
a.Name = obj.NAME_PARAM Fatalf("naddr: nil sym %v", n)
} }
if n.Name.Method && n.Type != nil && n.Type.Sym != nil && n.Type.Sym.Pkg != nil {
a.Sym = Linksym(s) Fatalf("naddr: weird method %v", n)
}
case OLITERAL: a.Type = obj.TYPE_MEM
switch u := n.Val().U.(type) { switch n.Class {
default: default:
Fatalf("naddr: const %L", n.Type) Fatalf("naddr: ONAME class %v %d\n", n.Sym, n.Class)
case *Mpflt: case PEXTERN, PFUNC:
a.Type = obj.TYPE_FCONST a.Name = obj.NAME_EXTERN
a.Val = u.Float64()
case *Mpint: case PAUTO:
a.Sym = nil a.Name = obj.NAME_AUTO
a.Type = obj.TYPE_CONST
a.Offset = u.Int64()
case string: case PPARAM, PPARAMOUT:
datagostring(u, a) a.Name = obj.NAME_PARAM
}
case bool: a.Sym = Linksym(s)
a.Sym = nil }
a.Type = obj.TYPE_CONST
a.Offset = int64(obj.Bool2int(u))
case *NilVal: func Addrconst(a *obj.Addr, v int64) {
a.Sym = nil a.Sym = nil
a.Type = obj.TYPE_CONST a.Type = obj.TYPE_CONST
a.Offset = 0 a.Offset = v
}
}
} }
func newplist() *obj.Plist { func newplist() *obj.Plist {
......
...@@ -17,14 +17,12 @@ import ( ...@@ -17,14 +17,12 @@ import (
var makefuncdatasym_nsym int var makefuncdatasym_nsym int
func makefuncdatasym(nameprefix string, funcdatakind int64) *Sym { func makefuncdatasym(nameprefix string, funcdatakind int64) *Sym {
var nod Node
sym := lookupN(nameprefix, makefuncdatasym_nsym) sym := lookupN(nameprefix, makefuncdatasym_nsym)
makefuncdatasym_nsym++ makefuncdatasym_nsym++
pnod := newname(sym) pnod := newname(sym)
pnod.Class = PEXTERN pnod.Class = PEXTERN
Nodconst(&nod, Types[TINT32], funcdatakind) p := Gins(obj.AFUNCDATA, nil, pnod)
Gins(obj.AFUNCDATA, &nod, pnod) Addrconst(&p.From, funcdatakind)
return sym return sym
} }
...@@ -376,13 +374,11 @@ func compile(fn *Node) { ...@@ -376,13 +374,11 @@ func compile(fn *Node) {
setlineno(Curfn) setlineno(Curfn)
var nod1 Node
Nodconst(&nod1, Types[TINT32], 0)
nam := Curfn.Func.Nname nam := Curfn.Func.Nname
if isblank(nam) { if isblank(nam) {
nam = nil nam = nil
} }
ptxt := Gins(obj.ATEXT, nam, &nod1) ptxt := Gins(obj.ATEXT, nam, nil)
ptxt.From3 = new(obj.Addr) ptxt.From3 = new(obj.Addr)
if fn.Func.Dupok { if fn.Func.Dupok {
ptxt.From3.Offset |= obj.DUPOK ptxt.From3.Offset |= obj.DUPOK
...@@ -432,8 +428,7 @@ func compile(fn *Node) { ...@@ -432,8 +428,7 @@ func compile(fn *Node) {
} }
switch n.Class { switch n.Class {
case PAUTO, PPARAM, PPARAMOUT: case PAUTO, PPARAM, PPARAMOUT:
Nodconst(&nod1, Types[TUINTPTR], n.Type.Width) p := Gins(obj.ATYPE, n, nil)
p := Gins(obj.ATYPE, n, &nod1)
p.From.Gotype = Linksym(ngotype(n)) p.From.Gotype = Linksym(ngotype(n))
} }
} }
......
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