summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYury Delendik <ydelendik@mozilla.com>2016-04-20 18:13:16 -0500
committerYury Delendik <ydelendik@mozilla.com>2016-04-20 18:13:16 -0500
commitc2d9d476b853212e96f301106cf00ceb19baefca (patch)
tree68e4acc166f063dfe26d5f7ae7866c9b28bde1e0
parent86154bff23044b24e18235c8c92721eb463e616a (diff)
parentb9637c4b74d340e1e8f5a3ab7a4f11e4fee7ce76 (diff)
downloadbinaryen-c2d9d476b853212e96f301106cf00ceb19baefca.tar.gz
binaryen-c2d9d476b853212e96f301106cf00ceb19baefca.tar.bz2
binaryen-c2d9d476b853212e96f301106cf00ceb19baefca.zip
Merge pull request #371 from yurydelendik/initarray-mutilple
Parses more than one entry in the .init_array section.
-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"] }