summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-06-03 10:48:14 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-06-03 10:48:14 -0700
commitf0e79fc18be7013f43f79317836dc71d623c40d6 (patch)
treeea9ba4f6634fe6743f6fec93eb0daca557ae0e0e
parente2a6ee77c6acf518036259ca11c18e9abc834b19 (diff)
downloadbinaryen-f0e79fc18be7013f43f79317836dc71d623c40d6.tar.gz
binaryen-f0e79fc18be7013f43f79317836dc71d623c40d6.tar.bz2
binaryen-f0e79fc18be7013f43f79317836dc71d623c40d6.zip
add nm pass, that prints function names and sizes (#562)
-rw-r--r--src/ast_utils.h6
-rw-r--r--src/passes/CMakeLists.txt1
-rw-r--r--src/passes/NameList.cpp38
-rw-r--r--test/passes/nm.txt32
-rw-r--r--test/passes/nm.wast29
5 files changed, 103 insertions, 3 deletions
diff --git a/src/ast_utils.h b/src/ast_utils.h
index ee5c76b69..600abd1b6 100644
--- a/src/ast_utils.h
+++ b/src/ast_utils.h
@@ -169,16 +169,16 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer, Visitor<EffectAnalyzer
// Meausure the size of an AST
struct Measurer : public PostWalker<Measurer, UnifiedExpressionVisitor<Measurer>> {
- size_t size = 0;
+ Index size = 0;
void visitExpression(Expression* curr) {
size++;
}
- static bool measure(Expression* tree) {
+ static Index measure(Expression* tree) {
Measurer measurer;
measurer.walk(tree);
- return !!measurer.size;
+ return measurer.size;
}
};
diff --git a/src/passes/CMakeLists.txt b/src/passes/CMakeLists.txt
index ab55dff85..88d513407 100644
--- a/src/passes/CMakeLists.txt
+++ b/src/passes/CMakeLists.txt
@@ -8,6 +8,7 @@ SET(passes_SOURCES
MergeBlocks.cpp
Metrics.cpp
NameManager.cpp
+ NameList.cpp
OptimizeInstructions.cpp
PostEmscripten.cpp
Print.cpp
diff --git a/src/passes/NameList.cpp b/src/passes/NameList.cpp
new file mode 100644
index 000000000..ed0d1835a
--- /dev/null
+++ b/src/passes/NameList.cpp
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+//
+// Write out the name list of the module, similar to `nm`.
+//
+
+#include "wasm.h"
+#include "pass.h"
+#include "ast_utils.h"
+
+namespace wasm {
+
+struct NameList : public Pass {
+ void run(PassRunner* runner, Module* module) override {
+ for (auto& func : module->functions) {
+ std::cout << " " << func->name << " : " << Measurer::measure(func->body) << '\n';
+ }
+ }
+};
+
+static RegisterPass<NameList> registerPass("nm", "name list");
+
+} // namespace wasm
+
diff --git a/test/passes/nm.txt b/test/passes/nm.txt
new file mode 100644
index 000000000..99404c670
--- /dev/null
+++ b/test/passes/nm.txt
@@ -0,0 +1,32 @@
+ $a : 1
+ $b : 4
+ $c : 11
+(module
+ (memory 0)
+ (func $a
+ (nop)
+ )
+ (func $b
+ (loop $loop-out0 $loop-in1
+ (nop)
+ (i32.const 1000)
+ )
+ )
+ (func $c
+ (block $top
+ (nop)
+ (i32.const 1000)
+ (i32.add
+ (i32.add
+ (i32.const 1001)
+ (i32.const 1002)
+ )
+ (i32.add
+ (i32.const 1003)
+ (i32.const 1004)
+ )
+ )
+ (br $top)
+ )
+ )
+)
diff --git a/test/passes/nm.wast b/test/passes/nm.wast
new file mode 100644
index 000000000..72534e55d
--- /dev/null
+++ b/test/passes/nm.wast
@@ -0,0 +1,29 @@
+(module
+ (func $a
+ (nop)
+ )
+ (func $b
+ (loop
+ (nop)
+ (i32.const 1000)
+ )
+ )
+ (func $c
+ (block $top
+ (nop)
+ (i32.const 1000)
+ (i32.add
+ (i32.add
+ (i32.const 1001)
+ (i32.const 1002)
+ )
+ (i32.add
+ (i32.const 1003)
+ (i32.const 1004)
+ )
+ )
+ (br $top)
+ )
+ )
+)
+