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