diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/Strip.cpp | 34 | ||||
-rw-r--r-- | src/passes/pass.cpp | 4 | ||||
-rw-r--r-- | src/passes/passes.h | 3 | ||||
-rw-r--r-- | src/wasm-binary.h | 1 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 2 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 1 |
6 files changed, 32 insertions, 13 deletions
diff --git a/src/passes/Strip.cpp b/src/passes/Strip.cpp index d2ebbe129..8ab712cb1 100644 --- a/src/passes/Strip.cpp +++ b/src/passes/Strip.cpp @@ -15,10 +15,12 @@ */ // -// Similar to strip-ing a native binary, this removes debug info -// and related things like source map URLs, names section, etc. +// Similar to strip-ing a native binary, this family of passes can +// removes debug info and other things. // +#include <functional> + #include "wasm.h" #include "wasm-binary.h" #include "pass.h" @@ -28,6 +30,12 @@ using namespace std; namespace wasm { struct Strip : public Pass { + // A function that returns true if the method should be removed. + typedef std::function<bool (UserSection&)> Decider; + Decider decider; + + Strip(Decider decider) : decider(decider) {} + void run(PassRunner* runner, Module* module) override { // Remove name and debug sections. auto& sections = module->userSections; @@ -35,12 +43,7 @@ struct Strip : public Pass { std::remove_if( sections.begin(), sections.end(), - [&](const UserSection& curr) { - return curr.name == BinaryConsts::UserSections::Name || - curr.name == BinaryConsts::UserSections::SourceMapUrl || - curr.name.find(".debug") == 0 || - curr.name.find("reloc..debug") == 0; - } + decider ), sections.end() ); @@ -53,8 +56,19 @@ struct Strip : public Pass { } }; -Pass *createStripPass() { - return new Strip(); +Pass *createStripDebugPass() { + return new Strip([&](const UserSection& curr) { + return curr.name == BinaryConsts::UserSections::Name || + curr.name == BinaryConsts::UserSections::SourceMapUrl || + curr.name.find(".debug") == 0 || + curr.name.find("reloc..debug") == 0; + }); +} + +Pass *createStripProducersPass() { + return new Strip([&](const UserSection& curr) { + return curr.name == BinaryConsts::UserSections::Producers; + }); } } // namespace wasm diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index cae69860a..2872575c2 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -133,7 +133,9 @@ void PassRegistry::registerPasses() { registerPass("souperify-single-use", "emit Souper IR in text form (single-use nodes only)", createSouperifySingleUsePass); registerPass("spill-pointers", "spill pointers to the C stack (useful for Boehm-style GC)", createSpillPointersPass); registerPass("ssa", "ssa-ify variables so that they have a single assignment", createSSAifyPass); - registerPass("strip", "strip debug info (including the names section)", createStripPass); + registerPass("strip", "deprecated; same as strip-debug", createStripDebugPass); + registerPass("strip-debug", "strip debug info (including the names section)", createStripDebugPass); + registerPass("strip-producers", "strip the wasm producers section", createStripProducersPass); registerPass("trap-mode-clamp", "replace trapping operations with clamping semantics", createTrapModeClamp); registerPass("trap-mode-js", "replace trapping operations with js semantics", createTrapModeJS); registerPass("untee", "removes local.tees, replacing them with sets and gets", createUnteePass); diff --git a/src/passes/passes.h b/src/passes/passes.h index b04303429..15493f313 100644 --- a/src/passes/passes.h +++ b/src/passes/passes.h @@ -84,7 +84,8 @@ Pass* createSimplifyLocalsNoNestingPass(); Pass* createSimplifyLocalsNoTeePass(); Pass* createSimplifyLocalsNoStructurePass(); Pass* createSimplifyLocalsNoTeeNoStructurePass(); -Pass* createStripPass(); +Pass* createStripDebugPass(); +Pass* createStripProducersPass(); Pass* createSouperifyPass(); Pass* createSouperifySingleUsePass(); Pass* createSpillPointersPass(); diff --git a/src/wasm-binary.h b/src/wasm-binary.h index a5b1e10b4..2402375dc 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -344,6 +344,7 @@ extern const char* Name; extern const char* SourceMapUrl; extern const char* Dylink; extern const char* Linking; +extern const char* Producers; enum Subsection { NameFunction = 1, diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 187328e58..90a588bb9 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -719,7 +719,7 @@ void WasmBinaryBuilder::readUserSection(size_t payloadLen) { } else { // an unfamiliar custom section if (sectionName.equals(BinaryConsts::UserSections::Linking)) { - std::cerr << "warning: linking section is present, which binaryen cannot handle yet - relocations will be invalidated!\n"; + std::cerr << "warning: linking section is present, so this is not a standard wasm file - binaryen cannot handle this properly!\n"; } wasm.userSections.resize(wasm.userSections.size() + 1); auto& section = wasm.userSections.back(); diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index 757bc1828..0d5f3d5b5 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -31,6 +31,7 @@ const char* Name = "name"; const char* SourceMapUrl = "sourceMappingURL"; const char* Dylink = "dylink"; const char* Linking = "linking"; +const char* Producers = "producers"; } } |