src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 54084 84f10bbf993f
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
     1 /*
     1 /*
     2  * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    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 }