From: <mic...@us...> - 2007-08-15 16:24:04
|
Revision: 167 http://pearcolator.svn.sourceforge.net/pearcolator/?rev=167&view=rev Author: michael_baer Date: 2007-08-15 09:24:05 -0700 (Wed, 15 Aug 2007) Log Message: ----------- - Controlling ARM memory model using a command line paremter - added new option to disable pearcolator inlining Modified Paths: -------------- src/org/binarytranslator/DBT_Options.java src/org/binarytranslator/arch/arm/decoder/ARM2IR.java src/org/binarytranslator/arch/arm/decoder/ARM_Options.java src/org/binarytranslator/arch/arm/os/process/ARM_ProcessSpace.java Modified: src/org/binarytranslator/DBT_Options.java =================================================================== --- src/org/binarytranslator/DBT_Options.java 2007-08-15 11:08:41 UTC (rev 166) +++ src/org/binarytranslator/DBT_Options.java 2007-08-15 16:24:05 UTC (rev 167) @@ -175,25 +175,12 @@ } else if (key.startsWith("arm:")) { key = key.substring(4); - parseArmOption(key, value); + ARM_Options.parseOption(key, value); } else { throw new Error("Unknown argument."); } } - - private static void parseArmOption(String key, String value) { - if (key.equalsIgnoreCase("optimizeByProfiling")) { - ARM_Options.optimizeTranslationByProfiling = Boolean.parseBoolean(value); - } else if (key.equalsIgnoreCase("flagEvaluation")) { - ARM_Options.flagEvaluation = ARM_Options.FlagBehaviour.valueOf(value); - } else if (key.equalsIgnoreCase("inline")) { - ARM_Options.inlining = ARM_Options.InliningBehaviour.valueOf(value); - } - else { - throw new Error("Unknown ARM option: " + key); - } - } private static void parseDbtOption(String key, String value) { if (key.equalsIgnoreCase("debugInstr")) { Modified: src/org/binarytranslator/arch/arm/decoder/ARM2IR.java =================================================================== --- src/org/binarytranslator/arch/arm/decoder/ARM2IR.java 2007-08-15 11:08:41 UTC (rev 166) +++ src/org/binarytranslator/arch/arm/decoder/ARM2IR.java 2007-08-15 16:24:05 UTC (rev 167) @@ -468,6 +468,9 @@ switch (ARM_Options.inlining) { + case NoInlining: + return false; + case Default: return super.inlineBranchInstruction(targetPc, jump); Modified: src/org/binarytranslator/arch/arm/decoder/ARM_Options.java =================================================================== --- src/org/binarytranslator/arch/arm/decoder/ARM_Options.java 2007-08-15 11:08:41 UTC (rev 166) +++ src/org/binarytranslator/arch/arm/decoder/ARM_Options.java 2007-08-15 16:24:05 UTC (rev 167) @@ -8,6 +8,7 @@ } public enum InliningBehaviour { + NoInlining, Default, Functions, FunctionCalls, @@ -16,6 +17,11 @@ All, } + public enum MemoryModel { + IntAddressed, + ByteAddressed + } + /** Set to true to enable a fastpath for the decoding of data processing instructions.. */ public final static boolean DATAPROCESSING_DECODER_FASTPATH = false; @@ -27,4 +33,23 @@ /** Describes the default behaviour for dealing with ARM function calls and indirect jumps. */ public static InliningBehaviour inlining = InliningBehaviour.Default; + + /** Sets the memory model that ARM shall use. */ + public static MemoryModel memoryModel = MemoryModel.IntAddressed; + + + public static void parseOption(String key, String value) { + if (key.equalsIgnoreCase("optimizeByProfiling")) { + optimizeTranslationByProfiling = Boolean.parseBoolean(value); + } else if (key.equalsIgnoreCase("flagEvaluation")) { + flagEvaluation = ARM_Options.FlagBehaviour.valueOf(value); + } else if (key.equalsIgnoreCase("inline")) { + inlining = ARM_Options.InliningBehaviour.valueOf(value); + } else if (key.equalsIgnoreCase("memory")) { + memoryModel = ARM_Options.MemoryModel.valueOf(value); + } + else { + throw new Error("Unknown ARM option: " + key); + } + } } Modified: src/org/binarytranslator/arch/arm/os/process/ARM_ProcessSpace.java =================================================================== --- src/org/binarytranslator/arch/arm/os/process/ARM_ProcessSpace.java 2007-08-15 11:08:41 UTC (rev 166) +++ src/org/binarytranslator/arch/arm/os/process/ARM_ProcessSpace.java 2007-08-15 16:24:05 UTC (rev 167) @@ -5,10 +5,12 @@ import org.binarytranslator.arch.arm.decoder.ARM2IR; import org.binarytranslator.arch.arm.decoder.ARM_Disassembler; import org.binarytranslator.arch.arm.decoder.ARM_Interpreter; +import org.binarytranslator.arch.arm.decoder.ARM_Options; import org.binarytranslator.arch.arm.os.process.image.ARM_ImageProcessSpace; import org.binarytranslator.arch.arm.os.process.linux.ARM_LinuxProcessSpace; import org.binarytranslator.generic.decoder.CodeTranslator; import org.binarytranslator.generic.decoder.Interpreter; +import org.binarytranslator.generic.memory.ByteAddressedMemory; import org.binarytranslator.generic.memory.IntAddressedMemory; import org.binarytranslator.generic.os.loader.Loader; import org.binarytranslator.generic.os.process.ProcessSpace; @@ -38,7 +40,20 @@ protected ARM_ProcessSpace() { registers = new ARM_Registers(); - memory = new IntAddressedMemory(); + + switch (ARM_Options.memoryModel) { + case ByteAddressed: + memory = new ByteAddressedMemory(); + break; + + case IntAddressed: + memory = new IntAddressedMemory(); + break; + + default: + throw new RuntimeException("Unexpected ARM memory model setting: " + ARM_Options.memoryModel); + } + } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |