diff options
author | jgravelle-google <jgravelle@google.com> | 2016-10-18 11:01:21 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-10-18 11:01:21 -0700 |
commit | f94bbcdc60e7e435b15a2f95dfce465766e940a3 (patch) | |
tree | 1a1070ed35277fa510372ea53784505520cb1085 /src | |
parent | b9698cc7076390ae2bb937537850395ae7bad056 (diff) | |
download | binaryen-f94bbcdc60e7e435b15a2f95dfce465766e940a3.tar.gz binaryen-f94bbcdc60e7e435b15a2f95dfce465766e940a3.tar.bz2 binaryen-f94bbcdc60e7e435b15a2f95dfce465766e940a3.zip |
Minor improvements to the wasm-interpreter debug messages (#784)
* Minor improvements to the wasm-interpreter debug messages
1. Indent nested blocks for more readable structure (with numeric labels
to make it even clearer)
2. Print the names of the variables used for NOTE_EVALs
3. Print the values of arguments when entering a function call
* Move Indenter class to wasm-interpreter.cpp
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-interpreter.cpp | 24 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 51 |
2 files changed, 67 insertions, 8 deletions
diff --git a/src/wasm-interpreter.cpp b/src/wasm-interpreter.cpp new file mode 100644 index 000000000..e7df785ac --- /dev/null +++ b/src/wasm-interpreter.cpp @@ -0,0 +1,24 @@ +#include "wasm-interpreter.h" + +namespace wasm { + +#ifdef WASM_INTERPRETER_DEBUG +int Indenter::indentLevel = 0; + +Indenter::Indenter(const char* entry) : entryName(entry) { + ++indentLevel; +} +Indenter::~Indenter() { + print(); + std::cout << "exit " << entryName << '\n'; + --indentLevel; +} +void Indenter::print() { + std::cout << indentLevel << ':'; + for (int i = 0; i <= indentLevel; ++i) { + std::cout << ' '; + } +} +#endif // WASM_INTERPRETER_DEBUG + +} // namespace wasm diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 942ba1ab6..f2c75cbc1 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -28,6 +28,7 @@ #include "support/bits.h" #include "wasm.h" +#include "wasm-traversal.h" #ifdef WASM_INTERPRETER_DEBUG #include "wasm-printing.h" @@ -75,11 +76,33 @@ typedef std::vector<Literal> LiteralList; // Debugging helpers #ifdef WASM_INTERPRETER_DEBUG -#define NOTE_ENTER(x) { std::cout << "visit " << x << " : " << curr << "\n"; } -#define NOTE_ENTER_(x) { std::cout << "visit " << x << "\n"; } -#define NOTE_NAME(p0) { std::cout << "name " << '(' << Name(p0) << ")\n"; } -#define NOTE_EVAL1(p0) { std::cout << "eval " << '(' << p0 << ")\n"; } -#define NOTE_EVAL2(p0, p1) { std::cout << "eval " << '(' << p0 << ", " << p1 << ")\n"; } +class Indenter { + static int indentLevel; + + const char* entryName; + +public: + Indenter(const char* entry); + ~Indenter(); + + static void print(); +}; + +#define NOTE_ENTER(x) Indenter _int_blah(x); { \ + Indenter::print(); \ + std::cout << "visit " << x << " : " << curr << "\n"; } +#define NOTE_ENTER_(x) Indenter _int_blah(x); { \ + Indenter::print(); \ + std::cout << "visit " << x << "\n"; } +#define NOTE_NAME(p0) { \ + Indenter::print(); \ + std::cout << "name " << '(' << Name(p0) << ")\n"; } +#define NOTE_EVAL1(p0) { \ + Indenter::print(); \ + std::cout << "eval " #p0 " (" << p0 << ")\n"; } +#define NOTE_EVAL2(p0, p1) { \ + Indenter::print(); \ + std::cout << "eval " #p0 " (" << p0 << "), " #p1 " (" << p1 << ")\n"; } #else // WASM_INTERPRETER_DEBUG #define NOTE_ENTER(x) #define NOTE_ENTER_(x) @@ -725,7 +748,12 @@ public: NOTE_ENTER("Load"); Flow flow = visit(curr->ptr); if (flow.breaking()) return flow; - return instance.externalInterface->load(curr, instance.getFinalAddress(curr, flow.value)); + NOTE_EVAL1(flow); + auto addr = instance.getFinalAddress(curr, flow.value); + auto ret = instance.externalInterface->load(curr, addr); + NOTE_EVAL1(addr); + NOTE_EVAL1(ret); + return ret; } Flow visitStore(Store *curr) { NOTE_ENTER("Store"); @@ -733,7 +761,10 @@ public: if (ptr.breaking()) return ptr; Flow value = visit(curr->value); if (value.breaking()) return value; - instance.externalInterface->store(curr, instance.getFinalAddress(curr, ptr.value), value.value); + auto addr = instance.getFinalAddress(curr, ptr.value); + NOTE_EVAL1(addr); + NOTE_EVAL1(value); + instance.externalInterface->store(curr, addr, value.value); return Flow(); } @@ -781,7 +812,11 @@ public: FunctionScope scope(function, arguments); #ifdef WASM_INTERPRETER_DEBUG - std::cout << "entering " << function->name << '\n'; + std::cout << "entering " << function->name + << "\n with arguments:\n"; + for (unsigned i = 0; i < arguments.size(); ++i) { + std::cout << " $" << i << ": " << arguments[i] << '\n'; + } #endif Flow flow = RuntimeExpressionRunner(*this, scope).visit(function->body); |