diff options
-rw-r--r-- | src/s2wasm.h | 24 | ||||
-rw-r--r-- | test/dot_s/initializers.s | 11 | ||||
-rw-r--r-- | test/dot_s/initializers.wast | 6 |
3 files changed, 28 insertions, 13 deletions
diff --git a/src/s2wasm.h b/src/s2wasm.h index d0dbe8c6a..2da99281c 100644 --- a/src/s2wasm.h +++ b/src/s2wasm.h @@ -480,24 +480,28 @@ class S2WasmBuilder { void parseToplevelSection() { auto section = getCommaSeparated(); // Initializers are anything in a section whose name begins with .init_array - if (!strncmp(section.c_str(), ".init_array", strlen(".init_array") - 1)) parseInitializer(); + if (!strncmp(section.c_str(), ".init_array", strlen(".init_array") - 1)) { + parseInitializer(); + return; + } s = strchr(s, '\n'); } void parseInitializer() { // Ignore the rest of the .section line s = strchr(s, '\n'); - while (*s) { + skipWhitespace(); + // The section may start with .p2align + if (match(".p2align")) { + s = strchr(s, '\n'); skipWhitespace(); - if (match(".p2align")) s = strchr(s, '\n'); - else if (match(".int32")) { - initializerFunctions.emplace_back(cleanFunction(getStr())); - assert(implementedFunctions.count(initializerFunctions.back())); - break; - } else { - abort_on("parseInitializer"); - } } + mustMatch(".int32"); + do { + initializerFunctions.emplace_back(cleanFunction(getStr())); + assert(implementedFunctions.count(initializerFunctions.back())); + skipWhitespace(); + } while (match(".int32")); } void parseText() { diff --git a/test/dot_s/initializers.s b/test/dot_s/initializers.s index ed4ad1cff..2bd4f1215 100644 --- a/test/dot_s/initializers.s +++ b/test/dot_s/initializers.s @@ -9,15 +9,22 @@ main: # @main return $pop0 .Lfunc_end0: .size main, .Lfunc_end0-main + .globl f1 + .type f1,@function +f1: + return +.Lfunc_end1: + .size f1, .Lfunc_end1-f1 .globl f2 .type f2,@function f2: return -.Lfunc_end1: - .size f2, .Lfunc_end1-f2 +.Lfunc_end2: + .size f2, .Lfunc_end2-f2 .section .init_array.101,"aw",@init_array .p2align 2 .int32 main@FUNCTION .section .init_array,"aw",@init_array .p2align 2 + .int32 f1@FUNCTION .int32 f2@FUNCTION diff --git a/test/dot_s/initializers.wast b/test/dot_s/initializers.wast index 4d64f9ffc..c73fccc73 100644 --- a/test/dot_s/initializers.wast +++ b/test/dot_s/initializers.wast @@ -2,14 +2,18 @@ (memory 1) (export "memory" memory) (export "main" $main) + (export "f1" $f1) (export "f2" $f2) (func $main (result i32) (return (i32.const 5) ) ) + (func $f1 + (return) + ) (func $f2 (return) ) ) -;; METADATA: { "asmConsts": {},"staticBump": 12, "initializers": ["main", "f2"] } +;; METADATA: { "asmConsts": {},"staticBump": 12, "initializers": ["main", "f1", "f2"] } |