diff options
Diffstat (limited to 'src/passes/Print.cpp')
-rw-r--r-- | src/passes/Print.cpp | 56 |
1 files changed, 40 insertions, 16 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 056b61939..8e3d503b8 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -26,17 +26,27 @@ namespace wasm { struct PrintSExpression : public WasmVisitor<PrintSExpression, void> { std::ostream& o; - unsigned indent; + unsigned indent = 0; + bool minify; const char *maybeSpace; const char *maybeNewLine; - PrintSExpression(std::ostream& o, bool minify = false) - : o(o), indent(0), minify(minify) { + bool fullAST = false; // whether to not elide nodes in output when possible + // (like implicit blocks) + + PrintSExpression(std::ostream& o) : o(o) { + setMinify(false); + } + + void setMinify(bool minify_) { + minify = minify_; maybeSpace = minify ? "" : " "; maybeNewLine = minify ? "" : "\n"; } + void setFullAST(bool fullAST_) { fullAST = fullAST_; } + void incIndent() { if (minify) return; o << '\n'; @@ -95,13 +105,13 @@ struct PrintSExpression : public WasmVisitor<PrintSExpression, void> { incIndent(); printFullLine(curr->condition); // ifTrue and False have implict blocks, avoid printing them if possible - if (curr->ifTrue->is<Block>() && curr->ifTrue->dyn_cast<Block>()->name.isNull() && curr->ifTrue->dyn_cast<Block>()->list.size() == 1) { + if (!fullAST && curr->ifTrue->is<Block>() && curr->ifTrue->dyn_cast<Block>()->name.isNull() && curr->ifTrue->dyn_cast<Block>()->list.size() == 1) { printFullLine(curr->ifTrue->dyn_cast<Block>()->list.back()); } else { printFullLine(curr->ifTrue); } if (curr->ifFalse) { - if (curr->ifFalse->is<Block>() && curr->ifFalse->dyn_cast<Block>()->name.isNull() && curr->ifFalse->dyn_cast<Block>()->list.size() == 1) { + if (!fullAST && curr->ifFalse->is<Block>() && curr->ifFalse->dyn_cast<Block>()->name.isNull() && curr->ifFalse->dyn_cast<Block>()->list.size() == 1) { printFullLine(curr->ifFalse->dyn_cast<Block>()->list.back()); } else { printFullLine(curr->ifFalse); @@ -120,7 +130,7 @@ struct PrintSExpression : public WasmVisitor<PrintSExpression, void> { } incIndent(); auto block = curr->body->dyn_cast<Block>(); - if (block && block->name.isNull()) { + if (!fullAST && block && block->name.isNull()) { // wasm spec has loops containing children directly, while our ast // has a single child for simplicity. print out the optimal form. for (auto expression : block->list) { @@ -435,7 +445,7 @@ struct PrintSExpression : public WasmVisitor<PrintSExpression, void> { } // It is ok to emit a block here, as a function can directly contain a list, even if our // ast avoids that for simplicity. We can just do that optimization here.. - if (curr->body->is<Block>() && curr->body->cast<Block>()->name.isNull()) { + if (!fullAST && curr->body->is<Block>() && curr->body->cast<Block>()->name.isNull()) { Block* block = curr->body->cast<Block>(); for (auto item : block->list) { printFullLine(item); @@ -526,8 +536,6 @@ struct PrintSExpression : public WasmVisitor<PrintSExpression, void> { } }; -// Pass entry point. Eventually this will direct printing to one of various options. - void Printer::run(PassRunner* runner, Module* module) { PrintSExpression print(o); print.visitModule(module); @@ -536,26 +544,42 @@ void Printer::run(PassRunner* runner, Module* module) { static RegisterPass<Printer> registerPass("print", "print in s-expression format"); // Prints out a minified module + class MinifiedPrinter : public Printer { public: MinifiedPrinter() : Printer() {} MinifiedPrinter(std::ostream& o) : Printer(o) {} - void run(PassRunner* runner, Module* module) override; + void run(PassRunner* runner, Module* module) override { + PrintSExpression print(o); + print.setMinify(true); + print.visitModule(module); + } }; -void MinifiedPrinter::run(PassRunner* runner, Module* module) { - PrintSExpression print(o, true); - print.visitModule(module); -} +static RegisterPass<MinifiedPrinter> registerMinifyPass("print-minified", "print in minified s-expression format"); +// Prints out a module withough elision, i.e., the full ast -static RegisterPass<MinifiedPrinter> registerMinifyPass("print-minified", "print in minified s-expression format"); +class FullPrinter : public Printer { + public: + FullPrinter() : Printer() {} + FullPrinter(std::ostream& o) : Printer(o) {} + + void run(PassRunner* runner, Module* module) override { + PrintSExpression print(o); + print.setFullAST(true); + print.visitModule(module); + } +}; + +static RegisterPass<FullPrinter> registerFullASTPass("print-full", "print in full s-expression format"); // Print individual expressions std::ostream& WasmPrinter::printExpression(Expression* expression, std::ostream& o, bool minify) { - PrintSExpression print(o, minify); + PrintSExpression print(o); + print.setMinify(minify); print.visit(expression); return o; } |