< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/NewInstanceStub.java

Print this page




  36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getAndClearObjectResult;
  37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeTlab;
  38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.isInstanceKlassFullyInitialized;
  39 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readLayoutHelper;
  40 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.log2WordSize;
  41 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.prototypeMarkWordOffset;
  42 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabEnd;
  43 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabStart;
  44 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabTop;
  45 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
  46 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadAllocatedBytesOffset;
  47 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadTlabSizeOffset;
  48 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabAlignmentReserveInHeapWords;
  49 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabFastRefillWasteOffset;
  50 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabIntArrayMarkWord;
  51 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabNumberOfRefillsOffset;
  52 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteIncrement;
  53 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteLimitOffset;
  54 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabSlowAllocationsOffset;
  55 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabStats;

  56 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useG1GC;
  57 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useTLAB;
  58 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.wordSize;
  59 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.writeTlabTop;
  60 import static org.graalvm.compiler.hotspot.stubs.StubUtil.handlePendingException;
  61 import static org.graalvm.compiler.hotspot.stubs.StubUtil.newDescriptor;
  62 import static org.graalvm.compiler.hotspot.stubs.StubUtil.printf;
  63 import static org.graalvm.compiler.hotspot.stubs.StubUtil.verifyObject;
  64 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.FAST_PATH_PROBABILITY;
  65 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability;
  66 
  67 import org.graalvm.compiler.api.replacements.Fold;
  68 import org.graalvm.compiler.api.replacements.Snippet;
  69 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
  70 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
  71 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
  72 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
  73 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
  74 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  75 import org.graalvm.compiler.hotspot.nodes.GraalHotSpotVMConfigNode;


 130     @Fold
 131     static boolean logging(OptionValues options) {
 132         return StubOptions.TraceNewInstanceStub.getValue(options);
 133     }
 134 
 135     /**
 136      * Re-attempts allocation after an initial TLAB allocation failed or was skipped (e.g., due to
 137      * -XX:-UseTLAB).
 138      *
 139      * @param hub the hub of the object to be allocated
 140      * @param intArrayHub the hub for {@code int[].class}
 141      */
 142     @Snippet
 143     private static Object newInstance(KlassPointer hub, @ConstantParameter KlassPointer intArrayHub, @ConstantParameter Register threadRegister, @ConstantParameter OptionValues options) {
 144         /*
 145          * The type is known to be an instance so Klass::_layout_helper is the instance size as a
 146          * raw number
 147          */
 148         Word thread = registerAsWord(threadRegister);
 149         boolean inlineContiguousAllocationSupported = GraalHotSpotVMConfigNode.inlineContiguousAllocationSupported();
 150         if (!forceSlowPath(options) && inlineContiguousAllocationSupported) {
 151             if (isInstanceKlassFullyInitialized(hub)) {
 152                 int sizeInBytes = readLayoutHelper(hub);
 153                 Word memory = refillAllocate(thread, intArrayHub, sizeInBytes, logging(options));
 154                 if (memory.notEqual(0)) {
 155                     Word prototypeMarkWord = hub.readWord(prototypeMarkWordOffset(INJECTED_VMCONFIG), PROTOTYPE_MARK_WORD_LOCATION);
 156                     NewObjectSnippets.formatObjectForStub(hub, sizeInBytes, memory, prototypeMarkWord);
 157                     return verifyObject(memory.toObject());
 158                 }
 159             }
 160         }
 161 
 162         if (logging(options)) {
 163             printf("newInstance: calling new_instance_c\n");
 164         }
 165 
 166         newInstanceC(NEW_INSTANCE_C, thread, hub);
 167         handlePendingException(thread, true);
 168         return verifyObject(getAndClearObjectResult(thread));
 169     }
 170 




  36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getAndClearObjectResult;
  37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeTlab;
  38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.isInstanceKlassFullyInitialized;
  39 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readLayoutHelper;
  40 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.log2WordSize;
  41 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.prototypeMarkWordOffset;
  42 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabEnd;
  43 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabStart;
  44 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabTop;
  45 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
  46 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadAllocatedBytesOffset;
  47 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadTlabSizeOffset;
  48 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabAlignmentReserveInHeapWords;
  49 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabFastRefillWasteOffset;
  50 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabIntArrayMarkWord;
  51 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabNumberOfRefillsOffset;
  52 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteIncrement;
  53 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteLimitOffset;
  54 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabSlowAllocationsOffset;
  55 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabStats;
  56 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useCMSIncrementalMode;
  57 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useG1GC;
  58 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useTLAB;
  59 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.wordSize;
  60 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.writeTlabTop;
  61 import static org.graalvm.compiler.hotspot.stubs.StubUtil.handlePendingException;
  62 import static org.graalvm.compiler.hotspot.stubs.StubUtil.newDescriptor;
  63 import static org.graalvm.compiler.hotspot.stubs.StubUtil.printf;
  64 import static org.graalvm.compiler.hotspot.stubs.StubUtil.verifyObject;
  65 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.FAST_PATH_PROBABILITY;
  66 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability;
  67 
  68 import org.graalvm.compiler.api.replacements.Fold;
  69 import org.graalvm.compiler.api.replacements.Snippet;
  70 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
  71 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
  72 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
  73 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
  74 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
  75 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  76 import org.graalvm.compiler.hotspot.nodes.GraalHotSpotVMConfigNode;


 131     @Fold
 132     static boolean logging(OptionValues options) {
 133         return StubOptions.TraceNewInstanceStub.getValue(options);
 134     }
 135 
 136     /**
 137      * Re-attempts allocation after an initial TLAB allocation failed or was skipped (e.g., due to
 138      * -XX:-UseTLAB).
 139      *
 140      * @param hub the hub of the object to be allocated
 141      * @param intArrayHub the hub for {@code int[].class}
 142      */
 143     @Snippet
 144     private static Object newInstance(KlassPointer hub, @ConstantParameter KlassPointer intArrayHub, @ConstantParameter Register threadRegister, @ConstantParameter OptionValues options) {
 145         /*
 146          * The type is known to be an instance so Klass::_layout_helper is the instance size as a
 147          * raw number
 148          */
 149         Word thread = registerAsWord(threadRegister);
 150         boolean inlineContiguousAllocationSupported = GraalHotSpotVMConfigNode.inlineContiguousAllocationSupported();
 151         if (!forceSlowPath(options) && inlineContiguousAllocationSupported && !useCMSIncrementalMode(INJECTED_VMCONFIG)) {
 152             if (isInstanceKlassFullyInitialized(hub)) {
 153                 int sizeInBytes = readLayoutHelper(hub);
 154                 Word memory = refillAllocate(thread, intArrayHub, sizeInBytes, logging(options));
 155                 if (memory.notEqual(0)) {
 156                     Word prototypeMarkWord = hub.readWord(prototypeMarkWordOffset(INJECTED_VMCONFIG), PROTOTYPE_MARK_WORD_LOCATION);
 157                     NewObjectSnippets.formatObjectForStub(hub, sizeInBytes, memory, prototypeMarkWord);
 158                     return verifyObject(memory.toObject());
 159                 }
 160             }
 161         }
 162 
 163         if (logging(options)) {
 164             printf("newInstance: calling new_instance_c\n");
 165         }
 166 
 167         newInstanceC(NEW_INSTANCE_C, thread, hub);
 168         handlePendingException(thread, true);
 169         return verifyObject(getAndClearObjectResult(thread));
 170     }
 171 


< prev index next >