Index: runtime/vm/instructions_arm64_test.cc |
diff --git a/runtime/vm/instructions_arm64_test.cc b/runtime/vm/instructions_arm64_test.cc |
index 970d271b4cdfc3cd47e70d25546851536bb5c45a..924d495c7c46ccb1fa55fb5e641245814cea9806 100644 |
--- a/runtime/vm/instructions_arm64_test.cc |
+++ b/runtime/vm/instructions_arm64_test.cc |
@@ -29,11 +29,42 @@ 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()); |
+} |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_ARM64 |