summaryrefslogtreecommitdiff
path: root/src/passes/Metrics.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-27 19:23:27 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-27 19:23:27 -0800
commit6f0e64113c98dec8fa32270b7c7556ce266190a3 (patch)
tree704c4217b8353ecd9dbcbed31ca2b9290f912940 /src/passes/Metrics.cpp
parent9effac86e9679d723f17d999d233f5b15ce61094 (diff)
parent54c77ff7c48d250a1a5b0aa2a262689fa8184d78 (diff)
downloadbinaryen-6f0e64113c98dec8fa32270b7c7556ce266190a3.tar.gz
binaryen-6f0e64113c98dec8fa32270b7c7556ce266190a3.tar.bz2
binaryen-6f0e64113c98dec8fa32270b7c7556ce266190a3.zip
Merge pull request #147 from mbebenita/metrics
Adds a --metrics command line argument.
Diffstat (limited to 'src/passes/Metrics.cpp')
-rw-r--r--src/passes/Metrics.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/passes/Metrics.cpp b/src/passes/Metrics.cpp
new file mode 100644
index 000000000..3624786a4
--- /dev/null
+++ b/src/passes/Metrics.cpp
@@ -0,0 +1,69 @@
+/*
+ * 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.
+ */
+
+#include <iomanip>
+#include <pass.h>
+#include <wasm.h>
+
+namespace wasm {
+
+using namespace std;
+
+// Prints metrics between optimization passes.
+struct Metrics : public WalkerPass<WasmWalker<Metrics>> {
+ static Metrics *lastMetricsPass;
+
+ map<const char *, int> counts;
+ void walk(Expression *&curr) override {
+ WalkerPass::walk(curr);
+ if (!curr)
+ return;
+ auto name = getExpressionName(curr);
+ counts[name]++;
+ }
+ void finalize(PassRunner *runner, Module *module) override {
+ ostream &o = cout;
+ o << "Counts"
+ << "\n";
+ for (auto i = counts.cbegin(); i != counts.cend(); i++) {
+ o << " " << left << setw(15) << i->first << ": " << setw(8)
+ << i->second;
+ if (lastMetricsPass) {
+ if (lastMetricsPass->counts.count(i->first)) {
+ int before = lastMetricsPass->counts[i->first];
+ int after = i->second;
+ if (after - before) {
+ if (after > before) {
+ Colors::red(o);
+ } else {
+ Colors::green(o);
+ }
+ o << right << setw(8);
+ o << showpos << after - before << noshowpos;
+ Colors::normal(o);
+ }
+ }
+ }
+ o << "\n";
+ }
+ lastMetricsPass = this;
+ }
+};
+
+Metrics *Metrics::lastMetricsPass;
+static RegisterPass<Metrics> registerPass("metrics", "reports metrics");
+
+} // namespace wasm