public LoweringProvider createLoweringProvider(MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls) { return new SubstrateBasicLoweringProvider(metaAccess, foreignCalls, ConfigurationValues.getTarget()); }
@Override public int arrayLengthOffset() { return getObjectLayout().getArrayLengthOffset(); }
@Override public void setConfiguration(RuntimeConfiguration runtimeConfig, OptionValues options, Iterable<DebugHandlersFactory> factories, Providers providers, SnippetReflectionProvider snippetReflection) { this.runtimeConfig = runtimeConfig; initialize(options, factories, Group.NullFactory, providers, snippetReflection); }
@Override protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, LoweringTool tool) { if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) { return graph.unique(new LoadHubNode(tool.getStampProvider(), object)); } assert !object.isConstant() || object.asJavaConstant().isNull(); Stamp headerBitsStamp = StampFactory.forUnsignedInteger(8 * getObjectLayout().getReferenceSize()); ConstantNode headerOffset = ConstantNode.forIntegerKind(target.wordJavaKind, getObjectLayout().getHubOffset(), graph); AddressNode headerAddress = graph.unique(new OffsetAddressNode(object, headerOffset)); ValueNode headerBits = graph.unique(new FloatingReadNode(headerAddress, NamedLocationIdentity.FINAL_LOCATION, null, headerBitsStamp, null, BarrierType.NONE)); ValueNode hubBits; int encodingShift = ReferenceAccess.singleton().getCompressEncoding().getShift(); if (encodingShift != 0) { assert (Long.MAX_VALUE << encodingShift) == ObjectHeader.BITS_CLEAR.rawValue() : "Compression shift must mask object header bits"; hubBits = graph.unique(new UnsignedRightShiftNode(headerBits, ConstantNode.forInt(encodingShift, graph))); } else { hubBits = graph.unique(new AndNode(headerBits, ConstantNode.forIntegerStamp(headerBitsStamp, ObjectHeader.BITS_CLEAR.rawValue(), graph))); } FloatingWordCastNode hubRef = graph.unique(new FloatingWordCastNode(hubStamp, hubBits)); return maybeUncompress(hubRef); }
@SuppressWarnings("unchecked") @Override public void lower(Node n, LoweringTool tool) { @SuppressWarnings("rawtypes") NodeLoweringProvider lowering = lowerings.get(n.getClass()); if (lowering != null) { lowering.lower(n, tool); } else if (n instanceof RemNode) { /* No lowering necessary. */ } else if (n instanceof AssertionNode) { lowerAssertionNode((AssertionNode) n); } else { super.lower(n, tool); } }
@Override protected ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor) { ConstantNode componentHubOffset = ConstantNode.forIntegerKind(target.wordJavaKind, runtimeConfig.getComponentHubOffset(), graph); AddressNode componentHubAddress = graph.unique(new OffsetAddressNode(arrayHub, componentHubOffset)); FloatingReadNode componentHubRef = graph.unique(new FloatingReadNode(componentHubAddress, NamedLocationIdentity.FINAL_LOCATION, null, hubStamp, null, BarrierType.NONE)); return maybeUncompress(componentHubRef); }
@Override public ValueNode staticFieldBase(StructuredGraph graph, ResolvedJavaField f) { SharedField field = (SharedField) f; assert field.isStatic(); Object fields = field.getStorageKind() == JavaKind.Object ? StaticFieldsSupport.getStaticObjectFields() : StaticFieldsSupport.getStaticPrimitiveFields(); return ConstantNode.forConstant(SubstrateObjectConstant.forObject(fields), getProviders().getMetaAccess(), graph); }