Chain<Unit> instList = body.getUnits(); labelCount = 0; for (UnitBox uBox : body.getUnitBoxes(true)) { Set<Unit> handlerUnits = new ArraySet<Unit>(body.getTraps().size()); for (Trap trap : body.getTraps()) { handlerUnits.add(trap.getHandlerUnit()); if (trap.getBeginUnit() != trap.getEndUnit()) { Set<Local> assignedLocals = new HashSet<Local>(); localToSlot = new HashMap<Local, Integer>(body.getLocalCount() * 2 + 1, 0.7f); for (Local local : body.getLocals()) { if (assignedLocals.add(local)) { localToSlot.put(local, new Integer(localCount)); for (Tag t : body.getTags()) { if (t instanceof JasminAttribute) { emit(".code_attribute " + t.getName() + " \"" + ((JasminAttribute) t).getJasminValue(unitToLabel) + "\"");
logger.debug("[" + getMethod().getName() + "] Constructing BafBody..."); getLocals().add(newLocal); getUnits().addAll(conversionList); for (UnitBox box : getAllUnitBoxes()) { if (box.getUnit() instanceof PlaceholderInst) { Unit source = ((PlaceholderInst) box.getUnit()).getSource(); getTraps().add(Baf.v().newTrap(trap.getException(), stmtToFirstInstruction.get(trap.getBeginUnit()), stmtToFirstInstruction.get(trap.getEndUnit()), stmtToFirstInstruction.get(trap.getHandlerUnit())));
@Override protected void generateMethodBody(MethodVisitor mv, SootMethod method) { BafBody body = getBafBody(method); Chain<Unit> instructions = body.getUnits(); for (UnitBox box : body.getUnitBoxes(true)) { Unit u = box.getUnit(); if (!branchTargetLabels.containsKey(u)) { for (Trap trap : body.getTraps()) { for (Local local : body.getLocals()) { if (assignedLocals.add(local)) { localToSlot.put(local, localCount); mv.visitLabel(endLabel); for (Local local : body.getLocals()) { Integer slot = localToSlot.get(local); if (slot != null) {
/** Returns an empty BafBody associated with method m. */ public BafBody newBody(SootMethod m) { return new BafBody(m); }
protected void internalTransform(Body b, String phaseName, Map<String, String> options) { BafBody body = (BafBody) b; LinkedList<Tag> tags = new LinkedList<Tag>(); LinkedList<Unit> units = new LinkedList<Unit>(); /* aggregate all tags */ for (Iterator<Unit> unitIt = body.getUnits().iterator(); unitIt.hasNext();) { final Unit unit = unitIt.next(); for (Iterator<Tag> tagIt = unit.getTags().iterator(); tagIt.hasNext();) { final Tag tag = tagIt.next(); if (wantTag(tag)) { considerTag(tag, unit, tags, units); } } } if (units.size() > 0) { b.addTag(new CodeAttribute(aggregatedName(), new LinkedList<Unit>(units), new LinkedList<Tag>(tags))); } fini(); }
public BafBody convertJimpleBodyToBaf(SootMethod m) { JimpleBody body = (JimpleBody) m.getActiveBody().clone(); // Change // ConditionalBranchFolder.v().transform(body); // UnreachableCodeEliminator.v().transform(body); // DeadAssignmentEliminator.v().transform(body); // UnusedLocalEliminator.v().transform(body); BafBody bafBody = Baf.v().newBody(body); PackManager.v().getPack("bop").apply(bafBody); PackManager.v().getPack("tag").apply(bafBody); if (Options.v().validate()) { bafBody.validate(); } return bafBody; }
/** Returns a BafBody constructed from b. */ public BafBody newBody(JimpleBody b) { return new BafBody(b, Collections.<String, String>emptyMap()); }
@Override protected int getMinJavaVersion(SootMethod method) { final BafBody body = getBafBody(method); int minVersion = Options.java_version_1_1; // http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/classfile/classFileParser.cpp if (method.getDeclaringClass().isInterface()) { if (method.isStatic() && !method.isStaticInitializer()) { return Options.java_version_1_8; } } for (Unit u : body.getUnits()) { if (u instanceof DynamicInvokeInst) { return Options.java_version_1_7; } if (u instanceof PushInst) { if (((PushInst) u).getConstant() instanceof ClassConstant) { minVersion = Options.java_version_1_5; } } } return minVersion; }
/** Returns a BafBody constructed from b. */ public BafBody newBody(JimpleBody b, String phase) { Map<String, String> options = PhaseOptions.v().getPhaseOptions(phase); return new BafBody(b, options); } }