| #include "analysis/cfg.h" |
| #include "support/colors.h" |
| #include "wasm-s-parser.h" |
| #include "wasm.h" |
| #include "gtest/gtest.h" |
| |
| using namespace wasm; |
| using namespace wasm::analysis; |
| |
| TEST(CFGTest, Print) { |
| auto moduleText = R"wasm( |
| (module |
| (func $foo |
| (drop |
| (i32.const 0) |
| ) |
| (drop |
| (if (result i32) |
| (i32.const 1) |
| (block |
| (loop $loop |
| (br_if $loop |
| (i32.const 2) |
| ) |
| ) |
| (i32.const 3) |
| ) |
| (return |
| (i32.const 4) |
| ) |
| ) |
| ) |
| ) |
| ) |
| )wasm"; |
| |
| auto cfgText = R"cfg(;; preds: [], succs: [1, 5] |
| 0: |
| 0: i32.const 0 |
| 1: drop |
| 2: i32.const 1 |
| |
| ;; preds: [0], succs: [2] |
| 1: |
| |
| ;; preds: [1, 2], succs: [3, 2] |
| 2: |
| 3: i32.const 2 |
| 4: br_if $loop |
| |
| ;; preds: [2], succs: [4] |
| 3: |
| 5: loop $loop |
| |
| ;; preds: [3], succs: [6] |
| 4: |
| 6: i32.const 3 |
| 7: block |
| |
| ;; preds: [0], succs: [] |
| 5: |
| 8: i32.const 4 |
| 9: return |
| |
| ;; preds: [4], succs: [] |
| 6: |
| 10: drop |
| 11: block |
| )cfg"; |
| |
| Module wasm; |
| SExpressionParser parser(moduleText); |
| SExpressionWasmBuilder builder(wasm, *(*parser.root)[0], IRProfile::Normal); |
| |
| CFG cfg = CFG::fromFunction(wasm.getFunction("foo")); |
| |
| bool colors = Colors::isEnabled(); |
| Colors::setEnabled(false); |
| std::stringstream ss; |
| cfg.print(ss); |
| Colors::setEnabled(colors); |
| |
| EXPECT_EQ(ss.str(), cfgText); |
| } |