Add a new option to add a comment line with the code offset for each instruction

git-svn-id: https://smali.googlecode.com/svn/trunk@634 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
JesusFreke@JesusFreke.com 2010-02-22 00:56:14 +00:00
parent 5b908115c0
commit 2bdbf739bf
3 changed files with 21 additions and 3 deletions

View File

@ -41,6 +41,7 @@ import org.jf.dexlib.Debug.DebugInstructionIterator;
import org.jf.dexlib.Util.AccessFlags; import org.jf.dexlib.Util.AccessFlags;
import org.antlr.stringtemplate.StringTemplateGroup; import org.antlr.stringtemplate.StringTemplateGroup;
import org.antlr.stringtemplate.StringTemplate; import org.antlr.stringtemplate.StringTemplate;
import org.jf.dexlib.Util.Hex;
import org.jf.dexlib.Util.SparseIntArray; import org.jf.dexlib.Util.SparseIntArray;
import java.util.*; import java.util.*;
@ -274,6 +275,11 @@ public class MethodDefinition {
methodItems.add(new BlankMethodItem(stg, currentCodeAddress)); methodItems.add(new BlankMethodItem(stg, currentCodeAddress));
} }
if (baksmali.addCodeOffsets) {
methodItems.add(new CommentMethodItem(stg, String.format("@%x", currentCodeAddress),
currentCodeAddress, -1000));
}
if (baksmali.registerInfo != 0 && !instruction.instruction.getFormat().variableSizeFormat) { if (baksmali.registerInfo != 0 && !instruction.instruction.getFormat().variableSizeFormat) {
printPreRegister.clear(); printPreRegister.clear();
printPostRegister.clear(); printPostRegister.clear();

View File

@ -45,6 +45,7 @@ public class baksmali {
public static boolean useLocalsDirective = false; public static boolean useLocalsDirective = false;
public static boolean useSequentialLabels = false; public static boolean useSequentialLabels = false;
public static boolean outputDebugInfo = true; public static boolean outputDebugInfo = true;
public static boolean addCodeOffsets = false;
public static int registerInfo = 0; public static int registerInfo = 0;
public static String bootClassPath; public static String bootClassPath;
public static DeodexUtil deodexUtil = null; public static DeodexUtil deodexUtil = null;
@ -52,12 +53,13 @@ public class baksmali {
public static void disassembleDexFile(DexFile dexFile, Deodexerant deodexerant, String outputDirectory, public static void disassembleDexFile(DexFile dexFile, Deodexerant deodexerant, String outputDirectory,
String bootClassPathDir, String bootClassPath, boolean noParameterRegisters, String bootClassPathDir, String bootClassPath, boolean noParameterRegisters,
boolean useLocalsDirective, boolean useSequentialLabels, boolean useLocalsDirective, boolean useSequentialLabels,
boolean outputDebugInfo, int registerInfo) boolean outputDebugInfo, boolean addCodeOffsets, int registerInfo)
{ {
baksmali.noParameterRegisters = noParameterRegisters; baksmali.noParameterRegisters = noParameterRegisters;
baksmali.useLocalsDirective = useLocalsDirective; baksmali.useLocalsDirective = useLocalsDirective;
baksmali.useSequentialLabels = useSequentialLabels; baksmali.useSequentialLabels = useSequentialLabels;
baksmali.outputDebugInfo = outputDebugInfo; baksmali.outputDebugInfo = outputDebugInfo;
baksmali.addCodeOffsets = addCodeOffsets;
baksmali.registerInfo = registerInfo; baksmali.registerInfo = registerInfo;
baksmali.bootClassPath = bootClassPath; baksmali.bootClassPath = bootClassPath;

View File

@ -87,6 +87,7 @@ public class main {
boolean useLocalsDirective = false; boolean useLocalsDirective = false;
boolean useSequentialLabels = false; boolean useSequentialLabels = false;
boolean outputDebugInfo = true; boolean outputDebugInfo = true;
boolean addCodeOffsets = false;
int registerInfo = 0; int registerInfo = 0;
@ -138,6 +139,9 @@ public class main {
case 'd': case 'd':
bootClassPathDir = commandLine.getOptionValue("d"); bootClassPathDir = commandLine.getOptionValue("d");
break; break;
case 'f':
addCodeOffsets = true;
break;
case 'r': case 'r':
String[] values = commandLine.getOptionValues('r'); String[] values = commandLine.getOptionValues('r');
@ -262,7 +266,8 @@ public class main {
if (disassemble) { if (disassemble) {
baksmali.disassembleDexFile(dexFile, deodexerant, outputDirectory, bootClassPathDir, bootClassPath, baksmali.disassembleDexFile(dexFile, deodexerant, outputDirectory, bootClassPathDir, bootClassPath,
noParameterRegisters, useLocalsDirective, useSequentialLabels, outputDebugInfo, registerInfo); noParameterRegisters, useLocalsDirective, useSequentialLabels, outputDebugInfo, addCodeOffsets,
registerInfo);
} }
if ((doDump || write) && !dexFile.isOdex()) { if ((doDump || write) && !dexFile.isOdex()) {
@ -415,6 +420,10 @@ public class main {
.withArgName("DIR") .withArgName("DIR")
.create("d"); .create("d");
Option codeOffsetOption = OptionBuilder.withLongOpt("code-offsets")
.withDescription("add comments to the disassembly containing the code offset for each address")
.create("f");
basicOptions.addOption(versionOption); basicOptions.addOption(versionOption);
basicOptions.addOption(helpOption); basicOptions.addOption(helpOption);
basicOptions.addOption(outputDirOption); basicOptions.addOption(outputDirOption);
@ -426,6 +435,7 @@ public class main {
basicOptions.addOption(registerInfoOption); basicOptions.addOption(registerInfoOption);
basicOptions.addOption(classPathOption); basicOptions.addOption(classPathOption);
basicOptions.addOption(classPathDirOption); basicOptions.addOption(classPathDirOption);
basicOptions.addOption(codeOffsetOption);
debugOptions.addOption(dumpOption); debugOptions.addOption(dumpOption);
debugOptions.addOption(noDisassemblyOption); debugOptions.addOption(noDisassemblyOption);