summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/s2wasm.h23
-rw-r--r--test/dot_s/basics.s6
-rw-r--r--test/dot_s/basics.wast4
3 files changed, 24 insertions, 9 deletions
diff --git a/src/s2wasm.h b/src/s2wasm.h
index 5f2a0d75d..57d5768b8 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -889,12 +889,17 @@ private:
bool zero = true;
while (1) {
skipWhitespace();
- if (match(".asciz")) {
- *raw = getQuoted();
- raw->push_back(0);
- zero = false;
- } else if (match(".ascii")) {
- *raw = getQuoted();
+ if (match(".asci")) {
+ bool z;
+ if (match("i")) {
+ z = false;
+ } else {
+ mustMatch("z");
+ z = true;
+ }
+ auto quoted = getQuoted();
+ raw->insert(raw->end(), quoted.begin(), quoted.end());
+ if (z) raw->push_back(0);
zero = false;
} else if (match(".zero")) {
int32_t size = getInt();
@@ -934,7 +939,11 @@ private:
mustMatch(name.str);
mustMatch(",");
size_t seenSize = atoi(getStr().str); // TODO: optimize
- assert(seenSize == size);
+ assert(seenSize >= size);
+ while (raw->size() < seenSize) {
+ raw->push_back(0);
+ }
+ size = seenSize;
}
while (nextStatic % align) nextStatic++;
// assign the address, add to memory
diff --git a/test/dot_s/basics.s b/test/dot_s/basics.s
index b9c3baeed..ad4c5d238 100644
--- a/test/dot_s/basics.s
+++ b/test/dot_s/basics.s
@@ -58,4 +58,10 @@ func_end0:
.asciz "hello, world!\n"
.size .str, 15
+ .type a2,@object # @a2
+ .globl a2
+a2:
+ .int8 118 # 0x76
+ .ascii "cq"
+ .size a2, 3 # surprisingly large size
diff --git a/test/dot_s/basics.wast b/test/dot_s/basics.wast
index fa658c8b8..f6fe9c493 100644
--- a/test/dot_s/basics.wast
+++ b/test/dot_s/basics.wast
@@ -1,5 +1,5 @@
(module
- (memory 0 4294967295 (segment 16 "hello, world!\n\00"))
+ (memory 0 4294967295 (segment 16 "hello, world!\n\00") (segment 32 "vcq"))
(import $puts "env" "puts")
(export "main" $main)
(func $main (param $$0 i32) (param $$1 i32) (result i32)
@@ -92,4 +92,4 @@
)
)
)
-;; METADATA: { "asmConsts": {},"staticBump": 30 }
+;; METADATA: { "asmConsts": {},"staticBump": 34 }