src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Call.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Call.java Fri Mar 16 11:26:05 2018 +0000
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Call.java Fri Mar 16 22:59:32 2018 -0700
@@ -227,13 +227,15 @@
masm.ensureUniquePC();
}
- public static void directJmp(CompilationResultBuilder crb, AArch64MacroAssembler masm, InvokeTarget target) {
- int before = masm.position();
- // Address is fixed up later by c++ code.
- masm.jmp();
- int after = masm.position();
- crb.recordDirectCall(before, after, target, null);
- masm.ensureUniquePC();
+ public static void directJmp(CompilationResultBuilder crb, AArch64MacroAssembler masm, InvokeTarget callTarget) {
+ try (AArch64MacroAssembler.ScratchRegister scratch = masm.getScratchRegister()) {
+ int before = masm.position();
+ masm.movNativeAddress(scratch.getRegister(), 0L);
+ masm.jmp(scratch.getRegister());
+ int after = masm.position();
+ crb.recordDirectCall(before, after, callTarget, null);
+ masm.ensureUniquePC();
+ }
}
public static void indirectJmp(CompilationResultBuilder crb, AArch64MacroAssembler masm, Register dst, InvokeTarget target) {