summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pass.h16
-rw-r--r--src/passes/pass.cpp30
-rw-r--r--src/tools/wasm-opt.cpp2
3 files changed, 42 insertions, 6 deletions
diff --git a/src/pass.h b/src/pass.h
index dd7c67bc1..0be45e2d1 100644
--- a/src/pass.h
+++ b/src/pass.h
@@ -256,10 +256,20 @@ struct PassRunner {
// 3: like 1, and also dumps out byn-* files for each pass as it is run.
static int getPassDebug();
-protected:
- bool isNested = false;
+ // Returns whether a pass by that name will remove debug info.
+ static bool passRemovesDebugInfo(const std::string& name);
private:
+ // Whether this is a nested pass runner.
+ bool isNested = false;
+
+ // Whether the passes we have added so far to be run (but not necessarily run
+ // yet) have removed DWARF.
+ bool addedPassesRemovedDWARF = false;
+
+ // Whether this pass runner has run. A pass runner should only be run once.
+ bool ran = false;
+
void doAdd(std::unique_ptr<Pass> pass);
void runPass(Pass* pass);
@@ -272,6 +282,8 @@ private:
// If a function is passed, we operate just on that function;
// otherwise, the whole module.
void handleAfterEffects(Pass* pass, Function* func = nullptr);
+
+ bool shouldPreserveDWARF();
};
//
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index 260bc761b..89b367272 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -386,8 +386,7 @@ void PassRegistry::registerPasses() {
void PassRunner::addIfNoDWARFIssues(std::string passName) {
auto pass = PassRegistry::get()->createPass(passName);
- if (!pass->invalidatesDWARF() ||
- !Debug::shouldPreserveDWARF(options, *wasm)) {
+ if (!pass->invalidatesDWARF() || !shouldPreserveDWARF()) {
doAdd(std::move(pass));
}
}
@@ -533,6 +532,9 @@ static void dumpWast(Name name, Module* wasm) {
}
void PassRunner::run() {
+ assert(!ran);
+ ran = true;
+
static const int passDebug = getPassDebug();
// Emit logging information when asked for. At passDebug level 1+ we log
// the main passes, while in 2 we also log nested ones. Note that for
@@ -670,10 +672,13 @@ void PassRunner::runOnFunction(Function* func) {
}
void PassRunner::doAdd(std::unique_ptr<Pass> pass) {
- if (Debug::shouldPreserveDWARF(options, *wasm) && pass->invalidatesDWARF()) {
+ if (pass->invalidatesDWARF() && shouldPreserveDWARF()) {
std::cerr << "warning: running pass '" << pass->name
<< "' which is not fully compatible with DWARF\n";
}
+ if (passRemovesDebugInfo(pass->name)) {
+ addedPassesRemovedDWARF = true;
+ }
passes.emplace_back(std::move(pass));
}
@@ -820,4 +825,23 @@ int PassRunner::getPassDebug() {
return passDebug;
}
+bool PassRunner::passRemovesDebugInfo(const std::string& name) {
+ return name == "strip" || name == "strip-debug" || name == "strip-dwarf";
+}
+
+bool PassRunner::shouldPreserveDWARF() {
+ // Check if the debugging subsystem wants to preserve DWARF.
+ if (!Debug::shouldPreserveDWARF(options, *wasm)) {
+ return false;
+ }
+
+ // We may need DWARF. Check if one of our previous passes would remove it
+ // anyhow, in which case, there is nothing to preserve.
+ if (addedPassesRemovedDWARF) {
+ return false;
+ }
+
+ return true;
+}
+
} // namespace wasm
diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp
index 8884619fe..45d394162 100644
--- a/src/tools/wasm-opt.cpp
+++ b/src/tools/wasm-opt.cpp
@@ -61,7 +61,7 @@ static std::string runCommand(std::string command) {
static bool willRemoveDebugInfo(const std::vector<std::string>& passes) {
for (auto& pass : passes) {
- if (pass == "strip" || pass == "strip-debug" || pass == "strip-dwarf") {
+ if (PassRunner::passRemovesDebugInfo(pass)) {
return true;
}
}