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