...
Source file src/pkg/cmd/compile/internal/gc/init.go
1
2
3
4
5 package gc
6
7 import (
8 "cmd/compile/internal/types"
9 "cmd/internal/obj"
10 )
11
12
13
14
15
16 var renameinitgen int
17
18
19 var dummyInitFn = nod(ODCLFUNC, nil, nil)
20
21 func renameinit() *types.Sym {
22 s := lookupN("init.", renameinitgen)
23 renameinitgen++
24 return s
25 }
26
27
28
29
30
31
32
33 func fninit(n []*Node) {
34 nf := initOrder(n)
35
36 var deps []*obj.LSym
37 var fns []*obj.LSym
38
39
40 for _, s := range types.InitSyms {
41 deps = append(deps, s.Linksym())
42 }
43
44
45 if len(nf) > 0 {
46 lineno = nf[0].Pos
47 initializers := lookup("init")
48 disableExport(initializers)
49 fn := dclfunc(initializers, nod(OTFUNC, nil, nil))
50 for _, dcl := range dummyInitFn.Func.Dcl {
51 dcl.Name.Curfn = fn
52 }
53 fn.Func.Dcl = append(fn.Func.Dcl, dummyInitFn.Func.Dcl...)
54 dummyInitFn.Func.Dcl = nil
55
56 fn.Nbody.Set(nf)
57 funcbody()
58
59 fn = typecheck(fn, ctxStmt)
60 Curfn = fn
61 typecheckslice(nf, ctxStmt)
62 Curfn = nil
63 funccompile(fn)
64 fns = append(fns, initializers.Linksym())
65 }
66 if dummyInitFn.Func.Dcl != nil {
67
68
69
70 Fatalf("dummyInitFn still has declarations")
71 }
72
73
74 for i := 0; i < renameinitgen; i++ {
75 s := lookupN("init.", i)
76 fns = append(fns, s.Linksym())
77 }
78
79 if len(deps) == 0 && len(fns) == 0 && localpkg.Name != "main" && localpkg.Name != "runtime" {
80 return
81 }
82
83
84 sym := lookup(".inittask")
85 nn := newname(sym)
86 nn.Type = types.Types[TUINT8]
87 nn.SetClass(PEXTERN)
88 sym.Def = asTypesNode(nn)
89 exportsym(nn)
90 lsym := sym.Linksym()
91 ot := 0
92 ot = duintptr(lsym, ot, 0)
93 ot = duintptr(lsym, ot, uint64(len(deps)))
94 ot = duintptr(lsym, ot, uint64(len(fns)))
95 for _, d := range deps {
96 ot = dsymptr(lsym, ot, d, 0)
97 }
98 for _, f := range fns {
99 ot = dsymptr(lsym, ot, f, 0)
100 }
101
102
103 ggloblsym(lsym, int32(ot), obj.NOPTR)
104 }
105
106 func (n *Node) checkInitFuncSignature() {
107 if n.Type.NumRecvs()+n.Type.NumParams()+n.Type.NumResults() > 0 {
108 Fatalf("init function cannot have receiver, params, or results: %v (%v)", n, n.Type)
109 }
110 }
111
View as plain text