mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.regabi] cmd/compile: separate exportsym more cleanly
Clean up a TODO (and make the package gc split easier) by moving the exportsym walk out of iexport proper. Also move exportsym call out of fninit. Change-Id: Ie5887a68d325f7154201f4a35b9b4be4bf4b48dd Reviewed-on: https://go-review.googlesource.com/c/go/+/279298 Trust: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
1a3b036b83
commit
85ce6ecfe3
4 changed files with 18 additions and 21 deletions
|
|
@ -27,21 +27,21 @@ func renameinit() *types.Sym {
|
|||
return s
|
||||
}
|
||||
|
||||
// fninit makes an initialization record for the package.
|
||||
// fninit makes and returns an initialization record for the package.
|
||||
// See runtime/proc.go:initTask for its layout.
|
||||
// The 3 tasks for initialization are:
|
||||
// 1) Initialize all of the packages the current package depends on.
|
||||
// 2) Initialize all the variables that have initializers.
|
||||
// 3) Run any init functions.
|
||||
func fninit(n []ir.Node) {
|
||||
nf := initOrder(n)
|
||||
func fninit() *ir.Name {
|
||||
nf := initOrder(Target.Decls)
|
||||
|
||||
var deps []*obj.LSym // initTask records for packages the current package depends on
|
||||
var fns []*obj.LSym // functions to call for package initialization
|
||||
|
||||
// Find imported packages with init tasks.
|
||||
for _, pkg := range Target.Imports {
|
||||
n := resolve(oldname(pkg.Lookup(".inittask")))
|
||||
n := resolve(ir.NewIdent(base.Pos, pkg.Lookup(".inittask")))
|
||||
if n.Op() == ir.ONONAME {
|
||||
continue
|
||||
}
|
||||
|
|
@ -92,16 +92,15 @@ func fninit(n []ir.Node) {
|
|||
}
|
||||
|
||||
if len(deps) == 0 && len(fns) == 0 && types.LocalPkg.Name != "main" && types.LocalPkg.Name != "runtime" {
|
||||
return // nothing to initialize
|
||||
return nil // nothing to initialize
|
||||
}
|
||||
|
||||
// Make an .inittask structure.
|
||||
sym := lookup(".inittask")
|
||||
nn := NewName(sym)
|
||||
nn.SetType(types.Types[types.TUINT8]) // fake type
|
||||
nn.SetClass(ir.PEXTERN)
|
||||
sym.Def = nn
|
||||
exportsym(nn)
|
||||
task := NewName(sym)
|
||||
task.SetType(types.Types[types.TUINT8]) // fake type
|
||||
task.SetClass(ir.PEXTERN)
|
||||
sym.Def = task
|
||||
lsym := sym.Linksym()
|
||||
ot := 0
|
||||
ot = duintptr(lsym, ot, 0) // state: not initialized yet
|
||||
|
|
@ -116,4 +115,5 @@ func fninit(n []ir.Node) {
|
|||
// An initTask has pointers, but none into the Go heap.
|
||||
// It's not quite read only, the state field must be modifiable.
|
||||
ggloblsym(lsym, int32(ot), obj.NOPTR)
|
||||
return task
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue