Index: runtime/vm/instructions_arm_test.cc |
diff --git a/runtime/vm/instructions_arm_test.cc b/runtime/vm/instructions_arm_test.cc |
index de3ff6f4ab38bbddc285fc6157b93b5147d07a7d..540fd5f8163cf68a33b975e85b52de6d78bd9408 100644 |
--- a/runtime/vm/instructions_arm_test.cc |
+++ b/runtime/vm/instructions_arm_test.cc |
@@ -29,9 +29,81 @@ ASSEMBLER_TEST_RUN(Call, test) { |
// before the end of the code buffer. |
CallPattern call(test->entry() + test->code().Size() - Instr::kInstrSize, |
test->code()); |
- EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(), call.TargetCode()); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(), |
+ call.TargetAddress()); |
} |
+ |
+ASSEMBLER_TEST_GENERATE(Jump, assembler) { |
+ __ BranchPatchable(*StubCode::InvokeDartCode_entry()); |
+ __ BranchPatchable(*StubCode::AllocateArray_entry()); |
+} |
+ |
+ |
+ASSEMBLER_TEST_RUN(Jump, test) { |
+ const Code& code = test->code(); |
+ const Instructions& instrs = Instructions::Handle(code.instructions()); |
+ bool status = |
+ VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()), |
+ instrs.size(), |
+ VirtualMemory::kReadWrite); |
+ EXPECT(status); |
+ JumpPattern jump1(test->entry(), test->code()); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(), |
+ jump1.TargetAddress()); |
+ JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(), |
+ test->code()); |
+ const Code& array_stub = |
+ Code::Handle(StubCode::AllocateArray_entry()->code()); |
+ EXPECT_EQ(array_stub.EntryPoint(), jump2.TargetAddress()); |
+ uword target1 = jump1.TargetAddress(); |
+ uword target2 = jump2.TargetAddress(); |
+ jump1.SetTargetAddress(target2); |
+ jump2.SetTargetAddress(target1); |
+ EXPECT_EQ(array_stub.EntryPoint(), jump1.TargetAddress()); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(), |
+ jump2.TargetAddress()); |
+} |
+ |
+ |
+#if defined(USING_SIMULATOR) |
+ASSEMBLER_TEST_GENERATE(JumpARMv6, assembler) { |
+ // ARMv7 is the default. |
+ HostCPUFeatures::set_arm_version(ARMv6); |
+ __ BranchPatchable(*StubCode::InvokeDartCode_entry()); |
+ __ BranchPatchable(*StubCode::AllocateArray_entry()); |
+ HostCPUFeatures::set_arm_version(ARMv7); |
+} |
+ |
+ |
+ASSEMBLER_TEST_RUN(JumpARMv6, test) { |
+ HostCPUFeatures::set_arm_version(ARMv6); |
+ const Code& code = test->code(); |
+ const Instructions& instrs = Instructions::Handle(code.instructions()); |
+ bool status = |
+ VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()), |
+ instrs.size(), |
+ VirtualMemory::kReadWrite); |
+ EXPECT(status); |
+ JumpPattern jump1(test->entry(), test->code()); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(), |
+ jump1.TargetAddress()); |
+ JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(), |
+ test->code()); |
+ const Code& array_stub = |
+ Code::Handle(StubCode::AllocateArray_entry()->code()); |
+ EXPECT_EQ(array_stub.EntryPoint(), jump2.TargetAddress()); |
+ uword target1 = jump1.TargetAddress(); |
+ uword target2 = jump2.TargetAddress(); |
+ jump1.SetTargetAddress(target2); |
+ jump2.SetTargetAddress(target1); |
+ EXPECT_EQ(array_stub.EntryPoint(), jump1.TargetAddress()); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(), |
+ jump2.TargetAddress()); |
+ HostCPUFeatures::set_arm_version(ARMv7); |
+} |
+#endif |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_ARM |