Chromium Code Reviews| Index: test/cctest/test-wasm-relocation-disasm-arm.cc |
| diff --git a/test/cctest/test-wasm-relocation-disasm-arm.cc b/test/cctest/test-wasm-relocation-disasm-arm.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b10b5494dc4e77a93849e901e9306bd3cf1b99c9 |
| --- /dev/null |
| +++ b/test/cctest/test-wasm-relocation-disasm-arm.cc |
| @@ -0,0 +1,103 @@ |
| +// Copyright 2016 the V8 project authors. All rights reserved. |
|
titzer
2016/03/14 15:23:38
Can we rename this file to be closer to what it do
gdeepti1
2016/03/14 20:08:14
Done.
|
| +// Redistribution and use in source and binary forms, with or without |
| +// modification, are permitted provided that the following conditions are |
| +// met: |
| +// |
| +// * Redistributions of source code must retain the above copyright |
| +// notice, this list of conditions and the following disclaimer. |
| +// * Redistributions in binary form must reproduce the above |
| +// copyright notice, this list of conditions and the following |
| +// disclaimer in the documentation and/or other materials provided |
| +// with the distribution. |
| +// * Neither the name of Google Inc. nor the names of its |
| +// contributors may be used to endorse or promote products derived |
| +// from this software without specific prior written permission. |
| +// |
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| + |
| +#include <iostream> // NOLINT(readability/streams) |
| + |
| +#include "src/v8.h" |
| +#include "test/cctest/cctest.h" |
| + |
| +#include "src/arm/assembler-arm-inl.h" |
| +#include "src/arm/simulator-arm.h" |
| +#include "src/disassembler.h" |
| +#include "src/factory.h" |
| +#include "src/ostreams.h" |
| +#include "test/cctest/compiler/c-signature.h" |
| +#include "test/cctest/compiler/call-tester.h" |
| + |
| +using namespace v8::base; |
| +using namespace v8::internal; |
| +using namespace v8::internal::compiler; |
| + |
| +#define __ assm. |
| + |
| +static int32_t DummyStaticFunction(Object* result) { return 1; } |
| + |
| +TEST(WasmRelocationArm) { |
| + CcTest::InitializeVM(); |
| + Isolate* isolate = CcTest::i_isolate(); |
| + HandleScope scope(isolate); |
| + v8::internal::byte buffer[4096]; |
| + DummyStaticFunction(NULL); |
| + int32_t imm = 1234567; |
| + |
| + Assembler assm(isolate, buffer, sizeof buffer); |
| + |
| + __ mov(r0, Operand(imm, RelocInfo::WASM_MEMORY_REFERENCE)); |
| + __ mov(pc, Operand(lr)); |
| + |
| + CodeDesc desc; |
| + assm.GetCode(&desc); |
| + Handle<Code> code = isolate->factory()->NewCode( |
| + desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| + |
| + CSignature0<int32_t> csig; |
| + CodeRunner<int32_t> runnable(isolate, code, &csig); |
| + int32_t ret_value = runnable.Call(); |
| + CHECK_EQ(ret_value, imm); |
| + |
| +#ifdef DEBUG |
| + OFStream os(stdout); |
| + code->Print(os); |
| + ::printf("f() = %d\n\n", ret_value); |
| +#endif |
| + size_t offset = 1234; |
| + |
| + // Relocating references by offset |
| + int mode_mask = (1 << RelocInfo::WASM_MEMORY_REFERENCE); |
| + for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) { |
| + RelocInfo::Mode mode = it.rinfo()->rmode(); |
| + if (RelocInfo::IsWasmMemoryReference(mode)) { |
| + // Dummy values of size used here as the objective of the test is to |
| + // verify that the immediate is patched correctly |
| + it.rinfo()->update_wasm_memory_reference( |
| + it.rinfo()->wasm_memory_reference(), |
| + it.rinfo()->wasm_memory_reference() + offset, 1, 2, |
| + SKIP_ICACHE_FLUSH); |
| + } |
| + } |
| + |
| + // Call into relocated code object |
| + ret_value = runnable.Call(); |
| + CHECK_EQ((imm + offset), ret_value); |
| + |
| +#ifdef DEBUG |
| + code->Print(os); |
| + ::printf("f() = %d\n\n", ret_value); |
| +#endif |
| +} |
| + |
| +#undef __ |