1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The VM wraps some additional data structures around the DexFile. These 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are defined here. 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_DVMDEX_H_ 22375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_DVMDEX_H_ 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24b4d5cf78d4731ffc6211d07a0d69c92c559ba792Elliott Hughes#include "jni.h" 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "libdex/DexFile.h" 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* extern */ 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct ClassObject; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct HashTable; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct InstField; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct Method; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct StringObject; 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Some additional VM data structures that are associated with the DEX file. 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 38d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct DvmDex { 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* pointer to the DexFile we're associated with */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DexFile* pDexFile; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* clone of pDexFile->pHeader (it's used frequently enough) */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexHeader* pHeader; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* interned strings; parallel to "stringIds" */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct StringObject** pResStrings; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* resolved classes; parallel to "typeIds" */ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct ClassObject** pResClasses; 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* resolved methods; parallel to "methodIds" */ 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Method** pResMethods; 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* resolved instance fields; parallel to "fieldIds" */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* (this holds both InstField and StaticField) */ 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Field** pResFields; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* interface method lookup cache */ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct AtomicCache* pInterfaceCache; 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shared memory region with file contents */ 6257fd399d1265ec627d28a15b3d4b98e5f239ac88Andy McFadden bool isMappedReadOnly; 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MemMapping memMap; 64fb119e6cf8b47d53f024cae889487a17eacbf19fAndy McFadden 65b4d5cf78d4731ffc6211d07a0d69c92c559ba792Elliott Hughes jobject dex_object; 66b4d5cf78d4731ffc6211d07a0d69c92c559ba792Elliott Hughes 67fb119e6cf8b47d53f024cae889487a17eacbf19fAndy McFadden /* lock ensuring mutual exclusion during updates */ 68fb119e6cf8b47d53f024cae889487a17eacbf19fAndy McFadden pthread_mutex_t modLock; 69d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a file descriptor for an open "optimized" DEX file, map it into 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * memory and parse the contents. 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On success, returns 0 and sets "*ppDvmDex" to a newly-allocated DvmDex. 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On failure, returns a meaningful error code [currently just -1]. 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmDexFileOpenFromFd(int fd, DvmDex** ppDvmDex); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Open a partial DEX file. Only useful as part of the optimization process. 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free a DvmDex structure, along with any associated structures. 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDexFileFree(DvmDex* pDvmDex); 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 9396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Change the 1- or 2-byte value at the specified address to a new value. If 9496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * the location already has the new value, do nothing. 9596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * 9696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * This does not make any synchronization guarantees. The caller must 9796516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * ensure exclusivity vs. other callers. 9896516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * 9996516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * For the 2-byte call, the pointer should have 16-bit alignment. 10096516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * 10196516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Returns "true" on success. 10296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 10396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenbool dvmDexChangeDex1(DvmDex* pDvmDex, u1* addr, u1 newVal); 10496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenbool dvmDexChangeDex2(DvmDex* pDvmDex, u2* addr, u2 newVal); 10596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 10696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the requested item if it has been resolved, or NULL if it hasn't. 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct StringObject* dvmDexGetResolvedString(const DvmDex* pDvmDex, 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 stringIdx) 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(stringIdx < pDvmDex->pHeader->stringIdsSize); 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResStrings[stringIdx]; 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct ClassObject* dvmDexGetResolvedClass(const DvmDex* pDvmDex, 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classIdx) 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(classIdx < pDvmDex->pHeader->typeIdsSize); 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResClasses[classIdx]; 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct Method* dvmDexGetResolvedMethod(const DvmDex* pDvmDex, 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 methodIdx) 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(methodIdx < pDvmDex->pHeader->methodIdsSize); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResMethods[methodIdx]; 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct Field* dvmDexGetResolvedField(const DvmDex* pDvmDex, 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 fieldIdx) 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(fieldIdx < pDvmDex->pHeader->fieldIdsSize); 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResFields[fieldIdx]; 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Update the resolved item table. Resolution always produces the same 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * result, so we're not worried about atomicity here. 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedString(DvmDex* pDvmDex, u4 stringIdx, 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct StringObject* str) 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(stringIdx < pDvmDex->pHeader->stringIdsSize); 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResStrings[stringIdx] = str; 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedClass(DvmDex* pDvmDex, u4 classIdx, 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct ClassObject* clazz) 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(classIdx < pDvmDex->pHeader->typeIdsSize); 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResClasses[classIdx] = clazz; 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedMethod(DvmDex* pDvmDex, u4 methodIdx, 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Method* method) 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(methodIdx < pDvmDex->pHeader->methodIdsSize); 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResMethods[methodIdx] = method; 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedField(DvmDex* pDvmDex, u4 fieldIdx, 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Field* field) 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(fieldIdx < pDvmDex->pHeader->fieldIdsSize); 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResFields[fieldIdx] = field; 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 164375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_DVMDEX_H_ 165