#ifndef wasm_passes_pass_utils_h
#define wasm_passes_pass_utils_h
#include <unordered_set>
#include <pass.h>
#include <wasm.h>
namespace wasm::PassUtils {
using FuncSet = std::unordered_set<Function*>;
struct FilteredPass : public Pass {
std::unique_ptr<Pass> create() override {
return std::make_unique<FilteredPass>(pass->create(), relevantFuncs);
}
FilteredPass(std::unique_ptr<Pass>&& pass, const FuncSet& relevantFuncs)
: pass(std::move(pass)), relevantFuncs(relevantFuncs) {}
bool isFunctionParallel() override {
assert(pass->isFunctionParallel());
return true;
}
void runOnFunction(Module* module, Function* func) override {
if (!relevantFuncs.count(func)) {
return;
}
pass->setPassRunner(getPassRunner());
pass->runOnFunction(module, func);
}
bool modifiesBinaryenIR() override { return pass->modifiesBinaryenIR(); }
bool invalidatesDWARF() override { return pass->invalidatesDWARF(); }
bool addsEffects() override { return pass->addsEffects(); }
bool requiresNonNullableLocalFixups() override {
return pass->requiresNonNullableLocalFixups();
}
private:
std::unique_ptr<Pass> pass;
const FuncSet& relevantFuncs;
};
struct FilteredPassRunner : public PassRunner {
FilteredPassRunner(Module* wasm, const FuncSet& relevantFuncs)
: PassRunner(wasm), relevantFuncs(relevantFuncs) {}
FilteredPassRunner(Module* wasm,
const FuncSet& relevantFuncs,
const PassOptions& options)
: PassRunner(wasm, options), relevantFuncs(relevantFuncs) {}
protected:
void doAdd(std::unique_ptr<Pass> pass) override {
PassRunner::doAdd(
std::make_unique<FilteredPass>(std::move(pass), relevantFuncs));
}
private:
const FuncSet& relevantFuncs;
};
}
#endif