for _, s := range funcsyms {
sf := s.Pkg.Lookup(funcsymname(s))
- dsymptr(sf, 0, s, 0)
+ dsymptrLSym(sf.Linksym(), 0, s.Linksym(), 0)
ggloblsym(sf, int32(Widthptr), obj.DUPOK|obj.RODATA)
}
}
}
-func duintxx(s *types.Sym, off int, v uint64, wid int) int {
- return duintxxLSym(s.Linksym(), off, v, wid)
-}
-
func duintxxLSym(s *obj.LSym, off int, v uint64, wid int) int {
if s.Type == 0 {
// TODO(josharian): Do this in obj.prepwrite instead.
return off + wid
}
-func duint8(s *types.Sym, off int, v uint8) int {
- return duintxx(s, off, uint64(v), 1)
-}
-
-func duint16(s *types.Sym, off int, v uint16) int {
- return duintxx(s, off, uint64(v), 2)
-}
-
-func duint32(s *types.Sym, off int, v uint32) int {
- return duintxx(s, off, uint64(v), 4)
-}
-
-func duintptr(s *types.Sym, off int, v uint64) int {
- return duintxx(s, off, v, Widthptr)
-}
-
func duint8LSym(s *obj.LSym, off int, v uint8) int {
return duintxxLSym(s, off, uint64(v), 1)
}
+func duint16LSym(s *obj.LSym, off int, v uint16) int {
+ return duintxxLSym(s, off, uint64(v), 2)
+}
+
func duint32LSym(s *obj.LSym, off int, v uint32) int {
return duintxxLSym(s, off, uint64(v), 4)
}
+func duintptrLSym(s *obj.LSym, off int, v uint64) int {
+ return duintxxLSym(s, off, v, Widthptr)
+}
+
func dbvecLSym(s *obj.LSym, off int, bv bvec) int {
// Runtime reads the bitmaps as byte arrays. Oblige.
for j := 0; int32(j) < bv.n; j += 8 {
sym := localpkg.Lookup(symname)
sym.Def = asTypesNode(newname(sym))
- off := dsname(sym, 0, s)
+ off := dsnameLSym(sym.Linksym(), 0, s)
ggloblsym(sym, int32(off), obj.NOPTR|obj.LOCAL)
if nam.Op != ONAME {
Fatalf("slicebytes %v", nam)
}
off = int(nam.Xoffset)
- off = dsymptr(nam.Sym, off, sym, 0)
- off = duintxx(nam.Sym, off, uint64(len), Widthint)
- duintxx(nam.Sym, off, uint64(len), Widthint)
-}
-
-func dsname(s *types.Sym, off int, t string) int {
- return dsnameLSym(s.Linksym(), off, t)
+ off = dsymptrLSym(nam.Sym.Linksym(), off, sym.Linksym(), 0)
+ off = duintxxLSym(nam.Sym.Linksym(), off, uint64(len), Widthint)
+ duintxxLSym(nam.Sym.Linksym(), off, uint64(len), Widthint)
}
func dsnameLSym(s *obj.LSym, off int, t string) int {
return off + len(t)
}
-func dsymptr(s *types.Sym, off int, x *types.Sym, xoff int) int {
- return dsymptrLSym(s.Linksym(), off, x.Linksym(), xoff)
-}
-
func dsymptrLSym(s *obj.LSym, off int, x *obj.LSym, xoff int) int {
off = int(Rnd(int64(off), int64(Widthptr)))
s.WriteAddr(Ctxt, int64(off), Widthptr, x, int64(xoff))
Fatalf("methods are too far away on %v: %d", t, dataAdd)
}
- ot = duint16(s, ot, uint16(mcount))
- ot = duint16(s, ot, 0)
- ot = duint32(s, ot, uint32(dataAdd))
- ot = duint32(s, ot, 0)
+ ot = duint16LSym(s.Linksym(), ot, uint16(mcount))
+ ot = duint16LSym(s.Linksym(), ot, 0)
+ ot = duint32LSym(s.Linksym(), ot, uint32(dataAdd))
+ ot = duint32LSym(s.Linksym(), ot, 0)
return ot
}
// str nameOff
// ptrToThis typeOff
// }
- ot = duintptr(s, ot, uint64(t.Width))
- ot = duintptr(s, ot, uint64(ptrdata))
+ ot = duintptrLSym(s.Linksym(), ot, uint64(t.Width))
+ ot = duintptrLSym(s.Linksym(), ot, uint64(ptrdata))
- ot = duint32(s, ot, typehash(t))
+ ot = duint32LSym(s.Linksym(), ot, typehash(t))
var tflag uint8
if uncommonSize(t) != 0 {
}
}
- ot = duint8(s, ot, tflag)
+ ot = duint8LSym(s.Linksym(), ot, tflag)
// runtime (and common sense) expects alignment to be a power of two.
i := int(t.Align)
if i&(i-1) != 0 {
Fatalf("invalid alignment %d for %v", t.Align, t)
}
- ot = duint8(s, ot, t.Align) // align
- ot = duint8(s, ot, t.Align) // fieldAlign
+ ot = duint8LSym(s.Linksym(), ot, t.Align) // align
+ ot = duint8LSym(s.Linksym(), ot, t.Align) // fieldAlign
i = kinds[t.Etype]
if !types.Haspointers(t) {
if useGCProg {
i |= objabi.KindGCProg
}
- ot = duint8(s, ot, uint8(i)) // kind
+ ot = duint8LSym(s.Linksym(), ot, uint8(i)) // kind
if algsym == nil {
- ot = dsymptr(s, ot, dcommontype_algarray, int(alg)*sizeofAlg)
+ ot = dsymptrLSym(s.Linksym(), ot, dcommontype_algarray.Linksym(), int(alg)*sizeofAlg)
} else {
- ot = dsymptr(s, ot, algsym, 0)
+ ot = dsymptrLSym(s.Linksym(), ot, algsym.Linksym(), 0)
}
- ot = dsymptr(s, ot, gcsym, 0) // gcdata
+ ot = dsymptrLSym(s.Linksym(), ot, gcsym.Linksym(), 0) // gcdata
nsym := dname(p, "", nil, exported)
ot = dsymptrOffLSym(s.Linksym(), ot, nsym, 0) // str
// ptrToThis
if sptr == nil {
- ot = duint32(s, ot, 0)
+ ot = duint32LSym(s.Linksym(), ot, 0)
} else if sptrWeak {
ot = dsymptrWeakOffLSym(s.Linksym(), ot, sptr.Linksym())
} else {
t2 := types.NewSlice(t.Elem())
s2 := dtypesym(t2)
ot = dcommontype(s, ot, t)
- ot = dsymptr(s, ot, s1, 0)
- ot = dsymptr(s, ot, s2, 0)
- ot = duintptr(s, ot, uint64(t.NumElem()))
+ ot = dsymptrLSym(s.Linksym(), ot, s1.Linksym(), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, s2.Linksym(), 0)
+ ot = duintptrLSym(s.Linksym(), ot, uint64(t.NumElem()))
ot = dextratype(s, ot, t, 0)
case TSLICE:
// ../../../../runtime/type.go:/sliceType
s1 := dtypesym(t.Elem())
ot = dcommontype(s, ot, t)
- ot = dsymptr(s, ot, s1, 0)
+ ot = dsymptrLSym(s.Linksym(), ot, s1.Linksym(), 0)
ot = dextratype(s, ot, t, 0)
case TCHAN:
// ../../../../runtime/type.go:/chanType
s1 := dtypesym(t.Elem())
ot = dcommontype(s, ot, t)
- ot = dsymptr(s, ot, s1, 0)
- ot = duintptr(s, ot, uint64(t.ChanDir()))
+ ot = dsymptrLSym(s.Linksym(), ot, s1.Linksym(), 0)
+ ot = duintptrLSym(s.Linksym(), ot, uint64(t.ChanDir()))
ot = dextratype(s, ot, t, 0)
case TFUNC:
if isddd {
outCount |= 1 << 15
}
- ot = duint16(s, ot, uint16(inCount))
- ot = duint16(s, ot, uint16(outCount))
+ ot = duint16LSym(s.Linksym(), ot, uint16(inCount))
+ ot = duint16LSym(s.Linksym(), ot, uint16(outCount))
if Widthptr == 8 {
ot += 4 // align for *rtype
}
// Array of rtype pointers follows funcType.
for _, t1 := range t.Recvs().Fields().Slice() {
- ot = dsymptr(s, ot, dtypesym(t1.Type), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, dtypesym(t1.Type).Linksym(), 0)
}
for _, t1 := range t.Params().Fields().Slice() {
- ot = dsymptr(s, ot, dtypesym(t1.Type), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, dtypesym(t1.Type).Linksym(), 0)
}
for _, t1 := range t.Results().Fields().Slice() {
- ot = dsymptr(s, ot, dtypesym(t1.Type), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, dtypesym(t1.Type).Linksym(), 0)
}
case TINTER:
}
ot = dgopkgpath(s, ot, tpkg)
- ot = dsymptr(s, ot, s, ot+Widthptr+2*Widthint+uncommonSize(t))
- ot = duintxx(s, ot, uint64(n), Widthint)
- ot = duintxx(s, ot, uint64(n), Widthint)
+ ot = dsymptrLSym(s.Linksym(), ot, s.Linksym(), ot+Widthptr+2*Widthint+uncommonSize(t))
+ ot = duintxxLSym(s.Linksym(), ot, uint64(n), Widthint)
+ ot = duintxxLSym(s.Linksym(), ot, uint64(n), Widthint)
dataAdd := imethodSize() * n
ot = dextratype(s, ot, t, dataAdd)
s3 := dtypesym(mapbucket(t))
s4 := dtypesym(hmap(t))
ot = dcommontype(s, ot, t)
- ot = dsymptr(s, ot, s1, 0)
- ot = dsymptr(s, ot, s2, 0)
- ot = dsymptr(s, ot, s3, 0)
- ot = dsymptr(s, ot, s4, 0)
+ ot = dsymptrLSym(s.Linksym(), ot, s1.Linksym(), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, s2.Linksym(), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, s3.Linksym(), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, s4.Linksym(), 0)
if t.Key().Width > MAXKEYSIZE {
- ot = duint8(s, ot, uint8(Widthptr))
- ot = duint8(s, ot, 1) // indirect
+ ot = duint8LSym(s.Linksym(), ot, uint8(Widthptr))
+ ot = duint8LSym(s.Linksym(), ot, 1) // indirect
} else {
- ot = duint8(s, ot, uint8(t.Key().Width))
- ot = duint8(s, ot, 0) // not indirect
+ ot = duint8LSym(s.Linksym(), ot, uint8(t.Key().Width))
+ ot = duint8LSym(s.Linksym(), ot, 0) // not indirect
}
if t.Val().Width > MAXVALSIZE {
- ot = duint8(s, ot, uint8(Widthptr))
- ot = duint8(s, ot, 1) // indirect
+ ot = duint8LSym(s.Linksym(), ot, uint8(Widthptr))
+ ot = duint8LSym(s.Linksym(), ot, 1) // indirect
} else {
- ot = duint8(s, ot, uint8(t.Val().Width))
- ot = duint8(s, ot, 0) // not indirect
+ ot = duint8LSym(s.Linksym(), ot, uint8(t.Val().Width))
+ ot = duint8LSym(s.Linksym(), ot, 0) // not indirect
}
- ot = duint16(s, ot, uint16(mapbucket(t).Width))
- ot = duint8(s, ot, uint8(obj.Bool2int(isreflexive(t.Key()))))
- ot = duint8(s, ot, uint8(obj.Bool2int(needkeyupdate(t.Key()))))
+ ot = duint16LSym(s.Linksym(), ot, uint16(mapbucket(t).Width))
+ ot = duint8LSym(s.Linksym(), ot, uint8(obj.Bool2int(isreflexive(t.Key()))))
+ ot = duint8LSym(s.Linksym(), ot, uint8(obj.Bool2int(needkeyupdate(t.Key()))))
ot = dextratype(s, ot, t, 0)
case TPTR32, TPTR64:
s1 := dtypesym(t.Elem())
ot = dcommontype(s, ot, t)
- ot = dsymptr(s, ot, s1, 0)
+ ot = dsymptrLSym(s.Linksym(), ot, s1.Linksym(), 0)
ot = dextratype(s, ot, t, 0)
// ../../../../runtime/type.go:/structType
}
}
ot = dgopkgpath(s, ot, pkg)
- ot = dsymptr(s, ot, s, ot+Widthptr+2*Widthint+uncommonSize(t))
- ot = duintxx(s, ot, uint64(n), Widthint)
- ot = duintxx(s, ot, uint64(n), Widthint)
+ ot = dsymptrLSym(s.Linksym(), ot, s.Linksym(), ot+Widthptr+2*Widthint+uncommonSize(t))
+ ot = duintxxLSym(s.Linksym(), ot, uint64(n), Widthint)
+ ot = duintxxLSym(s.Linksym(), ot, uint64(n), Widthint)
dataAdd := n * structfieldSize()
ot = dextratype(s, ot, t, dataAdd)
for _, f := range t.Fields().Slice() {
// ../../../../runtime/type.go:/structField
ot = dnameField(s, ot, pkg, f)
- ot = dsymptr(s, ot, dtypesym(f.Type), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, dtypesym(f.Type).Linksym(), 0)
offsetAnon := uint64(f.Offset) << 1
if offsetAnon>>1 != uint64(f.Offset) {
Fatalf("%v: bad field offset for %s", t, f.Sym.Name)
if f.Embedded != 0 {
offsetAnon |= 1
}
- ot = duintptr(s, ot, offsetAnon)
+ ot = duintptrLSym(s.Linksym(), ot, offsetAnon)
}
}
// unused [2]byte
// fun [1]uintptr // variable sized
// }
- o := dsymptr(i.sym, 0, dtypesym(i.itype), 0)
- o = dsymptr(i.sym, o, dtypesym(i.t), 0)
- o += Widthptr // skip link field
- o = duint32(i.sym, o, typehash(i.t)) // copy of type hash
- o += 4 // skip bad/inhash/unused fields
- o += len(imethods(i.itype)) * Widthptr // skip fun method pointers
+ o := dsymptrLSym(i.sym.Linksym(), 0, dtypesym(i.itype).Linksym(), 0)
+ o = dsymptrLSym(i.sym.Linksym(), o, dtypesym(i.t).Linksym(), 0)
+ o += Widthptr // skip link field
+ o = duint32LSym(i.sym.Linksym(), o, typehash(i.t)) // copy of type hash
+ o += 4 // skip bad/inhash/unused fields
+ o += len(imethods(i.itype)) * Widthptr // skip fun method pointers
// at runtime the itab will contain pointers to types, other itabs and
// method functions. None are allocated on heap, so we can use obj.NOPTR.
ggloblsym(i.sym, int32(o), int16(obj.DUPOK|obj.NOPTR))
ilink := itablinkpkg.Lookup(i.t.ShortString() + "," + i.itype.ShortString())
- dsymptr(ilink, 0, i.sym, 0)
+ dsymptrLSym(ilink.Linksym(), 0, i.sym.Linksym(), 0)
ggloblsym(ilink, int32(Widthptr), int16(obj.DUPOK|obj.RODATA))
}
hashfunc = types.TypePkgLookup(p)
ot := 0
- ot = dsymptr(hashfunc, ot, Runtimepkg.Lookup("memhash_varlen"), 0)
- ot = duintxx(hashfunc, ot, uint64(t.Width), Widthptr) // size encoded in closure
+ ot = dsymptrLSym(hashfunc.Linksym(), ot, Runtimepkg.Lookup("memhash_varlen").Linksym(), 0)
+ ot = duintxxLSym(hashfunc.Linksym(), ot, uint64(t.Width), Widthptr) // size encoded in closure
ggloblsym(hashfunc, int32(ot), obj.DUPOK|obj.RODATA)
// make equality closure
eqfunc = types.TypePkgLookup(p)
ot = 0
- ot = dsymptr(eqfunc, ot, Runtimepkg.Lookup("memequal_varlen"), 0)
- ot = duintxx(eqfunc, ot, uint64(t.Width), Widthptr)
+ ot = dsymptrLSym(eqfunc.Linksym(), ot, Runtimepkg.Lookup("memequal_varlen").Linksym(), 0)
+ ot = duintxxLSym(eqfunc.Linksym(), ot, uint64(t.Width), Widthptr)
ggloblsym(eqfunc, int32(ot), obj.DUPOK|obj.RODATA)
} else {
// generate an alg table specific to this type
geneq(eq, t)
// make Go funcs (closures) for calling hash and equal from Go
- dsymptr(hashfunc, 0, hash, 0)
+ dsymptrLSym(hashfunc.Linksym(), 0, hash.Linksym(), 0)
ggloblsym(hashfunc, int32(Widthptr), obj.DUPOK|obj.RODATA)
- dsymptr(eqfunc, 0, eq, 0)
+ dsymptrLSym(eqfunc.Linksym(), 0, eq.Linksym(), 0)
ggloblsym(eqfunc, int32(Widthptr), obj.DUPOK|obj.RODATA)
}
// ../../../../runtime/alg.go:/typeAlg
ot := 0
- ot = dsymptr(s, ot, hashfunc, 0)
- ot = dsymptr(s, ot, eqfunc, 0)
+ ot = dsymptrLSym(s.Linksym(), ot, hashfunc.Linksym(), 0)
+ ot = dsymptrLSym(s.Linksym(), ot, eqfunc.Linksym(), 0)
ggloblsym(s, int32(ot), obj.DUPOK|obj.RODATA)
return s
}
if !sym.Uniq() {
sym.SetUniq(true)
for i, x := range ptrmask {
- duint8(sym, i, x)
+ duint8LSym(sym.Linksym(), i, x)
}
ggloblsym(sym, int32(len(ptrmask)), obj.DUPOK|obj.RODATA|obj.LOCAL)
}
}
func (p *GCProg) writeByte(x byte) {
- p.symoff = duint8(p.sym, p.symoff, x)
+ p.symoff = duint8LSym(p.sym.Linksym(), p.symoff, x)
}
func (p *GCProg) end() {
p.w.End()
- duint32(p.sym, 0, uint32(p.symoff-4))
+ duint32LSym(p.sym.Linksym(), 0, uint32(p.symoff-4))
ggloblsym(p.sym, int32(p.symoff), obj.DUPOK|obj.RODATA|obj.LOCAL)
if Debug_gcprog > 0 {
fmt.Fprintf(os.Stderr, "compile: end GCProg for %v\n", p.sym)