summaryrefslogtreecommitdiff
path: root/src/passes/Print.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/Print.cpp')
-rw-r--r--src/passes/Print.cpp133
1 files changed, 83 insertions, 50 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 77562af4b..3ab1cc75d 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -109,10 +109,6 @@ struct PrintExpressionContents : public Visitor<PrintExpressionContents> {
printMedium(o, "call ");
printName(curr->target, o);
}
- void visitCallImport(CallImport* curr) {
- printMedium(o, "call ");
- printName(curr->target, o);
- }
void visitCallIndirect(CallIndirect* curr) {
printMedium(o, "call_indirect (type ") << curr->fullType << ')';
}
@@ -478,6 +474,7 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
}
void decIndent() {
if (!minify) {
+ assert(indent > 0);
indent--;
doIndent(o, indent);
}
@@ -636,11 +633,6 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
PrintExpressionContents(currFunction, o).visit(curr);
printCallOperands(curr);
}
- void visitCallImport(CallImport* curr) {
- o << '(';
- PrintExpressionContents(currFunction, o).visit(curr);
- printCallOperands(curr);
- }
void visitCallIndirect(CallIndirect* curr) {
o << '(';
PrintExpressionContents(currFunction, o).visit(curr);
@@ -818,20 +810,6 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
}
o << ")";
}
- void visitImport(Import* curr) {
- o << '(';
- printMedium(o, "import ");
- printText(o, curr->module.str) << ' ';
- printText(o, curr->base.str) << ' ';
- switch (curr->kind) {
- case ExternalKind::Function: if (curr->functionType.is()) visitFunctionType(currModule->getFunctionType(curr->functionType), &curr->name); break;
- case ExternalKind::Table: printTableHeader(&currModule->table); break;
- case ExternalKind::Memory: printMemoryHeader(&currModule->memory); break;
- case ExternalKind::Global: o << "(global " << curr->name << ' ' << printType(curr->globalType) << ")"; break;
- default: WASM_UNREACHABLE();
- }
- o << ')';
- }
void visitExport(Export* curr) {
o << '(';
printMedium(o, "export ");
@@ -846,19 +824,66 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
o << ' ';
printName(curr->value, o) << "))";
}
+ void emitImportHeader(Importable* curr) {
+ printMedium(o, "import ");
+ printText(o, curr->module.str) << ' ';
+ printText(o, curr->base.str) << ' ';
+ }
void visitGlobal(Global* curr) {
- o << '(';
- printMedium(o, "global ");
- printName(curr->name, o) << ' ';
+ if (curr->imported()) {
+ visitImportedGlobal(curr);
+ } else {
+ visitDefinedGlobal(curr);
+ }
+ }
+ void emitGlobalType(Global* curr) {
if (curr->mutable_) {
- o << "(mut " << printType(curr->type) << ") ";
+ o << "(mut " << printType(curr->type) << ')';
} else {
- o << printType(curr->type) << ' ';
+ o << printType(curr->type);
}
+ }
+ void visitImportedGlobal(Global* curr) {
+ doIndent(o, indent);
+ o << '(';
+ emitImportHeader(curr);
+ o << "(global ";
+ printName(curr->name, o) << ' ';
+ emitGlobalType(curr);
+ o << "))" << maybeNewLine;
+ }
+ void visitDefinedGlobal(Global* curr) {
+ doIndent(o, indent);
+ o << '(';
+ printMedium(o, "global ");
+ printName(curr->name, o) << ' ';
+ emitGlobalType(curr);
+ o << ' ';
visit(curr->init);
o << ')';
+ o << maybeNewLine;
}
void visitFunction(Function* curr) {
+ if (curr->imported()) {
+ visitImportedFunction(curr);
+ } else {
+ visitDefinedFunction(curr);
+ }
+ }
+ void visitImportedFunction(Function* curr) {
+ doIndent(o, indent);
+ currFunction = curr;
+ lastPrintedLocation = { 0, 0, 0 };
+ o << '(';
+ emitImportHeader(curr);
+ if (curr->type.is()) {
+ visitFunctionType(currModule->getFunctionType(curr->type), &curr->name);
+ }
+ o << ')';
+ o << maybeNewLine;
+ }
+ void visitDefinedFunction(Function* curr) {
+ doIndent(o, indent);
currFunction = curr;
lastPrintedLocation = { 0, 0, 0 };
if (currFunction->prologLocation.size()) {
@@ -927,6 +952,7 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
} else {
decIndent();
}
+ o << maybeNewLine;
}
void printTableHeader(Table* curr) {
o << '(';
@@ -937,8 +963,13 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
}
void visitTable(Table* curr) {
if (!curr->exists) return;
- // if table wasn't imported, declare it
- if (!curr->imported) {
+ if (curr->imported()) {
+ doIndent(o, indent);
+ o << '(';
+ emitImportHeader(curr);
+ printTableHeader(&currModule->table);
+ o << ')' << maybeNewLine;
+ } else {
doIndent(o, indent);
printTableHeader(curr);
o << maybeNewLine;
@@ -954,7 +985,7 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
o << ' ';
printName(name, o);
}
- o << ")\n";
+ o << ')' << maybeNewLine;
}
}
void printMemoryHeader(Memory* curr) {
@@ -972,8 +1003,13 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
}
void visitMemory(Memory* curr) {
if (!curr->exists) return;
- // if memory wasn't imported, declare it
- if (!curr->imported) {
+ if (curr->imported()) {
+ doIndent(o, indent);
+ o << '(';
+ emitImportHeader(curr);
+ printMemoryHeader(&currModule->memory);
+ o << ')' << maybeNewLine;
+ } else {
doIndent(o, indent);
printMemoryHeader(curr);
o << '\n';
@@ -1004,7 +1040,7 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
}
}
}
- o << "\")\n";
+ o << "\")" << maybeNewLine;
}
}
void visitModule(Module* curr) {
@@ -1020,20 +1056,19 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
visitFunctionType(child.get());
o << ")" << maybeNewLine;
}
- for (auto& child : curr->imports) {
- doIndent(o, indent);
- visitImport(child.get());
- o << maybeNewLine;
- }
- for (auto& child : curr->globals) {
- doIndent(o, indent);
- visitGlobal(child.get());
- o << maybeNewLine;
- }
+ visitMemory(&curr->memory);
if (curr->table.exists) {
visitTable(&curr->table); // Prints its own newlines
}
- visitMemory(&curr->memory);
+ ModuleUtils::iterImportedGlobals(*curr, [&](Global* global) {
+ visitGlobal(global);
+ });
+ ModuleUtils::iterImportedFunctions(*curr, [&](Function* func) {
+ visitFunction(func);
+ });
+ ModuleUtils::iterDefinedGlobals(*curr, [&](Global* global) {
+ visitGlobal(global);
+ });
for (auto& child : curr->exports) {
doIndent(o, indent);
visitExport(child.get());
@@ -1045,11 +1080,9 @@ struct PrintSExpression : public Visitor<PrintSExpression> {
printMedium(o, "start") << ' ' << curr->start << ')';
o << maybeNewLine;
}
- for (auto& child : curr->functions) {
- doIndent(o, indent);
- visitFunction(child.get());
- o << maybeNewLine;
- }
+ ModuleUtils::iterDefinedFunctions(*curr, [&](Function* func) {
+ visitFunction(func);
+ });
for (auto& section : curr->userSections) {
doIndent(o, indent);
o << ";; custom section \"" << section.name << "\", size " << section.data.size();