// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "src/assembler-inl.h" #include "src/objects-inl.h" #include "src/v8.h" #include "test/cctest/cctest.h" #include "test/cctest/compiler/c-signature.h" #include "test/cctest/wasm/wasm-run-utils.h" #include "test/common/wasm/wasm-macro-gen.h" namespace v8 { namespace internal { namespace wasm { namespace test_run_wasm_relocation { WASM_COMPILED_EXEC_TEST(RunPatchWasmContext) { WasmRunner r(execution_mode); Isolate* isolate = CcTest::i_isolate(); r.builder().AddGlobal(); r.builder().AddGlobal(); BUILD(r, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)), WASM_GET_GLOBAL(0)); CHECK_EQ(1, r.builder().CodeTableLength()); // Run with the old global data. CHECK_EQ(113, r.Call(113)); WasmContext* old_wasm_context = r.builder().instance_object()->wasm_context()->get(); Address old_wasm_context_address = reinterpret_cast
(old_wasm_context); uint32_t new_global_data[3] = {0, 0, 0}; WasmContext new_wasm_context; new_wasm_context.globals_start = reinterpret_cast(new_global_data); { // TODO(6792): No longer needed once WebAssembly code is off heap. CodeSpaceMemoryModificationScope modification_scope(isolate->heap()); // Patch in a new WasmContext that points to the new global data. int filter = 1 << RelocInfo::WASM_CONTEXT_REFERENCE; bool patched = false; Handle code = r.GetWrapperCode(); for (RelocIterator it(*code, filter); !it.done(); it.next()) { CHECK_EQ(old_wasm_context_address, it.rinfo()->wasm_context_reference()); it.rinfo()->set_wasm_context_reference( isolate, reinterpret_cast
(&new_wasm_context)); patched = true; } CHECK(patched); Assembler::FlushICache(isolate, code->instruction_start(), code->instruction_size()); } // Run with the new global data. CHECK_EQ(115, r.Call(115)); CHECK_EQ(115, new_global_data[0]); } } // namespace test_run_wasm_relocation } // namespace wasm } // namespace internal } // namespace v8