LocalVariableInfo.java revision 99409883d9c4c0ffb49b070ce307bb33a9dfe9f1
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.ssa; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.MutabilityControl; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpecSet; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpec; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashMap; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.List; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Container for local variable information for a particular {@link 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * com.android.dx.ssa.SsaMethod}. 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Stolen from {@link com.android.dx.rop.code.LocalVariableInfo}. 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class LocalVariableInfo extends MutabilityControl { 3299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code >= 0;} the register count for the method */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final int regCount; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 3699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code non-null;} {@link com.android.dx.rop.code.RegisterSpecSet} to use when indicating a block 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that has no locals; it is empty and immutable but has an appropriate 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * max size for the method 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final RegisterSpecSet emptySet; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 4399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code non-null;} array consisting of register sets representing the 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sets of variables already assigned upon entry to each block, 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * where array indices correspond to block indices 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final RegisterSpecSet[] blockStarts; 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} map from instructions to the variable each assigns */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final HashMap<SsaInsn, RegisterSpec> insnAssignments; 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method being represented by this instance 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalVariableInfo(SsaMethod method) { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (method == null) { 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("method == null"); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project List<SsaBasicBlock> blocks = method.getBlocks(); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.regCount = method.getRegCount(); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.emptySet = new RegisterSpecSet(regCount); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.blockStarts = new RegisterSpecSet[blocks.size()]; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.insnAssignments = 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new HashMap<SsaInsn, RegisterSpec>(/*hint here*/); 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project emptySet.setImmutable(); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the register set associated with the start of the block with 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the given index. 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param index {@code >= 0;} the block index 7899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param specs {@code non-null;} the register set to associate with the block 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setStarts(int index, RegisterSpecSet specs) { 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIfImmutable(); 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (specs == null) { 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("specs == null"); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blockStarts[index] = specs; 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (ArrayIndexOutOfBoundsException ex) { 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Translate the exception. 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("bogus index"); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Merges the given register set into the set for the block with the 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * given index. If there was not already an associated set, then this 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is the same as calling {@link #setStarts}. Otherwise, this will 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * merge the two sets and call {@link #setStarts} on the result of the 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * merge. 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param index {@code >= 0;} the block index 10399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param specs {@code non-null;} the register set to merge into the start set 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for the block 10599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} if the merge resulted in an actual change 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to the associated set (including storing one for the first time) or 10799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code false} if there was no change 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean mergeStarts(int index, RegisterSpecSet specs) { 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecSet start = getStarts0(index); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean changed = false; 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (start == null) { 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setStarts(index, specs); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecSet newStart = start.mutableCopy(); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newStart.intersect(specs, true); 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (start.equals(newStart)) { 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newStart.setImmutable(); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setStarts(index, newStart); 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the register set associated with the start of the block 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the given index. This returns an empty set with the appropriate 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * max size if no set was associated with the block in question. 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 13699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param index {@code >= 0;} the block index 13799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the associated register set 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RegisterSpecSet getStarts(int index) { 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecSet result = getStarts0(index); 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (result != null) ? result : emptySet; 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the register set associated with the start of the given 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * block. This is just convenient shorthand for 14899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code getStarts(block.getLabel())}. 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 15099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param block {@code non-null;} the block in question 15199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the associated register set 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RegisterSpecSet getStarts(SsaBasicBlock block) { 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getStarts(block.getIndex()); 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets a mutable copy of the register set associated with the 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * start of the block with the given index. This returns a 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * newly-allocated empty {@link RegisterSpecSet} of appropriate 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * max size if there is not yet any set associated with the block. 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 16399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param index {@code >= 0;} the block index 16499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the associated register set 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RegisterSpecSet mutableCopyOfStarts(int index) { 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecSet result = getStarts0(index); 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (result != null) ? 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.mutableCopy() : new RegisterSpecSet(regCount); 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds an assignment association for the given instruction and 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * register spec. This throws an exception if the instruction 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * doesn't actually perform a named variable assignment. 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <b>Note:</b> Although the instruction contains its own spec for 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the result, it still needs to be passed in explicitly to this 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method, since the spec that is stored here should always have a 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * simple type and the one in the instruction can be an arbitrary 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link com.android.dx.rop.type.TypeBearer} (such as a constant value). 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 18499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction in question 18599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param spec {@code non-null;} the associated register spec 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addAssignment(SsaInsn insn, RegisterSpec spec) { 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIfImmutable(); 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (insn == null) { 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("insn == null"); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (spec == null) { 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("spec == null"); 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project insnAssignments.put(insn, spec); 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the named register being assigned by the given instruction, if 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * previously stored in this instance. 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 20599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} instruction in question 20699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the named register being assigned, if any 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RegisterSpec getAssignment(SsaInsn insn) { 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return insnAssignments.get(insn); 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the number of assignments recorded by this instance. 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 21599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the number of assignments 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getAssignmentCount() { 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return insnAssignments.size(); 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void debugDump() { 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int index = 0 ; index < blockStarts.length; index++) { 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (blockStarts[index] == null) { 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project continue; 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (blockStarts[index] == emptySet) { 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.printf("%04x: empty set\n", index); 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.out.printf("%04x: %s\n", index, blockStarts[index]); 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method, to get the starts for a index, throwing the 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * right exception for range problems. 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 23999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param index {@code >= 0;} the block index 24099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} associated register set or {@code null} if there 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is none 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private RegisterSpecSet getStarts0(int index) { 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return blockStarts[index]; 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (ArrayIndexOutOfBoundsException ex) { 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Translate the exception. 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("bogus index"); 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 252