Commit 30940e2c authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/compile: move Linksym, linksymname, and isblanksym to types package

Response to code review feedback on CL 40693.

This CL was prepared by:

(1) manually adding new implementations and the Ctxt var to package types

(2) running eg with template:

func before(s *types.Sym) *obj.LSym { return gc.Linksym(s) }
func after(s *types.Sym) *obj.LSym  { return s.Linksym() }

(3) running gofmt -r:

gofmt -r 'isblanksym(a) -> a.IsBlank()'

(4) manually removing old implementations from package gc

Passes toolstash-check.

Change-Id: I39c35def7cae5bcbcc7c77253e5d2b066b981dea
Reviewed-on: https://go-review.googlesource.com/41302
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 5aebeaac
...@@ -127,7 +127,7 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) { ...@@ -127,7 +127,7 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) {
if gc.Widthptr == 4 { if gc.Widthptr == 4 {
op = x86.AMOVL op = x86.AMOVL
} }
sym := gc.Linksym(n.Sym) sym := n.Sym.Linksym()
size := n.Type.Size() size := n.Type.Size()
for i := int64(0); i < size; i += int64(gc.Widthptr) { for i := int64(0); i < size; i += int64(gc.Widthptr) {
p := pp.Prog(op) p := pp.Prog(op)
......
...@@ -49,7 +49,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, r0 *uint32) *obj.Prog ...@@ -49,7 +49,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, r0 *uint32) *obj.Prog
func zeroAuto(pp *gc.Progs, n *gc.Node) { func zeroAuto(pp *gc.Progs, n *gc.Node) {
// Note: this code must not clobber any registers. // Note: this code must not clobber any registers.
sym := gc.Linksym(n.Sym) sym := n.Sym.Linksym()
size := n.Type.Size() size := n.Type.Size()
p := pp.Prog(arm.AMOVW) p := pp.Prog(arm.AMOVW)
p.From.Type = obj.TYPE_CONST p.From.Type = obj.TYPE_CONST
......
...@@ -60,7 +60,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog { ...@@ -60,7 +60,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog {
func zeroAuto(pp *gc.Progs, n *gc.Node) { func zeroAuto(pp *gc.Progs, n *gc.Node) {
// Note: this code must not clobber any registers. // Note: this code must not clobber any registers.
sym := gc.Linksym(n.Sym) sym := n.Sym.Linksym()
size := n.Type.Size() size := n.Type.Size()
for i := int64(0); i < size; i += 8 { for i := int64(0); i < size; i += 8 {
p := pp.Prog(arm64.AMOVD) p := pp.Prog(arm64.AMOVD)
......
...@@ -157,7 +157,7 @@ func algtype1(t *types.Type) (AlgKind, *types.Type) { ...@@ -157,7 +157,7 @@ func algtype1(t *types.Type) (AlgKind, *types.Type) {
fields := t.FieldSlice() fields := t.FieldSlice()
// One-field struct is same as that one field alone. // One-field struct is same as that one field alone.
if len(fields) == 1 && !isblanksym(fields[0].Sym) { if len(fields) == 1 && !fields[0].Sym.IsBlank() {
return algtype1(fields[0].Type) return algtype1(fields[0].Type)
} }
...@@ -171,7 +171,7 @@ func algtype1(t *types.Type) (AlgKind, *types.Type) { ...@@ -171,7 +171,7 @@ func algtype1(t *types.Type) (AlgKind, *types.Type) {
// Blank fields, padded fields, fields with non-memory // Blank fields, padded fields, fields with non-memory
// equality need special compare. // equality need special compare.
if a != AMEM || isblanksym(f.Sym) || ispaddedfield(t, i) { if a != AMEM || f.Sym.IsBlank() || ispaddedfield(t, i) {
ret = ASPECIAL ret = ASPECIAL
} }
} }
...@@ -247,7 +247,7 @@ func genhash(sym *types.Sym, t *types.Type) { ...@@ -247,7 +247,7 @@ func genhash(sym *types.Sym, t *types.Type) {
f := fields[i] f := fields[i]
// Skip blank fields. // Skip blank fields.
if isblanksym(f.Sym) { if f.Sym.IsBlank() {
i++ i++
continue continue
} }
...@@ -435,7 +435,7 @@ func geneq(sym *types.Sym, t *types.Type) { ...@@ -435,7 +435,7 @@ func geneq(sym *types.Sym, t *types.Type) {
f := fields[i] f := fields[i]
// Skip blank-named fields. // Skip blank-named fields.
if isblanksym(f.Sym) { if f.Sym.IsBlank() {
i++ i++
continue continue
} }
...@@ -568,7 +568,7 @@ func memrun(t *types.Type, start int) (size int64, next int) { ...@@ -568,7 +568,7 @@ func memrun(t *types.Type, start int) (size int64, next int) {
break break
} }
// Also, stop before a blank or non-memory field. // Also, stop before a blank or non-memory field.
if f := t.Field(next); isblanksym(f.Sym) || !IsRegularMemory(f.Type) { if f := t.Field(next); f.Sym.IsBlank() || !IsRegularMemory(f.Type) {
break break
} }
} }
......
...@@ -607,7 +607,7 @@ func checkdupfields(what string, ts ...*types.Type) { ...@@ -607,7 +607,7 @@ func checkdupfields(what string, ts ...*types.Type) {
seen := make(map[*types.Sym]bool) seen := make(map[*types.Sym]bool)
for _, t := range ts { for _, t := range ts {
for _, f := range t.Fields().Slice() { for _, f := range t.Fields().Slice() {
if f.Sym == nil || isblanksym(f.Sym) || asNode(f.Nname) == nil { if f.Sym == nil || f.Sym.IsBlank() || asNode(f.Nname) == nil {
continue continue
} }
if seen[f.Sym] { if seen[f.Sym] {
...@@ -935,7 +935,7 @@ func methodname(s *types.Sym, recv *types.Type) *types.Sym { ...@@ -935,7 +935,7 @@ func methodname(s *types.Sym, recv *types.Type) *types.Sym {
} }
tsym := recv.Sym tsym := recv.Sym
if tsym == nil || isblanksym(s) { if tsym == nil || s.IsBlank() {
return s return s
} }
...@@ -1000,7 +1000,7 @@ func addmethod(msym *types.Sym, t *types.Type, local, nointerface bool) { ...@@ -1000,7 +1000,7 @@ func addmethod(msym *types.Sym, t *types.Type, local, nointerface bool) {
return return
} }
if isblanksym(msym) { if msym.IsBlank() {
return return
} }
...@@ -1087,7 +1087,7 @@ func makefuncsym(s *types.Sym) { ...@@ -1087,7 +1087,7 @@ func makefuncsym(s *types.Sym) {
if !Ctxt.Flag_dynlink { if !Ctxt.Flag_dynlink {
Fatalf("makefuncsym dynlink") Fatalf("makefuncsym dynlink")
} }
if isblanksym(s) { if s.IsBlank() {
return return
} }
if compiling_runtime && s.Name == "getg" { if compiling_runtime && s.Name == "getg" {
......
...@@ -2109,7 +2109,7 @@ func (e *EscState) esctag(fn *Node) { ...@@ -2109,7 +2109,7 @@ func (e *EscState) esctag(fn *Node) {
// (Unnamed parameters are not in the Dcl list in the loop above // (Unnamed parameters are not in the Dcl list in the loop above
// so we need to mark them separately.) // so we need to mark them separately.)
for _, f := range fn.Type.Params().Fields().Slice() { for _, f := range fn.Type.Params().Fields().Slice() {
if f.Sym == nil || isblanksym(f.Sym) { if f.Sym == nil || f.Sym.IsBlank() {
f.Note = mktag(EscNone) f.Note = mktag(EscNone)
} }
} }
......
...@@ -301,7 +301,7 @@ func dumpasmhdr() { ...@@ -301,7 +301,7 @@ func dumpasmhdr() {
} }
fmt.Fprintf(b, "// generated by compile -asmhdr from package %s\n\n", localpkg.Name) fmt.Fprintf(b, "// generated by compile -asmhdr from package %s\n\n", localpkg.Name)
for _, n := range asmlist { for _, n := range asmlist {
if isblanksym(n.Sym) { if n.Sym.IsBlank() {
continue continue
} }
switch n.Op { switch n.Op {
...@@ -315,7 +315,7 @@ func dumpasmhdr() { ...@@ -315,7 +315,7 @@ func dumpasmhdr() {
} }
fmt.Fprintf(b, "#define %s__size %d\n", t.Sym.Name, int(t.Width)) fmt.Fprintf(b, "#define %s__size %d\n", t.Sym.Name, int(t.Width))
for _, t := range t.Fields().Slice() { for _, t := range t.Fields().Slice() {
if !isblanksym(t.Sym) { if !t.Sym.IsBlank() {
fmt.Fprintf(b, "#define %s_%s %d\n", n.Sym.Name, t.Sym.Name, int(t.Offset)) fmt.Fprintf(b, "#define %s_%s %d\n", n.Sym.Name, t.Sym.Name, int(t.Offset))
} }
} }
......
...@@ -15,7 +15,7 @@ import ( ...@@ -15,7 +15,7 @@ import (
) )
func Sysfunc(name string) *obj.LSym { func Sysfunc(name string) *obj.LSym {
return Linksym(Runtimepkg.Lookup(name)) return Runtimepkg.Lookup(name).Linksym()
} }
// addrescapes tags node n as having had its address taken // addrescapes tags node n as having had its address taken
......
...@@ -173,7 +173,7 @@ func (f *Func) initLSym() { ...@@ -173,7 +173,7 @@ func (f *Func) initLSym() {
} }
if nam := f.Nname; !isblank(nam) { if nam := f.Nname; !isblank(nam) {
f.lsym = Linksym(nam.Sym) f.lsym = nam.Sym.Linksym()
if f.Pragma&Systemstack != 0 { if f.Pragma&Systemstack != 0 {
f.lsym.Set(obj.AttrCFunc, true) f.lsym.Set(obj.AttrCFunc, true)
} }
...@@ -213,8 +213,8 @@ func (f *Func) initLSym() { ...@@ -213,8 +213,8 @@ func (f *Func) initLSym() {
} }
func ggloblnod(nam *Node) { func ggloblnod(nam *Node) {
s := Linksym(nam.Sym) s := nam.Sym.Linksym()
s.Gotype = Linksym(ngotype(nam)) s.Gotype = ngotype(nam).Linksym()
flags := 0 flags := 0
if nam.Name.Readonly() { if nam.Name.Readonly() {
flags = obj.RODATA flags = obj.RODATA
...@@ -226,7 +226,7 @@ func ggloblnod(nam *Node) { ...@@ -226,7 +226,7 @@ func ggloblnod(nam *Node) {
} }
func ggloblsym(s *types.Sym, width int32, flags int16) { func ggloblsym(s *types.Sym, width int32, flags int16) {
ggloblLSym(Linksym(s), width, flags) ggloblLSym(s.Linksym(), width, flags)
} }
func ggloblLSym(s *obj.LSym, width int32, flags int16) { func ggloblLSym(s *obj.LSym, width int32, flags int16) {
...@@ -316,7 +316,7 @@ func nodarg(t interface{}, fp int) *Node { ...@@ -316,7 +316,7 @@ func nodarg(t interface{}, fp int) *Node {
} }
for _, n := range Curfn.Func.Dcl { for _, n := range Curfn.Func.Dcl {
if (n.Class == PPARAM || n.Class == PPARAMOUT) && !isblanksym(t.Sym) && n.Sym == t.Sym { if (n.Class == PPARAM || n.Class == PPARAMOUT) && !t.Sym.IsBlank() && n.Sym == t.Sym {
if n != expect { if n != expect {
Fatalf("nodarg: unexpected node: %v (%p %v) vs %v (%p %v)", n, n, n.Op, asNode(t.Nname), asNode(t.Nname), asNode(t.Nname).Op) Fatalf("nodarg: unexpected node: %v (%p %v) vs %v (%p %v)", n, n, n.Op, asNode(t.Nname), asNode(t.Nname), asNode(t.Nname).Op)
} }
...@@ -324,7 +324,7 @@ func nodarg(t interface{}, fp int) *Node { ...@@ -324,7 +324,7 @@ func nodarg(t interface{}, fp int) *Node {
} }
} }
if !isblanksym(expect.Sym) { if !expect.Sym.IsBlank() {
Fatalf("nodarg: did not find node in dcl list: %v", expect) Fatalf("nodarg: did not find node in dcl list: %v", expect)
} }
} }
......
...@@ -762,7 +762,7 @@ func mkinlcall1(n *Node, fn *Node, isddd bool) *Node { ...@@ -762,7 +762,7 @@ func mkinlcall1(n *Node, fn *Node, isddd bool) *Node {
if callBase != nil { if callBase != nil {
parent = callBase.InliningIndex() parent = callBase.InliningIndex()
} }
newIndex := Ctxt.InlTree.Add(parent, n.Pos, Linksym(fn.Sym)) newIndex := Ctxt.InlTree.Add(parent, n.Pos, fn.Sym.Linksym())
setpos := &setPos{ setpos := &setPos{
bases: make(map[*src.PosBase]*src.PosBase), bases: make(map[*src.PosBase]*src.PosBase),
newInlIndex: newIndex, newInlIndex: newIndex,
......
...@@ -361,11 +361,12 @@ func Main(archInit func(*Arch)) { ...@@ -361,11 +361,12 @@ func Main(archInit func(*Arch)) {
return f.Sym.Name return f.Sym.Name
} }
types.TypeLinkSym = func(t *types.Type) *obj.LSym { types.TypeLinkSym = func(t *types.Type) *obj.LSym {
return Linksym(typenamesym(t)) return typenamesym(t).Linksym()
} }
types.FmtLeft = int(FmtLeft) types.FmtLeft = int(FmtLeft)
types.FmtUnsigned = int(FmtUnsigned) types.FmtUnsigned = int(FmtUnsigned)
types.FErr = FErr types.FErr = FErr
types.Ctxt = Ctxt
initUniverse() initUniverse()
......
...@@ -251,28 +251,8 @@ func addGCLocals() { ...@@ -251,28 +251,8 @@ func addGCLocals() {
} }
} }
func linksymname(s *types.Sym) string {
if isblanksym(s) {
return "_"
}
if s.Linkname != "" {
return s.Linkname
}
return s.Pkg.Prefix + "." + s.Name
}
func Linksym(s *types.Sym) *obj.LSym {
if s == nil {
return nil
}
if s.Lsym == nil {
s.Lsym = Ctxt.Lookup(linksymname(s))
}
return s.Lsym
}
func duintxx(s *types.Sym, off int, v uint64, wid int) int { func duintxx(s *types.Sym, off int, v uint64, wid int) int {
return duintxxLSym(Linksym(s), off, v, wid) return duintxxLSym(s.Linksym(), off, v, wid)
} }
func duintxxLSym(s *obj.LSym, off int, v uint64, wid int) int { func duintxxLSym(s *obj.LSym, off int, v uint64, wid int) int {
...@@ -369,7 +349,7 @@ func slicebytes(nam *Node, s string, len int) { ...@@ -369,7 +349,7 @@ func slicebytes(nam *Node, s string, len int) {
} }
func dsname(s *types.Sym, off int, t string) int { func dsname(s *types.Sym, off int, t string) int {
return dsnameLSym(Linksym(s), off, t) return dsnameLSym(s.Linksym(), off, t)
} }
func dsnameLSym(s *obj.LSym, off int, t string) int { func dsnameLSym(s *obj.LSym, off int, t string) int {
...@@ -378,7 +358,7 @@ func dsnameLSym(s *obj.LSym, off int, t string) int { ...@@ -378,7 +358,7 @@ func dsnameLSym(s *obj.LSym, off int, t string) int {
} }
func dsymptr(s *types.Sym, off int, x *types.Sym, xoff int) int { func dsymptr(s *types.Sym, off int, x *types.Sym, xoff int) int {
return dsymptrLSym(Linksym(s), off, Linksym(x), xoff) return dsymptrLSym(s.Linksym(), off, x.Linksym(), xoff)
} }
func dsymptrLSym(s *obj.LSym, off int, x *obj.LSym, xoff int) int { func dsymptrLSym(s *obj.LSym, off int, x *obj.LSym, xoff int) int {
...@@ -407,7 +387,7 @@ func gdata(nam *Node, nr *Node, wid int) { ...@@ -407,7 +387,7 @@ func gdata(nam *Node, nr *Node, wid int) {
if nam.Sym == nil { if nam.Sym == nil {
Fatalf("gdata nil nam sym") Fatalf("gdata nil nam sym")
} }
s := Linksym(nam.Sym) s := nam.Sym.Linksym()
switch nr.Op { switch nr.Op {
case OLITERAL: case OLITERAL:
...@@ -454,13 +434,13 @@ func gdata(nam *Node, nr *Node, wid int) { ...@@ -454,13 +434,13 @@ func gdata(nam *Node, nr *Node, wid int) {
Fatalf("gdata ADDR left op %v", nr.Left.Op) Fatalf("gdata ADDR left op %v", nr.Left.Op)
} }
to := nr.Left to := nr.Left
s.WriteAddr(Ctxt, nam.Xoffset, wid, Linksym(to.Sym), to.Xoffset) s.WriteAddr(Ctxt, nam.Xoffset, wid, to.Sym.Linksym(), to.Xoffset)
case ONAME: case ONAME:
if nr.Class != PFUNC { if nr.Class != PFUNC {
Fatalf("gdata NAME not PFUNC %d", nr.Class) Fatalf("gdata NAME not PFUNC %d", nr.Class)
} }
s.WriteAddr(Ctxt, nam.Xoffset, wid, Linksym(funcsym(nr.Sym)), nr.Xoffset) s.WriteAddr(Ctxt, nam.Xoffset, wid, funcsym(nr.Sym).Linksym(), nr.Xoffset)
default: default:
Fatalf("gdata unhandled op %v %v\n", nr, nr.Op) Fatalf("gdata unhandled op %v %v\n", nr, nr.Op)
......
...@@ -23,7 +23,7 @@ func emitptrargsmap() { ...@@ -23,7 +23,7 @@ func emitptrargsmap() {
return return
} }
sym := lookup(fmt.Sprintf("%s.args_stackmap", Curfn.Func.Nname.Sym.Name)) sym := lookup(fmt.Sprintf("%s.args_stackmap", Curfn.Func.Nname.Sym.Name))
lsym := Linksym(sym) lsym := sym.Linksym()
nptr := int(Curfn.Type.ArgWidth() / int64(Widthptr)) nptr := int(Curfn.Type.ArgWidth() / int64(Widthptr))
bv := bvalloc(int32(nptr) * 2) bv := bvalloc(int32(nptr) * 2)
...@@ -223,7 +223,7 @@ func compile(fn *Node) { ...@@ -223,7 +223,7 @@ func compile(fn *Node) {
func debuginfo(fnsym *obj.LSym, curfn interface{}) []*dwarf.Var { func debuginfo(fnsym *obj.LSym, curfn interface{}) []*dwarf.Var {
fn := curfn.(*Node) fn := curfn.(*Node)
if expect := Linksym(fn.Func.Nname.Sym); fnsym != expect { if expect := fn.Func.Nname.Sym.Linksym(); fnsym != expect {
Fatalf("unexpected fnsym: %v != %v", fnsym, expect) Fatalf("unexpected fnsym: %v != %v", fnsym, expect)
} }
...@@ -262,7 +262,7 @@ func debuginfo(fnsym *obj.LSym, curfn interface{}) []*dwarf.Var { ...@@ -262,7 +262,7 @@ func debuginfo(fnsym *obj.LSym, curfn interface{}) []*dwarf.Var {
continue continue
} }
gotype := Linksym(ngotype(n)) gotype := ngotype(n).Linksym()
fnsym.Func.Autom = append(fnsym.Func.Autom, &obj.Auto{ fnsym.Func.Autom = append(fnsym.Func.Autom, &obj.Auto{
Asym: Ctxt.Lookup(n.Sym.Name), Asym: Ctxt.Lookup(n.Sym.Name),
Aoffset: int32(n.Xoffset), Aoffset: int32(n.Xoffset),
...@@ -306,7 +306,7 @@ func fieldtrack(fnsym *obj.LSym, tracked map[*types.Sym]struct{}) { ...@@ -306,7 +306,7 @@ func fieldtrack(fnsym *obj.LSym, tracked map[*types.Sym]struct{}) {
sort.Sort(symByName(trackSyms)) sort.Sort(symByName(trackSyms))
for _, sym := range trackSyms { for _, sym := range trackSyms {
r := obj.Addrel(fnsym) r := obj.Addrel(fnsym)
r.Sym = Linksym(sym) r.Sym = sym.Linksym()
r.Type = objabi.R_USEFIELD r.Type = objabi.R_USEFIELD
} }
} }
......
...@@ -409,7 +409,7 @@ func imethods(t *types.Type) []*Sig { ...@@ -409,7 +409,7 @@ func imethods(t *types.Type) []*Sig {
methods = append(methods, &sig) methods = append(methods, &sig)
// Compiler can only refer to wrappers for non-blank methods. // Compiler can only refer to wrappers for non-blank methods.
if isblanksym(method) { if method.IsBlank() {
continue continue
} }
...@@ -454,7 +454,7 @@ func dimportpath(p *types.Pkg) { ...@@ -454,7 +454,7 @@ func dimportpath(p *types.Pkg) {
} }
func dgopkgpath(s *types.Sym, ot int, pkg *types.Pkg) int { func dgopkgpath(s *types.Sym, ot int, pkg *types.Pkg) int {
return dgopkgpathLSym(Linksym(s), ot, pkg) return dgopkgpathLSym(s.Linksym(), ot, pkg)
} }
func dgopkgpathLSym(s *obj.LSym, ot int, pkg *types.Pkg) int { func dgopkgpathLSym(s *obj.LSym, ot int, pkg *types.Pkg) int {
...@@ -521,7 +521,7 @@ func dnameField(s *types.Sym, ot int, spkg *types.Pkg, ft *types.Field) int { ...@@ -521,7 +521,7 @@ func dnameField(s *types.Sym, ot int, spkg *types.Pkg, ft *types.Field) int {
fpkg = nil fpkg = nil
} }
nsym := dname(name, ft.Note, fpkg, isExported) nsym := dname(name, ft.Note, fpkg, isExported)
return dsymptrLSym(Linksym(s), ot, nsym, 0) return dsymptrLSym(s.Linksym(), ot, nsym, 0)
} }
// dnameData writes the contents of a reflect.name into s at offset ot. // dnameData writes the contents of a reflect.name into s at offset ot.
...@@ -617,7 +617,7 @@ func dextratype(s *types.Sym, ot int, t *types.Type, dataAdd int) int { ...@@ -617,7 +617,7 @@ func dextratype(s *types.Sym, ot int, t *types.Type, dataAdd int) int {
dtypesym(a.type_) dtypesym(a.type_)
} }
ot = dgopkgpathOffLSym(Linksym(s), ot, typePkg(t)) ot = dgopkgpathOffLSym(s.Linksym(), ot, typePkg(t))
dataAdd += uncommonSize(t) dataAdd += uncommonSize(t)
mcount := len(m) mcount := len(m)
...@@ -654,7 +654,7 @@ func typePkg(t *types.Type) *types.Pkg { ...@@ -654,7 +654,7 @@ func typePkg(t *types.Type) *types.Pkg {
// dextratypeData dumps the backing array for the []method field of // dextratypeData dumps the backing array for the []method field of
// runtime.uncommontype. // runtime.uncommontype.
func dextratypeData(s *types.Sym, ot int, t *types.Type) int { func dextratypeData(s *types.Sym, ot int, t *types.Type) int {
lsym := Linksym(s) lsym := s.Linksym()
for _, a := range methods(t) { for _, a := range methods(t) {
// ../../../../runtime/type.go:/method // ../../../../runtime/type.go:/method
exported := exportname(a.name) exported := exportname(a.name)
...@@ -665,9 +665,9 @@ func dextratypeData(s *types.Sym, ot int, t *types.Type) int { ...@@ -665,9 +665,9 @@ func dextratypeData(s *types.Sym, ot int, t *types.Type) int {
nsym := dname(a.name, "", pkg, exported) nsym := dname(a.name, "", pkg, exported)
ot = dsymptrOffLSym(lsym, ot, nsym, 0) ot = dsymptrOffLSym(lsym, ot, nsym, 0)
ot = dmethodptrOffLSym(lsym, ot, Linksym(dtypesym(a.mtype))) ot = dmethodptrOffLSym(lsym, ot, dtypesym(a.mtype).Linksym())
ot = dmethodptrOffLSym(lsym, ot, Linksym(a.isym)) ot = dmethodptrOffLSym(lsym, ot, a.isym.Linksym())
ot = dmethodptrOffLSym(lsym, ot, Linksym(a.tsym)) ot = dmethodptrOffLSym(lsym, ot, a.tsym.Linksym())
} }
return ot return ot
} }
...@@ -885,14 +885,14 @@ func dcommontype(s *types.Sym, ot int, t *types.Type) int { ...@@ -885,14 +885,14 @@ func dcommontype(s *types.Sym, ot int, t *types.Type) int {
ot = dsymptr(s, ot, gcsym, 0) // gcdata ot = dsymptr(s, ot, gcsym, 0) // gcdata
nsym := dname(p, "", nil, exported) nsym := dname(p, "", nil, exported)
ot = dsymptrOffLSym(Linksym(s), ot, nsym, 0) // str ot = dsymptrOffLSym(s.Linksym(), ot, nsym, 0) // str
// ptrToThis // ptrToThis
if sptr == nil { if sptr == nil {
ot = duint32(s, ot, 0) ot = duint32(s, ot, 0)
} else if sptrWeak { } else if sptrWeak {
ot = dsymptrWeakOffLSym(Linksym(s), ot, Linksym(sptr)) ot = dsymptrWeakOffLSym(s.Linksym(), ot, sptr.Linksym())
} else { } else {
ot = dsymptrOffLSym(Linksym(s), ot, Linksym(sptr), 0) ot = dsymptrOffLSym(s.Linksym(), ot, sptr.Linksym(), 0)
} }
return ot return ot
...@@ -1209,7 +1209,7 @@ ok: ...@@ -1209,7 +1209,7 @@ ok:
dataAdd := imethodSize() * n dataAdd := imethodSize() * n
ot = dextratype(s, ot, t, dataAdd) ot = dextratype(s, ot, t, dataAdd)
lsym := Linksym(s) lsym := s.Linksym()
for _, a := range m { for _, a := range m {
// ../../../../runtime/type.go:/imethod // ../../../../runtime/type.go:/imethod
exported := exportname(a.name) exported := exportname(a.name)
...@@ -1220,7 +1220,7 @@ ok: ...@@ -1220,7 +1220,7 @@ ok:
nsym := dname(a.name, "", pkg, exported) nsym := dname(a.name, "", pkg, exported)
ot = dsymptrOffLSym(lsym, ot, nsym, 0) ot = dsymptrOffLSym(lsym, ot, nsym, 0)
ot = dsymptrOffLSym(lsym, ot, Linksym(dtypesym(a.type_)), 0) ot = dsymptrOffLSym(lsym, ot, dtypesym(a.type_).Linksym(), 0)
} }
// ../../../../runtime/type.go:/mapType // ../../../../runtime/type.go:/mapType
...@@ -1352,7 +1352,7 @@ func peekitabs() { ...@@ -1352,7 +1352,7 @@ func peekitabs() {
if len(methods) == 0 { if len(methods) == 0 {
continue continue
} }
tab.lsym = Linksym(tab.sym) tab.lsym = tab.sym.Linksym()
tab.entries = methods tab.entries = methods
} }
} }
...@@ -1375,7 +1375,7 @@ func genfun(t, it *types.Type) []*obj.LSym { ...@@ -1375,7 +1375,7 @@ func genfun(t, it *types.Type) []*obj.LSym {
// so we can find the intersect in a single pass // so we can find the intersect in a single pass
for _, m := range methods { for _, m := range methods {
if m.name == sigs[0].name { if m.name == sigs[0].name {
out = append(out, Linksym(m.isym)) out = append(out, m.isym.Linksym())
sigs = sigs[1:] sigs = sigs[1:]
if len(sigs) == 0 { if len(sigs) == 0 {
break break
...@@ -1488,14 +1488,14 @@ func dumptypestructs() { ...@@ -1488,14 +1488,14 @@ func dumptypestructs() {
// } // }
nsym := dname(p.s.Name, "", nil, true) nsym := dname(p.s.Name, "", nil, true)
ot = dsymptrOffLSym(s, ot, nsym, 0) ot = dsymptrOffLSym(s, ot, nsym, 0)
ot = dsymptrOffLSym(s, ot, Linksym(dtypesym(p.t)), 0) ot = dsymptrOffLSym(s, ot, dtypesym(p.t).Linksym(), 0)
} }
ggloblLSym(s, int32(ot), int16(obj.RODATA)) ggloblLSym(s, int32(ot), int16(obj.RODATA))
ot = 0 ot = 0
s = Ctxt.Lookup("go.plugin.exports") s = Ctxt.Lookup("go.plugin.exports")
for _, p := range ptabs { for _, p := range ptabs {
ot = dsymptrLSym(s, ot, Linksym(p.s), 0) ot = dsymptrLSym(s, ot, p.s.Linksym(), 0)
} }
ggloblLSym(s, int32(ot), int16(obj.RODATA)) ggloblLSym(s, int32(ot), int16(obj.RODATA))
} }
......
...@@ -725,7 +725,7 @@ func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes) ...@@ -725,7 +725,7 @@ func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes)
if r.Op != OSTRUCTKEY { if r.Op != OSTRUCTKEY {
Fatalf("fixedlit: rhs not OSTRUCTKEY: %v", r) Fatalf("fixedlit: rhs not OSTRUCTKEY: %v", r)
} }
if isblanksym(r.Sym) { if r.Sym.IsBlank() {
return nblank, r.Left return nblank, r.Left
} }
return nodSym(ODOT, var_, r.Sym), r.Left return nodSym(ODOT, var_, r.Sym), r.Left
......
...@@ -762,7 +762,7 @@ func (s *state) stmt(n *Node) { ...@@ -762,7 +762,7 @@ func (s *state) stmt(n *Node) {
s.stmtList(n.List) s.stmtList(n.List)
b := s.exit() b := s.exit()
b.Kind = ssa.BlockRetJmp // override BlockRet b.Kind = ssa.BlockRetJmp // override BlockRet
b.Aux = Linksym(n.Left.Sym) b.Aux = n.Left.Sym.Linksym()
case OCONTINUE, OBREAK: case OCONTINUE, OBREAK:
var to *ssa.Block var to *ssa.Block
...@@ -1387,12 +1387,12 @@ func (s *state) expr(n *Node) *ssa.Value { ...@@ -1387,12 +1387,12 @@ func (s *state) expr(n *Node) *ssa.Value {
len := s.newValue1(ssa.OpStringLen, types.Types[TINT], str) len := s.newValue1(ssa.OpStringLen, types.Types[TINT], str)
return s.newValue3(ssa.OpSliceMake, n.Type, ptr, len, len) return s.newValue3(ssa.OpSliceMake, n.Type, ptr, len, len)
case OCFUNC: case OCFUNC:
aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: Linksym(n.Left.Sym)}) aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: n.Left.Sym.Linksym()})
return s.entryNewValue1A(ssa.OpAddr, n.Type, aux, s.sb) return s.entryNewValue1A(ssa.OpAddr, n.Type, aux, s.sb)
case ONAME: case ONAME:
if n.Class == PFUNC { if n.Class == PFUNC {
// "value" of a function is the address of the function's closure // "value" of a function is the address of the function's closure
sym := Linksym(funcsym(n.Sym)) sym := funcsym(n.Sym).Linksym()
aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: sym}) aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: sym})
return s.entryNewValue1A(ssa.OpAddr, types.NewPtr(n.Type), aux, s.sb) return s.entryNewValue1A(ssa.OpAddr, types.NewPtr(n.Type), aux, s.sb)
} }
...@@ -2833,7 +2833,7 @@ func init() { ...@@ -2833,7 +2833,7 @@ func init() {
sys.ARM64) sys.ARM64)
makeOnesCount := func(op64 ssa.Op, op32 ssa.Op) func(s *state, n *Node, args []*ssa.Value) *ssa.Value { makeOnesCount := func(op64 ssa.Op, op32 ssa.Op) func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
return func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: Linksym(syslook("support_popcnt").Sym)}) aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: syslook("support_popcnt").Sym.Linksym()})
addr := s.entryNewValue1A(ssa.OpAddr, types.Types[TBOOL].PtrTo(), aux, s.sb) addr := s.entryNewValue1A(ssa.OpAddr, types.Types[TBOOL].PtrTo(), aux, s.sb)
v := s.newValue2(ssa.OpLoad, types.Types[TBOOL], addr, s.mem()) v := s.newValue2(ssa.OpLoad, types.Types[TBOOL], addr, s.mem())
b := s.endBlock() b := s.endBlock()
...@@ -3131,7 +3131,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { ...@@ -3131,7 +3131,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
case codeptr != nil: case codeptr != nil:
call = s.newValue2(ssa.OpInterCall, ssa.TypeMem, codeptr, s.mem()) call = s.newValue2(ssa.OpInterCall, ssa.TypeMem, codeptr, s.mem())
case sym != nil: case sym != nil:
call = s.newValue1A(ssa.OpStaticCall, ssa.TypeMem, Linksym(sym), s.mem()) call = s.newValue1A(ssa.OpStaticCall, ssa.TypeMem, sym.Linksym(), s.mem())
default: default:
Fatalf("bad call type %v %v", n.Op, n) Fatalf("bad call type %v %v", n.Op, n)
} }
...@@ -3204,7 +3204,7 @@ func (s *state) addr(n *Node, bounded bool) *ssa.Value { ...@@ -3204,7 +3204,7 @@ func (s *state) addr(n *Node, bounded bool) *ssa.Value {
switch n.Class { switch n.Class {
case PEXTERN: case PEXTERN:
// global variable // global variable
aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: Linksym(n.Sym)}) aux := s.lookupSymbol(n, &ssa.ExternSymbol{Sym: n.Sym.Linksym()})
v := s.entryNewValue1A(ssa.OpAddr, t, aux, s.sb) v := s.entryNewValue1A(ssa.OpAddr, t, aux, s.sb)
// TODO: Make OpAddr use AuxInt as well as Aux. // TODO: Make OpAddr use AuxInt as well as Aux.
if n.Xoffset != 0 { if n.Xoffset != 0 {
...@@ -4599,12 +4599,12 @@ func AddAux2(a *obj.Addr, v *ssa.Value, offset int64) { ...@@ -4599,12 +4599,12 @@ func AddAux2(a *obj.Addr, v *ssa.Value, offset int64) {
case *ssa.ArgSymbol: case *ssa.ArgSymbol:
n := sym.Node.(*Node) n := sym.Node.(*Node)
a.Name = obj.NAME_PARAM a.Name = obj.NAME_PARAM
a.Sym = Linksym(n.Orig.Sym) a.Sym = n.Orig.Sym.Linksym()
a.Offset += n.Xoffset a.Offset += n.Xoffset
case *ssa.AutoSymbol: case *ssa.AutoSymbol:
n := sym.Node.(*Node) n := sym.Node.(*Node)
a.Name = obj.NAME_AUTO a.Name = obj.NAME_AUTO
a.Sym = Linksym(n.Sym) a.Sym = n.Sym.Linksym()
a.Offset += n.Xoffset a.Offset += n.Xoffset
default: default:
v.Fatalf("aux in %s not implemented %#v", v, v.Aux) v.Fatalf("aux in %s not implemented %#v", v, v.Aux)
...@@ -4706,7 +4706,7 @@ func AutoVar(v *ssa.Value) (*Node, int64) { ...@@ -4706,7 +4706,7 @@ func AutoVar(v *ssa.Value) (*Node, int64) {
func AddrAuto(a *obj.Addr, v *ssa.Value) { func AddrAuto(a *obj.Addr, v *ssa.Value) {
n, off := AutoVar(v) n, off := AutoVar(v)
a.Type = obj.TYPE_MEM a.Type = obj.TYPE_MEM
a.Sym = Linksym(n.Sym) a.Sym = n.Sym.Linksym()
a.Reg = int16(thearch.REGSP) a.Reg = int16(thearch.REGSP)
a.Offset = n.Xoffset + off a.Offset = n.Xoffset + off
if n.Class == PPARAM || n.Class == PPARAMOUT { if n.Class == PPARAM || n.Class == PPARAMOUT {
...@@ -4722,7 +4722,7 @@ func (s *SSAGenState) AddrScratch(a *obj.Addr) { ...@@ -4722,7 +4722,7 @@ func (s *SSAGenState) AddrScratch(a *obj.Addr) {
} }
a.Type = obj.TYPE_MEM a.Type = obj.TYPE_MEM
a.Name = obj.NAME_AUTO a.Name = obj.NAME_AUTO
a.Sym = Linksym(s.ScratchFpMem.Sym) a.Sym = s.ScratchFpMem.Sym.Linksym()
a.Reg = int16(thearch.REGSP) a.Reg = int16(thearch.REGSP)
a.Offset = s.ScratchFpMem.Xoffset a.Offset = s.ScratchFpMem.Xoffset
} }
......
...@@ -510,11 +510,7 @@ func isblank(n *Node) bool { ...@@ -510,11 +510,7 @@ func isblank(n *Node) bool {
if n == nil { if n == nil {
return false return false
} }
return isblanksym(n.Sym) return n.Sym.IsBlank()
}
func isblanksym(s *types.Sym) bool {
return s != nil && s.Name == "_"
} }
// methtype returns the underlying type, if any, // methtype returns the underlying type, if any,
......
...@@ -901,7 +901,7 @@ OpSwitch: ...@@ -901,7 +901,7 @@ OpSwitch:
checkwidth(t) checkwidth(t)
} }
if isblanksym(n.Sym) { if n.Sym.IsBlank() {
yyerror("cannot refer to blank field or method") yyerror("cannot refer to blank field or method")
n.Type = nil n.Type = nil
return n return n
...@@ -2010,7 +2010,7 @@ OpSwitch: ...@@ -2010,7 +2010,7 @@ OpSwitch:
case OLABEL: case OLABEL:
ok |= Etop ok |= Etop
decldepth++ decldepth++
if isblanksym(n.Left.Sym) { if n.Left.Sym.IsBlank() {
// Empty identifier is valid but useless. // Empty identifier is valid but useless.
// Eliminate now to simplify life later. // Eliminate now to simplify life later.
// See issues 7538, 11589, 11593. // See issues 7538, 11589, 11593.
...@@ -3097,7 +3097,7 @@ func typecheckcomplit(n *Node) *Node { ...@@ -3097,7 +3097,7 @@ func typecheckcomplit(n *Node) *Node {
// the field to the right of the dot, // the field to the right of the dot,
// so s will be non-nil, but an OXDOT // so s will be non-nil, but an OXDOT
// is never a valid struct literal key. // is never a valid struct literal key.
if key.Sym == nil || key.Op == OXDOT || isblanksym(key.Sym) { if key.Sym == nil || key.Op == OXDOT || key.Sym.IsBlank() {
yyerror("invalid field name %v in struct initializer", key) yyerror("invalid field name %v in struct initializer", key)
l.Left = typecheck(l.Left, Erv) l.Left = typecheck(l.Left, Erv)
continue continue
......
...@@ -3202,7 +3202,7 @@ func walkcompare(n *Node, init *Nodes) *Node { ...@@ -3202,7 +3202,7 @@ func walkcompare(n *Node, init *Nodes) *Node {
if t.IsStruct() { if t.IsStruct() {
for _, f := range t.Fields().Slice() { for _, f := range t.Fields().Slice() {
sym := f.Sym sym := f.Sym
if isblanksym(sym) { if sym.IsBlank() {
continue continue
} }
compare( compare(
......
...@@ -45,7 +45,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog { ...@@ -45,7 +45,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog {
func zeroAuto(pp *gc.Progs, n *gc.Node) { func zeroAuto(pp *gc.Progs, n *gc.Node) {
// Note: this code must not clobber any registers. // Note: this code must not clobber any registers.
sym := gc.Linksym(n.Sym) sym := n.Sym.Linksym()
size := n.Type.Size() size := n.Type.Size()
for i := int64(0); i < size; i += 4 { for i := int64(0); i < size; i += 4 {
p := pp.Prog(mips.AMOVW) p := pp.Prog(mips.AMOVW)
......
...@@ -49,7 +49,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog { ...@@ -49,7 +49,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog {
func zeroAuto(pp *gc.Progs, n *gc.Node) { func zeroAuto(pp *gc.Progs, n *gc.Node) {
// Note: this code must not clobber any registers. // Note: this code must not clobber any registers.
sym := gc.Linksym(n.Sym) sym := n.Sym.Linksym()
size := n.Type.Size() size := n.Type.Size()
for i := int64(0); i < size; i += 8 { for i := int64(0); i < size; i += 8 {
p := pp.Prog(mips.AMOVV) p := pp.Prog(mips.AMOVV)
......
...@@ -44,7 +44,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog { ...@@ -44,7 +44,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog {
func zeroAuto(pp *gc.Progs, n *gc.Node) { func zeroAuto(pp *gc.Progs, n *gc.Node) {
// Note: this code must not clobber any registers. // Note: this code must not clobber any registers.
sym := gc.Linksym(n.Sym) sym := n.Sym.Linksym()
size := n.Type.Size() size := n.Type.Size()
for i := int64(0); i < size; i += 8 { for i := int64(0); i < size; i += 8 {
p := pp.Prog(ppc64.AMOVD) p := pp.Prog(ppc64.AMOVD)
......
...@@ -102,7 +102,7 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) { ...@@ -102,7 +102,7 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) {
p.To.Name = obj.NAME_AUTO p.To.Name = obj.NAME_AUTO
p.To.Reg = s390x.REGSP p.To.Reg = s390x.REGSP
p.To.Offset = n.Xoffset p.To.Offset = n.Xoffset
p.To.Sym = gc.Linksym(n.Sym) p.To.Sym = n.Sym.Linksym()
} }
func ginsnop(pp *gc.Progs) { func ginsnop(pp *gc.Progs) {
......
...@@ -59,3 +59,27 @@ func (sym *Sym) SetUniq(b bool) { sym.flags.set(symUniq, b) } ...@@ -59,3 +59,27 @@ func (sym *Sym) SetUniq(b bool) { sym.flags.set(symUniq, b) }
func (sym *Sym) SetSiggen(b bool) { sym.flags.set(symSiggen, b) } func (sym *Sym) SetSiggen(b bool) { sym.flags.set(symSiggen, b) }
func (sym *Sym) SetAsm(b bool) { sym.flags.set(symAsm, b) } func (sym *Sym) SetAsm(b bool) { sym.flags.set(symAsm, b) }
func (sym *Sym) SetAlgGen(b bool) { sym.flags.set(symAlgGen, b) } func (sym *Sym) SetAlgGen(b bool) { sym.flags.set(symAlgGen, b) }
func (sym *Sym) IsBlank() bool {
return sym != nil && sym.Name == "_"
}
func (sym *Sym) LinksymName() string {
if sym.IsBlank() {
return "_"
}
if sym.Linkname != "" {
return sym.Linkname
}
return sym.Pkg.Prefix + "." + sym.Name
}
func (sym *Sym) Linksym() *obj.LSym {
if sym == nil {
return nil
}
if sym.Lsym == nil {
sym.Lsym = Ctxt.Lookup(sym.LinksymName())
}
return sym.Lsym
}
...@@ -27,6 +27,7 @@ var ( ...@@ -27,6 +27,7 @@ var (
FormatType func(*Type, fmt.State, rune, int) // orig: func typeFormat(t *Type, s fmt.State, verb rune, mode fmtMode) FormatType func(*Type, fmt.State, rune, int) // orig: func typeFormat(t *Type, s fmt.State, verb rune, mode fmtMode)
FieldName func(*Field) string FieldName func(*Field) string
TypeLinkSym func(*Type) *obj.LSym TypeLinkSym func(*Type) *obj.LSym
Ctxt *obj.Link
FmtLeft int FmtLeft int
FmtUnsigned int FmtUnsigned int
......
...@@ -39,7 +39,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, ax *uint32) *obj.Prog ...@@ -39,7 +39,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, ax *uint32) *obj.Prog
func zeroAuto(pp *gc.Progs, n *gc.Node) { func zeroAuto(pp *gc.Progs, n *gc.Node) {
// Note: this code must not clobber any registers. // Note: this code must not clobber any registers.
sym := gc.Linksym(n.Sym) sym := n.Sym.Linksym()
size := n.Type.Size() size := n.Type.Size()
for i := int64(0); i < size; i += 4 { for i := int64(0); i < size; i += 4 {
p := pp.Prog(x86.AMOVL) p := pp.Prog(x86.AMOVL)
......
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