@@ -60,6 +60,26 @@ func mainPackages(pkgs []*ssa.Package) ([]*ssa.Package, error) {
60
60
return mains , nil
61
61
}
62
62
63
+ // initFuncs returns all package init functions
64
+ func initFuncs (pkgs []* ssa.Package ) ([]* ssa.Function , error ) {
65
+ var inits []* ssa.Function
66
+ for _ , p := range pkgs {
67
+ if p == nil {
68
+ continue
69
+ }
70
+ for name , member := range p .Members {
71
+ fun , ok := member .(* ssa.Function )
72
+ if ! ok {
73
+ continue
74
+ }
75
+ if name == "init" || strings .HasPrefix (name , "init#" ) {
76
+ inits = append (inits , fun )
77
+ }
78
+ }
79
+ }
80
+ return inits , nil
81
+ }
82
+
63
83
//==[ type def/func: analysis ]===============================================
64
84
type analysis struct {
65
85
opts * renderOpts
@@ -119,6 +139,15 @@ func (a *analysis) DoAnalysis(
119
139
for _ , main := range mains {
120
140
roots = append (roots , main .Func ("main" ))
121
141
}
142
+
143
+ inits , err := initFuncs (prog .AllPackages ())
144
+ if err != nil {
145
+ return err
146
+ }
147
+ for _ , init := range inits {
148
+ roots = append (roots , init )
149
+ }
150
+
122
151
graph = rta .Analyze (roots , true ).CallGraph
123
152
case CallGraphTypePointer :
124
153
mains , err := mainPackages (prog .AllPackages ())
0 commit comments