1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2011 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.google.dexmaker; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.BasicBlock; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.Insn; 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.InsnList; 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.IntList; 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.util.ArrayList; 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.util.Collections; 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.util.List; 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * A branch target in a list of instructions. 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class Label { 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson final List<Insn> instructions = new ArrayList<Insn>(); 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 3423abc2fe89ec3713645d64bdb74415a9090084f4Jesse Wilson Code code; 3523abc2fe89ec3713645d64bdb74415a9090084f4Jesse Wilson 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson boolean marked = false; 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** an immutable list of labels corresponding to the types in the catch list */ 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson List<Label> catchLabels = Collections.emptyList(); 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** contains the next instruction if no branch occurs */ 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson Label primarySuccessor; 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** contains the instruction to jump to if the if is true */ 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson Label alternateSuccessor; 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int id = -1; 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 4923abc2fe89ec3713645d64bdb74415a9090084f4Jesse Wilson public Label() {} 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson boolean isEmpty() { 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return instructions.isEmpty(); 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson void compact() { 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < catchLabels.size(); i++) { 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson while (catchLabels.get(i).isEmpty()) { 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson catchLabels.set(i, catchLabels.get(i).primarySuccessor); 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson while (primarySuccessor != null && primarySuccessor.isEmpty()) { 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson primarySuccessor = primarySuccessor.primarySuccessor; 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson while (alternateSuccessor != null && alternateSuccessor.isEmpty()) { 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson alternateSuccessor = alternateSuccessor.primarySuccessor; 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson BasicBlock toBasicBlock() { 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson InsnList result = new InsnList(instructions.size()); 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < instructions.size(); i++) { 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(i, instructions.get(i)); 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.setImmutable(); 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int primarySuccessorIndex = -1; 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson IntList successors = new IntList(); 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (Label catchLabel : catchLabels) { 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson successors.add(catchLabel.id); 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (primarySuccessor != null) { 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson primarySuccessorIndex = primarySuccessor.id; 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson successors.add(primarySuccessorIndex); 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (alternateSuccessor != null) { 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson successors.add(alternateSuccessor.id); 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson successors.setImmutable(); 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return new BasicBlock(id, result, successors, primarySuccessorIndex); 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 93