Skip to content

Commit 1205804

Browse files
committed
[GR-11040] Use indirect call and jmp for reserved stack functions.
PullRequest: graal/1867
2 parents d2989fa + fd97895 commit 1205804

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

compiler/src/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotReturnOp.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
7979
leaveFrameAndRestoreRbp(crb, masm);
8080
if (!isStub) {
8181
if (requiresReservedStackAccessCheck) {
82+
assert scratchForSafepointOnReturn != null;
8283
HotSpotForeignCallsProvider foreignCalls = (HotSpotForeignCallsProvider) crb.foreignCalls;
8384

8485
Label noReserved = new Label();
@@ -94,11 +95,11 @@ public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
9495
assert cc.getArgumentCount() == 1;
9596
Register arg0 = ((RegisterValue) cc.getArgument(0)).getRegister();
9697
masm.movq(arg0, thread);
97-
AMD64Call.directCall(crb, masm, enableStackReservedZone, null, false, null);
98+
AMD64Call.directCall(crb, masm, enableStackReservedZone, scratchForSafepointOnReturn, false, null);
9899
if (stackAdjust > 0) {
99100
masm.addq(rsp, stackAdjust);
100101
}
101-
AMD64Call.directJmp(crb, masm, foreignCalls.lookupForeignCall(THROW_DELAYED_STACKOVERFLOW_ERROR));
102+
AMD64Call.directJmp(crb, masm, foreignCalls.lookupForeignCall(THROW_DELAYED_STACKOVERFLOW_ERROR), scratchForSafepointOnReturn);
102103
masm.bind(noReserved);
103104
}
104105

compiler/src/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Call.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -24,12 +24,13 @@
2424
*/
2525
package org.graalvm.compiler.lir.amd64;
2626

27+
import static jdk.vm.ci.code.ValueUtil.asRegister;
28+
import static jdk.vm.ci.code.ValueUtil.isRegister;
29+
import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
2730
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL;
2831
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
2932
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK;
3033
import static org.graalvm.compiler.lir.LIRValueUtil.differentRegisters;
31-
import static jdk.vm.ci.code.ValueUtil.asRegister;
32-
import static jdk.vm.ci.code.ValueUtil.isRegister;
3334

3435
import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
3536
import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
@@ -195,7 +196,7 @@ public static int directCall(CompilationResultBuilder crb, AMD64MacroAssembler m
195196
}
196197
int before = masm.position();
197198
int callPCOffset;
198-
if (scratch != null) {
199+
if (scratch != null && !GeneratePIC.getValue(crb.getOptions())) {
199200
// offset might not fit a 32-bit immediate, generate an
200201
// indirect call with a 64-bit immediate
201202
masm.movq(scratch, 0L);
@@ -222,12 +223,27 @@ protected static void emitAlignmentForDirectCall(CompilationResultBuilder crb, A
222223
}
223224
}
224225

225-
public static void directJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target) {
226+
public static int directJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target) {
227+
return directJmp(crb, masm, target, null);
228+
}
229+
230+
public static int directJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target, Register scratch) {
226231
int before = masm.position();
227-
masm.jmp(0, true);
232+
int callPCOffset;
233+
if (scratch != null && !GeneratePIC.getValue(crb.getOptions())) {
234+
// offset might not fit a 32-bit immediate, generate an
235+
// indirect call with a 64-bit immediate
236+
masm.movq(scratch, 0L);
237+
callPCOffset = masm.position();
238+
masm.jmp(scratch);
239+
} else {
240+
callPCOffset = masm.position();
241+
masm.jmp(0, true);
242+
}
228243
int after = masm.position();
229244
crb.recordDirectCall(before, after, target, null);
230245
masm.ensureUniquePC();
246+
return callPCOffset;
231247
}
232248

233249
public static void directConditionalJmp(CompilationResultBuilder crb, AMD64MacroAssembler masm, InvokeTarget target, ConditionFlag cond) {

0 commit comments

Comments
 (0)