blob: f748e572fce86075c87ba111449159f75a7fa6d8 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 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 */
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070016
17#ifndef ART_SRC_DEX_CACHE_H_
18#define ART_SRC_DEX_CACHE_H_
19
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070020#include "dex_file.h"
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070021#include "globals.h"
22#include "macros.h"
23#include "object.h"
24
25namespace art {
26
27class Class;
28class Field;
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070029class ImageWriter;
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070030class Method;
31class String;
32union JValue;
33
Brian Carlstrome4f7e1d2011-09-11 13:21:12 -070034class MANAGED CodeAndDirectMethods : public IntArray {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070035 public:
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070036 void* GetResolvedCode(uint32_t method_idx) const {
37 return reinterpret_cast<byte*>(Get(CodeIndex(method_idx)));
Brian Carlstrom83db7722011-08-26 17:32:56 -070038 }
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070039 Method* GetResolvedMethod(uint32_t method_idx) const {
40 return reinterpret_cast<Method*>(Get(MethodIndex(method_idx)));
Brian Carlstrom83db7722011-08-26 17:32:56 -070041 }
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070042
Brian Carlstrom3320cf42011-10-04 14:58:28 -070043 void SetResolvedDirectMethodTrampoline(uint32_t method_idx, ByteArray* code_array) {
44 CHECK(code_array != NULL);
Ian Rogersad25ac52011-10-04 19:13:33 -070045 int32_t code = reinterpret_cast<int32_t>(code_array->GetData());
Ian Rogersad25ac52011-10-04 19:13:33 -070046 Set(CodeIndex(method_idx), code);
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070047 Set(MethodIndex(method_idx), method_idx);
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070048 }
49
jeffhaoe343b762011-12-05 16:36:44 -080050 void SetResolvedDirectMethodTraceEntry(uint32_t method_idx, const void* pcode);
51
Ian Rogers0571d352011-11-03 19:51:38 -070052 void SetResolvedDirectMethod(uint32_t method_idx, Method* method);
Brian Carlstrom83db7722011-08-26 17:32:56 -070053
buzbee561227c2011-09-02 15:28:19 -070054 static size_t LengthAsArray(size_t elements) {
55 return kMax * elements;
56 }
57
58 // Offset of resolved method entry from start of code_and_direct_methods_
59 static size_t MethodOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070060 return (MethodIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070061 }
62
63 // Offset of resolved method's code_ from start of code_and_direct_methods_
64 static size_t CodeOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070065 return (CodeIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070066 }
Brian Carlstrom83db7722011-08-26 17:32:56 -070067
Elliott Hughes362f9bc2011-10-17 18:56:41 -070068 size_t NumCodeAndDirectMethods() const {
69 return GetLength() / kMax;
70 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070071
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070072 static size_t CodeIndex(uint32_t method_idx) {
73 return method_idx * kMax + kCode;
74 }
75 static size_t MethodIndex(uint32_t method_idx) {
76 return method_idx * kMax + kMethod;
77 }
78
Logan Chienbb4d12a2012-02-17 14:10:01 +080079 private:
80 enum TupleIndex {
81 kCode = 0,
82 kMethod = 1,
83 kMax = 2,
84 };
85
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070086 // grant friend status to ImageWriter fixup code that needs to know internal layout
87 friend class ImageWriter;
88
89 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeAndDirectMethods);
Brian Carlstrom83db7722011-08-26 17:32:56 -070090};
91
Brian Carlstrome4f7e1d2011-09-11 13:21:12 -070092class MANAGED DexCache : public ObjectArray<Object> {
Brian Carlstrom83db7722011-08-26 17:32:56 -070093 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070094 void Init(String* location,
95 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070096 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070097 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070098 ObjectArray<Field>* fields,
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070099 CodeAndDirectMethods* code_and_direct_methods,
100 ObjectArray<StaticStorageBase>* initialized_static_storage);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700101
Brian Carlstroma663ea52011-08-19 23:33:41 -0700102 String* GetLocation() const {
103 return Get(kLocation)->AsString();
104 }
105
buzbee5cd21802011-08-26 10:40:14 -0700106 static MemberOffset StringsOffset() {
107 return MemberOffset(DataOffset().Int32Value() +
108 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700109 }
110
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700111 static MemberOffset ResolvedFieldsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700112 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700113 kResolvedFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700114 }
115
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700116 static MemberOffset ResolvedMethodsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700117 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700118 kResolvedMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700119 }
120
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700121 size_t NumStrings() const {
122 return GetStrings()->GetLength();
123 }
124
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700125 size_t NumResolvedTypes() const {
126 return GetResolvedTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700127 }
128
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700129 size_t NumResolvedMethods() const {
130 return GetResolvedMethods()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700131 }
132
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700133 size_t NumResolvedFields() const {
134 return GetResolvedFields()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700135 }
136
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700137 size_t NumCodeAndDirectMethods() const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700138 return GetCodeAndDirectMethods()->NumCodeAndDirectMethods();
139 }
140
141 size_t NumInitializedStaticStorage() const {
142 return GetInitializedStaticStorage()->GetLength();
Brian Carlstrom83db7722011-08-26 17:32:56 -0700143 }
144
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700145 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700146 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700147 }
148
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700149 void SetResolvedString(uint32_t string_idx, String* resolved) {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700150 GetStrings()->Set(string_idx, resolved);
151 }
152
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700153 Class* GetResolvedType(uint32_t type_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700154 return GetResolvedTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700155 }
156
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700157 void SetResolvedType(uint32_t type_idx, Class* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700158 GetResolvedTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700159 }
160
161 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700162 return GetResolvedMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700163 }
164
165 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700166 GetResolvedMethods()->Set(method_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700167 }
168
169 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700170 return GetResolvedFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700171 }
172
Elliott Hughes4a2b4172011-09-20 17:08:25 -0700173 void SetResolvedField(uint32_t field_idx, Field* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700174 GetResolvedFields()->Set(field_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700175 }
176
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700177 ObjectArray<String>* GetStrings() const {
178 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700179 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700180 ObjectArray<Class>* GetResolvedTypes() const {
181 return static_cast<ObjectArray<Class>*>(GetNonNull(kResolvedTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700182 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700183 ObjectArray<Method>* GetResolvedMethods() const {
184 return static_cast<ObjectArray<Method>*>(GetNonNull(kResolvedMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700185 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700186 ObjectArray<Field>* GetResolvedFields() const {
187 return static_cast<ObjectArray<Field>*>(GetNonNull(kResolvedFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700188 }
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700189 CodeAndDirectMethods* GetCodeAndDirectMethods() const {
190 return static_cast<CodeAndDirectMethods*>(GetNonNull(kCodeAndDirectMethods));
Brian Carlstrom83db7722011-08-26 17:32:56 -0700191 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700192 ObjectArray<StaticStorageBase>* GetInitializedStaticStorage() const {
193 return static_cast<ObjectArray<StaticStorageBase>*>(GetNonNull(kInitializedStaticStorage));
194 }
Brian Carlstrom83db7722011-08-26 17:32:56 -0700195
Brian Carlstrom4b620ff2011-09-11 01:11:01 -0700196 static size_t LengthAsArray() {
197 return kMax;
198 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700199
200 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700201
202 enum ArrayIndex {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700203 kLocation = 0,
204 kStrings = 1,
205 kResolvedTypes = 2,
206 kResolvedMethods = 3,
207 kResolvedFields = 4,
208 kCodeAndDirectMethods = 5,
209 kInitializedStaticStorage = 6,
210 kMax = 7,
Brian Carlstrom83db7722011-08-26 17:32:56 -0700211 };
212
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700213 Object* GetNonNull(ArrayIndex array_index) const {
214 Object* obj = Get(array_index);
215 DCHECK(obj != NULL);
216 return obj;
217 }
218 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700219};
220
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700221} // namespace art
222
223#endif // ART_SRC_DEX_CACHE_H_