blob: 22dae24ddf1f2ccb8beb91966173bfeb8c0e3f54 [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 Carlstrom9cc262e2011-08-28 12:45:30 -070020class 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 Carlstrom9cc262e2011-08-28 12:45:30 -070029 void SetResolvedDirectMethodTrampoline(uint32_t method_idx) {
Brian Carlstrom8a487412011-08-29 20:08:52 -070030 UNIMPLEMENTED(WARNING) << "need to install a trampoline to resolve the method_idx at runtime";
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070031 Set(CodeIndex(method_idx), 0xffffffff);
32 Set(MethodIndex(method_idx), method_idx);
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070033 }
34
35 void SetResolvedDirectMethod(uint32_t method_idx, Method* method) {
Brian Carlstrom83db7722011-08-26 17:32:56 -070036 CHECK(method != NULL);
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070037 CHECK(method->IsDirect());
Brian Carlstrom83db7722011-08-26 17:32:56 -070038 // CHECK(method->GetCode() != NULL); // TODO enable when all code is compiling
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070039 Set(CodeIndex(method_idx), reinterpret_cast<int32_t>(method->GetCode()));
40 Set(MethodIndex(method_idx), reinterpret_cast<int32_t>(method));
Brian Carlstrom83db7722011-08-26 17:32:56 -070041 }
42
buzbee561227c2011-09-02 15:28:19 -070043 static size_t LengthAsArray(size_t elements) {
44 return kMax * elements;
45 }
46
47 // Offset of resolved method entry from start of code_and_direct_methods_
48 static size_t MethodOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070049 return (MethodIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070050 }
51
52 // Offset of resolved method's code_ from start of code_and_direct_methods_
53 static size_t CodeOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070054 return (CodeIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070055 }
Brian Carlstrom83db7722011-08-26 17:32:56 -070056
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070057 size_t NumCodeAndDirectMethods() const {
58 return GetLength() / kMax;
59 }
60
Brian Carlstrom83db7722011-08-26 17:32:56 -070061 private:
62 enum TupleIndex {
63 kCode = 0,
64 kMethod = 1,
65 kMax = 2,
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070066 };
67
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070068 static size_t CodeIndex(uint32_t method_idx) {
69 return method_idx * kMax + kCode;
70 }
71 static size_t MethodIndex(uint32_t method_idx) {
72 return method_idx * kMax + kMethod;
73 }
74
75 // grant friend status to ImageWriter fixup code that needs to know internal layout
76 friend class ImageWriter;
77
78 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeAndDirectMethods);
Brian Carlstrom83db7722011-08-26 17:32:56 -070079};
80
81class DexCache : public ObjectArray<Object> {
82 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070083 void Init(String* location,
84 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070085 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070086 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070087 ObjectArray<Field>* fields,
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070088 CodeAndDirectMethods* code_and_direct_methods,
89 ObjectArray<StaticStorageBase>* initialized_static_storage);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070090
Brian Carlstroma663ea52011-08-19 23:33:41 -070091 String* GetLocation() const {
92 return Get(kLocation)->AsString();
93 }
94
buzbee5cd21802011-08-26 10:40:14 -070095 static MemberOffset StringsOffset() {
96 return MemberOffset(DataOffset().Int32Value() +
97 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070098 }
99
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700100 static MemberOffset ResolvedFieldsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700101 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700102 kResolvedFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700103 }
104
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700105 static MemberOffset ResolvedMethodsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700106 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700107 kResolvedMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700108 }
109
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700110 size_t NumStrings() const {
111 return GetStrings()->GetLength();
112 }
113
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700114 size_t NumResolvedTypes() const {
115 return GetResolvedTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700116 }
117
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700118 size_t NumResolvedMethods() const {
119 return GetResolvedMethods()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700120 }
121
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700122 size_t NumResolvedFields() const {
123 return GetResolvedFields()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700124 }
125
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700126 size_t NumCodeAndDirectMethods() const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700127 return GetCodeAndDirectMethods()->NumCodeAndDirectMethods();
128 }
129
130 size_t NumInitializedStaticStorage() const {
131 return GetInitializedStaticStorage()->GetLength();
Brian Carlstrom83db7722011-08-26 17:32:56 -0700132 }
133
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700134 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700135 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700136 }
137
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700138 void SetResolvedString(uint32_t string_idx, String* resolved) {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700139 GetStrings()->Set(string_idx, resolved);
140 }
141
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700142 Class* GetResolvedType(uint32_t type_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700143 return GetResolvedTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700144 }
145
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700146 void SetResolvedType(uint32_t type_idx, Class* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700147 GetResolvedTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700148 }
149
150 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700151 return GetResolvedMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700152 }
153
154 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700155 GetResolvedMethods()->Set(method_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700156 }
157
158 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700159 return GetResolvedFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700160 }
161
162 void SetResolvedfield(uint32_t field_idx, Field* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700163 GetResolvedFields()->Set(field_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700164 }
165
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700166 ObjectArray<String>* GetStrings() const {
167 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700168 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700169 ObjectArray<Class>* GetResolvedTypes() const {
170 return static_cast<ObjectArray<Class>*>(GetNonNull(kResolvedTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700171 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700172 ObjectArray<Method>* GetResolvedMethods() const {
173 return static_cast<ObjectArray<Method>*>(GetNonNull(kResolvedMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700174 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700175 ObjectArray<Field>* GetResolvedFields() const {
176 return static_cast<ObjectArray<Field>*>(GetNonNull(kResolvedFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700177 }
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700178 CodeAndDirectMethods* GetCodeAndDirectMethods() const {
179 return static_cast<CodeAndDirectMethods*>(GetNonNull(kCodeAndDirectMethods));
Brian Carlstrom83db7722011-08-26 17:32:56 -0700180 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700181 ObjectArray<StaticStorageBase>* GetInitializedStaticStorage() const {
182 return static_cast<ObjectArray<StaticStorageBase>*>(GetNonNull(kInitializedStaticStorage));
183 }
Brian Carlstrom83db7722011-08-26 17:32:56 -0700184
185 static size_t LengthAsArray() {
186 return kMax;
187 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700188
189 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700190
191 enum ArrayIndex {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700192 kLocation = 0,
193 kStrings = 1,
194 kResolvedTypes = 2,
195 kResolvedMethods = 3,
196 kResolvedFields = 4,
197 kCodeAndDirectMethods = 5,
198 kInitializedStaticStorage = 6,
199 kMax = 7,
Brian Carlstrom83db7722011-08-26 17:32:56 -0700200 };
201
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700202 Object* GetNonNull(ArrayIndex array_index) const {
203 Object* obj = Get(array_index);
204 DCHECK(obj != NULL);
205 return obj;
206 }
207 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700208};
209
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700210struct DexCacheHash {
211 size_t operator()(art::DexCache* const& obj) const {
212 return reinterpret_cast<size_t>(&obj);
213 }
214};
215
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700216} // namespace art
217
218#endif // ART_SRC_DEX_CACHE_H_