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