# HG changeset patch # User dlong # Date 1532372503 25200 # Node ID 087c3ba2d138e0da5dc893efdb55ab4ecd27d554 # Parent ed66516bab5bc291e9ed420cff5dd9fca9cff825 8207383: [Graal] SelfChangedCDS.java fails with "guarantee(disp == (intptr_t)(jint)disp) failed: must be 32-bit offset" Reviewed-by: kvn diff -r ed66516bab5b -r 087c3ba2d138 src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotReturnOp.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotReturnOp.java Mon Jul 23 14:41:06 2018 -0400 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotReturnOp.java Mon Jul 23 12:01:43 2018 -0700 @@ -79,6 +79,7 @@ leaveFrameAndRestoreRbp(crb, masm); if (!isStub) { if (requiresReservedStackAccessCheck) { + assert scratchForSafepointOnReturn != null; HotSpotForeignCallsProvider foreignCalls = (HotSpotForeignCallsProvider) crb.foreignCalls; Label noReserved = new Label(); @@ -94,11 +95,11 @@ assert cc.getArgumentCount() == 1; Register arg0 = ((RegisterValue) cc.getArgument(0)).getRegister(); masm.movq(arg0, thread); - AMD64Call.directCall(crb, masm, enableStackReservedZone, null, false, null); + AMD64Call.directCall(crb, masm, enableStackReservedZone, scratchForSafepointOnReturn, false, null); if (stackAdjust > 0) { masm.addq(rsp, stackAdjust); } - AMD64Call.directJmp(crb, masm, foreignCalls.lookupForeignCall(THROW_DELAYED_STACKOVERFLOW_ERROR)); + AMD64Call.directJmp(crb, masm, foreignCalls.lookupForeignCall(THROW_DELAYED_STACKOVERFLOW_ERROR), scratchForSafepointOnReturn); masm.bind(noReserved); } diff -r ed66516bab5b -r 087c3ba2d138 src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Call.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Call.java Mon Jul 23 14:41:06 2018 -0400 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Call.java Mon Jul 23 12:01:43 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,12 +24,13 @@ package org.graalvm.compiler.lir.amd64; +import static jdk.vm.ci.code.ValueUtil.asRegister; +import static jdk.vm.ci.code.ValueUtil.isRegister; +import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; import static org.graalvm.compiler.lir.LIRValueUtil.differentRegisters; -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.isRegister; import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag; import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler; @@ -195,7 +196,7 @@ } int before = masm.position(); int callPCOffset; - if (scratch != null) { + if (scratch != null && !GeneratePIC.getValue(crb.getOptions())) { // offset might not fit a 32-bit immediate, generate an // indirect call with a 64-bit immediate masm.movq(scratch, 0L); @@ -222,12 +223,27 @@ } } - public static void directJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target) { + public static int directJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target) { + return directJmp(crb, masm, target, null); + } + + public static int directJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target, Register scratch) { int before = masm.position(); - masm.jmp(0, true); + int callPCOffset; + if (scratch != null && !GeneratePIC.getValue(crb.getOptions())) { + // offset might not fit a 32-bit immediate, generate an + // indirect call with a 64-bit immediate + masm.movq(scratch, 0L); + callPCOffset = masm.position(); + masm.jmp(scratch); + } else { + callPCOffset = masm.position(); + masm.jmp(0, true); + } int after = masm.position(); crb.recordDirectCall(before, after, target, null); masm.ensureUniquePC(); + return callPCOffset; } public static void directConditionalJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target, ConditionFlag cond) {