Commit 8eb9fdaa authored by David Crawshaw's avatar David Crawshaw

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: 's avatarRuss Cox <rsc@golang.org>
parent 5ac3e7d6
...@@ -61,6 +61,15 @@ func main() { ...@@ -61,6 +61,15 @@ func main() {
log.Fatalf("plugin.Open(%q) failed: %v", subpPath, err) 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") readFunc, err = subp.Lookup("ReadCommonX")
if err != nil { if err != nil {
log.Fatalf(`sub/plugin1.Lookup("ReadCommonX") failed: %v`, err) log.Fatalf(`sub/plugin1.Lookup("ReadCommonX") failed: %v`, err)
...@@ -68,6 +77,9 @@ func main() { ...@@ -68,6 +77,9 @@ func main() {
if got := readFunc.(func() int)(); got != wantX { if got := readFunc.(func() int)(); got != wantX {
log.Fatalf("sub/plugin1.ReadCommonX()=%d, want %d", 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") subf, err := subp.Lookup("F")
if err != nil { if err != nil {
......
...@@ -11,7 +11,10 @@ import "common" ...@@ -11,7 +11,10 @@ import "common"
func F() int { return 17 } func F() int { return 17 }
var FuncVar = func() {}
func ReadCommonX() int { func ReadCommonX() int {
FuncVar()
return common.X return common.X
} }
......
...@@ -1416,7 +1416,7 @@ func dumptypestructs() { ...@@ -1416,7 +1416,7 @@ 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(typesym(p.t)), 0) ot = dsymptrOffLSym(s, ot, Linksym(dtypesym(p.t)), 0)
} }
ggloblLSym(s, int32(ot), int16(obj.RODATA)) ggloblLSym(s, int32(ot), int16(obj.RODATA))
......
...@@ -290,6 +290,11 @@ func (d *deadcodepass) flood() { ...@@ -290,6 +290,11 @@ func (d *deadcodepass) flood() {
} }
if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' { 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 { if decodetypeKind(s)&kindMask == kindInterface {
for _, sig := range decodeIfaceMethods(d.ctxt.Arch, s) { for _, sig := range decodeIfaceMethods(d.ctxt.Arch, s) {
if d.ctxt.Debugvlog > 1 { if d.ctxt.Debugvlog > 1 {
......
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