mirror of
https://github.com/golang/go
synced 2024-11-26 08:48:13 -07:00
[dev.regabi] cmd/compile: call NeedFuncSym in InitLSym
InitLSym is where we're now generating ABI wrappers, so it seems as good a place as any to make sure we're generating the degenerate closure wrappers for declared functions and methods. Change-Id: I097f34bbcee65dee87a97f9ed6f3f38e4cf2e2b5 Reviewed-on: https://go-review.googlesource.com/c/go/+/283312 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
95acd8121b
commit
cd5b74d2df
@ -20,7 +20,6 @@ import (
|
|||||||
"cmd/compile/internal/reflectdata"
|
"cmd/compile/internal/reflectdata"
|
||||||
"cmd/compile/internal/ssa"
|
"cmd/compile/internal/ssa"
|
||||||
"cmd/compile/internal/ssagen"
|
"cmd/compile/internal/ssagen"
|
||||||
"cmd/compile/internal/staticdata"
|
|
||||||
"cmd/compile/internal/typecheck"
|
"cmd/compile/internal/typecheck"
|
||||||
"cmd/compile/internal/types"
|
"cmd/compile/internal/types"
|
||||||
"cmd/compile/internal/walk"
|
"cmd/compile/internal/walk"
|
||||||
@ -194,7 +193,6 @@ func Main(archInit func(*ssagen.ArchInfo)) {
|
|||||||
|
|
||||||
typecheck.Target = new(ir.Package)
|
typecheck.Target = new(ir.Package)
|
||||||
|
|
||||||
typecheck.NeedFuncSym = staticdata.NeedFuncSym
|
|
||||||
typecheck.NeedITab = func(t, iface *types.Type) { reflectdata.ITabAddr(t, iface) }
|
typecheck.NeedITab = func(t, iface *types.Type) { reflectdata.ITabAddr(t, iface) }
|
||||||
typecheck.NeedRuntimeType = reflectdata.NeedRuntimeType // TODO(rsc): typenamesym for lock?
|
typecheck.NeedRuntimeType = reflectdata.NeedRuntimeType // TODO(rsc): typenamesym for lock?
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
"cmd/compile/internal/base"
|
"cmd/compile/internal/base"
|
||||||
"cmd/compile/internal/escape"
|
"cmd/compile/internal/escape"
|
||||||
"cmd/compile/internal/ir"
|
"cmd/compile/internal/ir"
|
||||||
|
"cmd/compile/internal/staticdata"
|
||||||
"cmd/compile/internal/typecheck"
|
"cmd/compile/internal/typecheck"
|
||||||
"cmd/compile/internal/types"
|
"cmd/compile/internal/types"
|
||||||
"cmd/internal/obj"
|
"cmd/internal/obj"
|
||||||
@ -137,6 +138,8 @@ func ReadSymABIs(file, myimportpath string) {
|
|||||||
// For body-less functions, we only create the LSym; for functions
|
// For body-less functions, we only create the LSym; for functions
|
||||||
// with bodies call a helper to setup up / populate the LSym.
|
// with bodies call a helper to setup up / populate the LSym.
|
||||||
func InitLSym(f *ir.Func, hasBody bool) {
|
func InitLSym(f *ir.Func, hasBody bool) {
|
||||||
|
staticdata.NeedFuncSym(f.Sym())
|
||||||
|
|
||||||
// FIXME: for new-style ABI wrappers, we set up the lsym at the
|
// FIXME: for new-style ABI wrappers, we set up the lsym at the
|
||||||
// point the wrapper is created.
|
// point the wrapper is created.
|
||||||
if f.LSym != nil && base.Flag.ABIWrap {
|
if f.LSym != nil && base.Flag.ABIWrap {
|
||||||
@ -152,7 +155,7 @@ func InitLSym(f *ir.Func, hasBody bool) {
|
|||||||
// makes calls to helpers to create ABI wrappers if needed.
|
// makes calls to helpers to create ABI wrappers if needed.
|
||||||
func selectLSym(f *ir.Func, hasBody bool) {
|
func selectLSym(f *ir.Func, hasBody bool) {
|
||||||
if f.LSym != nil {
|
if f.LSym != nil {
|
||||||
base.Fatalf("Func.initLSym called twice")
|
base.FatalfAt(f.Pos(), "Func.initLSym called twice on %v", f)
|
||||||
}
|
}
|
||||||
|
|
||||||
if nam := f.Nname; !ir.IsBlank(nam) {
|
if nam := f.Nname; !ir.IsBlank(nam) {
|
||||||
|
@ -265,7 +265,7 @@ func FuncLinksym(n *ir.Name) *obj.LSym {
|
|||||||
return FuncSym(n.Sym()).Linksym()
|
return FuncSym(n.Sym()).Linksym()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NeedFuncSym ensures that s·f is exported.
|
// NeedFuncSym ensures that s·f is exported, if needed.
|
||||||
// It is only used with -dynlink.
|
// It is only used with -dynlink.
|
||||||
// When not compiling for dynamic linking,
|
// When not compiling for dynamic linking,
|
||||||
// the funcsyms are created as needed by
|
// the funcsyms are created as needed by
|
||||||
@ -275,8 +275,13 @@ func FuncLinksym(n *ir.Name) *obj.LSym {
|
|||||||
// So instead, when dynamic linking, we only create
|
// So instead, when dynamic linking, we only create
|
||||||
// the s·f stubs in s's package.
|
// the s·f stubs in s's package.
|
||||||
func NeedFuncSym(s *types.Sym) {
|
func NeedFuncSym(s *types.Sym) {
|
||||||
|
if base.Ctxt.InParallel {
|
||||||
|
// The append below probably just needs to lock
|
||||||
|
// funcsymsmu, like in FuncSym.
|
||||||
|
base.Fatalf("NeedFuncSym must be called in serial")
|
||||||
|
}
|
||||||
if !base.Ctxt.Flag_dynlink {
|
if !base.Ctxt.Flag_dynlink {
|
||||||
base.Fatalf("NeedFuncSym: dynlink")
|
return
|
||||||
}
|
}
|
||||||
if s.IsBlank() {
|
if s.IsBlank() {
|
||||||
return
|
return
|
||||||
@ -287,9 +292,7 @@ func NeedFuncSym(s *types.Sym) {
|
|||||||
// get funcsyms.
|
// get funcsyms.
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, existed := s.Pkg.LookupOK(ir.FuncSymName(s)); !existed {
|
funcsyms = append(funcsyms, s)
|
||||||
funcsyms = append(funcsyms, s)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func WriteFuncSyms() {
|
func WriteFuncSyms() {
|
||||||
|
@ -364,10 +364,6 @@ func tcFunc(n *ir.Func) {
|
|||||||
n.Nname.SetSym(ir.MethodSym(rcvr.Type, n.Shortname))
|
n.Nname.SetSym(ir.MethodSym(rcvr.Type, n.Shortname))
|
||||||
Declare(n.Nname, ir.PFUNC)
|
Declare(n.Nname, ir.PFUNC)
|
||||||
}
|
}
|
||||||
|
|
||||||
if base.Ctxt.Flag_dynlink && !inimport && n.Nname != nil {
|
|
||||||
NeedFuncSym(n.Sym())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// tcCall typechecks an OCALL node.
|
// tcCall typechecks an OCALL node.
|
||||||
|
@ -24,7 +24,6 @@ var inimport bool // set during import
|
|||||||
var TypecheckAllowed bool
|
var TypecheckAllowed bool
|
||||||
|
|
||||||
var (
|
var (
|
||||||
NeedFuncSym = func(*types.Sym) {}
|
|
||||||
NeedITab = func(t, itype *types.Type) {}
|
NeedITab = func(t, itype *types.Type) {}
|
||||||
NeedRuntimeType = func(*types.Type) {}
|
NeedRuntimeType = func(*types.Type) {}
|
||||||
)
|
)
|
||||||
@ -1140,12 +1139,6 @@ func typecheckMethodExpr(n *ir.SelectorExpr) (res ir.Node) {
|
|||||||
n.SetOp(ir.OMETHEXPR)
|
n.SetOp(ir.OMETHEXPR)
|
||||||
n.Selection = m
|
n.Selection = m
|
||||||
n.SetType(NewMethodType(m.Type, n.X.Type()))
|
n.SetType(NewMethodType(m.Type, n.X.Type()))
|
||||||
|
|
||||||
// Issue 25065. Make sure that we emit the symbol for a local method.
|
|
||||||
if base.Ctxt.Flag_dynlink && !inimport && (t.Sym() == nil || t.Sym().Pkg == types.LocalPkg) {
|
|
||||||
NeedFuncSym(n.FuncName().Sym())
|
|
||||||
}
|
|
||||||
|
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user