diff -r d58442b8abc1 -r 650335128b9d src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java Thu Jun 27 03:33:44 2019 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java Tue Jul 23 11:36:05 2019 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, 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 diff -r d58442b8abc1 -r 650335128b9d src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java Thu Jun 27 03:33:44 2019 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java Tue Jul 23 11:36:05 2019 -0700 @@ -344,6 +344,7 @@ public final int threadIsMethodHandleReturnOffset = getFieldOffset("JavaThread::_is_method_handle_return", Integer.class, "int"); public final int threadObjectResultOffset = getFieldOffset("JavaThread::_vm_result", Integer.class, "oop"); public final int jvmciCountersThreadOffset = getFieldOffset("JavaThread::_jvmci_counters", Integer.class, "jlong*"); + public final int doingUnsafeAccessOffset = getFieldOffset("JavaThread::_doing_unsafe_access", Integer.class, "bool", Integer.MAX_VALUE); public final int javaThreadReservedStackActivationOffset = versioned.javaThreadReservedStackActivationOffset; public boolean requiresReservedStackCheck(List methods) { diff -r d58442b8abc1 -r 650335128b9d src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java Thu Jun 27 03:33:44 2019 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java Tue Jul 23 11:36:05 2019 -0700 @@ -175,7 +175,7 @@ registerGHASHPlugins(invocationPlugins, config, metaAccess, foreignCalls); registerCounterModePlugins(invocationPlugins, config, replacementBytecodeProvider); registerBase64Plugins(invocationPlugins, config, metaAccess, foreignCalls); - registerUnsafePlugins(invocationPlugins, replacementBytecodeProvider); + registerUnsafePlugins(invocationPlugins, config, replacementBytecodeProvider); StandardGraphBuilderPlugins.registerInvocationPlugins(metaAccess, snippetReflection, invocationPlugins, replacementBytecodeProvider, true, false); registerArrayPlugins(invocationPlugins, replacementBytecodeProvider); registerStringPlugins(invocationPlugins, replacementBytecodeProvider); @@ -276,15 +276,16 @@ r.registerMethodSubstitution(ReflectionSubstitutions.class, "getClassAccessFlags", Class.class); } - private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementBytecodeProvider) { + private static void registerUnsafePlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider replacementBytecodeProvider) { Registration r; if (JavaVersionUtil.JAVA_SPEC <= 8) { r = new Registration(plugins, Unsafe.class, replacementBytecodeProvider); } else { r = new Registration(plugins, "jdk.internal.misc.Unsafe", replacementBytecodeProvider); } - r.registerMethodSubstitution(HotSpotUnsafeSubstitutions.class, HotSpotUnsafeSubstitutions.copyMemoryName, "copyMemory", Receiver.class, Object.class, long.class, Object.class, long.class, - long.class); + String substituteMethodName = config.doingUnsafeAccessOffset != Integer.MAX_VALUE ? "copyMemoryGuarded" : "copyMemory"; + r.registerMethodSubstitution(HotSpotUnsafeSubstitutions.class, HotSpotUnsafeSubstitutions.copyMemoryName, substituteMethodName, Receiver.class, Object.class, long.class, Object.class, + long.class, long.class); } private static final LocationIdentity INSTANCE_KLASS_CONSTANTS = NamedLocationIdentity.immutable("InstanceKlass::_constants"); diff -r d58442b8abc1 -r 650335128b9d src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java Thu Jun 27 03:33:44 2019 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java Tue Jul 23 11:36:05 2019 -0700 @@ -24,12 +24,17 @@ package org.graalvm.compiler.hotspot.meta; +import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG; +import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.doingUnsafeAccessOffset; + import org.graalvm.compiler.api.replacements.ClassSubstitution; import org.graalvm.compiler.api.replacements.MethodSubstitution; import org.graalvm.compiler.hotspot.HotSpotBackend; +import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode; import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.serviceprovider.JavaVersionUtil; import org.graalvm.compiler.word.Word; +import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.internal.vm.compiler.word.WordFactory; @ClassSubstitution(className = {"jdk.internal.misc.Unsafe", "sun.misc.Unsafe"}) @@ -43,6 +48,24 @@ Word srcAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(srcBase, srcOffset)); Word dstAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(destBase, destOffset)); Word size = WordFactory.signed(bytes); + HotSpotBackend.unsafeArraycopy(srcAddr, dstAddr, size); } + + @SuppressWarnings("unused") + @MethodSubstitution(value = "copyMemory", isStatic = false) + static void copyMemoryGuarded(Object receiver, Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes) { + Word srcAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(srcBase, srcOffset)); + Word dstAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(destBase, destOffset)); + Word size = WordFactory.signed(bytes); + Word javaThread = CurrentJavaThreadNode.get(); + int offset = doingUnsafeAccessOffset(INJECTED_VMCONFIG); + LocationIdentity any = LocationIdentity.any(); + + /* Set doingUnsafeAccess to guard and handle unsafe memory access failures */ + javaThread.writeByte(offset, (byte) 1, any); + HotSpotBackend.unsafeArraycopy(srcAddr, dstAddr, size); + /* Reset doingUnsafeAccess */ + javaThread.writeByte(offset, (byte) 0, any); + } } diff -r d58442b8abc1 -r 650335128b9d src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java Thu Jun 27 03:33:44 2019 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java Tue Jul 23 11:36:05 2019 -0700 @@ -187,6 +187,14 @@ return config.verifyOops; } + /** + * @see GraalHotSpotVMConfig#doingUnsafeAccessOffset + */ + @Fold + public static int doingUnsafeAccessOffset(@InjectedParameter GraalHotSpotVMConfig config) { + return config.doingUnsafeAccessOffset; + } + public static final LocationIdentity EXCEPTION_OOP_LOCATION = NamedLocationIdentity.mutable("ExceptionOop"); /** diff -r d58442b8abc1 -r 650335128b9d src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java Thu Jun 27 03:33:44 2019 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java Tue Jul 23 11:36:05 2019 -0700 @@ -29,11 +29,9 @@ import static jdk.vm.ci.amd64.AMD64.rdi; import static jdk.vm.ci.amd64.AMD64.rdx; import static jdk.vm.ci.amd64.AMD64.rsi; - import static jdk.vm.ci.code.ValueUtil.asRegister; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; -import jdk.vm.ci.amd64.AMD64; import org.graalvm.compiler.asm.Label; import org.graalvm.compiler.asm.amd64.AMD64Address; import org.graalvm.compiler.asm.amd64.AMD64Assembler; @@ -44,6 +42,7 @@ import org.graalvm.compiler.lir.asm.CompilationResultBuilder; import org.graalvm.compiler.lir.gen.LIRGeneratorTool; +import jdk.vm.ci.amd64.AMD64; import jdk.vm.ci.amd64.AMD64Kind; import jdk.vm.ci.code.Register; import jdk.vm.ci.meta.Value; @@ -52,9 +51,13 @@ public final class AMD64StringLatin1InflateOp extends AMD64LIRInstruction { public static final LIRInstructionClass TYPE = LIRInstructionClass.create(AMD64StringLatin1InflateOp.class); - @Alive({REG}) private Value rsrc; - @Alive({REG}) private Value rdst; - @Alive({REG}) private Value rlen; + @Use({REG}) private Value rsrc; + @Use({REG}) private Value rdst; + @Use({REG}) private Value rlen; + + @Temp({REG}) private Value rsrcTemp; + @Temp({REG}) private Value rdstTemp; + @Temp({REG}) private Value rlenTemp; @Temp({REG}) private Value vtmp1; @Temp({REG}) private Value rtmp2; @@ -66,9 +69,9 @@ assert asRegister(dst).equals(rdi); assert asRegister(len).equals(rdx); - rsrc = src; - rdst = dst; - rlen = len; + rsrcTemp = rsrc = src; + rdstTemp = rdst = dst; + rlenTemp = rlen = len; vtmp1 = tool.newVariable(LIRKind.value(AMD64Kind.V512_BYTE)); rtmp2 = tool.newVariable(LIRKind.value(AMD64Kind.DWORD)); diff -r d58442b8abc1 -r 650335128b9d src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringUTF16CompressOp.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringUTF16CompressOp.java Thu Jun 27 03:33:44 2019 +0200 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringUTF16CompressOp.java Tue Jul 23 11:36:05 2019 -0700 @@ -31,12 +31,10 @@ import static jdk.vm.ci.amd64.AMD64.rdi; import static jdk.vm.ci.amd64.AMD64.rdx; import static jdk.vm.ci.amd64.AMD64.rsi; - import static jdk.vm.ci.amd64.AMD64.rsp; import static jdk.vm.ci.code.ValueUtil.asRegister; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; -import jdk.vm.ci.amd64.AMD64; import org.graalvm.compiler.asm.Label; import org.graalvm.compiler.asm.amd64.AMD64Address; import org.graalvm.compiler.asm.amd64.AMD64Assembler; @@ -47,6 +45,7 @@ import org.graalvm.compiler.lir.asm.CompilationResultBuilder; import org.graalvm.compiler.lir.gen.LIRGeneratorTool; +import jdk.vm.ci.amd64.AMD64; import jdk.vm.ci.amd64.AMD64Kind; import jdk.vm.ci.code.Register; import jdk.vm.ci.meta.Value; @@ -56,9 +55,13 @@ public static final LIRInstructionClass TYPE = LIRInstructionClass.create(AMD64StringUTF16CompressOp.class); @Def({REG}) private Value rres; - @Alive({REG}) private Value rsrc; - @Alive({REG}) private Value rdst; - @Alive({REG}) private Value rlen; + @Use({REG}) private Value rsrc; + @Use({REG}) private Value rdst; + @Use({REG}) private Value rlen; + + @Temp({REG}) private Value rsrcTemp; + @Temp({REG}) private Value rdstTemp; + @Temp({REG}) private Value rlenTemp; @Temp({REG}) private Value vtmp1; @Temp({REG}) private Value vtmp2; @@ -75,9 +78,9 @@ assert asRegister(res).equals(rax); rres = res; - rsrc = src; - rdst = dst; - rlen = len; + rsrcTemp = rsrc = src; + rdstTemp = rdst = dst; + rlenTemp = rlen = len; LIRKind vkind = LIRKind.value(AMD64Kind.V512_BYTE);