1
1
/*
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.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
24
24
*/
25
25
package org .graalvm .compiler .lir .amd64 ;
26
26
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 ;
27
30
import static org .graalvm .compiler .lir .LIRInstruction .OperandFlag .ILLEGAL ;
28
31
import static org .graalvm .compiler .lir .LIRInstruction .OperandFlag .REG ;
29
32
import static org .graalvm .compiler .lir .LIRInstruction .OperandFlag .STACK ;
30
33
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 ;
33
34
34
35
import org .graalvm .compiler .asm .amd64 .AMD64Assembler .ConditionFlag ;
35
36
import org .graalvm .compiler .asm .amd64 .AMD64MacroAssembler ;
@@ -195,7 +196,7 @@ public static int directCall(CompilationResultBuilder crb, AMD64MacroAssembler m
195
196
}
196
197
int before = masm .position ();
197
198
int callPCOffset ;
198
- if (scratch != null ) {
199
+ if (scratch != null && ! GeneratePIC . getValue ( crb . getOptions ()) ) {
199
200
// offset might not fit a 32-bit immediate, generate an
200
201
// indirect call with a 64-bit immediate
201
202
masm .movq (scratch , 0L );
@@ -222,12 +223,27 @@ protected static void emitAlignmentForDirectCall(CompilationResultBuilder crb, A
222
223
}
223
224
}
224
225
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 ) {
226
231
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
+ }
228
243
int after = masm .position ();
229
244
crb .recordDirectCall (before , after , target , null );
230
245
masm .ensureUniquePC ();
246
+ return callPCOffset ;
231
247
}
232
248
233
249
public static void directConditionalJmp (CompilationResultBuilder crb , AMD64MacroAssembler masm , InvokeTarget target , ConditionFlag cond ) {
0 commit comments