From e933da35729acb4409cc3d06a8de83ecfcb7e058 Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Fri, 24 Apr 2009 04:37:05 +0000 Subject: [PATCH] Add support for Format11n (const/4) git-svn-id: https://smali.googlecode.com/svn/trunk@11 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../antlr3/org/JesusFreke/smali/smaliLexer.g | 16 ++++++- .../antlr3/org/JesusFreke/smali/smaliParser.g | 4 ++ .../org/JesusFreke/smali/smaliTreeWalker.g | 17 +++++++ .../org/JesusFreke/dexlib/code/Opcode.java | 2 +- src/test/resources/examples/HelloWorld2.smali | 45 +++++++++++++++++++ 5 files changed, 81 insertions(+), 3 deletions(-) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g index 8be9f6dd..1f55d6a5 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g @@ -232,6 +232,13 @@ REGISTERS_PHRASE INSTRUCTION_FORMAT10x_PHRASE : INSTRUCTION_FORMAT10x_EMIT; +INSTRUCTION_FORMAT11n_PHRASE + : INSTRUCTION_FORMAT11n_EMIT + WS + REGISTER_EMIT + WS? ',' WS? + INTEGER_LITERAL_EMIT; + INSTRUCTION_FORMAT11x_PHRASE : INSTRUCTION_FORMAT11x_EMIT WS @@ -293,8 +300,8 @@ INSTRUCTION_FORMAT3rc_METHOD_PHRASE WS? ',' WS? FULLY_QUALIFIED_MEMBER_NAME_EMITCHILDREN METHOD_PROTOTYPE_EMITCHILDREN; - - + + fragment CLASS_DIRECTIVE_EMIT : CLASS_DIRECTIVE {emit($CLASS_DIRECTIVE, CLASS_DIRECTIVE);}; fragment CLASS_DIRECTIVE @@ -576,6 +583,11 @@ fragment INSTRUCTION_FORMAT10x : 'return-void' | 'nop'; +fragment INSTRUCTION_FORMAT11n_EMIT + : INSTRUCTION_FORMAT11n {emit($INSTRUCTION_FORMAT11n, INSTRUCTION_FORMAT11n);}; +fragment INSTRUCTION_FORMAT11n + : 'const/4'; + fragment INSTRUCTION_FORMAT11x_EMIT : INSTRUCTION_FORMAT11x {emit($INSTRUCTION_FORMAT11x, INSTRUCTION_FORMAT11x);}; fragment INSTRUCTION_FORMAT11x diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g index eb57a184..a74c5101 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g @@ -50,6 +50,7 @@ tokens { I_REGISTERS; I_STATEMENTS; I_STATEMENT_FORMAT10x; + I_STATEMENT_FORMAT11n; I_STATEMENT_FORMAT11x; I_STATEMENT_FORMAT12x; I_STATEMENT_FORMAT21c_TYPE; @@ -122,6 +123,9 @@ instruction //e.g. return : INSTRUCTION_FORMAT10x -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x) + | //e.g. const/4 v0, 5 + INSTRUCTION_FORMAT11n REGISTER INTEGER_LITERAL + -> ^(I_STATEMENT_FORMAT11n[$start, "I_STARTMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER INTEGER_LITERAL) | //e.g. move-result-object v1 INSTRUCTION_FORMAT11x REGISTER -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g index 53a2c585..511c10cd 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g @@ -48,6 +48,14 @@ import org.JesusFreke.dexlib.code.Format.*; public ClassDefItem classDefItem; public ClassDataItem classDataItem; + private static byte parseIntLiteral_nibble(String intLiteral) { + byte val = Byte.parseByte(intLiteral); + if (val < -(1<<3) || val >= 1<<3) { + //TODO: throw correct exception type + throw new RuntimeException("The literal integer value must be between -8 and 7, inclusive"); + } + return val; + } private static byte parseRegister_nibble(String register) { //register should be in the format "v12" @@ -256,6 +264,15 @@ instruction returns[Instruction instruction] Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT10x.text); $instruction = Format10x.Format.make(dexFile, opcode.value); } + | //e.g. const/4 v0, 5 + ^(I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER INTEGER_LITERAL) + { + Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT11n.text); + byte regA = parseRegister_nibble($REGISTER.text); + byte litB = parseIntLiteral_nibble($INTEGER_LITERAL.text); + + $instruction = Format11n.Format.make(dexFile, opcode.value, regA, litB); + } | //e.g. move-result-object v1 ^(I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER) { diff --git a/src/main/java/org/JesusFreke/dexlib/code/Opcode.java b/src/main/java/org/JesusFreke/dexlib/code/Opcode.java index 2a494db5..b004e79a 100644 --- a/src/main/java/org/JesusFreke/dexlib/code/Opcode.java +++ b/src/main/java/org/JesusFreke/dexlib/code/Opcode.java @@ -51,7 +51,7 @@ public enum Opcode RETURN((byte)0x0f, "RETURN", (byte)2, ReferenceType.none, "11x"), RETURN_WIDE((byte)0x10, "RETURN-WIDE", (byte)2, ReferenceType.none, "11x"), RETURN_OBJECT((byte)0x11, "RETURN-OBJECT", (byte)2, ReferenceType.none, "11x"), - CONST_4((byte)0x12, "CONST-4", (byte)2, ReferenceType.none, "11n"), + CONST_4((byte)0x12, "CONST/4", (byte)2, ReferenceType.none, "11n"), CONST_16((byte)0x13, "CONST/16", (byte)4, ReferenceType.none, "21s"), CONST((byte)0x14, "CONST", (byte)6, ReferenceType.none, "31i"), CONST_HIGH16((byte)0x15, "CONST/HIGH16", (byte)4, ReferenceType.none, "21h"), diff --git a/src/test/resources/examples/HelloWorld2.smali b/src/test/resources/examples/HelloWorld2.smali index 18bf426a..ea7b8582 100644 --- a/src/test/resources/examples/HelloWorld2.smali +++ b/src/test/resources/examples/HelloWorld2.smali @@ -15,6 +15,9 @@ ;org/JesusFreke/HelloWorld2/HelloWorld2 ;[Lorg/JesusFreke/HelloWorld2/HelloWorld2; ;[I +;0 +;-8 +;7 .method static constructor ()V ;test @@ -99,6 +102,48 @@ move-object v2, v1 + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test out Format11n, with various literals + ;with 0 + const/4 v1, 0 + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;with -8 + const/4 v1, -8 + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;with 7 + const/4 v1, 7 + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + +