22 */ |
22 */ |
23 |
23 |
24 |
24 |
25 package org.graalvm.compiler.hotspot.meta; |
25 package org.graalvm.compiler.hotspot.meta; |
26 |
26 |
27 import static org.graalvm.compiler.serviceprovider.JavaVersionUtil.Java8OrEarlier; |
27 import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG; |
|
28 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.doingUnsafeAccessOffset; |
28 |
29 |
29 import org.graalvm.compiler.api.replacements.ClassSubstitution; |
30 import org.graalvm.compiler.api.replacements.ClassSubstitution; |
30 import org.graalvm.compiler.api.replacements.MethodSubstitution; |
31 import org.graalvm.compiler.api.replacements.MethodSubstitution; |
31 import org.graalvm.compiler.hotspot.HotSpotBackend; |
32 import org.graalvm.compiler.hotspot.HotSpotBackend; |
|
33 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode; |
32 import org.graalvm.compiler.nodes.ComputeObjectAddressNode; |
34 import org.graalvm.compiler.nodes.ComputeObjectAddressNode; |
|
35 import org.graalvm.compiler.serviceprovider.JavaVersionUtil; |
33 import org.graalvm.compiler.word.Word; |
36 import org.graalvm.compiler.word.Word; |
|
37 import jdk.internal.vm.compiler.word.LocationIdentity; |
34 import jdk.internal.vm.compiler.word.WordFactory; |
38 import jdk.internal.vm.compiler.word.WordFactory; |
35 |
39 |
36 @ClassSubstitution(className = {"jdk.internal.misc.Unsafe", "sun.misc.Unsafe"}) |
40 @ClassSubstitution(className = {"jdk.internal.misc.Unsafe", "sun.misc.Unsafe"}) |
37 public class HotSpotUnsafeSubstitutions { |
41 public class HotSpotUnsafeSubstitutions { |
38 |
42 |
39 public static final String copyMemoryName = Java8OrEarlier ? "copyMemory" : "copyMemory0"; |
43 public static final String copyMemoryName = JavaVersionUtil.JAVA_SPEC <= 8 ? "copyMemory" : "copyMemory0"; |
40 |
44 |
41 @SuppressWarnings("unused") |
45 @SuppressWarnings("unused") |
42 @MethodSubstitution(isStatic = false) |
46 @MethodSubstitution(isStatic = false) |
43 static void copyMemory(Object receiver, Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes) { |
47 static void copyMemory(Object receiver, Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes) { |
44 Word srcAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(srcBase, srcOffset)); |
48 Word srcAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(srcBase, srcOffset)); |
45 Word dstAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(destBase, destOffset)); |
49 Word dstAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(destBase, destOffset)); |
46 Word size = WordFactory.signed(bytes); |
50 Word size = WordFactory.signed(bytes); |
|
51 |
47 HotSpotBackend.unsafeArraycopy(srcAddr, dstAddr, size); |
52 HotSpotBackend.unsafeArraycopy(srcAddr, dstAddr, size); |
48 } |
53 } |
|
54 |
|
55 @SuppressWarnings("unused") |
|
56 @MethodSubstitution(value = "copyMemory", isStatic = false) |
|
57 static void copyMemoryGuarded(Object receiver, Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes) { |
|
58 Word srcAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(srcBase, srcOffset)); |
|
59 Word dstAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(destBase, destOffset)); |
|
60 Word size = WordFactory.signed(bytes); |
|
61 Word javaThread = CurrentJavaThreadNode.get(); |
|
62 int offset = doingUnsafeAccessOffset(INJECTED_VMCONFIG); |
|
63 LocationIdentity any = LocationIdentity.any(); |
|
64 |
|
65 /* Set doingUnsafeAccess to guard and handle unsafe memory access failures */ |
|
66 javaThread.writeByte(offset, (byte) 1, any); |
|
67 HotSpotBackend.unsafeArraycopy(srcAddr, dstAddr, size); |
|
68 /* Reset doingUnsafeAccess */ |
|
69 javaThread.writeByte(offset, (byte) 0, any); |
|
70 } |
49 } |
71 } |