mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: write type symbols referenced in ptabs
The exported symbol for a plugin can be the only reference to a type in a program. In particular, "var F func()" will have the type *func(), which is uncommon. Fixes #17140 Change-Id: Ide2104edbf087565f5377374057ae54e0c00c57e Reviewed-on: https://go-review.googlesource.com/29692 Run-TryBot: David Crawshaw <crawshaw@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
5ac3e7d6a7
commit
8eb9fdaa01
4 changed files with 21 additions and 1 deletions
|
|
@ -61,6 +61,15 @@ func main() {
|
|||
log.Fatalf("plugin.Open(%q) failed: %v", subpPath, err)
|
||||
}
|
||||
|
||||
funcVar, err := subp.Lookup("FuncVar")
|
||||
if err != nil {
|
||||
log.Fatalf(`sub/plugin1.Lookup("FuncVar") failed: %v`, err)
|
||||
}
|
||||
called := false
|
||||
*funcVar.(*func()) = func() {
|
||||
called = true
|
||||
}
|
||||
|
||||
readFunc, err = subp.Lookup("ReadCommonX")
|
||||
if err != nil {
|
||||
log.Fatalf(`sub/plugin1.Lookup("ReadCommonX") failed: %v`, err)
|
||||
|
|
@ -68,6 +77,9 @@ func main() {
|
|||
if got := readFunc.(func() int)(); got != wantX {
|
||||
log.Fatalf("sub/plugin1.ReadCommonX()=%d, want %d", got, wantX)
|
||||
}
|
||||
if !called {
|
||||
log.Fatal("calling ReadCommonX did not call FuncVar")
|
||||
}
|
||||
|
||||
subf, err := subp.Lookup("F")
|
||||
if err != nil {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ import "common"
|
|||
|
||||
func F() int { return 17 }
|
||||
|
||||
var FuncVar = func() {}
|
||||
|
||||
func ReadCommonX() int {
|
||||
FuncVar()
|
||||
return common.X
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1416,7 +1416,7 @@ func dumptypestructs() {
|
|||
// }
|
||||
nsym := dname(p.s.Name, "", nil, true)
|
||||
ot = dsymptrOffLSym(s, ot, nsym, 0)
|
||||
ot = dsymptrOffLSym(s, ot, Linksym(typesym(p.t)), 0)
|
||||
ot = dsymptrOffLSym(s, ot, Linksym(dtypesym(p.t)), 0)
|
||||
}
|
||||
ggloblLSym(s, int32(ot), int16(obj.RODATA))
|
||||
|
||||
|
|
|
|||
|
|
@ -290,6 +290,11 @@ func (d *deadcodepass) flood() {
|
|||
}
|
||||
|
||||
if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' {
|
||||
if len(s.P) == 0 {
|
||||
// Probably a bug. The undefined symbol check
|
||||
// later will give a better error than deadcode.
|
||||
continue
|
||||
}
|
||||
if decodetypeKind(s)&kindMask == kindInterface {
|
||||
for _, sig := range decodeIfaceMethods(d.ctxt.Arch, s) {
|
||||
if d.ctxt.Debugvlog > 1 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue