summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-09-13 16:58:03 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-09-13 16:58:03 -0700
commit6cb6d65dd0c19dc5cba43d9367bcbdf691f80df3 (patch)
tree4a9fa55575855cf132e8ee89472805a54696fb26
parent02e43255350e8d9336b658dfcfd73ed5696fbb58 (diff)
downloadbinaryen-6cb6d65dd0c19dc5cba43d9367bcbdf691f80df3.tar.gz
binaryen-6cb6d65dd0c19dc5cba43d9367bcbdf691f80df3.tar.bz2
binaryen-6cb6d65dd0c19dc5cba43d9367bcbdf691f80df3.zip
add ExtractFunction pass
-rw-r--r--src/passes/CMakeLists.txt1
-rw-r--r--src/passes/ExtractFunction.cpp46
-rw-r--r--src/passes/pass.cpp1
-rw-r--r--src/passes/passes.h1
4 files changed, 49 insertions, 0 deletions
diff --git a/src/passes/CMakeLists.txt b/src/passes/CMakeLists.txt
index 9e3cfbabb..30f63c880 100644
--- a/src/passes/CMakeLists.txt
+++ b/src/passes/CMakeLists.txt
@@ -3,6 +3,7 @@ SET(passes_SOURCES
CoalesceLocals.cpp
DeadCodeElimination.cpp
DuplicateFunctionElimination.cpp
+ ExtractFunction.cpp
MergeBlocks.cpp
Metrics.cpp
NameManager.cpp
diff --git a/src/passes/ExtractFunction.cpp b/src/passes/ExtractFunction.cpp
new file mode 100644
index 000000000..b342efc3b
--- /dev/null
+++ b/src/passes/ExtractFunction.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Removes code from all functions but one, leaving a valid module
+// with (mostly) just the code you want to debug (function-parallel,
+// non-lto) passes on.
+
+#include "wasm.h"
+#include "pass.h"
+
+namespace wasm {
+
+Name TO_LEAVE("_bytearray_join"); // TODO: commandline param
+
+struct ExtractFunction : public Pass {
+ void run(PassRunner* runner, Module* module) override {
+ for (auto& func : module->functions) {
+ if (func->name != TO_LEAVE) {
+ // wipe out the body
+ func->body = module->allocator.alloc<Unreachable>();
+ }
+ }
+ }
+};
+
+// declare pass
+
+Pass *createExtractFunctionPass() {
+ return new ExtractFunction();
+}
+
+} // namespace wasm
+
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index 49c614534..f3bc6d4c7 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -66,6 +66,7 @@ void PassRegistry::registerPasses() {
registerPass("coalesce-locals-learning", "reduce # of locals by coalescing and learning", createCoalesceLocalsWithLearningPass);
registerPass("dce", "removes unreachable code", createDeadCodeEliminationPass);
registerPass("duplicate-function-elimination", "removes duplicate functions", createDuplicateFunctionEliminationPass);
+ registerPass("extract-function", "leaves just one function (useful for debugging)", createExtractFunctionPass);
registerPass("merge-blocks", "merges blocks to their parents", createMergeBlocksPass);
registerPass("metrics", "reports metrics", createMetricsPass);
registerPass("nm", "name list", createNameListPass);
diff --git a/src/passes/passes.h b/src/passes/passes.h
index d2a0990c6..80fa394e1 100644
--- a/src/passes/passes.h
+++ b/src/passes/passes.h
@@ -26,6 +26,7 @@ Pass *createCoalesceLocalsPass();
Pass *createCoalesceLocalsWithLearningPass();
Pass *createDeadCodeEliminationPass();
Pass *createDuplicateFunctionEliminationPass();
+Pass *createExtractFunctionPass();
Pass *createLowerIfElsePass();
Pass *createMergeBlocksPass();
Pass *createMetricsPass();