aboutsummaryrefslogtreecommitdiff
path: root/smali
diff options
context:
space:
mode:
authorAlbert Gorski <sagorski@ncsu.edu>2018-08-03 17:03:45 -0400
committerBen Gruver <bgruv@google.com>2018-08-20 12:55:29 -0700
commitc6b0408092ba7a6d93e1c2c71b84b8a492de78d4 (patch)
tree234fee258c19beffd7e747f46c3a118a0025a641 /smali
parent49ecdb334b1eddaa8d8d8be123b322da56caf65e (diff)
downloadsmali-c6b0408092ba7a6d93e1c2c71b84b8a492de78d4.tar.gz
Fix support for the kind values of MethodHandle
The current implementation only supported 6 of the possible kind values for a MethodHandle object. However, as the link below shows there are in fact 9. All 9 can be seen in the MethodHandleType class which is used by dexdump to translate the kind value of a MethodHandle object to a string representation. https://android.googlesource.com/platform/art/+/android-8.1.0_r41/runtime/dex_file.h Moreover, this in fact lines up with the 9 different kinds for a MethodHandle object in standard java bytecode (though the values are swapped around for some reason). https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/MethodHandleInfo.html These changes add in the additional 3 kind values and make sure all nesscary hooks using the kind values of MethodHandle reference them. For testing purposes, I found the easiest way to get correctly formatted invoke-custom and invoke-polymorphic instructions was to use the already generated dex files used to test dexdump. They can be found at the link below (invoke-custom.dex and invoke-polymorphic.dex). https://android.googlesource.com/platform/art/+/android-8.1.0_r41/test/dexdump/
Diffstat (limited to 'smali')
-rw-r--r--smali/src/main/antlr/smaliParser.g15
-rw-r--r--smali/src/main/antlr/smaliTreeWalker.g6
-rw-r--r--smali/src/main/jflex/smaliLexer.jflex10
3 files changed, 21 insertions, 10 deletions
diff --git a/smali/src/main/antlr/smaliParser.g b/smali/src/main/antlr/smaliParser.g
index 370c3dec..76de3bc5 100644
--- a/smali/src/main/antlr/smaliParser.g
+++ b/smali/src/main/antlr/smaliParser.g
@@ -110,6 +110,7 @@ tokens {
INSTRUCTION_FORMAT35c_CALL_SITE;
INSTRUCTION_FORMAT35c_METHOD;
INSTRUCTION_FORMAT35c_METHOD_ODEX;
+ INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE;
INSTRUCTION_FORMAT35c_TYPE;
INSTRUCTION_FORMAT35mi_METHOD;
INSTRUCTION_FORMAT35ms_METHOD;
@@ -586,6 +587,7 @@ simple_name
| INSTRUCTION_FORMAT35c_CALL_SITE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_CALL_SITE]
| INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD]
| INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX]
+ | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE]
| INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE]
| INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD]
| INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD]
@@ -724,7 +726,8 @@ call_site_reference
method_handle_reference
: METHOD_HANDLE_TYPE_FIELD AT field_reference -> METHOD_HANDLE_TYPE_FIELD field_reference
- | METHOD_HANDLE_TYPE_METHOD AT method_reference -> METHOD_HANDLE_TYPE_METHOD method_reference;
+ | METHOD_HANDLE_TYPE_METHOD AT method_reference -> METHOD_HANDLE_TYPE_METHOD method_reference
+ | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE AT method_reference -> INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE method_reference;
method_handle_literal
: method_handle_reference
@@ -826,6 +829,10 @@ instruction_format22s
instruction_format31i
: INSTRUCTION_FORMAT31i
| INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID];
+
+instruction_format35c_method
+ : INSTRUCTION_FORMAT35c_METHOD
+ | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE -> INSTRUCTION_FORMAT35c_METHOD[$INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE];
instruction
: insn_format10t
@@ -943,7 +950,7 @@ insn_format21c_field_odex
-> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference);
insn_format21c_method_handle
- : //e.g. const-method-handle v0, static-invoke@Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+ : //e.g. const-method-handle v0, invoke-static@Ljava/lang/Integer;->toString(I)Ljava/lang/String;
INSTRUCTION_FORMAT21c_METHOD_HANDLE REGISTER COMMA method_handle_reference
-> ^(I_STATEMENT_FORMAT21c_METHOD_HANDLE[$start, "I_STATEMENT_FORMAT21c_METHOD_HANDLE"]
INSTRUCTION_FORMAT21c_METHOD_HANDLE REGISTER method_handle_reference);
@@ -1069,8 +1076,8 @@ insn_format35c_call_site
insn_format35c_method
: //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
- INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
- -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference);
+ instruction_format35c_method OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+ -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] instruction_format35c_method register_list method_reference);
insn_format35c_type
: //e.g. filled-new-array {v0,v1}, I
diff --git a/smali/src/main/antlr/smaliTreeWalker.g b/smali/src/main/antlr/smaliTreeWalker.g
index 5844bb45..f3595232 100644
--- a/smali/src/main/antlr/smaliTreeWalker.g
+++ b/smali/src/main/antlr/smaliTreeWalker.g
@@ -514,7 +514,7 @@ call_site_reference returns[ImmutableCallSiteReference callSiteReference]
{
String callSiteName = $call_site_name.text;
ImmutableMethodHandleReference methodHandleReference =
- new ImmutableMethodHandleReference(MethodHandleType.STATIC_INVOKE,
+ new ImmutableMethodHandleReference(MethodHandleType.INVOKE_STATIC,
$method_reference.methodReference);
$callSiteReference = new ImmutableCallSiteReference(
callSiteName, methodHandleReference, $method_name.value, $method_prototype.proto,
@@ -522,7 +522,7 @@ call_site_reference returns[ImmutableCallSiteReference callSiteReference]
};
method_handle_type returns[int methodHandleType]
- : METHOD_HANDLE_TYPE_FIELD | METHOD_HANDLE_TYPE_METHOD {
+ : (METHOD_HANDLE_TYPE_FIELD | METHOD_HANDLE_TYPE_METHOD | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE) {
$methodHandleType = MethodHandleType.getMethodHandleType($text);
};
@@ -891,7 +891,7 @@ insn_format21c_field
};
insn_format21c_method_handle
- : //e.g. const-method-handle v0, static-invoke@Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+ : //e.g. const-method-handle v0, invoke-static@Ljava/lang/Integer;->toString(I)Ljava/lang/String;
^(I_STATEMENT_FORMAT21c_METHOD_HANDLE inst=(INSTRUCTION_FORMAT21c_METHOD_HANDLE) REGISTER method_handle_reference)
{
Opcode opcode = opcodes.getOpcodeByName($inst.text);
diff --git a/smali/src/main/jflex/smaliLexer.jflex b/smali/src/main/jflex/smaliLexer.jflex
index 7e6c1c1c..1bae56e1 100644
--- a/smali/src/main/jflex/smaliLexer.jflex
+++ b/smali/src/main/jflex/smaliLexer.jflex
@@ -409,11 +409,11 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayPrefix} ({ClassDescriptor} |
"vtable@0x" {HexDigit}+ { return newToken(VTABLE_INDEX); }
"field@0x" {HexDigit}+ { return newToken(FIELD_OFFSET); }
- "instance-get" | "instance-put" | "static-get" | "static-put" {
+ "static-put" | "static-get" | "instance-put" | "instance-get" {
return newToken(METHOD_HANDLE_TYPE_FIELD);
}
- "instance-invoke" | "static-invoke" {
+ "invoke-instance" | "invoke-constructor" {
return newToken(METHOD_HANDLE_TYPE_METHOD);
}
@@ -588,9 +588,13 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayPrefix} ({ClassDescriptor} |
return newToken(INSTRUCTION_FORMAT35c_CALL_SITE);
}
- "invoke-virtual" | "invoke-super" | "invoke-direct" | "invoke-static" | "invoke-interface" {
+ "invoke-virtual" | "invoke-super" {
return newToken(INSTRUCTION_FORMAT35c_METHOD);
}
+
+ "invoke-direct" | "invoke-static" | "invoke-interface" {
+ return newToken(INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE);
+ }
"invoke-direct-empty" {
return newToken(INSTRUCTION_FORMAT35c_METHOD_ODEX);