diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:14 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:14 -0800 |
| commit | f72d5de56a522ac3be03873bdde26f23a5eeeb3c (patch) | |
| tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /dexdump | |
| parent | 31e30105703263782efd450d356cd67ea01af3b7 (diff) | |
| download | android_dalvik-f72d5de56a522ac3be03873bdde26f23a5eeeb3c.tar.gz android_dalvik-f72d5de56a522ac3be03873bdde26f23a5eeeb3c.tar.bz2 android_dalvik-f72d5de56a522ac3be03873bdde26f23a5eeeb3c.zip | |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'dexdump')
| -rw-r--r-- | dexdump/Android.mk | 69 | ||||
| -rw-r--r-- | dexdump/DexDump.c | 1171 | ||||
| -rw-r--r-- | dexdump/OpCodeNames.c | 330 | ||||
| -rw-r--r-- | dexdump/OpCodeNames.h | 26 |
4 files changed, 0 insertions, 1596 deletions
diff --git a/dexdump/Android.mk b/dexdump/Android.mk deleted file mode 100644 index d9fe36703..000000000 --- a/dexdump/Android.mk +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) 2008 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# dexdump, similar in purpose to objdump. -# -LOCAL_PATH:= $(call my-dir) - -dexdump_src_files := \ - DexDump.c \ - OpCodeNames.c - -dexdump_c_includes := \ - dalvik \ - $(JNI_H_INCLUDE) - -dexdump_shared_libraries := - -dexdump_static_libraries := \ - libdex - -## -## -## Build the device command line tool dexdump -## -## -ifneq ($(SDK_ONLY),true) # SDK_only doesn't need device version - -include $(CLEAR_VARS) -LOCAL_MODULE := dexdump -LOCAL_SRC_FILES := $(dexdump_src_files) -LOCAL_C_INCLUDES := $(dexdump_c_includes) -LOCAL_SHARED_LIBRARIES := $(dexdump_shared_libraries) libz liblog -LOCAL_STATIC_LIBRARIES := $(dexdump_static_libraries) -LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES) -LOCAL_MODULE_TAGS := debug development -LOCAL_LDLIBS += -include $(BUILD_EXECUTABLE) - -endif # !SDK_ONLY - - -## -## -## Build the host command line tool dexdump -## -## -ifneq ($(TARGET_SIMULATOR),true) # not 64 bit clean -include $(CLEAR_VARS) -LOCAL_MODULE := dexdump -LOCAL_SRC_FILES := $(dexdump_src_files) -LOCAL_C_INCLUDES := $(dexdump_c_includes) -LOCAL_SHARED_LIBRARIES := $(dexdump_shared_libraries) -LOCAL_STATIC_LIBRARIES := $(dexdump_static_libraries) liblog -LOCAL_LDLIBS += -lpthread -lz -include $(BUILD_HOST_EXECUTABLE) -endif # !TARGET_SIMULATOR - diff --git a/dexdump/DexDump.c b/dexdump/DexDump.c deleted file mode 100644 index a4d97eb7b..000000000 --- a/dexdump/DexDump.c +++ /dev/null @@ -1,1171 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* - * The "dexdump" tool is intended to mimic "objdump". When possible, use - * similar command-line arguments. - * - * TODO: rework the output format to be more regexp-friendly - */ -#include "libdex/DexFile.h" -#include "libdex/DexCatch.h" -#include "libdex/DexClass.h" -#include "libdex/DexProto.h" -#include "libdex/InstrUtils.h" -#include "libdex/SysUtil.h" -#include "libdex/CmdUtils.h" - -#include "dexdump/OpCodeNames.h" - -#include <stdlib.h> -#include <stdio.h> -#include <fcntl.h> -#include <string.h> -#include <unistd.h> -#include <getopt.h> -#include <errno.h> -#include <assert.h> - -static const char* gProgName = "dexdump"; - -static InstructionWidth* gInstrWidth; -static InstructionFormat* gInstrFormat; - -/* command-line options */ -struct { - bool disassemble; - bool showFileHeaders; - bool showSectionHeaders; - const char* tempFileName; -} gOptions; - -/* basic info about a field or method */ -typedef struct FieldMethodInfo { - const char* classDescriptor; - const char* name; - const char* signature; -} FieldMethodInfo; - -/* - * Get 2 little-endian bytes. - */ -static inline u2 get2LE(unsigned char const* pSrc) -{ - return pSrc[0] | (pSrc[1] << 8); -} - -/* - * Return a newly-allocated string for the "dot version" of the class - * name for the given type descriptor. That is, The initial "L" and - * final ";" (if any) have been removed and all occurrences of '/' - * have been changed to '.'. - */ -static char* descriptorToDot(const char* str) -{ - size_t at = strlen(str); - char* newStr; - - if (str[0] == 'L') { - assert(str[at - 1] == ';'); - at -= 2; /* Two fewer chars to copy. */ - str++; /* Skip the 'L'. */ - } - - newStr = malloc(at + 1); /* Add one for the '\0'. */ - newStr[at] = '\0'; - - while (at > 0) { - at--; - newStr[at] = (str[at] == '/') ? '.' : str[at]; - } - - return newStr; -} - -/* - * Count the number of '1' bits in a word. - * - * Having completed this, I'm ready for an interview at Google. - * - * TODO? there's a parallel version w/o loops. Performance not currently - * important. - */ -static int countOnes(u4 val) -{ - int count = 0; - - while (val != 0) { - val &= val-1; - count++; - } - - return count; -} - - -/* - * Flag for use with createAccessFlagStr(). - */ -typedef enum AccessFor { - kAccessForClass = 0, kAccessForMethod = 1, kAccessForField = 2, - kAccessForMAX -} AccessFor; - -/* - * Create a new string with human-readable access flags. - * - * In the base language the access_flags fields are type u2; in Dalvik - * they're u4. - */ -static char* createAccessFlagStr(u4 flags, AccessFor forWhat) -{ -#define NUM_FLAGS 18 - static const char* kAccessStrings[kAccessForMAX][NUM_FLAGS] = { - { - /* class, inner class */ - "PUBLIC", /* 0x0001 */ - "PRIVATE", /* 0x0002 */ - "PROTECTED", /* 0x0004 */ - "STATIC", /* 0x0008 */ - "FINAL", /* 0x0010 */ - "?", /* 0x0020 */ - "?", /* 0x0040 */ - "?", /* 0x0080 */ - "?", /* 0x0100 */ - "INTERFACE", /* 0x0200 */ - "ABSTRACT", /* 0x0400 */ - "?", /* 0x0800 */ - "SYNTHETIC", /* 0x1000 */ - "ANNOTATION", /* 0x2000 */ - "ENUM", /* 0x4000 */ - "?", /* 0x8000 */ - "VERIFIED", /* 0x10000 */ - "OPTIMIZED", /* 0x20000 */ - }, - { - /* method */ - "PUBLIC", /* 0x0001 */ - "PRIVATE", /* 0x0002 */ - "PROTECTED", /* 0x0004 */ - "STATIC", /* 0x0008 */ - "FINAL", /* 0x0010 */ - "SYNCHRONIZED", /* 0x0020 */ - "BRIDGE", /* 0x0040 */ - "VARARGS", /* 0x0080 */ - "NATIVE", /* 0x0100 */ - "?", /* 0x0200 */ - "ABSTRACT", /* 0x0400 */ - "STRICT", /* 0x0800 */ - "SYNTHETIC", /* 0x1000 */ - "?", /* 0x2000 */ - "?", /* 0x4000 */ - "MIRANDA", /* 0x8000 */ - "CONSTRUCTOR", /* 0x10000 */ - "DECLARED_SYNCHRONIZED", /* 0x20000 */ - }, - { - /* field */ - "PUBLIC", /* 0x0001 */ - "PRIVATE", /* 0x0002 */ - "PROTECTED", /* 0x0004 */ - "STATIC", /* 0x0008 */ - "FINAL", /* 0x0010 */ - "?", /* 0x0020 */ - "VOLATILE", /* 0x0040 */ - "TRANSIENT", /* 0x0080 */ - "?", /* 0x0100 */ - "?", /* 0x0200 */ - "?", /* 0x0400 */ - "?", /* 0x0800 */ - "SYNTHETIC", /* 0x1000 */ - "?", /* 0x2000 */ - "ENUM", /* 0x4000 */ - "?", /* 0x8000 */ - "?", /* 0x10000 */ - "?", /* 0x20000 */ - }, - }; - const int kLongest = 21; /* strlen of longest string above */ - int i, count; - char* str; - char* cp; - - /* - * Allocate enough storage to hold the expected number of strings, - * plus a space between each. We over-allocate, using the longest - * string above as the base metric. - */ - count = countOnes(flags); - cp = str = (char*) malloc(count * (kLongest+1) +1); - - for (i = 0; i < NUM_FLAGS; i++) { - if (flags & 0x01) { - const char* accessStr = kAccessStrings[forWhat][i]; - int len = strlen(accessStr); - if (cp != str) - *cp++ = ' '; - - memcpy(cp, accessStr, len); - cp += len; - } - flags >>= 1; - } - *cp = '\0'; - - return str; -} - - -/* - * Dump the file header. - */ -void dumpFileHeader(const DexFile* pDexFile) -{ - const DexHeader* pHeader = pDexFile->pHeader; - - printf("DEX file header:\n"); - printf("magic : '%.8s'\n", pHeader->magic); - printf("checksum : %08x\n", pHeader->checksum); - printf("signature : %02x%02x...%02x%02x\n", - pHeader->signature[0], pHeader->signature[1], - pHeader->signature[kSHA1DigestLen-2], - pHeader->signature[kSHA1DigestLen-1]); - printf("file_size : %d\n", pHeader->fileSize); - printf("header_size : %d\n", pHeader->headerSize); - printf("link_size : %d\n", pHeader->linkSize); - printf("link_off : %d (0x%06x)\n", - pHeader->linkOff, pHeader->linkOff); - printf("string_ids_size : %d\n", pHeader->stringIdsSize); - printf("string_ids_off : %d (0x%06x)\n", - pHeader->stringIdsOff, pHeader->stringIdsOff); - printf("type_ids_size : %d\n", pHeader->typeIdsSize); - printf("type_ids_off : %d (0x%06x)\n", - pHeader->typeIdsOff, pHeader->typeIdsOff); - printf("field_ids_size : %d\n", pHeader->fieldIdsSize); - printf("field_ids_off : %d (0x%06x)\n", - pHeader->fieldIdsOff, pHeader->fieldIdsOff); - printf("method_ids_size : %d\n", pHeader->methodIdsSize); - printf("method_ids_off : %d (0x%06x)\n", - pHeader->methodIdsOff, pHeader->methodIdsOff); - printf("class_defs_size : %d\n", pHeader->classDefsSize); - printf("class_defs_off : %d (0x%06x)\n", - pHeader->classDefsOff, pHeader->classDefsOff); - printf("data_size : %d\n", pHeader->dataSize); - printf("data_off : %d (0x%06x)\n", - pHeader->dataOff, pHeader->dataOff); - printf("\n"); -} - -/* - * Dump a class_def_item. - */ -void dumpClassDef(DexFile* pDexFile, int idx) -{ - const DexClassDef* pClassDef; - const u1* pEncodedData; - DexClassData* pClassData; - - pClassDef = dexGetClassDef(pDexFile, idx); - pEncodedData = dexGetClassData(pDexFile, pClassDef); - pClassData = dexReadAndVerifyClassData(&pEncodedData, NULL); - - if (pClassData == NULL) { - fprintf(stderr, "Trouble reading class data\n"); - return; - } - - printf("Class #%d header:\n", idx); - printf("class_idx : %d\n", pClassDef->classIdx); - printf("access_flags : %d (0x%04x)\n", - pClassDef->accessFlags, pClassDef->accessFlags); - printf("superclass_idx : %d\n", pClassDef->superclassIdx); - printf("interfaces_off : %d (0x%06x)\n", - pClassDef->interfacesOff, pClassDef->interfacesOff); - printf("source_file_idx : %d\n", pClassDef->sourceFileIdx); - printf("annotations_off : %d (0x%06x)\n", - pClassDef->annotationsOff, pClassDef->annotationsOff); - printf("class_data_off : %d (0x%06x)\n", - pClassDef->classDataOff, pClassDef->classDataOff); - printf("static_fields_size : %d\n", pClassData->header.staticFieldsSize); - printf("instance_fields_size: %d\n", - pClassData->header.instanceFieldsSize); - printf("direct_methods_size : %d\n", pClassData->header.directMethodsSize); - printf("virtual_methods_size: %d\n", - pClassData->header.virtualMethodsSize); - printf("\n"); - - free(pClassData); -} - -/* - * Dump an interface. - */ -void dumpInterface(const DexFile* pDexFile, const DexTypeItem* pTypeItem, - int i) -{ - const char* interfaceName = - dexStringByTypeIdx(pDexFile, pTypeItem->typeIdx); - - printf(" #%d : '%s'\n", i, interfaceName); -} - -/* - * Dump the catches table associated with the code. - */ -void dumpCatches(DexFile* pDexFile, const DexCode* pCode) -{ - u4 triesSize = pCode->triesSize; - - if (triesSize == 0) { - printf(" catches : (none)\n"); - return; - } - - printf(" catches : %d\n", triesSize); - - const DexTry* pTries = dexGetTries(pCode); - u4 i; - - for (i = 0; i < triesSize; i++) { - const DexTry* pTry = &pTries[i]; - u4 start = pTry->startAddr; - u4 end = start + pTry->insnCount; - DexCatchIterator iterator; - - printf(" 0x%04x - 0x%04x\n", start, end); - - dexCatchIteratorInit(&iterator, pCode, pTry->handlerOff); - - for (;;) { - DexCatchHandler* handler = dexCatchIteratorNext(&iterator); - const char* descriptor; - - if (handler == NULL) { - break; - } - - descriptor = (handler->typeIdx == kDexNoIndex) ? "<any>" : - dexStringByTypeIdx(pDexFile, handler->typeIdx); - - printf(" %s -> 0x%04x\n", descriptor, - handler->address); - } - } -} - -static int dumpPositionsCb(void *cnxt, u4 address, u4 lineNum) -{ - printf(" 0x%04x line=%d\n", address, lineNum); - return 0; -} - -/* - * Dump the positions list. - */ -void dumpPositions(DexFile* pDexFile, const DexCode* pCode, - const DexMethod *pDexMethod) -{ - printf(" positions : \n"); - const DexMethodId *pMethodId - = dexGetMethodId(pDexFile, pDexMethod->methodIdx); - const char *classDescriptor - = dexStringByTypeIdx(pDexFile, pMethodId->classIdx); - - dexDecodeDebugInfo(pDexFile, pCode, classDescriptor, pMethodId->protoIdx, - pDexMethod->accessFlags, dumpPositionsCb, NULL, NULL); -} - -static void dumpLocalsCb(void *cnxt, u2 reg, u4 startAddress, - u4 endAddress, const char *name, const char *descriptor, - const char *signature) -{ - printf(" 0x%04x - 0x%04x reg=%d %s %s %s\n", - startAddress, endAddress, reg, name, descriptor, - signature); -} - -/* - * Dump the locals list. - */ -void dumpLocals(DexFile* pDexFile, const DexCode* pCode, - const DexMethod *pDexMethod) -{ - printf(" locals : \n"); - - const DexMethodId *pMethodId - = dexGetMethodId(pDexFile, pDexMethod->methodIdx); - const char *classDescriptor - = dexStringByTypeIdx(pDexFile, pMethodId->classIdx); - - dexDecodeDebugInfo(pDexFile, pCode, classDescriptor, pMethodId->protoIdx, - pDexMethod->accessFlags, NULL, dumpLocalsCb, NULL); -} - -/* - * Get information about a method. - */ -bool getMethodInfo(DexFile* pDexFile, u4 methodIdx, FieldMethodInfo* pMethInfo) -{ - const DexMethodId* pMethodId; - - if (methodIdx >= pDexFile->pHeader->methodIdsSize) - return false; - - pMethodId = dexGetMethodId(pDexFile, methodIdx); - pMethInfo->name = dexStringById(pDexFile, pMethodId->nameIdx); - pMethInfo->signature = dexCopyDescriptorFromMethodId(pDexFile, pMethodId); - - pMethInfo->classDescriptor = - dexStringByTypeIdx(pDexFile, pMethodId->classIdx); - return true; -} - -/* - * Get information about a field. - */ -bool getFieldInfo(DexFile* pDexFile, u4 fieldIdx, FieldMethodInfo* pFieldInfo) -{ - const DexFieldId* pFieldId; - - if (fieldIdx >= pDexFile->pHeader->fieldIdsSize) - return false; - - pFieldId = dexGetFieldId(pDexFile, fieldIdx); - pFieldInfo->name = dexStringById(pDexFile, pFieldId->nameIdx); - pFieldInfo->signature = dexStringByTypeIdx(pDexFile, pFieldId->typeIdx); - pFieldInfo->classDescriptor = - dexStringByTypeIdx(pDexFile, pFieldId->classIdx); - return true; -} - - -/* - * Look up a class' descriptor. - */ -const char* getClassDescriptor(DexFile* pDexFile, u4 classIdx) -{ - return dexStringByTypeIdx(pDexFile, classIdx); -} - -/* - * Dump a single instruction. - */ -void dumpInstruction(DexFile* pDexFile, const DexCode* pCode, int insnIdx, - int insnWidth, const DecodedInstruction* pDecInsn) -{ - static const float gSpecialTab[16] = { - -2.0f, -1.0f, -0.5f, -0.25f, -0.1f, 0.1f, 0.25f, 0.5f, - 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 10.0f, 100.0f, 1000.0f - }; - const u2* insns = pCode->insns; - int i; - - printf("%06x:", ((u1*)insns - pDexFile->baseAddr) + insnIdx*2); - for (i = 0; i < 8; i++) { - if (i < insnWidth) { - if (i == 7) { - printf(" ... "); - } else { - /* print 16-bit value in little-endian order */ - const u1* bytePtr = (const u1*) &insns[insnIdx+i]; - printf(" %02x%02x", bytePtr[0], bytePtr[1]); - } - } else { - fputs(" ", stdout); - } - } - - if (pDecInsn->opCode == OP_NOP) { - u2 instr = get2LE((const u1*) &insns[insnIdx]); - if (instr == kPackedSwitchSignature) { - printf("|%04x: packed-switch-data (%d units)", - insnIdx, insnWidth); - } else if (instr == kSparseSwitchSignature) { - printf("|%04x: sparse-switch-data (%d units)", - insnIdx, insnWidth); - } else if (instr == kArrayDataSignature) { - printf("|%04x: array-data (%d units)", - insnIdx, insnWidth); - } else { - printf("|%04x: nop // spacer", insnIdx); - } - } else { - printf("|%04x: %s", insnIdx, getOpcodeName(pDecInsn->opCode)); - } - - switch (dexGetInstrFormat(gInstrFormat, pDecInsn->opCode)) { - case kFmt10x: // op - break; - case kFmt12x: // op vA, vB - printf(" v%d, v%d", pDecInsn->vA, pDecInsn->vB); - break; - case kFmt11n: // op vA, #+B - printf(" v%d, #int %d // #%x", - pDecInsn->vA, (s4)pDecInsn->vB, (u1)pDecInsn->vB); - break; - case kFmt11x: // op vAA - printf(" v%d", pDecInsn->vA); - break; - case kFmt10t: // op +AA - case kFmt20t: // op +AAAA - { - s4 targ = (s4) pDecInsn->vA; - printf(" %04x // %c%04x", - insnIdx + targ, - (targ < 0) ? '-' : '+', - (targ < 0) ? -targ : targ); - } - break; - case kFmt22x: // op vAA, vBBBB - printf(" v%d, v%d", pDecInsn->vA, pDecInsn->vB); - break; - case kFmt21t: // op vAA, +BBBB - { - s4 targ = (s4) pDecInsn->vB; - printf(" v%d, %04x // %c%04x", pDecInsn->vA, - insnIdx + targ, - (targ < 0) ? '-' : '+', - (targ < 0) ? -targ : targ); - } - break; - case kFmt21s: // op vAA, #+BBBB - printf(" v%d, #int %d // #%x", - pDecInsn->vA, (s4)pDecInsn->vB, (u2)pDecInsn->vB); - break; - case kFmt21h: // op vAA, #+BBBB0000[00000000] - // The printed format varies a bit based on the actual opcode. - if (pDecInsn->opCode == OP_CONST_HIGH16) { - s4 value = pDecInsn->vB << 16; - printf(" v%d, #int %d // #%x", - pDecInsn->vA, value, (u2)pDecInsn->vB); - } else { - s8 value = ((s8) pDecInsn->vB) << 48; - printf(" v%d, #long %lld // #%x", - pDecInsn->vA, value, (u2)pDecInsn->vB); - } - break; - case kFmt21c: // op vAA, thing@BBBB - if (pDecInsn->opCode == OP_CONST_STRING) { - printf(" v%d, \"%s\" // string@%04x", pDecInsn->vA, - dexStringById(pDexFile, pDecInsn->vB), pDecInsn->vB); - } else if (pDecInsn->opCode == OP_CHECK_CAST || - pDecInsn->opCode == OP_NEW_INSTANCE || - pDecInsn->opCode == OP_CONST_CLASS) - { - printf(" v%d, %s // class@%04x", pDecInsn->vA, - getClassDescriptor(pDexFile, pDecInsn->vB), pDecInsn->vB); - } else /* OP_SGET* */ { - FieldMethodInfo fieldInfo; - if (getFieldInfo(pDexFile, pDecInsn->vB, &fieldInfo)) { - printf(" v%d, %s.%s:%s // field@%04x", pDecInsn->vA, - fieldInfo.classDescriptor, fieldInfo.name, - fieldInfo.signature, pDecInsn->vB); - } else { - printf(" v%d, ??? // field@%04x", pDecInsn->vA, pDecInsn->vB); - } - } - break; - case kFmt23x: // op vAA, vBB, vCC - printf(" v%d, v%d, v%d", pDecInsn->vA, pDecInsn->vB, pDecInsn->vC); - break; - case kFmt22b: // op vAA, vBB, #+CC - printf(" v%d, v%d, #int %d // #%02x", - pDecInsn->vA, pDecInsn->vB, (s4)pDecInsn->vC, (u1)pDecInsn->vC); - break; - case kFmt22t: // op vA, vB, +CCCC - { - s4 targ = (s4) pDecInsn->vC; - printf(" v%d, v%d, %04x // %c%04x", pDecInsn->vA, pDecInsn->vB, - insnIdx + targ, - (targ < 0) ? '-' : '+', - (targ < 0) ? -targ : targ); - } - break; - case kFmt22s: // op vA, vB, #+CCCC - printf(" v%d, v%d, #int %d // #%04x", - pDecInsn->vA, pDecInsn->vB, (s4)pDecInsn->vC, (u2)pDecInsn->vC); - break; - case kFmt22c: // op vA, vB, thing@CCCC - if (pDecInsn->opCode >= OP_IGET && pDecInsn->opCode <= OP_IPUT_SHORT) { - FieldMethodInfo fieldInfo; - if (getFieldInfo(pDexFile, pDecInsn->vC, &fieldInfo)) { - printf(" v%d, v%d, %s.%s:%s // field@%04x", pDecInsn->vA, - pDecInsn->vB, fieldInfo.classDescriptor, fieldInfo.name, - fieldInfo.signature, pDecInsn->vC); - } else { - printf(" v%d, v%d, ??? // field@%04x", pDecInsn->vA, - pDecInsn->vB, pDecInsn->vC); - } - } else { - printf(" v%d, v%d, %s // class@%04x", - pDecInsn->vA, pDecInsn->vB, - getClassDescriptor(pDexFile, pDecInsn->vC), pDecInsn->vC); - } - break; - case kFmt22cs: // [opt] op vA, vB, field offset CCCC - printf(" v%d, v%d, [obj+%04x]", - pDecInsn->vA, pDecInsn->vB, pDecInsn->vC); - break; - case kFmt30t: - printf(" #%08x", pDecInsn->vA); - break; - case kFmt31i: // op vAA, #+BBBBBBBB - { - /* this is often, but not always, a float */ - union { - float f; - u4 i; - } conv; - conv.i = pDecInsn->vB; - printf(" v%d, #float %f // #%08x", - pDecInsn->vA, conv.f, pDecInsn->vB); - } - break; - case kFmt31c: // op vAA, thing@BBBBBBBB - printf(" v%d, \"%s\" // string@%08x", pDecInsn->vA, - dexStringById(pDexFile, pDecInsn->vB), pDecInsn->vB); - break; - case kFmt31t: // op vAA, offset +BBBBBBBB - printf(" v%d, %08x // +%08x", - pDecInsn->vA, insnIdx + pDecInsn->vB, pDecInsn->vB); - break; - case kFmt32x: // op vAAAA, vBBBB - printf(" v%d, v%d", pDecInsn->vA, pDecInsn->vB); - break; - case kFmt35c: // op vB, {vD, vE, vF, vG, vA}, thing@CCCC - { - /* NOTE: decoding of 35c doesn't quite match spec */ - fputs(" {", stdout); - for (i = 0; i < (int) pDecInsn->vA; i++) { - if (i == 0) - printf("v%d", pDecInsn->arg[i]); - else - printf(", v%d", pDecInsn->arg[i]); - } - if (pDecInsn->opCode == OP_FILLED_NEW_ARRAY) { - printf("}, %s // class@%04x", - getClassDescriptor(pDexFile, pDecInsn->vB), pDecInsn->vB); - } else { - FieldMethodInfo methInfo; - if (getMethodInfo(pDexFile, pDecInsn->vB, &methInfo)) { - printf("}, %s.%s:%s // method@%04x", - methInfo.classDescriptor, methInfo.name, - methInfo.signature, pDecInsn->vB); - } else { - printf("}, ??? // method@%04x", pDecInsn->vB); - } - } - } - break; - case kFmt35ms: // [opt] invoke-virtual+super - case kFmt35fs: // [opt] invoke-interface - { - fputs(" {", stdout); - for (i = 0; i < (int) pDecInsn->vA; i++) { - if (i == 0) - printf("v%d", pDecInsn->arg[i]); - else - printf(", v%d", pDecInsn->arg[i]); - } - printf("}, [%04x] // vtable #%04x", pDecInsn->vB, pDecInsn->vB); - } - break; - case kFmt3rc: // op {vCCCC .. v(CCCC+AA-1)}, meth@BBBB - { - /* - * This doesn't match the "dx" output when some of the args are - * 64-bit values -- dx only shows the first register. - */ - fputs(" {", stdout); - for (i = 0; i < (int) pDecInsn->vA; i++) { - if (i == 0) - printf("v%d", pDecInsn->vC + i); - else - printf(", v%d", pDecInsn->vC + i); - } - if (pDecInsn->opCode == OP_FILLED_NEW_ARRAY_RANGE) { - printf("}, %s // class@%04x", - getClassDescriptor(pDexFile, pDecInsn->vB), pDecInsn->vB); - } else { - FieldMethodInfo methInfo; - if (getMethodInfo(pDexFile, pDecInsn->vB, &methInfo)) { - printf("}, %s.%s:%s // method@%04x", - methInfo.classDescriptor, methInfo.name, - methInfo.signature, pDecInsn->vB); - } else { - printf("}, ??? // method@%04x", pDecInsn->vB); - } - } - } - break; - case kFmt3rms: // [opt] invoke-virtual+super/range - case kFmt3rfs: // [opt] invoke-interface/range - { - /* - * This doesn't match the "dx" output when some of the args are - * 64-bit values -- dx only shows the first register. - */ - fputs(" {", stdout); - for (i = 0; i < (int) pDecInsn->vA; i++) { - if (i == 0) - printf("v%d", pDecInsn->vC + i); - else - printf(", v%d", pDecInsn->vC + i); - } - printf("}, [%04x] // vtable #%04x", pDecInsn->vB, pDecInsn->vB); - } - break; - case kFmt3inline: // [opt] inline invoke - { -#if 0 - const InlineOperation* inlineOpsTable = dvmGetInlineOpsTable(); - u4 tableLen = dvmGetInlineOpsTableLength(); -#endif - - fputs(" {", stdout); - for (i = 0; i < (int) pDecInsn->vA; i++) { - if (i == 0) - printf("v%d", pDecInsn->arg[i]); - else - printf(", v%d", pDecInsn->arg[i]); - } -#if 0 - if (pDecInsn->vB < tableLen) { - printf("}, %s.%s:%s // inline #%04x", - inlineOpsTable[pDecInsn->vB].classDescriptor, - inlineOpsTable[pDecInsn->vB].methodName, - inlineOpsTable[pDecInsn->vB].methodSignature, - pDecInsn->vB); - } else { -#endif - printf("}, [%04x] // inline #%04x", pDecInsn->vB, pDecInsn->vB); -#if 0 - } -#endif - } - break; - case kFmt51l: // op vAA, #+BBBBBBBBBBBBBBBB - { - /* this is often, but not always, a double */ - union { - double d; - u8 j; - } conv; - conv.j = pDecInsn->vB_wide; - printf(" v%d, #double %f // #%016llx", - pDecInsn->vA, conv.d, pDecInsn->vB_wide); - } - break; - case kFmtUnknown: - break; - default: - printf(" ???"); - break; - } - - - putchar('\n'); - -} - -/* - * Dump a bytecode disassembly. - */ -void dumpBytecodes(DexFile* pDexFile, const DexMethod* pDexMethod) -{ - const DexCode* pCode = dexGetCode(pDexFile, pDexMethod); - const u2* insns; - int insnIdx; - FieldMethodInfo methInfo; - int startAddr; - char* className = NULL; - - assert(pCode->insnsSize > 0); - insns = pCode->insns; - - getMethodInfo(pDexFile, pDexMethod->methodIdx, &methInfo); - startAddr = ((u1*)pCode - pDexFile->baseAddr); - className = descriptorToDot(methInfo.classDescriptor); - - printf("%06x: |[%06x] %s.%s:%s\n", - startAddr, startAddr, - className, methInfo.name, methInfo.signature); - - insnIdx = 0; - while (insnIdx < (int) pCode->insnsSize) { - int insnWidth; - OpCode opCode; - DecodedInstruction decInsn; - u2 instr; - - instr = get2LE((const u1*)insns); - if (instr == kPackedSwitchSignature) { - insnWidth = 4 + get2LE((const u1*)(insns+1)) * 2; - } else if (instr == kSparseSwitchSignature) { - insnWidth = 2 + get2LE((const u1*)(insns+1)) * 4; - } else if (instr == kArrayDataSignature) { - int width = get2LE((const u1*)(insns+1)); - int size = get2LE((const u1*)(insns+2)) | - (get2LE((const u1*)(insns+3))<<16); - // The plus 1 is to round up for odd size and width - insnWidth = 4 + ((size * width) + 1) / 2; - } else { - opCode = instr & 0xff; - insnWidth = dexGetInstrWidthAbs(gInstrWidth, opCode); - if (insnWidth == 0) { - fprintf(stderr, - "GLITCH: zero-width instruction at idx=0x%04x\n", insnIdx); - break; - } - } - - dexDecodeInstruction(gInstrFormat, insns, &decInsn); - dumpInstruction(pDexFile, pCode, insnIdx, insnWidth, &decInsn); - - insns += insnWidth; - insnIdx += insnWidth; - } - - free(className); -} - -/* - * Dump a "code" struct. - */ -void dumpCode(DexFile* pDexFile, const DexMethod* pDexMethod) -{ - const DexCode* pCode = dexGetCode(pDexFile, pDexMethod); - - printf(" registers : %d\n", pCode->registersSize); - printf(" ins : %d\n", pCode->insSize); - printf(" outs : %d\n", pCode->outsSize); - printf(" insns size : %d 16-bit code units\n", pCode->insnsSize); - - if (gOptions.disassemble) - dumpBytecodes(pDexFile, pDexMethod); - - dumpCatches(pDexFile, pCode); - /* both of these are encoded in debug info */ - dumpPositions(pDexFile, pCode, pDexMethod); - dumpLocals(pDexFile, pCode, pDexMethod); -} - -/* - * Dump a method. - */ -void dumpMethod(DexFile* pDexFile, const DexMethod* pDexMethod, int i) -{ - const DexMethodId* pMethodId; - const char* backDescriptor; - const char* name; - char* typeDescriptor; - char* accessStr; - - pMethodId = dexGetMethodId(pDexFile, pDexMethod->methodIdx); - name = dexStringById(pDexFile, pMethodId->nameIdx); - typeDescriptor = dexCopyDescriptorFromMethodId(pDexFile, pMethodId); - - backDescriptor = dexStringByTypeIdx(pDexFile, pMethodId->classIdx); - - accessStr = createAccessFlagStr(pDexMethod->accessFlags, - kAccessForMethod); - - printf(" #%d : (in %s)\n", i, backDescriptor); - printf(" name : '%s'\n", name); - printf(" type : '%s'\n", typeDescriptor); - printf(" access : 0x%04x (%s)\n", - pDexMethod->accessFlags, accessStr); - - if (pDexMethod->codeOff == 0) { - printf(" code : (none)\n"); - } else { - printf(" code -\n"); - dumpCode(pDexFile, pDexMethod); - } - - if (gOptions.disassemble) - putchar('\n'); - - free(typeDescriptor); - free(accessStr); -} - -/* - * Dump a static (class) field. - */ -void dumpSField(const DexFile* pDexFile, const DexField* pSField, int i) -{ - const DexFieldId* pFieldId; - const char* backDescriptor; - const char* name; - const char* typeDescriptor; - char* accessStr; - - pFieldId = dexGetFieldId(pDexFile, pSField->fieldIdx); - name = dexStringById(pDexFile, pFieldId->nameIdx); - typeDescriptor = dexStringByTypeIdx(pDexFile, pFieldId->typeIdx); - backDescriptor = dexStringByTypeIdx(pDexFile, pFieldId->classIdx); - - accessStr = createAccessFlagStr(pSField->accessFlags, kAccessForField); - - printf(" #%d : (in %s)\n", i, backDescriptor); - printf(" name : '%s'\n", name); - printf(" type : '%s'\n", typeDescriptor); - printf(" access : 0x%04x (%s)\n", - pSField->accessFlags, accessStr); - - free(accessStr); -} - -/* - * Dump an instance field. - */ -void dumpIField(const DexFile* pDexFile, const DexField* pIField, int i) -{ - const DexFieldId* pFieldId; - const char* backDescriptor; - const char* name; - const char* typeDescriptor; - char* accessStr; - - pFieldId = dexGetFieldId(pDexFile, pIField->fieldIdx); - name = dexStringById(pDexFile, pFieldId->nameIdx); - typeDescriptor = dexStringByTypeIdx(pDexFile, pFieldId->typeIdx); - backDescriptor = dexStringByTypeIdx(pDexFile, pFieldId->classIdx); - - accessStr = createAccessFlagStr(pIField->accessFlags, kAccessForField); - - printf(" #%d : (in %s)\n", i, backDescriptor); - printf(" name : '%s'\n", name); - printf(" type : '%s'\n", typeDescriptor); - printf(" access : 0x%04x (%s)\n", - pIField->accessFlags, accessStr); - - free(accessStr); -} - -/* - * Dump the class. - */ -void dumpClass(DexFile* pDexFile, int idx) -{ - const DexTypeList* pInterfaces; - const DexClassDef* pClassDef; - DexClassData* pClassData; - const u1* pEncodedData; - const char* fileName; - const char* classDescriptor; - const char* superclassDescriptor; - char* accessStr; - int i; - - pClassDef = dexGetClassDef(pDexFile, idx); - printf("Class #%d -\n", idx); - - pEncodedData = dexGetClassData(pDexFile, pClassDef); - pClassData = dexReadAndVerifyClassData(&pEncodedData, NULL); - - if (pClassData == NULL) { - printf("Trouble reading class data\n"); - return; - } - - classDescriptor = dexStringByTypeIdx(pDexFile, pClassDef->classIdx); - printf(" Class descriptor : '%s'\n", classDescriptor); - - accessStr = createAccessFlagStr(pClassDef->accessFlags, kAccessForClass); - printf(" Access flags : 0x%04x (%s)\n", - pClassDef->accessFlags, accessStr); - - if (pClassDef->superclassIdx == kDexNoIndex) - superclassDescriptor = "(none)"; - else { - superclassDescriptor = - dexStringByTypeIdx(pDexFile, pClassDef->superclassIdx); - printf(" Superclass : '%s'\n", superclassDescriptor); - } - - printf(" Interfaces -\n"); - pInterfaces = dexGetInterfacesList(pDexFile, pClassDef); - if (pInterfaces != NULL) { - for (i = 0; i < (int) pInterfaces->size; i++) - dumpInterface(pDexFile, dexGetTypeItem(pInterfaces, i), i); - } - - printf(" Static fields -\n"); - for (i = 0; i < (int) pClassData->header.staticFieldsSize; i++) { - dumpSField(pDexFile, &pClassData->staticFields[i], i); - } - - printf(" Instance fields -\n"); - for (i = 0; i < (int) pClassData->header.instanceFieldsSize; i++) { - dumpIField(pDexFile, &pClassData->instanceFields[i], i); - } - - printf(" Direct methods -\n"); - for (i = 0; i < (int) pClassData->header.directMethodsSize; i++) { - dumpMethod(pDexFile, &pClassData->directMethods[i], i); - } - - printf(" Virtual methods -\n"); - for (i = 0; i < (int) pClassData->header.virtualMethodsSize; i++) { - dumpMethod(pDexFile, &pClassData->virtualMethods[i], i); - } - - // TODO: Annotations. - - if (pClassDef->sourceFileIdx != kDexNoIndex) - fileName = dexStringById(pDexFile, pClassDef->sourceFileIdx); - else - fileName = "unknown"; - printf(" source_file_idx : %d (%s)\n", - pClassDef->sourceFileIdx, fileName); - - printf("\n"); - - free(pClassData); - free(accessStr); -} - -/* - * Dump the requested sections of the file. - */ -void processDexFile(const char* fileName, DexFile* pDexFile) -{ - int i; - - printf("Opened '%s', DEX version '%.3s'\n", fileName, - pDexFile->pHeader->magic +4); - - if (gOptions.showFileHeaders) - dumpFileHeader(pDexFile); - - for (i = 0; i < (int) pDexFile->pHeader->classDefsSize; i++) { - if (gOptions.showSectionHeaders) - dumpClassDef(pDexFile, i); - - dumpClass(pDexFile, i); - } -} - - -/* - * Process one file. - */ -int process(const char* fileName) -{ - DexFile* pDexFile = NULL; - MemMapping map; - bool mapped = false; - int result = -1; - - printf("Processing '%s'...\n", fileName); - - if (dexOpenAndMap(fileName, gOptions.tempFileName, &map, false) != 0) - goto bail; - mapped = true; - - pDexFile = dexFileParse(map.addr, map.length, - kDexParseVerifyChecksum | kDexParseContinueOnError); - if (pDexFile == NULL) { - fprintf(stderr, "ERROR: DEX parse failed\n"); - goto bail; - } - - processDexFile(fileName, pDexFile); - - result = 0; - -bail: - if (mapped) - sysReleaseShmem(&map); - if (pDexFile != NULL) - dexFileFree(pDexFile); - return result; -} - - -/* - * Show usage. - */ -void usage(void) -{ - fprintf(stderr, "Copyright (C) 2007 The Android Open Source Project\n\n"); - fprintf(stderr, "%s: [-d] [-f] [-h] [-t tempfile] dexfile...\n", gProgName); - fprintf(stderr, "\n"); - fprintf(stderr, " -d : disassemble code sections\n"); - fprintf(stderr, " -f : display summary information from file header\n"); - fprintf(stderr, " -h : display file header details\n"); - fprintf(stderr, " -t : temp file name (defaults to /sdcard/dex-temp-*)\n"); -} - -/* - * Parse args. - * - * I'm not using getopt_long() because we may not have it in libc. - */ -int main(int argc, char* const argv[]) -{ - bool wantUsage = false; - int ic; - - memset(&gOptions, 0, sizeof(gOptions)); - - while (1) { - ic = getopt(argc, argv, "dfht:"); - if (ic < 0) - break; - - switch (ic) { - case 'd': // disassemble Dalvik instructions - gOptions.disassemble = true; - break; - case 'f': // dump outer file header - gOptions.showFileHeaders = true; - break; - case 'h': // dump section headers, i.e. all meta-data - gOptions.showSectionHeaders = true; - break; - case 't': // temp file, used when opening compressed Jar - gOptions.tempFileName = argv[optind]; - break; - default: - wantUsage = true; - break; - } - } - - if (optind == argc) { - fprintf(stderr, "%s: no file specified\n", gProgName); - wantUsage = true; - } - - /* initialize some VM tables */ - gInstrWidth = dexCreateInstrWidthTable(); - gInstrFormat = dexCreateInstrFormatTable(); - - if (wantUsage) { - usage(); - return 2; - } - - while (optind < argc) - process(argv[optind++]); - - free(gInstrWidth); - free(gInstrFormat); - - return 0; -} diff --git a/dexdump/OpCodeNames.c b/dexdump/OpCodeNames.c deleted file mode 100644 index 378dcf729..000000000 --- a/dexdump/OpCodeNames.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* - * Table of Dalvik opcode names. - */ -#include "OpCodeNames.h" - -/* - * The following two lines work, but slashes and dashes both turn into - * underscores, and the strings are all upper case. The output is easier - * to read if we do the strings by hand (could probably write a - * post-processing function easily enough if maintenance becomes annoying). - */ -//#define H(_op) #_op -//DEFINE_GOTO_TABLE(gOpNames) - -/* - * Dalvik opcode names. - */ -static const char* gOpNames[256] = { - /* 0x00 */ - "nop", - "move", - "move/from16", - "move/16", - "move-wide", - "move-wide/from16", - "move-wide/16", - "move-object", - "move-object/from16", - "move-object/16", - "move-result", - "move-result-wide", - "move-result-object", - "move-exception", - "return-void", - "return", - - /* 0x10 */ - "return-wide", - "return-object", - "const/4", - "const/16", - "const", - "const/high16", - "const-wide/16", - "const-wide/32", - "const-wide", - "const-wide/high16", - "const-string", - "const-string/jumbo", - "const-class", - "monitor-enter", - "monitor-exit", - "check-cast", - - /* 0x20 */ - "instance-of", - "array-length", - "new-instance", - "new-array", - "filled-new-array", - "filled-new-array/range", - "fill-array-data", - "throw", - "goto", - "goto/16", - "goto/32", - "packed-switch", - "sparse-switch", - "cmpl-float", - "cmpg-float", - "cmpl-double", - - /* 0x30 */ - "cmpg-double", - "cmp-long", - "if-eq", - "if-ne", - "if-lt", - "if-ge", - "if-gt", - "if-le", - "if-eqz", - "if-nez", - "if-ltz", - "if-gez", - "if-gtz", - "if-lez", - "UNUSED", - "UNUSED", - - /* 0x40 */ - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "aget", - "aget-wide", - "aget-object", - "aget-boolean", - "aget-byte", - "aget-char", - "aget-short", - "aput", - "aput-wide", - "aput-object", - "aput-boolean", - "aput-byte", - - /* 0x50 */ - "aput-char", - "aput-short", - "iget", - "iget-wide", - "iget-object", - "iget-boolean", - "iget-byte", - "iget-char", - "iget-short", - "iput", - "iput-wide", - "iput-object", - "iput-boolean", - "iput-byte", - "iput-char", - "iput-short", - - /* 0x60 */ - "sget", - "sget-wide", - "sget-object", - "sget-boolean", - "sget-byte", - "sget-char", - "sget-short", - "sput", - "sput-wide", - "sput-object", - "sput-boolean", - "sput-byte", - "sput-char", - "sput-short", - "invoke-virtual", - "invoke-super", - - /* 0x70 */ - "invoke-direct", - "invoke-static", - "invoke-interface", - "UNUSED", - "invoke-virtual/range", - "invoke-super/range", - "invoke-direct/range", - "invoke-static/range", - "invoke-interface/range", - "UNUSED", - "UNUSED", - "neg-int", - "not-int", - "neg-long", - "not-long", - "neg-float", - - /* 0x80 */ - "neg-double", - "int-to-long", - "int-to-float", - "int-to-double", - "long-to-int", - "long-to-float", - "long-to-double", - "float-to-int", - "float-to-long", - "float-to-double", - "double-to-int", - "double-to-long", - "double-to-float", - "int-to-byte", - "int-to-char", - "int-to-short", - - /* 0x90 */ - "add-int", - "sub-int", - "mul-int", - "div-int", - "rem-int", - "and-int", - "or-int", - "xor-int", - "shl-int", - "shr-int", - "ushr-int", - "add-long", - "sub-long", - "mul-long", - "div-long", - "rem-long", - - /* 0xa0 */ - "and-long", - "or-long", - "xor-long", - "shl-long", - "shr-long", - "ushr-long", - "add-float", - "sub-float", - "mul-float", - "div-float", - "rem-float", - "add-double", - "sub-double", - "mul-double", - "div-double", - "rem-double", - - /* 0xb0 */ - "add-int/2addr", - "sub-int/2addr", - "mul-int/2addr", - "div-int/2addr", - "rem-int/2addr", - "and-int/2addr", - "or-int/2addr", - "xor-int/2addr", - "shl-int/2addr", - "shr-int/2addr", - "ushr-int/2addr", - "add-long/2addr", - "sub-long/2addr", - "mul-long/2addr", - "div-long/2addr", - "rem-long/2addr", - - /* 0xc0 */ - "and-long/2addr", - "or-long/2addr", - "xor-long/2addr", - "shl-long/2addr", - "shr-long/2addr", - "ushr-long/2addr", - "add-float/2addr", - "sub-float/2addr", - "mul-float/2addr", - "div-float/2addr", - "rem-float/2addr", - "add-double/2addr", - "sub-double/2addr", - "mul-double/2addr", - "div-double/2addr", - "rem-double/2addr", - - /* 0xd0 */ - "add-int/lit16", - "rsub-int", - "mul-int/lit16", - "div-int/lit16", - "rem-int/lit16", - "and-int/lit16", - "or-int/lit16", - "xor-int/lit16", - "add-int/lit8", - "rsub-int/lit8", - "mul-int/lit8", - "div-int/lit8", - "rem-int/lit8", - "and-int/lit8", - "or-int/lit8", - "xor-int/lit8", - - /* 0xe0 */ - "shl-int/lit8", - "shr-int/lit8", - "ushr-int/lit8", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", - "+execute-inline", - "UNUSED", - - /* 0xf0 */ - "+invoke-direct-empty", - "UNUSED", - "+iget-quick", - "+iget-wide-quick", - "+iget-object-quick", - "+iput-quick", - "+iput-wide-quick", - "+iput-object-quick", - "+invoke-virtual-quick", - "+invoke-virtual-quick/range", - "+invoke-super-quick", - "+invoke-super-quick/range", - "UNUSED", - "UNUSED", - "UNUSED", - "UNUSED", -}; - -/* - * Return the name of an opcode. - */ -const char* getOpcodeName(OpCode op) -{ - return gOpNames[op]; -} - diff --git a/dexdump/OpCodeNames.h b/dexdump/OpCodeNames.h deleted file mode 100644 index 1aec0d174..000000000 --- a/dexdump/OpCodeNames.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* - * Dalvik opcode names. - */ -#ifndef _DEXDUMP_OPCODENAMES -#define _DEXDUMP_OPCODENAMES - -#include "libdex/OpCode.h" - -const char* getOpcodeName(OpCode op); - -#endif /*_DEXDUMP_OPCODENAMES*/ |
