blob: a9776b7a5525d1eab24183d1182b1158796450cd [file] [log] [blame]
Brian Carlstrom7e49dca2011-07-22 18:07:34 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_DEX_CACHE_H_
4#define ART_SRC_DEX_CACHE_H_
5
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -07006#include "dex_file.h"
Brian Carlstrom7e49dca2011-07-22 18:07:34 -07007#include "globals.h"
8#include "macros.h"
9#include "object.h"
10
11namespace art {
12
13class Class;
14class Field;
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070015class ImageWriter;
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070016class Method;
17class String;
18union JValue;
19
Brian Carlstrome4f7e1d2011-09-11 13:21:12 -070020class MANAGED CodeAndDirectMethods : public IntArray {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070021 public:
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070022 void* GetResolvedCode(uint32_t method_idx) const {
23 return reinterpret_cast<byte*>(Get(CodeIndex(method_idx)));
Brian Carlstrom83db7722011-08-26 17:32:56 -070024 }
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070025 Method* GetResolvedMethod(uint32_t method_idx) const {
26 return reinterpret_cast<Method*>(Get(MethodIndex(method_idx)));
Brian Carlstrom83db7722011-08-26 17:32:56 -070027 }
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070028
Brian Carlstrom3320cf42011-10-04 14:58:28 -070029 void SetResolvedDirectMethodTrampoline(uint32_t method_idx, ByteArray* code_array) {
30 CHECK(code_array != NULL);
Ian Rogersad25ac52011-10-04 19:13:33 -070031 int32_t code = reinterpret_cast<int32_t>(code_array->GetData());
Ian Rogersad25ac52011-10-04 19:13:33 -070032 Set(CodeIndex(method_idx), code);
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070033 Set(MethodIndex(method_idx), method_idx);
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070034 }
35
36 void SetResolvedDirectMethod(uint32_t method_idx, Method* method) {
Brian Carlstrom83db7722011-08-26 17:32:56 -070037 CHECK(method != NULL);
Brian Carlstrom3320cf42011-10-04 14:58:28 -070038 CHECK(method->IsDirect()) << PrettyMethod(method);
39 CHECK(method->GetCode() != NULL) << PrettyMethod(method);
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070040 Set(CodeIndex(method_idx), reinterpret_cast<int32_t>(method->GetCode()));
41 Set(MethodIndex(method_idx), reinterpret_cast<int32_t>(method));
Brian Carlstrom83db7722011-08-26 17:32:56 -070042 }
43
buzbee561227c2011-09-02 15:28:19 -070044 static size_t LengthAsArray(size_t elements) {
45 return kMax * elements;
46 }
47
48 // Offset of resolved method entry from start of code_and_direct_methods_
49 static size_t MethodOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070050 return (MethodIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070051 }
52
53 // Offset of resolved method's code_ from start of code_and_direct_methods_
54 static size_t CodeOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070055 return (CodeIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070056 }
Brian Carlstrom83db7722011-08-26 17:32:56 -070057
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070058 size_t NumCodeAndDirectMethods() const {
59 return GetLength() / kMax;
60 }
61
Brian Carlstrom83db7722011-08-26 17:32:56 -070062 private:
63 enum TupleIndex {
64 kCode = 0,
65 kMethod = 1,
66 kMax = 2,
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070067 };
68
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070069 static size_t CodeIndex(uint32_t method_idx) {
70 return method_idx * kMax + kCode;
71 }
72 static size_t MethodIndex(uint32_t method_idx) {
73 return method_idx * kMax + kMethod;
74 }
75
76 // grant friend status to ImageWriter fixup code that needs to know internal layout
77 friend class ImageWriter;
78
79 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeAndDirectMethods);
Brian Carlstrom83db7722011-08-26 17:32:56 -070080};
81
Brian Carlstrome4f7e1d2011-09-11 13:21:12 -070082class MANAGED DexCache : public ObjectArray<Object> {
Brian Carlstrom83db7722011-08-26 17:32:56 -070083 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070084 void Init(String* location,
85 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070086 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070087 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070088 ObjectArray<Field>* fields,
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070089 CodeAndDirectMethods* code_and_direct_methods,
90 ObjectArray<StaticStorageBase>* initialized_static_storage);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070091
Brian Carlstroma663ea52011-08-19 23:33:41 -070092 String* GetLocation() const {
93 return Get(kLocation)->AsString();
94 }
95
buzbee5cd21802011-08-26 10:40:14 -070096 static MemberOffset StringsOffset() {
97 return MemberOffset(DataOffset().Int32Value() +
98 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070099 }
100
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700101 static MemberOffset ResolvedFieldsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700102 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700103 kResolvedFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700104 }
105
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700106 static MemberOffset ResolvedMethodsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700107 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700108 kResolvedMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700109 }
110
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700111 size_t NumStrings() const {
112 return GetStrings()->GetLength();
113 }
114
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700115 size_t NumResolvedTypes() const {
116 return GetResolvedTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700117 }
118
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700119 size_t NumResolvedMethods() const {
120 return GetResolvedMethods()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700121 }
122
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700123 size_t NumResolvedFields() const {
124 return GetResolvedFields()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700125 }
126
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700127 size_t NumCodeAndDirectMethods() const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700128 return GetCodeAndDirectMethods()->NumCodeAndDirectMethods();
129 }
130
131 size_t NumInitializedStaticStorage() const {
132 return GetInitializedStaticStorage()->GetLength();
Brian Carlstrom83db7722011-08-26 17:32:56 -0700133 }
134
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700135 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700136 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700137 }
138
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700139 void SetResolvedString(uint32_t string_idx, String* resolved) {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700140 GetStrings()->Set(string_idx, resolved);
141 }
142
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700143 Class* GetResolvedType(uint32_t type_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700144 return GetResolvedTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700145 }
146
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700147 void SetResolvedType(uint32_t type_idx, Class* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700148 GetResolvedTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700149 }
150
151 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700152 return GetResolvedMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700153 }
154
155 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700156 GetResolvedMethods()->Set(method_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700157 }
158
159 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700160 return GetResolvedFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700161 }
162
Elliott Hughes4a2b4172011-09-20 17:08:25 -0700163 void SetResolvedField(uint32_t field_idx, Field* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700164 GetResolvedFields()->Set(field_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700165 }
166
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700167 ObjectArray<String>* GetStrings() const {
168 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700169 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700170 ObjectArray<Class>* GetResolvedTypes() const {
171 return static_cast<ObjectArray<Class>*>(GetNonNull(kResolvedTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700172 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700173 ObjectArray<Method>* GetResolvedMethods() const {
174 return static_cast<ObjectArray<Method>*>(GetNonNull(kResolvedMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700175 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700176 ObjectArray<Field>* GetResolvedFields() const {
177 return static_cast<ObjectArray<Field>*>(GetNonNull(kResolvedFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700178 }
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700179 CodeAndDirectMethods* GetCodeAndDirectMethods() const {
180 return static_cast<CodeAndDirectMethods*>(GetNonNull(kCodeAndDirectMethods));
Brian Carlstrom83db7722011-08-26 17:32:56 -0700181 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700182 ObjectArray<StaticStorageBase>* GetInitializedStaticStorage() const {
183 return static_cast<ObjectArray<StaticStorageBase>*>(GetNonNull(kInitializedStaticStorage));
184 }
Brian Carlstrom83db7722011-08-26 17:32:56 -0700185
Brian Carlstrom4b620ff2011-09-11 01:11:01 -0700186 static size_t LengthAsArray() {
187 return kMax;
188 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700189
190 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700191
192 enum ArrayIndex {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700193 kLocation = 0,
194 kStrings = 1,
195 kResolvedTypes = 2,
196 kResolvedMethods = 3,
197 kResolvedFields = 4,
198 kCodeAndDirectMethods = 5,
199 kInitializedStaticStorage = 6,
200 kMax = 7,
Brian Carlstrom83db7722011-08-26 17:32:56 -0700201 };
202
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700203 Object* GetNonNull(ArrayIndex array_index) const {
204 Object* obj = Get(array_index);
205 DCHECK(obj != NULL);
206 return obj;
207 }
208 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700209};
210
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700211} // namespace art
212
213#endif // ART_SRC_DEX_CACHE_H_