summaryrefslogtreecommitdiff
path: root/src/asm2wasm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/asm2wasm.h')
-rw-r--r--src/asm2wasm.h33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 4ee09aca5..f6b6da43d 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -973,7 +973,8 @@ void Asm2WasmBuilder::processAsm(Ref ast) {
wasm.table.initial = wasm.table.max = 0;
- // first pass - do almost everything, but function imports and indirect calls
+ // first pass - do all global things, aside from function bodies (second pass)
+ // and function imports and indirect calls (last pass)
for (unsigned i = 1; i < body->size(); i++) {
Ref curr = body[i];
@@ -1108,17 +1109,6 @@ void Asm2WasmBuilder::processAsm(Ref ast) {
abort_on("invalid var element", pair);
}
}
- } else if (curr[0] == DEFUN) {
- // function
- auto* func = processFunction(curr);
- if (wasm.getFunctionOrNull(func->name)) {
- Fatal() << "duplicate function: " << func->name;
- }
- if (runOptimizationPasses) {
- optimizingBuilder->addFunction(func);
- } else {
- wasm.addFunction(func);
- }
} else if (curr[0] == RETURN) {
// exports
Ref object = curr[1];
@@ -1173,6 +1163,23 @@ void Asm2WasmBuilder::processAsm(Ref ast) {
}
}
+ // second pass: function bodies
+ for (unsigned i = 1; i < body->size(); i++) {
+ Ref curr = body[i];
+ if (curr[0] == DEFUN) {
+ // function
+ auto* func = processFunction(curr);
+ if (wasm.getFunctionOrNull(func->name)) {
+ Fatal() << "duplicate function: " << func->name;
+ }
+ if (runOptimizationPasses) {
+ optimizingBuilder->addFunction(func);
+ } else {
+ wasm.addFunction(func);
+ }
+ }
+ }
+
if (runOptimizationPasses) {
optimizingBuilder->finish();
// if we added any helper functions (like non-trapping i32-div, etc.), then those
@@ -1191,7 +1198,7 @@ void Asm2WasmBuilder::processAsm(Ref ast) {
}
wasm.debugInfoFileNames = std::move(preprocessor.debugInfoFileNames);
- // second pass. first, function imports
+ // third pass. first, function imports
std::vector<IString> toErase;