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 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "libdex/DexFile.h" 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* extern */ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct ClassObject; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct HashTable; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct InstField; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct Method; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct StringObject; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Some additional VM data structures that are associated with the DEX file. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 37d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct DvmDex { 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* pointer to the DexFile we're associated with */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DexFile* pDexFile; 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* clone of pDexFile->pHeader (it's used frequently enough) */ 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexHeader* pHeader; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* interned strings; parallel to "stringIds" */ 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct StringObject** pResStrings; 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* resolved classes; parallel to "typeIds" */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct ClassObject** pResClasses; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* resolved methods; parallel to "methodIds" */ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Method** pResMethods; 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* resolved instance fields; parallel to "fieldIds" */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* (this holds both InstField and StaticField) */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Field** pResFields; 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* interface method lookup cache */ 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct AtomicCache* pInterfaceCache; 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shared memory region with file contents */ 6157fd399d1265ec627d28a15b3d4b98e5f239ac88Andy McFadden bool isMappedReadOnly; 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MemMapping memMap; 63fb119e6cf8b47d53f024cae889487a17eacbf19fAndy McFadden 64fb119e6cf8b47d53f024cae889487a17eacbf19fAndy McFadden /* lock ensuring mutual exclusion during updates */ 65fb119e6cf8b47d53f024cae889487a17eacbf19fAndy McFadden pthread_mutex_t modLock; 66d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a file descriptor for an open "optimized" DEX file, map it into 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * memory and parse the contents. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On success, returns 0 and sets "*ppDvmDex" to a newly-allocated DvmDex. 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On failure, returns a meaningful error code [currently just -1]. 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmDexFileOpenFromFd(int fd, DvmDex** ppDvmDex); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Open a partial DEX file. Only useful as part of the optimization process. 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex); 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free a DvmDex structure, along with any associated structures. 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDexFileFree(DvmDex* pDvmDex); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8996516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* 9096516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Change the 1- or 2-byte value at the specified address to a new value. If 9196516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * the location already has the new value, do nothing. 9296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * 9396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * This does not make any synchronization guarantees. The caller must 9496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * ensure exclusivity vs. other callers. 9596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * 9696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * For the 2-byte call, the pointer should have 16-bit alignment. 9796516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * 9896516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden * Returns "true" on success. 9996516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden */ 10096516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenbool dvmDexChangeDex1(DvmDex* pDvmDex, u1* addr, u1 newVal); 10196516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFaddenbool dvmDexChangeDex2(DvmDex* pDvmDex, u2* addr, u2 newVal); 10296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 10396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the requested item if it has been resolved, or NULL if it hasn't. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct StringObject* dvmDexGetResolvedString(const DvmDex* pDvmDex, 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 stringIdx) 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(stringIdx < pDvmDex->pHeader->stringIdsSize); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResStrings[stringIdx]; 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct ClassObject* dvmDexGetResolvedClass(const DvmDex* pDvmDex, 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classIdx) 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(classIdx < pDvmDex->pHeader->typeIdsSize); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResClasses[classIdx]; 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct Method* dvmDexGetResolvedMethod(const DvmDex* pDvmDex, 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 methodIdx) 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(methodIdx < pDvmDex->pHeader->methodIdsSize); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResMethods[methodIdx]; 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE struct Field* dvmDexGetResolvedField(const DvmDex* pDvmDex, 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 fieldIdx) 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(fieldIdx < pDvmDex->pHeader->fieldIdsSize); 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDvmDex->pResFields[fieldIdx]; 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Update the resolved item table. Resolution always produces the same 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * result, so we're not worried about atomicity here. 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedString(DvmDex* pDvmDex, u4 stringIdx, 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct StringObject* str) 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(stringIdx < pDvmDex->pHeader->stringIdsSize); 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResStrings[stringIdx] = str; 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedClass(DvmDex* pDvmDex, u4 classIdx, 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct ClassObject* clazz) 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(classIdx < pDvmDex->pHeader->typeIdsSize); 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResClasses[classIdx] = clazz; 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedMethod(DvmDex* pDvmDex, u4 methodIdx, 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Method* method) 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(methodIdx < pDvmDex->pHeader->methodIdsSize); 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResMethods[methodIdx] = method; 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDexSetResolvedField(DvmDex* pDvmDex, u4 fieldIdx, 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Field* field) 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(fieldIdx < pDvmDex->pHeader->fieldIdsSize); 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pDvmDex->pResFields[fieldIdx] = field; 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 161375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_DVMDEX_H_ 162