Home | History | Annotate | Download | only in libdex
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18  * Table of Dalvik opcode names.
     19  */
     20 #include "OpCodeNames.h"
     21 
     22 #include <assert.h>
     23 
     24 /*
     25  * The following two lines work, but slashes and dashes both turn into
     26  * underscores, and the strings are all upper case.  The output is easier
     27  * to read if we do the strings by hand (could probably write a
     28  * post-processing function easily enough if maintenance becomes annoying).
     29  */
     30 //#define H(_op) #_op
     31 //DEFINE_GOTO_TABLE(gOpNames)
     32 
     33 /*
     34  * Dalvik opcode names.
     35  */
     36 static const char* gOpNames[256] = {
     37     /* 0x00 */
     38     "nop",
     39     "move",
     40     "move/from16",
     41     "move/16",
     42     "move-wide",
     43     "move-wide/from16",
     44     "move-wide/16",
     45     "move-object",
     46     "move-object/from16",
     47     "move-object/16",
     48     "move-result",
     49     "move-result-wide",
     50     "move-result-object",
     51     "move-exception",
     52     "return-void",
     53     "return",
     54 
     55     /* 0x10 */
     56     "return-wide",
     57     "return-object",
     58     "const/4",
     59     "const/16",
     60     "const",
     61     "const/high16",
     62     "const-wide/16",
     63     "const-wide/32",
     64     "const-wide",
     65     "const-wide/high16",
     66     "const-string",
     67     "const-string/jumbo",
     68     "const-class",
     69     "monitor-enter",
     70     "monitor-exit",
     71     "check-cast",
     72 
     73     /* 0x20 */
     74     "instance-of",
     75     "array-length",
     76     "new-instance",
     77     "new-array",
     78     "filled-new-array",
     79     "filled-new-array/range",
     80     "fill-array-data",
     81     "throw",
     82     "goto",
     83     "goto/16",
     84     "goto/32",
     85     "packed-switch",
     86     "sparse-switch",
     87     "cmpl-float",
     88     "cmpg-float",
     89     "cmpl-double",
     90 
     91     /* 0x30 */
     92     "cmpg-double",
     93     "cmp-long",
     94     "if-eq",
     95     "if-ne",
     96     "if-lt",
     97     "if-ge",
     98     "if-gt",
     99     "if-le",
    100     "if-eqz",
    101     "if-nez",
    102     "if-ltz",
    103     "if-gez",
    104     "if-gtz",
    105     "if-lez",
    106     "UNUSED",
    107     "UNUSED",
    108 
    109     /* 0x40 */
    110     "UNUSED",
    111     "UNUSED",
    112     "UNUSED",
    113     "UNUSED",
    114     "aget",
    115     "aget-wide",
    116     "aget-object",
    117     "aget-boolean",
    118     "aget-byte",
    119     "aget-char",
    120     "aget-short",
    121     "aput",
    122     "aput-wide",
    123     "aput-object",
    124     "aput-boolean",
    125     "aput-byte",
    126 
    127     /* 0x50 */
    128     "aput-char",
    129     "aput-short",
    130     "iget",
    131     "iget-wide",
    132     "iget-object",
    133     "iget-boolean",
    134     "iget-byte",
    135     "iget-char",
    136     "iget-short",
    137     "iput",
    138     "iput-wide",
    139     "iput-object",
    140     "iput-boolean",
    141     "iput-byte",
    142     "iput-char",
    143     "iput-short",
    144 
    145     /* 0x60 */
    146     "sget",
    147     "sget-wide",
    148     "sget-object",
    149     "sget-boolean",
    150     "sget-byte",
    151     "sget-char",
    152     "sget-short",
    153     "sput",
    154     "sput-wide",
    155     "sput-object",
    156     "sput-boolean",
    157     "sput-byte",
    158     "sput-char",
    159     "sput-short",
    160     "invoke-virtual",
    161     "invoke-super",
    162 
    163     /* 0x70 */
    164     "invoke-direct",
    165     "invoke-static",
    166     "invoke-interface",
    167     "UNUSED",
    168     "invoke-virtual/range",
    169     "invoke-super/range",
    170     "invoke-direct/range",
    171     "invoke-static/range",
    172     "invoke-interface/range",
    173     "UNUSED",
    174     "UNUSED",
    175     "neg-int",
    176     "not-int",
    177     "neg-long",
    178     "not-long",
    179     "neg-float",
    180 
    181     /* 0x80 */
    182     "neg-double",
    183     "int-to-long",
    184     "int-to-float",
    185     "int-to-double",
    186     "long-to-int",
    187     "long-to-float",
    188     "long-to-double",
    189     "float-to-int",
    190     "float-to-long",
    191     "float-to-double",
    192     "double-to-int",
    193     "double-to-long",
    194     "double-to-float",
    195     "int-to-byte",
    196     "int-to-char",
    197     "int-to-short",
    198 
    199     /* 0x90 */
    200     "add-int",
    201     "sub-int",
    202     "mul-int",
    203     "div-int",
    204     "rem-int",
    205     "and-int",
    206     "or-int",
    207     "xor-int",
    208     "shl-int",
    209     "shr-int",
    210     "ushr-int",
    211     "add-long",
    212     "sub-long",
    213     "mul-long",
    214     "div-long",
    215     "rem-long",
    216 
    217     /* 0xa0 */
    218     "and-long",
    219     "or-long",
    220     "xor-long",
    221     "shl-long",
    222     "shr-long",
    223     "ushr-long",
    224     "add-float",
    225     "sub-float",
    226     "mul-float",
    227     "div-float",
    228     "rem-float",
    229     "add-double",
    230     "sub-double",
    231     "mul-double",
    232     "div-double",
    233     "rem-double",
    234 
    235     /* 0xb0 */
    236     "add-int/2addr",
    237     "sub-int/2addr",
    238     "mul-int/2addr",
    239     "div-int/2addr",
    240     "rem-int/2addr",
    241     "and-int/2addr",
    242     "or-int/2addr",
    243     "xor-int/2addr",
    244     "shl-int/2addr",
    245     "shr-int/2addr",
    246     "ushr-int/2addr",
    247     "add-long/2addr",
    248     "sub-long/2addr",
    249     "mul-long/2addr",
    250     "div-long/2addr",
    251     "rem-long/2addr",
    252 
    253     /* 0xc0 */
    254     "and-long/2addr",
    255     "or-long/2addr",
    256     "xor-long/2addr",
    257     "shl-long/2addr",
    258     "shr-long/2addr",
    259     "ushr-long/2addr",
    260     "add-float/2addr",
    261     "sub-float/2addr",
    262     "mul-float/2addr",
    263     "div-float/2addr",
    264     "rem-float/2addr",
    265     "add-double/2addr",
    266     "sub-double/2addr",
    267     "mul-double/2addr",
    268     "div-double/2addr",
    269     "rem-double/2addr",
    270 
    271     /* 0xd0 */
    272     "add-int/lit16",
    273     "rsub-int",
    274     "mul-int/lit16",
    275     "div-int/lit16",
    276     "rem-int/lit16",
    277     "and-int/lit16",
    278     "or-int/lit16",
    279     "xor-int/lit16",
    280     "add-int/lit8",
    281     "rsub-int/lit8",
    282     "mul-int/lit8",
    283     "div-int/lit8",
    284     "rem-int/lit8",
    285     "and-int/lit8",
    286     "or-int/lit8",
    287     "xor-int/lit8",
    288 
    289     /* 0xe0 */
    290     "shl-int/lit8",
    291     "shr-int/lit8",
    292     "ushr-int/lit8",
    293     "+iget-volatile",
    294     "+iput-volatile",
    295     "+sget-volatile",
    296     "+sput-volatile",
    297     "+iget-object-volatile",
    298     "+iget-wide-volatile",
    299     "+iput-wide-volatile",
    300     "+sget-wide-volatile",
    301     "+sput-wide-volatile",
    302     "^breakpoint",                  // does not appear in DEX files
    303     "^throw-verification-error",    // does not appear in DEX files
    304     "+execute-inline",
    305     "+execute-inline/range",
    306 
    307     /* 0xf0 */
    308     "+invoke-direct-empty",
    309     "UNUSED",
    310     "+iget-quick",
    311     "+iget-wide-quick",
    312     "+iget-object-quick",
    313     "+iput-quick",
    314     "+iput-wide-quick",
    315     "+iput-object-quick",
    316     "+invoke-virtual-quick",
    317     "+invoke-virtual-quick/range",
    318     "+invoke-super-quick",
    319     "+invoke-super-quick/range",
    320     "+iput-object-volatile",
    321     "+sget-object-volatile",
    322     "+sput-object-volatile",
    323     "UNUSED",
    324 };
    325 
    326 /*
    327  * Return the name of an opcode.
    328  */
    329 const char* dexGetOpcodeName(OpCode op)
    330 {
    331     assert(op >= 0 && op < kNumDalvikInstructions);
    332     return gOpNames[op];
    333 }
    334