summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-23 14:58:57 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-23 14:58:57 -0800
commit070b1102338a7baa8d0c5f0e5c6731b93cf0e09a (patch)
treec02500e12b047e00274518f49678ee3d29ab07fd
parentb6214708e08fe8cc894bfd4ace866beb6bb3606f (diff)
downloadbinaryen-070b1102338a7baa8d0c5f0e5c6731b93cf0e09a.tar.gz
binaryen-070b1102338a7baa8d0c5f0e5c6731b93cf0e09a.tar.bz2
binaryen-070b1102338a7baa8d0c5f0e5c6731b93cf0e09a.zip
emit tables in s2wasm
-rw-r--r--src/s2wasm.h19
-rw-r--r--test/dot_s/basics.s1
-rw-r--r--test/dot_s/basics.wast2
3 files changed, 18 insertions, 4 deletions
diff --git a/src/s2wasm.h b/src/s2wasm.h
index 57d5768b8..74387859e 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -76,6 +76,8 @@ private:
std::map<size_t, size_t> addressSegments; // address => segment index
+ std::map<Name, size_t> functionIndexes;
+
// utilities
void skipWhitespace() {
@@ -972,11 +974,20 @@ private:
Name name = triple.name;
size_t offset = triple.offset;
const auto &symbolAddress = staticAddresses.find(name);
- if (symbolAddress == staticAddresses.end()) {
- std::cerr << "Unknown symbol: " << name << '\n';
- abort_on("Unknown symbol");
+ if (symbolAddress != staticAddresses.end()) {
+ curr->value = Literal(symbolAddress->second + offset);
+ } else {
+ // must be a function address
+ if (wasm.functionsMap.count(name) == 0) {
+ std::cerr << "Unknown symbol: " << name << '\n';
+ abort_on("Unknown symbol");
+ }
+ if (functionIndexes.count(name) == 0) {
+ functionIndexes[name] = functionIndexes.size();
+ wasm.table.names.push_back(name);
+ }
+ curr->value = Literal(functionIndexes[name] + offset);
}
- curr->value = Literal(symbolAddress->second + offset);
assert(curr->value.i32 > 0);
curr->type = i32;
}
diff --git a/test/dot_s/basics.s b/test/dot_s/basics.s
index ad4c5d238..c4f6776d6 100644
--- a/test/dot_s/basics.s
+++ b/test/dot_s/basics.s
@@ -47,6 +47,7 @@ BB0_3: # in Loop: Header=BB0_1 Depth=1
BB0_4:
i32.const $push11=, -12
i32.add $0=, $0, $pop11
+ i32.const $discard=, main # just take address for testing
BB0_5: # %.loopexit
return $0
func_end0:
diff --git a/test/dot_s/basics.wast b/test/dot_s/basics.wast
index f6fe9c493..7e59854d8 100644
--- a/test/dot_s/basics.wast
+++ b/test/dot_s/basics.wast
@@ -2,6 +2,7 @@
(memory 0 4294967295 (segment 16 "hello, world!\n\00") (segment 32 "vcq"))
(import $puts "env" "puts")
(export "main" $main)
+ (table $main)
(func $main (param $$0 i32) (param $$1 i32) (result i32)
(block $fake_return_waka123
(block
@@ -84,6 +85,7 @@
(i32.const -12)
)
)
+ (i32.const 1)
)
(br $fake_return_waka123
(get_local $$0)