| // 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(); | |
| } | |
| } |