diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-12-23 14:58:57 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-12-23 14:58:57 -0800 |
commit | 070b1102338a7baa8d0c5f0e5c6731b93cf0e09a (patch) | |
tree | c02500e12b047e00274518f49678ee3d29ab07fd | |
parent | b6214708e08fe8cc894bfd4ace866beb6bb3606f (diff) | |
download | binaryen-070b1102338a7baa8d0c5f0e5c6731b93cf0e09a.tar.gz binaryen-070b1102338a7baa8d0c5f0e5c6731b93cf0e09a.tar.bz2 binaryen-070b1102338a7baa8d0c5f0e5c6731b93cf0e09a.zip |
emit tables in s2wasm
-rw-r--r-- | src/s2wasm.h | 19 | ||||
-rw-r--r-- | test/dot_s/basics.s | 1 | ||||
-rw-r--r-- | test/dot_s/basics.wast | 2 |
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) |