summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/passes/Strip.cpp34
-rw-r--r--src/passes/pass.cpp4
-rw-r--r--src/passes/passes.h3
-rw-r--r--src/wasm-binary.h1
-rw-r--r--src/wasm/wasm-binary.cpp2
-rw-r--r--src/wasm/wasm.cpp1
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";
}
}