summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/s2wasm.h24
-rw-r--r--test/dot_s/initializers.s11
-rw-r--r--test/dot_s/initializers.wast6
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"] }