1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.code; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpecList; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.SourcePosition; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Pseudo-instruction which is used to track an address within a code 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * array. Instances are used for such things as branch targets and 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception handler ranges. Its code size is zero, and so instances 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * do not in general directly wind up in any output (either 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * human-oriented or binary file). 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class CodeAddress extends ZeroSizeInsn { 3040c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver /** If this address should bind closely to the following real instruction */ 3140c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver private final boolean bindsClosely; 3240c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. The output address of this instance is initially 3599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * unknown ({@code -1}). 36de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 3799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param position {@code non-null;} source position 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CodeAddress(SourcePosition position) { 4040c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver this(position, false); 4140c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver } 4240c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver 4340c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver /** 4440c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * Constructs an instance. The output address of this instance is initially 4540c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * unknown ({@code -1}). 4640c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * 4740c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * @param position {@code non-null;} source position 4840c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * @param bindsClosely if the address should bind closely to the following 4940c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * real instruction. 5040c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver */ 5140c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver public CodeAddress(SourcePosition position, boolean bindsClosely) { 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(position); 5340c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver this.bindsClosely = bindsClosely; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final DalvInsn withRegisters(RegisterSpecList registers) { 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new CodeAddress(getPosition()); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected String argString() { 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected String listingString0(boolean noteIndices) { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "code-address"; 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 7340c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver 7440c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver /** 7540c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * Gets whether this address binds closely to the following "real" 7640c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * (non-zero-length) instruction. 7740c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * 7840c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * When a prefix is added to an instruction (for example, to move a value 7940c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * from a high register to a low register), this determines whether this 8040c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * {@code CodeAddress} will point to the prefix, or to the instruction 8140c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * itself. 8240c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * 8340c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * If bindsClosely is true, the address will point to the instruction 8440c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * itself, otherwise it will point to the prefix (if any) 8540c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * 8640c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver * @return true if this address binds closely to the next real instruction 8740c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver */ 8840c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver public boolean getBindsClosely() { 8940c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver return bindsClosely; 9040c69d949e67fe2cc2cccf4dd16b2f9fdabea396Ben Gruver } 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 92