From 2ca53880b1e908bebcfd88ad5e225b30396a789c Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 20 Jun 2013 08:42:43 -0500 Subject: [PATCH] baksmali: added DIFFPRE reg info --- .../PreInstructionRegisterInfoMethodItem.java | 18 ++++++++++++++++++ .../java/org/jf/baksmali/baksmaliOptions.java | 2 ++ 2 files changed, 20 insertions(+) diff --git a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java index fa54f091..d2811c04 100644 --- a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java +++ b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java @@ -40,6 +40,8 @@ import java.io.IOException; import java.util.BitSet; public class PreInstructionRegisterInfoMethodItem extends MethodItem { + private static AnalyzedInstruction lastInstruction; + private final int registerInfo; @Nonnull private final MethodAnalyzer methodAnalyzer; @Nonnull private final RegisterFormatter registerFormatter; @@ -77,6 +79,9 @@ public class PreInstructionRegisterInfoMethodItem extends MethodItem { if ((registerInfo & baksmaliOptions.ARGS) != 0) { addArgsRegs(registers); } + if ((registerInfo & baksmaliOptions.DIFFPRE) != 0) { + addDiffRegs(registers); + } if ((registerInfo & baksmaliOptions.MERGE) != 0) { if (analyzedInstruction.isBeginningInstruction()) { addParamRegs(registers, registerCount); @@ -144,6 +149,19 @@ public class PreInstructionRegisterInfoMethodItem extends MethodItem { } } + private void addDiffRegs(BitSet registers) { + if (! analyzedInstruction.isBeginningInstruction()) { + for (int i = 0; i < analyzedInstruction.getRegisterCount(); i++) { + if (lastInstruction.getPreInstructionRegisterType(i).category != + analyzedInstruction.getPreInstructionRegisterType(i).category) { + registers.set(i); + } + } + } + + lastInstruction = analyzedInstruction; + } + private void addMergeRegs(BitSet registers, int registerCount) { if (analyzedInstruction.getPredecessorCount() <= 1) { //in the common case of an instruction that only has a single predecessor which is the previous diff --git a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java index cb3c563e..759fa98f 100644 --- a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java +++ b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java @@ -49,6 +49,8 @@ public class baksmaliOptions { public static final int MERGE = 32; public static final int FULLMERGE = 64; + public static final int DIFFPRE = 128; + public int apiLevel = 15; public String outputDirectory = "out"; public List bootClassPathDirs = Lists.newArrayList();