/* * 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 #include #include #include namespace wasm { using namespace std; // Prints metrics between optimization passes. struct Metrics : public WalkerPass> { static Metrics *lastMetricsPass; map 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"; vector keys; int total = 0; for (auto i : counts) { keys.push_back(i.first); total += i.second; } sort(keys.begin(), keys.end(), [](const char* a, const char* b) -> bool { return strcmp(b, a) > 0; }); for (auto* key : keys) { auto value = counts[key]; o << " " << left << setw(15) << key << ": " << setw(8) << value; if (lastMetricsPass) { if (lastMetricsPass->counts.count(key)) { int before = lastMetricsPass->counts[key]; int after = value; 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"; } o << left << setw(16) << "Total" << ": " << setw(8) << total << '\n'; lastMetricsPass = this; } }; Metrics *Metrics::lastMetricsPass; static RegisterPass registerPass("metrics", "reports metrics"); } // namespace wasm