Commit a4211ad6 authored by Ivica Bogosavljevic's avatar Ivica Bogosavljevic Committed by Commit Bot

[wasm]: Load and store globals properly on big-endian

TEST=wasm-spec-tests/tests/exports,wasm-spec-tests/tests/data

Change-Id: I5c1001b00f2a7eab41e6e143afa19803969c0fe4
Reviewed-on: https://chromium-review.googlesource.com/1181022Reviewed-by: 's avatarJunliang Yan <jyan@ca.ibm.com>
Reviewed-by: 's avatarBill Budge <bbudge@chromium.org>
Commit-Queue: Sreten Kovacevic <skovacevic@wavecomp.com>
Cr-Commit-Position: refs/heads/master@{#55274}
parent 4f0e9d6c
......@@ -1294,7 +1294,8 @@ uint32_t InstanceBuilder::EvalUint32InitExpr(const WasmInitExpr& expr) {
return expr.val.i32_const;
case WasmInitExpr::kGlobalIndex: {
uint32_t offset = module_->globals[expr.val.global_index].offset;
return *reinterpret_cast<uint32_t*>(raw_buffer_ptr(globals_, offset));
return ReadLittleEndianValue<uint32_t>(
reinterpret_cast<Address>(raw_buffer_ptr(globals_, offset)));
}
default:
UNREACHABLE();
......
......@@ -108,28 +108,36 @@ Address WasmGlobalObject::address() const {
return Address(array_buffer()->backing_store()) + offset();
}
int32_t WasmGlobalObject::GetI32() { return Memory::int32_at(address()); }
int32_t WasmGlobalObject::GetI32() {
return ReadLittleEndianValue<int32_t>(address());
}
int64_t WasmGlobalObject::GetI64() { return Memory::int64_at(address()); }
int64_t WasmGlobalObject::GetI64() {
return ReadLittleEndianValue<int64_t>(address());
}
float WasmGlobalObject::GetF32() { return Memory::float_at(address()); }
float WasmGlobalObject::GetF32() {
return ReadLittleEndianValue<float>(address());
}
double WasmGlobalObject::GetF64() { return Memory::double_at(address()); }
double WasmGlobalObject::GetF64() {
return ReadLittleEndianValue<double>(address());
}
void WasmGlobalObject::SetI32(int32_t value) {
Memory::int32_at(address()) = value;
WriteLittleEndianValue<int32_t>(address(), value);
}
void WasmGlobalObject::SetI64(int64_t value) {
Memory::int64_at(address()) = value;
WriteLittleEndianValue<int64_t>(address(), value);
}
void WasmGlobalObject::SetF32(float value) {
Memory::float_at(address()) = value;
WriteLittleEndianValue<float>(address(), value);
}
void WasmGlobalObject::SetF64(double value) {
Memory::double_at(address()) = value;
WriteLittleEndianValue<double>(address(), value);
}
// WasmInstanceObject
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment