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