blob: e8d830e332bf45d8b909f1983eee0b27f09b11cc [file] [log] [blame]
// Copyright (c) 2021, 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.conversion;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.ir.code.CatchHandlers;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.utils.ConsumerUtils;
import java.util.List;
import java.util.function.Consumer;
public abstract class SyntheticStraightLineSourceCode implements SourceCode {
private final List<Consumer<IRBuilder>> instructionBuilders;
private final Position position;
protected SyntheticStraightLineSourceCode(
List<Consumer<IRBuilder>> instructionBuilders, Position position) {
this.instructionBuilders = instructionBuilders;
this.position = position;
}
@Override
public int instructionCount() {
return instructionBuilders.size();
}
@Override
public int instructionIndex(int instructionOffset) {
return instructionOffset;
}
@Override
public int instructionOffset(int instructionIndex) {
return instructionIndex;
}
@Override
public void buildPrelude(IRBuilder builder) {
int firstArgumentRegister = 0;
builder.buildArgumentsWithRewrittenPrototypeChanges(
firstArgumentRegister, builder.getMethod(), ConsumerUtils.emptyBiConsumer());
}
@Override
public void buildInstruction(
IRBuilder builder, int instructionIndex, boolean firstBlockInstruction) {
instructionBuilders.get(instructionIndex).accept(builder);
}
@Override
public void buildPostlude(IRBuilder builder) {
// Intentionally empty.
}
@Override
public void clear() {
// Intentionally empty.
}
@Override
public Position getCanonicalDebugPositionAtOffset(int offset) {
return Position.syntheticNone();
}
@Override
public CatchHandlers<Integer> getCurrentCatchHandlers(IRBuilder builder) {
return null;
}
@Override
public Position getCurrentPosition() {
return position;
}
@Override
public DebugLocalInfo getIncomingLocal(int register) {
return null;
}
@Override
public DebugLocalInfo getIncomingLocalAtBlock(int register, int blockOffset) {
return null;
}
@Override
public DebugLocalInfo getOutgoingLocal(int register) {
return null;
}
@Override
public void setUp() {
// Intentionally empty.
}
@Override
public int traceInstruction(int instructionIndex, IRBuilder builder) {
// This instruction does not close the block.
return -1;
}
@Override
public boolean verifyCurrentInstructionCanThrow() {
return true;
}
@Override
public boolean verifyRegister(int register) {
return true;
}
@Override
public void buildBlockTransfer(
IRBuilder builder, int predecessorOffset, int successorOffset, boolean isExceptional) {
throw new Unreachable();
}
@Override
public int getMoveExceptionRegister(int instructionIndex) {
throw new Unreachable();
}
@Override
public void resolveAndBuildNewArrayFilledData(
int arrayRef, int payloadOffset, IRBuilder builder) {
throw new Unreachable();
}
@Override
public void resolveAndBuildSwitch(
int value, int fallthroughOffset, int payloadOffset, IRBuilder builder) {
throw new Unreachable();
}
@Override
public boolean verifyLocalInScope(DebugLocalInfo local) {
throw new Unreachable();
}
}