From 28f2923f80f6a3c51e2119bfb89932f9d5b83aa2 Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Sun, 3 May 2009 00:16:55 +0000 Subject: [PATCH] Added support for Format22s git-svn-id: https://smali.googlecode.com/svn/trunk@28 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../antlr3/org/JesusFreke/smali/smaliLexer.g | 24 +++++++++++++++- .../antlr3/org/JesusFreke/smali/smaliParser.g | 4 +++ .../org/JesusFreke/smali/smaliTreeWalker.g | 11 ++++++++ src/test/resources/examples/HelloWorld2.smali | 28 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g index d8b5e894..719b9d05 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g @@ -333,6 +333,15 @@ INSTRUCTION_FORMAT22c_TYPE_PHRASE REGISTER_EMIT WS? ',' WS? FIELD_TYPE_DESCRIPTOR_EMITCHILD; + +INSTRUCTION_FORMAT22s_PHRASE + : INSTRUCTION_FORMAT22s_EMIT + WS + REGISTER_EMIT + WS? ',' WS? + REGISTER_EMIT + WS? ',' WS? + INTEGER_LITERAL_EMIT; INSTRUCTION_FORMAT22t_PHRASE : INSTRUCTION_FORMAT22t_EMIT @@ -867,8 +876,21 @@ fragment INSTRUCTION_FORMAT22c_TYPE : 'instance-of' | 'new-array'; +fragment INSTRUCTION_FORMAT22s_EMIT + : INSTRUCTION_FORMAT22s {emit($INSTRUCTION_FORMAT22s, INSTRUCTION_FORMAT22s);}; +fragment INSTRUCTION_FORMAT22s + : 'add-int/lit16' + | 'rsub-int' + | 'mul-int/lit16' + | 'div-int/lit16' + | 'rem-int/lit16' + | 'and-int/lit16' + | 'or-int/lit16' + | 'xor-int/lit16' + ; + fragment INSTRUCTION_FORMAT22t_EMIT - : INSTRUCTION_FORMAT22t {emit($INSTRUCTION_FORMAT22t, INSTRUCTION_FORMAT22t);}; + : INSTRUCTION_FORMAT22t {emit($INSTRUCTION_FORMAT22t, INSTRUCTION_FORMAT22t);}; fragment INSTRUCTION_FORMAT22t : 'if-eq' | 'if-ne' diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g index 8f9e4a27..e1bbcaa9 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g @@ -66,6 +66,7 @@ tokens { I_STATEMENT_FORMAT22b; I_STATEMENT_FORMAT22c_FIELD; I_STATEMENT_FORMAT22c_TYPE; + I_STATEMENT_FORMAT22s; I_STATEMENT_FORMAT22t; I_STATEMENT_FORMAT22x; I_STATEMENT_FORMAT23x; @@ -186,6 +187,9 @@ instruction returns [int size] | //e.g. instance-of v0, v1, Ljava/lang/String; INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER field_type_descriptor {$size = Format22c.Format.getByteCount();} -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER field_type_descriptor) + | //e.g. add-int/lit16 v0, v1, 12345 + INSTRUCTION_FORMAT22s REGISTER REGISTER INTEGER_LITERAL {$size = Format22s.Format.getByteCount();} + -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] INSTRUCTION_FORMAT22s REGISTER REGISTER INTEGER_LITERAL) | //e.g. if-eq v0, v1, endloop: INSTRUCTION_FORMAT22t REGISTER REGISTER (LABEL | OFFSET) {$size = Format22t.Format.getByteCount();} -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER LABEL? OFFSET?) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g index 3d42a196..d8e94c71 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g @@ -493,6 +493,17 @@ instruction returns[Instruction instruction] $instruction = Format22c.Format.make(dexFile, opcode.value, regA, regB, typeIdItem); } + | //e.g. add-int/lit16 v0, v1, 12345 + ^(I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA=REGISTER registerB=REGISTER INTEGER_LITERAL) + { + Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22s.text); + byte regA = parseRegister_nibble($registerA.text); + byte regB = parseRegister_nibble($registerB.text); + + short litC = parseIntLiteral_short($INTEGER_LITERAL.text); + + $instruction = Format22s.Format.make(dexFile, opcode.value, regA, regB, litC); + } | //e.g. if-eq v0, v1, endloop: ^(I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA=REGISTER registerB=REGISTER offset_or_label) { diff --git a/src/test/resources/examples/HelloWorld2.smali b/src/test/resources/examples/HelloWorld2.smali index 354eeaef..aeef5d0e 100644 --- a/src/test/resources/examples/HelloWorld2.smali +++ b/src/test/resources/examples/HelloWorld2.smali @@ -30,6 +30,7 @@ ;20 ;1 ;Testing Format22t +;20025 @@ -93,6 +94,19 @@ HERE: return-object v1 .end method + +.method public testFormat22s()Ljava/lang/String; + .registers 2 + const/16 v0, 25 + + add-int/lit16 v1, v0, 20000 + + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v0 + + return-object v0 +.end method + .method public testFormat21h()Ljava/lang/String; .registers 2 @@ -173,6 +187,9 @@ skip: return-object v0 .end method + + + .method public onCreate(Landroid/os/Bundle;)V .registers 6 @@ -438,6 +455,17 @@ skip: invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; move-result-object v2 + + + ;test format22s + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat22s()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 check-cast v4, Landroid/app/Activity;