@@ -45,76 +45,6 @@ struct FuncInfo {
4545 std::unordered_set<HeapType> indirectCalledTypes;
4646};
4747
48- // Only funcs that are referenced may be the target of an indirect call. A
49- // function is referenced if:
50- // - It appears in a ref.func expression (this includes `elem` statements
51- // because of how our IR is represented).
52- // - It's exported, because it may flow back to us as a reference.
53- //
54- // If a function doesn't meet any of these criteria, it can't be the target of
55- // an indirect call and we don't need to include its effects in indirect calls.
56- std::unordered_set<Function*> getReferencedFuncs (Module& module ,
57- PassRunner& passRunner) {
58- struct AddressedFuncsWalker : WalkerPass<PostWalker<AddressedFuncsWalker>> {
59- // For each function, which functions are referenced in its body.
60- // The key for `nullptr` contains references that are not in a function
61- // (e.g. `elem` segments).
62- std::unordered_map<Function*, std::unordered_set<Function*>>&
63- allReferencedFuncs;
64- // Points to `allReferencedFuncs`.
65- std::unordered_set<Function*>* referencedFuncs = nullptr ;
66-
67- AddressedFuncsWalker (
68- std::unordered_map<Function*, std::unordered_set<Function*>>&
69- allReferencedFuncs)
70- : allReferencedFuncs(allReferencedFuncs),
71- referencedFuncs (&allReferencedFuncs[nullptr ]) {}
72-
73- std::unique_ptr<Pass> create () override {
74- return std::make_unique<AddressedFuncsWalker>(allReferencedFuncs);
75- }
76-
77- bool isFunctionParallel () override { return true ; }
78-
79- bool modifiesBinaryenIR () override { return false ; }
80-
81- void doWalkFunction (Function* func) {
82- referencedFuncs = &allReferencedFuncs.at (func);
83- walk (func->body );
84- }
85-
86- void visitRefFunc (RefFunc* refFunc) {
87- referencedFuncs->insert (getModule ()->getFunction (refFunc->func ));
88- }
89- };
90-
91- std::unordered_map<Function*, std::unordered_set<Function*>>
92- allReferencedFuncs;
93- for (auto & func : module .functions) {
94- allReferencedFuncs[func.get ()];
95- }
96-
97- AddressedFuncsWalker walker (allReferencedFuncs);
98- walker.run(&passRunner, &module );
99- walker.runOnModuleCode(&passRunner, &module );
100-
101- std::unordered_set<Function*> mergedReferencedFuncs;
102- for (auto & [_, referencedFuncs] : allReferencedFuncs) {
103- mergedReferencedFuncs.merge (referencedFuncs);
104- }
105-
106- for (const auto & export_ : module .exports) {
107- if (export_->kind != ExternalKind::Function) {
108- continue ;
109- }
110-
111- mergedReferencedFuncs.insert (
112- module .getFunction (*export_->getInternalName ()));
113- }
114-
115- return mergedReferencedFuncs;
116- }
117-
11848std::map<Function*, FuncInfo> analyzeFuncs (Module& module ,
11949 const PassOptions& passOptions) {
12050 ModuleUtils::ParallelFunctionAnalysis<FuncInfo> analysis (
@@ -456,7 +386,7 @@ struct GenerateGlobalEffects : public Pass {
456386 std::map<Function*, FuncInfo> funcInfos =
457387 analyzeFuncs (*module , getPassOptions ());
458388
459- auto referencedFuncs = getReferencedFuncs (*module , * getPassRunner () );
389+ auto referencedFuncs = ModuleUtils:: getReferencedFuncs (*module );
460390
461391 auto callGraph = buildCallGraph (
462392 *module , funcInfos, referencedFuncs, getPassOptions ().worldMode );
0 commit comments