| // Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| package com.android.tools.r8.ir.analysis.value; |
| |
| import com.android.tools.r8.graph.AppInfoWithClassHierarchy; |
| import com.android.tools.r8.graph.AppView; |
| import com.android.tools.r8.graph.DebugLocalInfo; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.graph.ProgramMethod; |
| import com.android.tools.r8.graph.lens.GraphLens; |
| import com.android.tools.r8.graph.proto.ArgumentInfoCollection; |
| import com.android.tools.r8.ir.analysis.type.TypeElement; |
| import com.android.tools.r8.ir.code.Instruction; |
| import com.android.tools.r8.ir.code.MaterializingInstructionsInfo; |
| import com.android.tools.r8.ir.code.Position; |
| import com.android.tools.r8.ir.code.ResourceConstNumber; |
| import com.android.tools.r8.ir.code.ValueFactory; |
| import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfo; |
| import com.android.tools.r8.shaking.AppInfoWithLiveness; |
| |
| public class SingleResourceNumberValue extends SingleConstValue { |
| |
| private final int value; |
| |
| /** Intentionally package private, use {@link AbstractValueFactory} instead. */ |
| SingleResourceNumberValue(int value) { |
| this.value = value; |
| } |
| |
| @Override |
| public boolean hasSingleMaterializingInstruction() { |
| return true; |
| } |
| |
| @Override |
| public boolean isSingleResourceNumberValue() { |
| return true; |
| } |
| |
| @Override |
| public SingleResourceNumberValue asSingleResourceNumberValue() { |
| return this; |
| } |
| |
| public int getValue() { |
| return value; |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| return this == o; |
| } |
| |
| @Override |
| public int hashCode() { |
| return System.identityHashCode(this); |
| } |
| |
| @Override |
| public String toString() { |
| return "SingleResourceNumberValue(" + value + ")"; |
| } |
| |
| @Override |
| public Instruction[] createMaterializingInstructions( |
| AppView<?> appView, |
| ProgramMethod context, |
| ValueFactory valueFactory, |
| MaterializingInstructionsInfo info) { |
| ResourceConstNumber materializingInstruction = |
| createMaterializingInstruction(appView, valueFactory, info); |
| return new Instruction[] {materializingInstruction}; |
| } |
| |
| public ResourceConstNumber createMaterializingInstruction( |
| AppView<?> appView, ValueFactory valueFactory, MaterializingInstructionsInfo info) { |
| return createMaterializingInstruction( |
| appView, valueFactory, info.getOutType(), info.getLocalInfo(), info.getPosition()); |
| } |
| |
| public ResourceConstNumber createMaterializingInstruction( |
| AppView<?> appView, |
| ValueFactory valueFactory, |
| TypeElement type, |
| DebugLocalInfo localInfo, |
| Position position) { |
| assert type.isInt(); |
| return ResourceConstNumber.builder() |
| .setFreshOutValue(valueFactory, type, localInfo) |
| .setPositionForNonThrowingInstruction(position, appView.options()) |
| .setValue(value) |
| .build(); |
| } |
| |
| @Override |
| boolean internalIsMaterializableInContext( |
| AppView<? extends AppInfoWithClassHierarchy> appView, ProgramMethod context) { |
| return true; |
| } |
| |
| @Override |
| public boolean isMaterializableInAllContexts(AppView<AppInfoWithLiveness> appView) { |
| return true; |
| } |
| |
| @Override |
| public InstanceFieldInitializationInfo fixupAfterParametersChanged( |
| ArgumentInfoCollection argumentInfoCollection) { |
| return this; |
| } |
| |
| @Override |
| public SingleValue rewrittenWithLens( |
| AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) { |
| return this; |
| } |
| } |