package depBase
+import (
+ "os"
+ "reflect"
+)
+
var V int = 1
var HasMask []string = []string{"hi"}
}
func (d *Dep) Method() int {
+ // This code below causes various go.itab.* symbols to be generated in
+ // the shared library. Similar code in ../exe/exe.go results in
+ // exercising https://github.com/golang/go/issues/17594
+ reflect.TypeOf(os.Stdout).Elem()
return 10
}
import (
"depBase"
+ "os"
+ "reflect"
"runtime"
)
func main() {
defer depBase.ImplementedInAsm()
+ // This code below causes various go.itab.* symbols to be generated in
+ // the executable. Similar code in ../depBase/dep.go results in
+ // exercising https://github.com/golang/go/issues/17594
+ reflect.TypeOf(os.Stdout).Elem()
runtime.GC()
depBase.V = depBase.F() + 1
}
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))
+ ggloblsym(i.sym, int32(o), int16(obj.DUPOK|obj.NOPTR|obj.LOCAL))
ilink := Pkglookup(i.t.tconv(FmtLeft)+","+i.itype.tconv(FmtLeft), itablinkpkg)
dsymptr(ilink, 0, i.sym, 0)
- ggloblsym(ilink, int32(Widthptr), int16(obj.DUPOK|obj.RODATA))
+ ggloblsym(ilink, int32(Widthptr), int16(obj.DUPOK|obj.RODATA|obj.LOCAL))
}
// process ptabs
throw("invalid itab locking")
}
h := itabhash(inter, typ)
+ if m == hash[h] {
+ println("duplicate itab for", typ.string(), "and", inter.typ.string())
+ throw("duplicate itabs")
+ }
m.link = hash[h]
atomicstorep(unsafe.Pointer(&hash[h]), unsafe.Pointer(m))
}