Commit ec37d0b0 authored by Clemens Hammacher's avatar Clemens Hammacher Committed by Commit Bot

[wasm] [debug] Add support for global variables

When instantiating the wasm interpreter, pass the start address of the
global variables. This was nullptr before, leading to a crash if
debugging a program which accesses globals.
With test.

R=ahaas@chromium.org, titzer@chromium.org
BUG=v8:5822

Change-Id: I5f419790042ef9a00787df093a07e5e5835d55bd
Reviewed-on: https://chromium-review.googlesource.com/456219
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: 's avatarAndreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#43948}
parent 3100f9b2
......@@ -73,6 +73,10 @@ class InterpreterHandle {
instance_.mem_start = nullptr;
instance_.mem_size = 0;
}
if (debug_info->wasm_instance()->has_globals_buffer()) {
instance_.globals_start = reinterpret_cast<byte*>(
debug_info->wasm_instance()->globals_buffer()->backing_store());
}
if (instance_.module->num_imported_functions > 0) {
int num_imported_functions =
static_cast<int>(instance_.module->num_imported_functions);
......
......@@ -139,3 +139,52 @@ function checkStack(stack, expected_lines) {
]);
}
})();
(function testGlobals() {
var builder = new WasmModuleBuilder();
builder.addGlobal(kWasmI32, true); // 0
builder.addGlobal(kWasmI64, true); // 1
builder.addGlobal(kWasmF32, true); // 2
builder.addGlobal(kWasmF64, true); // 3
builder.addFunction('get_i32', kSig_i_v)
.addBody([kExprGetGlobal, 0])
.exportFunc();
builder.addFunction('get_i64', kSig_d_v)
.addBody([kExprGetGlobal, 1, kExprF64SConvertI64])
.exportFunc();
builder.addFunction('get_f32', kSig_d_v)
.addBody([kExprGetGlobal, 2, kExprF64ConvertF32])
.exportFunc();
builder.addFunction('get_f64', kSig_d_v)
.addBody([kExprGetGlobal, 3])
.exportFunc();
builder.addFunction('set_i32', kSig_v_i)
.addBody([kExprGetLocal, 0, kExprSetGlobal, 0])
.exportFunc();
builder.addFunction('set_i64', kSig_v_d)
.addBody([kExprGetLocal, 0, kExprI64SConvertF64, kExprSetGlobal, 1])
.exportFunc();
builder.addFunction('set_f32', kSig_v_d)
.addBody([kExprGetLocal, 0, kExprF32ConvertF64, kExprSetGlobal, 2])
.exportFunc();
builder.addFunction('set_f64', kSig_v_d)
.addBody([kExprGetLocal, 0, kExprSetGlobal, 3])
.exportFunc();
var instance = builder.instantiate();
// Initially, all should be zero.
assertEquals(0, instance.exports.get_i32());
assertEquals(0, instance.exports.get_i64());
assertEquals(0, instance.exports.get_f32());
assertEquals(0, instance.exports.get_f64());
// Assign values to all variables.
var values = [4711, 1<<40 + 1 << 33, 0.3, 12.34567];
instance.exports.set_i32(values[0]);
instance.exports.set_i64(values[1]);
instance.exports.set_f32(values[2]);
instance.exports.set_f64(values[3]);
// Now check the values.
assertEquals(values[0], instance.exports.get_i32());
assertEquals(values[1], instance.exports.get_i64());
assertEqualsDelta(values[2], instance.exports.get_f32(), 2**-23);
assertEquals(values[3], instance.exports.get_f64());
})();
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