Skip to content

Commit 76a4467

Browse files
committed
Fix code according to comments
1 parent 579671d commit 76a4467

File tree

20 files changed

+325
-302
lines changed

20 files changed

+325
-302
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
26+
package org.graalvm.compiler.core.riscv64;
27+
28+
import java.lang.reflect.Method;
29+
30+
/**
31+
* This class contains utility methods for accessing RISC-V JVMCI classes and fields using
32+
* reflection. This is needed as all JDK versions used by Graal currently do not implement JVMCI for
33+
* RISC-V, which causes unwanted build errors.
34+
*/
35+
public class RISCV64ReflectionUtil {
36+
public static Class<?> lookupClass(boolean optional, String className) {
37+
try {
38+
return Class.forName(className);
39+
} catch (ClassNotFoundException ex) {
40+
if (optional) {
41+
return null;
42+
}
43+
throw new ReflectionUtilError(ex);
44+
}
45+
}
46+
47+
@SuppressWarnings("unchecked")
48+
public static <T> T readStaticField(Class<?> declaringClass, String fieldName) {
49+
try {
50+
return (T) declaringClass.getField(fieldName).get(null);
51+
} catch (ReflectiveOperationException ex) {
52+
throw new ReflectionUtilError(ex);
53+
}
54+
}
55+
56+
@SuppressWarnings("serial")
57+
public static final class ReflectionUtilError extends Error {
58+
private ReflectionUtilError(Throwable cause) {
59+
super(cause);
60+
}
61+
}
62+
63+
public static Method lookupMethod(Class<?> declaringClass, String methodName, Class<?>... parameterTypes) {
64+
try {
65+
return declaringClass.getDeclaredMethod(methodName, parameterTypes);
66+
} catch (ReflectiveOperationException ex) {
67+
throw new ReflectionUtilError(ex);
68+
}
69+
}
70+
71+
public static Object invokeMethod(Method method, Object obj, Object... args) {
72+
try {
73+
return method.invoke(obj, args);
74+
} catch (ReflectiveOperationException ex) {
75+
throw new ReflectionUtilError(ex);
76+
}
77+
}
78+
}

compiler/src/org.graalvm.compiler.hotspot.riscv64/src/org/graalvm/compiler/hotspot/riscv64/RISCV64HotSpotBackendFactory.java

Lines changed: 41 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.List;
2929

3030
import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig;
31+
import org.graalvm.compiler.core.riscv64.RISCV64ReflectionUtil;
3132
import org.graalvm.compiler.debug.GraalError;
3233
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
3334
import org.graalvm.compiler.hotspot.HotSpotBackend;
@@ -52,7 +53,7 @@
5253
import org.graalvm.compiler.nodes.spi.CoreProviders;
5354
import org.graalvm.compiler.options.OptionValues;
5455
import org.graalvm.compiler.phases.BasePhase;
55-
import org.graalvm.compiler.phases.common.AddressLoweringByUsePhase;
56+
import org.graalvm.compiler.phases.common.AddressLoweringPhase;
5657
import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
5758
import org.graalvm.compiler.serviceprovider.ServiceProvider;
5859

@@ -75,10 +76,10 @@ public String getName() {
7576

7677
@Override
7778
public Class<? extends Architecture> getArchitecture() {
78-
try {
79-
return Class.forName("jdk.vm.ci.riscv64.RISCV64").asSubclass(Architecture.class);
80-
} catch (ClassNotFoundException e) {
81-
// Running Native Image for RISC-V requires a JDK with JVMCI for RISC-V
79+
Class<?> riscv64 = RISCV64ReflectionUtil.lookupClass(true, "jdk.vm.ci.riscv64.RISCV64");
80+
if (riscv64 != null) {
81+
return riscv64.asSubclass(Architecture.class);
82+
} else {
8283
return null;
8384
}
8485
}
@@ -118,17 +119,12 @@ public ReferenceMapBuilder newReferenceMapBuilder(int totalFrameSize) {
118119

119120
@Override
120121
protected HotSpotRegistersProvider createRegisters() {
121-
try {
122-
Class<?> riscv64 = Class.forName("jdk.vm.ci.riscv64.RISCV64");
123-
Class<?> riscv64HotSpotRegisterConfig = Class.forName("jdk.vm.ci.hotspot.riscv64.RISCV64HotSpotRegisterConfig");
124-
Register tp = (Register) riscv64HotSpotRegisterConfig.getField("tp").get(null);
125-
Register x27 = (Register) riscv64.getField("x27").get(null);
126-
Register sp = (Register) riscv64HotSpotRegisterConfig.getField("sp").get(null);
127-
return new HotSpotRegisters(tp, x27, sp);
128-
} catch (IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
129-
e.printStackTrace();
130-
throw GraalError.shouldNotReachHere("Running Native Image for RISC-V requires a JDK with JVMCI for RISC-V");
131-
}
122+
Class<?> riscv64 = RISCV64ReflectionUtil.lookupClass(false, "jdk.vm.ci.riscv64.RISCV64");
123+
Class<?> riscv64HotSpotRegisterConfig = RISCV64ReflectionUtil.lookupClass(false, "jdk.vm.ci.hotspot.riscv64.RISCV64HotSpotRegisterConfig");
124+
Register tp = RISCV64ReflectionUtil.readStaticField(riscv64HotSpotRegisterConfig, "tp");
125+
Register x27 = RISCV64ReflectionUtil.readStaticField(riscv64, "x27");
126+
Register sp = RISCV64ReflectionUtil.readStaticField(riscv64HotSpotRegisterConfig, "sp");
127+
return new HotSpotRegisters(tp, x27, sp);
132128
}
133129

134130
@Override
@@ -141,7 +137,7 @@ protected HotSpotHostForeignCallsProvider createForeignCalls(HotSpotJVMCIRuntime
141137
protected HotSpotSuitesProvider createSuites(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, Plugins plugins,
142138
HotSpotRegistersProvider registers, HotSpotReplacementsImpl replacements, OptionValues options) {
143139
DefaultSuitesCreator suitesCreator = new DefaultSuitesCreator(compilerConfiguration, plugins);
144-
BasePhase<CoreProviders> addressLoweringPhase = new AddressLoweringByUsePhase(null);
140+
BasePhase<CoreProviders> addressLoweringPhase = new AddressLoweringPhase(null);
145141
return new AddressLoweringHotSpotSuitesProvider(suitesCreator, config, runtime, addressLoweringPhase);
146142
}
147143

@@ -156,39 +152,34 @@ protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider graa
156152
protected Value[] createNativeABICallerSaveRegisters(@SuppressWarnings("unused") GraalHotSpotVMConfig config, RegisterConfig regConfig) {
157153
List<Register> callerSave = new ArrayList<>(regConfig.getAllocatableRegisters().asList());
158154
// Removing callee-saved registers.
159-
try {
160-
Class<?> riscv64 = Class.forName("jdk.vm.ci.riscv64.RISCV64");
161-
/* General Purpose Registers. */
162-
callerSave.remove(riscv64.getField("x2").get(null));
163-
callerSave.remove(riscv64.getField("x8").get(null));
164-
callerSave.remove(riscv64.getField("x9").get(null));
165-
callerSave.remove(riscv64.getField("x10").get(null));
166-
callerSave.remove(riscv64.getField("x19").get(null));
167-
callerSave.remove(riscv64.getField("x20").get(null));
168-
callerSave.remove(riscv64.getField("x21").get(null));
169-
callerSave.remove(riscv64.getField("x22").get(null));
170-
callerSave.remove(riscv64.getField("x23").get(null));
171-
callerSave.remove(riscv64.getField("x24").get(null));
172-
callerSave.remove(riscv64.getField("x25").get(null));
173-
callerSave.remove(riscv64.getField("x26").get(null));
174-
callerSave.remove(riscv64.getField("x27").get(null));
175-
/* Floating-Point Registers. */
176-
callerSave.remove(riscv64.getField("f8").get(null));
177-
callerSave.remove(riscv64.getField("f9").get(null));
178-
callerSave.remove(riscv64.getField("f10").get(null));
179-
callerSave.remove(riscv64.getField("f19").get(null));
180-
callerSave.remove(riscv64.getField("f20").get(null));
181-
callerSave.remove(riscv64.getField("f21").get(null));
182-
callerSave.remove(riscv64.getField("f22").get(null));
183-
callerSave.remove(riscv64.getField("f23").get(null));
184-
callerSave.remove(riscv64.getField("f24").get(null));
185-
callerSave.remove(riscv64.getField("f25").get(null));
186-
callerSave.remove(riscv64.getField("f26").get(null));
187-
callerSave.remove(riscv64.getField("f27").get(null));
188-
} catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException e) {
189-
e.printStackTrace();
190-
throw GraalError.shouldNotReachHere("Running Native Image for RISC-V requires a JDK with JVMCI for RISC-V");
191-
}
155+
Class<?> riscv64 = RISCV64ReflectionUtil.lookupClass(false, "jdk.vm.ci.riscv64.RISCV64");
156+
/* General Purpose Registers. */
157+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x2"));
158+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x8"));
159+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x9"));
160+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x10"));
161+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x19"));
162+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x20"));
163+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x21"));
164+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x22"));
165+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x23"));
166+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x24"));
167+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x25"));
168+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x26"));
169+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "x27"));
170+
/* Floating-Point Registers. */
171+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f8"));
172+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f9"));
173+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f10"));
174+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f19"));
175+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f20"));
176+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f21"));
177+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f22"));
178+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f23"));
179+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f24"));
180+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f25"));
181+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f26"));
182+
callerSave.remove(RISCV64ReflectionUtil.readStaticField(riscv64, "f27"));
192183

193184
Value[] nativeABICallerSaveRegisters = new Value[callerSave.size()];
194185
for (int i = 0; i < callerSave.size(); i++) {

compiler/src/org.graalvm.compiler.hotspot.riscv64/src/org/graalvm/compiler/hotspot/riscv64/RISCV64HotSpotForeignCallsProvider.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_ALL_CALLER_SAVE_REGISTERS;
3030

3131
import org.graalvm.compiler.core.common.LIRKind;
32-
import org.graalvm.compiler.debug.GraalError;
32+
import org.graalvm.compiler.core.riscv64.RISCV64ReflectionUtil;
3333
import org.graalvm.compiler.hotspot.HotSpotBackend;
3434
import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkageImpl;
3535
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
@@ -65,22 +65,17 @@ public void initialize(HotSpotProviders providers, OptionValues options) {
6565

6666
// The calling convention for the exception handler stub is (only?) defined in
6767
// TemplateInterpreterGenerator::generate_throw_exception()
68-
try {
69-
Class<?> riscv64 = Class.forName("jdk.vm.ci.riscv64.RISCV64");
68+
Class<?> riscv64 = RISCV64ReflectionUtil.lookupClass(false, "jdk.vm.ci.riscv64.RISCV64");
7069

71-
RegisterValue exception = ((Register) riscv64.getField("x5").get(null)).asValue(LIRKind.reference(word));
72-
RegisterValue exceptionPc = ((Register) riscv64.getField("x7").get(null)).asValue(LIRKind.value(word));
70+
RegisterValue exception = ((Register) RISCV64ReflectionUtil.readStaticField(riscv64, "x5")).asValue(LIRKind.reference(word));
71+
RegisterValue exceptionPc = ((Register) RISCV64ReflectionUtil.readStaticField(riscv64, "x7")).asValue(LIRKind.value(word));
7372

74-
CallingConvention exceptionCc = new CallingConvention(0, ILLEGAL, exception, exceptionPc);
75-
register(new HotSpotForeignCallLinkageImpl(HotSpotBackend.EXCEPTION_HANDLER, 0L, DESTROYS_ALL_CALLER_SAVE_REGISTERS, exceptionCc, null));
76-
register(new HotSpotForeignCallLinkageImpl(HotSpotBackend.EXCEPTION_HANDLER_IN_CALLER, JUMP_ADDRESS, DESTROYS_ALL_CALLER_SAVE_REGISTERS, exceptionCc,
77-
null));
73+
CallingConvention exceptionCc = new CallingConvention(0, ILLEGAL, exception, exceptionPc);
74+
register(new HotSpotForeignCallLinkageImpl(HotSpotBackend.EXCEPTION_HANDLER, 0L, DESTROYS_ALL_CALLER_SAVE_REGISTERS, exceptionCc, null));
75+
register(new HotSpotForeignCallLinkageImpl(HotSpotBackend.EXCEPTION_HANDLER_IN_CALLER, JUMP_ADDRESS, DESTROYS_ALL_CALLER_SAVE_REGISTERS, exceptionCc,
76+
null));
7877

79-
super.initialize(providers, options);
80-
} catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException e) {
81-
e.printStackTrace();
82-
throw GraalError.shouldNotReachHere("Running Native Image for RISC-V requires a JDK with JVMCI for RISC-V");
83-
}
78+
super.initialize(providers, options);
8479
}
8580

8681
@Override

compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringByUsePhase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public abstract static class AddressLoweringByUse {
6262

6363
public AddressLoweringByUsePhase(AddressLoweringByUse lowering) {
6464
this.lowering = lowering;
65-
// assert lowering != null;
65+
assert lowering != null;
6666
}
6767

6868
@Override

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/Platform.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ default String getArchitecture() {
147147
}
148148

149149
/**
150-
* Returns string representing RISCV64 architecture.
150+
* Supported architecture: RISC-V 64-bit.
151151
*
152152
* @since 22.2
153153
*/

substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/util/LLVMIRBuilder.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,24 +1176,22 @@ public LLVMValueRef buildGEP(LLVMValueRef base, LLVMValueRef... indices) {
11761176
return LLVM.LLVMBuildGEP(builder, base, new PointerPointer<>(indices), indices.length, DEFAULT_INSTR_NAME);
11771177
}
11781178

1179-
public LLVMValueRef buildLoad(LLVMValueRef address, LLVMTypeRef type) {
1179+
private LLVMValueRef buildLoadHelper(LLVMValueRef address, LLVMTypeRef type, int alignment) {
11801180
LLVMTypeRef addressType = LLVM.LLVMTypeOf(address);
11811181
if (isObjectType(type) && !isObjectType(addressType)) {
11821182
boolean compressed = isCompressedPointerType(type);
11831183
return buildCall(helpers.getLoadObjectFromUntrackedPointerFunction(compressed), address);
11841184
}
11851185
LLVMValueRef castedAddress = buildBitcast(address, pointerType(type, isObjectType(addressType), false));
1186-
return buildLoad(castedAddress);
1186+
return alignment > 0 ? buildAlignedLoad(castedAddress, alignment) : buildLoad(castedAddress);
1187+
}
1188+
1189+
public LLVMValueRef buildLoad(LLVMValueRef address, LLVMTypeRef type) {
1190+
return buildLoadHelper(address, type, 0);
11871191
}
11881192

11891193
public LLVMValueRef buildAlignedLoad(LLVMValueRef address, LLVMTypeRef type, int alignment) {
1190-
LLVMTypeRef addressType = LLVM.LLVMTypeOf(address);
1191-
if (isObjectType(type) && !isObjectType(addressType)) {
1192-
boolean compressed = isCompressedPointerType(type);
1193-
return buildCall(helpers.getLoadObjectFromUntrackedPointerFunction(compressed), address);
1194-
}
1195-
LLVMValueRef castedAddress = buildBitcast(address, pointerType(type, isObjectType(addressType), false));
1196-
return buildAlignedLoad(castedAddress, alignment);
1194+
return buildLoadHelper(address, type, alignment);
11971195
}
11981196

11991197
public LLVMValueRef buildLoad(LLVMValueRef address) {

substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/util/LLVMObjectFileReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ public static final class LLVMTextSectionInfo {
213213
private LLVMTextSectionInfo(LLVMSectionInfo<Long, SymbolOffset> sectionInfo) {
214214
this.codeSize = sectionInfo.sectionInfo;
215215
for (SymbolOffset symbolOffset : sectionInfo.symbolInfo) {
216-
if (LLVMTargetSpecific.get().isValidSection(symbolOffset.symbol)) {
216+
if (LLVMTargetSpecific.get().isSymbolValid(symbolOffset.symbol)) {
217217
offsetToSymbol.put(symbolOffset.offset, symbolOffset.symbol);
218218
symbolToOffset.put(symbolOffset.symbol, symbolOffset.offset);
219219
}

substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/util/LLVMTargetSpecific.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ default String getLLVMRegisterName(String register) {
123123
/**
124124
* Condition for adding section in sections info to avoid duplicates.
125125
*/
126-
default boolean isValidSection(@SuppressWarnings("unused") String symbol) {
126+
default boolean isSymbolValid(@SuppressWarnings("unused") String symbol) {
127127
return true;
128128
}
129129

@@ -398,7 +398,7 @@ public String getScratchRegister() {
398398
* must remove when we parse the code at the linking step.
399399
*/
400400
@Override
401-
public boolean isValidSection(String section) {
401+
public boolean isSymbolValid(String section) {
402402
return !section.isEmpty() && !section.startsWith(".LBB");
403403
}
404404

substratevm/src/com.oracle.svm.core.graal.riscv64/src/com/oracle/svm/core/graal/riscv64/RISCV64ReservedRegisters.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
*/
2525
package com.oracle.svm.core.graal.riscv64;
2626

27+
import org.graalvm.compiler.core.riscv64.RISCV64ReflectionUtil;
2728
import org.graalvm.nativeimage.Platform;
2829
import org.graalvm.nativeimage.Platforms;
2930

3031
import com.oracle.svm.core.ReservedRegisters;
31-
import com.oracle.svm.util.ReflectionUtil;
3232

3333
import jdk.vm.ci.code.Register;
3434

@@ -39,12 +39,11 @@ public final class RISCV64ReservedRegisters extends ReservedRegisters {
3939
public static Register stackBaseRegisterCandidate;
4040

4141
static {
42-
try {
43-
stackBaseRegisterCandidate = (Register) ReflectionUtil.lookupField(Class.forName("jdk.vm.ci.riscv64.RISCV64"), "x2").get(null);
44-
threadRegisterCandidate = (Register) ReflectionUtil.lookupField(Class.forName("jdk.vm.ci.riscv64.RISCV64"), "x4").get(null);
45-
heapBaseRegisterCandidate = (Register) ReflectionUtil.lookupField(Class.forName("jdk.vm.ci.riscv64.RISCV64"), "x27").get(null);
46-
} catch (ClassNotFoundException | IllegalAccessException e) {
47-
// Running Native Image for RISC-V requires a JDK with JVMCI for RISC-V
42+
Class<?> riscv64 = RISCV64ReflectionUtil.lookupClass(true, "jdk.vm.ci.riscv64.RISCV64");
43+
if (riscv64 != null) {
44+
stackBaseRegisterCandidate = RISCV64ReflectionUtil.readStaticField(riscv64, "x2");
45+
threadRegisterCandidate = RISCV64ReflectionUtil.readStaticField(riscv64, "x23");
46+
heapBaseRegisterCandidate = RISCV64ReflectionUtil.readStaticField(riscv64, "x27");
4847
}
4948
}
5049

0 commit comments

Comments
 (0)