summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-25 20:28:55 -0500
committerAlon Zakai <alonzakai@gmail.com>2015-12-25 20:28:55 -0500
commit0f7bffb6b66698d21cb2f44a4a5b7bbaa3acd59c (patch)
tree211ca6684edb4000da587480565a8be3c4e0ea9e
parent7e1189e72938f23b463b7b531c1e91faea1f2c5e (diff)
downloadbinaryen-0f7bffb6b66698d21cb2f44a4a5b7bbaa3acd59c.tar.gz
binaryen-0f7bffb6b66698d21cb2f44a4a5b7bbaa3acd59c.tar.bz2
binaryen-0f7bffb6b66698d21cb2f44a4a5b7bbaa3acd59c.zip
start to implement lcomm
-rw-r--r--src/s2wasm.h25
-rw-r--r--test/dot_s/alternate-lcomm.wast4
-rw-r--r--test/dot_s/global.wast6
-rw-r--r--test/dot_s/lcomm-in-text-segment.wast4
4 files changed, 24 insertions, 15 deletions
diff --git a/src/s2wasm.h b/src/s2wasm.h
index 0370cdde3..dd4437ed9 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -867,8 +867,7 @@ private:
} else if (match(".section")) {
s = strchr(s, '\n');
} else if (match(".lcomm")) {
- s = strchr(s, '\n');
- // TODO
+ parseLcomm(name);
return;
}
skipWhitespace();
@@ -883,12 +882,8 @@ private:
}
align = pow(2, align); // convert from power to actual bytes
if (match(".lcomm")) {
- mustMatch(name.str);
- skipComma();
- getInt();
- skipComma();
- getInt();
- return; // XXX wtf is this thing and what do we do with it
+ parseLcomm(name, align);
+ return;
}
mustMatch(name.str);
mustMatch(":");
@@ -972,6 +967,20 @@ private:
wasm.memory.initial = nextStatic;
}
+ void parseLcomm(Name name, size_t align=1) {
+ mustMatch(name.str);
+ skipComma();
+ size_t size = getInt();
+ if (*s == ',') {
+ skipComma();
+ getInt();
+ }
+ while (nextStatic % align) nextStatic++;
+ staticAddresses[name] = nextStatic;
+ nextStatic += size;
+ wasm.memory.initial = nextStatic;
+ }
+
void skipImports() {
while (1) {
if (match(".import")) {
diff --git a/test/dot_s/alternate-lcomm.wast b/test/dot_s/alternate-lcomm.wast
index 955ce11ea..075b8d5fd 100644
--- a/test/dot_s/alternate-lcomm.wast
+++ b/test/dot_s/alternate-lcomm.wast
@@ -1,4 +1,4 @@
(module
- (memory 0 4294967295)
+ (memory 5 4294967295)
)
-;; METADATA: { "asmConsts": {},"staticBump": 0 }
+;; METADATA: { "asmConsts": {},"staticBump": 4 }
diff --git a/test/dot_s/global.wast b/test/dot_s/global.wast
index f28edc35a..4d84e81da 100644
--- a/test/dot_s/global.wast
+++ b/test/dot_s/global.wast
@@ -1,5 +1,5 @@
(module
- (memory 1136 4294967295 (segment 4 "9\05\00\00") (segment 12 "\01\00\00\00") (segment 16 "*\00\00\00") (segment 20 "\ff\ff\ff\ff") (segment 32 "\00\00\00\00\00\00\00\00") (segment 40 "\ff\ff\ff\ff\ff\ff\ff\ff") (segment 52 "\00\00\00\80") (segment 56 "\00\00\00@") (segment 72 "\00\00\00\00\00\00\00\00") (segment 80 "\00\00\00\00\00\00\00\00") (segment 608 "\b0\00\00\00"))
+ (memory 1184 4294967295 (segment 4 "9\05\00\00") (segment 20 "\01\00\00\00") (segment 24 "*\00\00\00") (segment 28 "\ff\ff\ff\ff") (segment 56 "\00\00\00\00\00\00\00\00") (segment 64 "\ff\ff\ff\ff\ff\ff\ff\ff") (segment 84 "\00\00\00\80") (segment 88 "\00\00\00@") (segment 120 "\00\00\00\00\00\00\00\00") (segment 128 "\00\00\00\00\00\00\00\00") (segment 656 "\e0\00\00\00"))
(import $memcpy "env" "memcpy")
(export "foo" $foo)
(export "call_memcpy" $call_memcpy)
@@ -7,7 +7,7 @@
(block $fake_return_waka123
(block
(br $fake_return_waka123
- (i32.load align=4 offset=16
+ (i32.load align=4 offset=24
(i32.const 0)
)
)
@@ -29,4 +29,4 @@
)
)
)
-;; METADATA: { "asmConsts": {},"staticBump": 1135 }
+;; METADATA: { "asmConsts": {},"staticBump": 1183 }
diff --git a/test/dot_s/lcomm-in-text-segment.wast b/test/dot_s/lcomm-in-text-segment.wast
index 955ce11ea..8bfef7516 100644
--- a/test/dot_s/lcomm-in-text-segment.wast
+++ b/test/dot_s/lcomm-in-text-segment.wast
@@ -1,4 +1,4 @@
(module
- (memory 0 4294967295)
+ (memory 16 4294967295 (segment 12 "\05\00\00\00"))
)
-;; METADATA: { "asmConsts": {},"staticBump": 0 }
+;; METADATA: { "asmConsts": {},"staticBump": 15 }