aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/gc/init.go32
-rw-r--r--src/cmd/internal/objabi/funcid.go2
2 files changed, 31 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go
index ae87488075..e981f83653 100644
--- a/src/cmd/compile/internal/gc/init.go
+++ b/src/cmd/compile/internal/gc/init.go
@@ -57,6 +57,9 @@ func anyinit(n []*Node) bool {
// fninit hand-crafts package initialization code.
//
+// func init.ializers() { (0)
+// <init stmts>
+// }
// var initdone· uint8 (1)
// func init() { (2)
// if initdone· > 1 { (3)
@@ -68,7 +71,7 @@ func anyinit(n []*Node) bool {
// initdone· = 1 (5)
// // over all matching imported symbols
// <pkg>.init() (6)
-// { <init stmts> } (7)
+// init.ializers() (7)
// init.<n>() // if any (8)
// initdone· = 2 (9)
// return (10)
@@ -80,6 +83,27 @@ func fninit(n []*Node) {
return
}
+ // (0)
+ // Make a function that contains all the initialization statements.
+ // This is a separate function because we want it to appear in
+ // stack traces, where the init function itself does not.
+ var initializers *types.Sym
+ if len(nf) > 0 {
+ lineno = nf[0].Pos // prolog/epilog gets line number of first init stmt
+ initializers = lookup("init.ializers")
+ disableExport(initializers)
+ fn := dclfunc(initializers, nod(OTFUNC, nil, nil))
+ fn.Nbody.Set(nf)
+ funcbody()
+
+ fn = typecheck(fn, ctxStmt)
+ Curfn = fn
+ typecheckslice(nf, ctxStmt)
+ Curfn = nil
+ funccompile(fn)
+ lineno = autogeneratedPos
+ }
+
var r []*Node
// (1)
@@ -130,7 +154,11 @@ func fninit(n []*Node) {
}
// (7)
- r = append(r, nf...)
+ if initializers != nil {
+ n := newname(initializers)
+ addvar(n, functype(nil, nil, nil), PFUNC)
+ r = append(r, nod(OCALL, n, nil))
+ }
// (8)
diff --git a/src/cmd/internal/objabi/funcid.go b/src/cmd/internal/objabi/funcid.go
index 1792df7cc1..a30bc3fa05 100644
--- a/src/cmd/internal/objabi/funcid.go
+++ b/src/cmd/internal/objabi/funcid.go
@@ -83,7 +83,7 @@ func GetFuncID(name, file string) FuncID {
case "runtime.panicwrap":
return FuncID_panicwrap
}
- if file == "<autogenerated>" && !strings.HasSuffix(name, ".init") {
+ if file == "<autogenerated>" {
return FuncID_wrapper
}
if strings.HasPrefix(name, "runtime.call") {