summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-14 16:10:24 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-14 16:10:24 -0800
commit4a6a88ae8387c9db99acda5b4fb1d2bff999a8a0 (patch)
tree16f3e2cdf0ba3226119b1513cef7348aedc23cc2
parent0b41a7d99f7652d607b14897e2ee963b28b6916e (diff)
downloadbinaryen-4a6a88ae8387c9db99acda5b4fb1d2bff999a8a0.tar.gz
binaryen-4a6a88ae8387c9db99acda5b4fb1d2bff999a8a0.tar.bz2
binaryen-4a6a88ae8387c9db99acda5b4fb1d2bff999a8a0.zip
add relocation support
-rw-r--r--src/s2wasm.h17
-rw-r--r--test/dot_s/relocation.wast16
2 files changed, 31 insertions, 2 deletions
diff --git a/src/s2wasm.h b/src/s2wasm.h
index a1805e659..45f12fdb7 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -34,9 +34,13 @@ private:
size_t nextStatic = 1; // location of next static allocation, i.e., the data segment
std::map<Name, int32_t> staticAddresses; // name => address
+
typedef std::pair<Const*, Name> Addressing;
std::vector<Addressing> addressings; // we fix these up
+ typedef std::pair<std::vector<char>*, Name> Relocation; // the data, and the name whose address we should place there
+ std::vector<Relocation> relocations;
+
// utilities
void skipWhitespace() {
@@ -771,7 +775,12 @@ private:
}
} else if (match(".int32")) {
raw->resize(4);
- (*(int32_t*)(&(*raw)[0])) = getInt();
+ if (isdigit(*s)) {
+ (*(int32_t*)(&(*raw)[0])) = getInt();
+ } else {
+ // relocation, the address of something
+ relocations.emplace_back(raw, getStr());
+ }
} else if (match(".int64")) {
raw->resize(8);
(*(int64_t*)(&(*raw)[0])) = getInt();
@@ -808,8 +817,12 @@ private:
assert(curr->value.i32 > 0);
curr->type = i32;
}
+ for (auto& pair : relocations) {
+ auto raw = pair.first;
+ auto name = pair.second;
+ (*(int32_t*)(&(*raw)[0])) = staticAddresses[name];
+ }
}
-
};
} // namespace wasm
diff --git a/test/dot_s/relocation.wast b/test/dot_s/relocation.wast
new file mode 100644
index 000000000..8949247bc
--- /dev/null
+++ b/test/dot_s/relocation.wast
@@ -0,0 +1,16 @@
+(module
+ (memory 0 4294967295 (segment 2 "\06\00\00\00") (segment 6 "\02\00\00\00"))
+ (export "main" $main)
+ (func $main (result i32)
+ (local $$0 i32)
+ (block $fake_return_waka123
+ (block
+ (br $fake_return_waka123
+ (i32.load align=4
+ (i32.const 0)
+ )
+ )
+ )
+ )
+ )
+)