return
}
- switch n.Op {
- default:
- a := a // copy to let escape into Ctxt.Dconv
+ if n.Op != ONAME {
Debug['h'] = 1
Dump("naddr", n)
Fatalf("naddr: bad %v %v", n.Op, Ctxt.Dconv(a))
+ }
- case ONAME:
- a.Offset = n.Xoffset
- s := n.Sym
- 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
+ a.Offset = n.Xoffset
+ s := n.Sym
+ a.Node = n.Orig
- case PPARAM, PPARAMOUT:
- a.Name = obj.NAME_PARAM
- }
-
- a.Sym = Linksym(s)
+ if s == nil {
+ Fatalf("naddr: nil sym %v", n)
+ }
+ if n.Name.Method && n.Type != nil && n.Type.Sym != nil && n.Type.Sym.Pkg != nil {
+ Fatalf("naddr: weird method %v", n)
+ }
- case OLITERAL:
- switch u := n.Val().U.(type) {
- default:
- Fatalf("naddr: const %L", n.Type)
+ a.Type = obj.TYPE_MEM
+ switch n.Class {
+ default:
+ Fatalf("naddr: ONAME class %v %d\n", n.Sym, n.Class)
- case *Mpflt:
- a.Type = obj.TYPE_FCONST
- a.Val = u.Float64()
+ case PEXTERN, PFUNC:
+ a.Name = obj.NAME_EXTERN
- case *Mpint:
- a.Sym = nil
- a.Type = obj.TYPE_CONST
- a.Offset = u.Int64()
+ case PAUTO:
+ a.Name = obj.NAME_AUTO
- case string:
- datagostring(u, a)
+ case PPARAM, PPARAMOUT:
+ a.Name = obj.NAME_PARAM
+ }
- case bool:
- a.Sym = nil
- a.Type = obj.TYPE_CONST
- a.Offset = int64(obj.Bool2int(u))
+ a.Sym = Linksym(s)
+}
- case *NilVal:
- a.Sym = nil
- a.Type = obj.TYPE_CONST
- a.Offset = 0
- }
- }
+func Addrconst(a *obj.Addr, v int64) {
+ a.Sym = nil
+ a.Type = obj.TYPE_CONST
+ a.Offset = v
}
func newplist() *obj.Plist {
var makefuncdatasym_nsym int
func makefuncdatasym(nameprefix string, funcdatakind int64) *Sym {
- var nod Node
-
sym := lookupN(nameprefix, makefuncdatasym_nsym)
makefuncdatasym_nsym++
pnod := newname(sym)
pnod.Class = PEXTERN
- Nodconst(&nod, Types[TINT32], funcdatakind)
- Gins(obj.AFUNCDATA, &nod, pnod)
+ p := Gins(obj.AFUNCDATA, nil, pnod)
+ Addrconst(&p.From, funcdatakind)
return sym
}
setlineno(Curfn)
- var nod1 Node
- Nodconst(&nod1, Types[TINT32], 0)
nam := Curfn.Func.Nname
if isblank(nam) {
nam = nil
}
- ptxt := Gins(obj.ATEXT, nam, &nod1)
+ ptxt := Gins(obj.ATEXT, nam, nil)
ptxt.From3 = new(obj.Addr)
if fn.Func.Dupok {
ptxt.From3.Offset |= obj.DUPOK
}
switch n.Class {
case PAUTO, PPARAM, PPARAMOUT:
- Nodconst(&nod1, Types[TUINTPTR], n.Type.Width)
- p := Gins(obj.ATYPE, n, &nod1)
+ p := Gins(obj.ATYPE, n, nil)
p.From.Gotype = Linksym(ngotype(n))
}
}