blob: 9e350533b31bf18926df54e54b2cefb4360ec087 [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
jeffhaoe343b762011-12-05 16:36:44 -080036 void SetResolvedDirectMethodTraceEntry(uint32_t method_idx, const void* pcode);
37
Ian Rogers0571d352011-11-03 19:51:38 -070038 void SetResolvedDirectMethod(uint32_t method_idx, Method* method);
Brian Carlstrom83db7722011-08-26 17:32:56 -070039
buzbee561227c2011-09-02 15:28:19 -070040 static size_t LengthAsArray(size_t elements) {
41 return kMax * elements;
42 }
43
44 // Offset of resolved method entry from start of code_and_direct_methods_
45 static size_t MethodOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070046 return (MethodIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070047 }
48
49 // Offset of resolved method's code_ from start of code_and_direct_methods_
50 static size_t CodeOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070051 return (CodeIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070052 }
Brian Carlstrom83db7722011-08-26 17:32:56 -070053
Elliott Hughes362f9bc2011-10-17 18:56:41 -070054 size_t NumCodeAndDirectMethods() const {
55 return GetLength() / kMax;
56 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070057
Brian Carlstrom83db7722011-08-26 17:32:56 -070058 private:
59 enum TupleIndex {
60 kCode = 0,
61 kMethod = 1,
62 kMax = 2,
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070063 };
64
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070065 static size_t CodeIndex(uint32_t method_idx) {
66 return method_idx * kMax + kCode;
67 }
68 static size_t MethodIndex(uint32_t method_idx) {
69 return method_idx * kMax + kMethod;
70 }
71
72 // grant friend status to ImageWriter fixup code that needs to know internal layout
73 friend class ImageWriter;
74
75 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeAndDirectMethods);
Brian Carlstrom83db7722011-08-26 17:32:56 -070076};
77
Brian Carlstrome4f7e1d2011-09-11 13:21:12 -070078class MANAGED DexCache : public ObjectArray<Object> {
Brian Carlstrom83db7722011-08-26 17:32:56 -070079 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070080 void Init(String* location,
81 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070082 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070083 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070084 ObjectArray<Field>* fields,
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070085 CodeAndDirectMethods* code_and_direct_methods,
86 ObjectArray<StaticStorageBase>* initialized_static_storage);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070087
Brian Carlstroma663ea52011-08-19 23:33:41 -070088 String* GetLocation() const {
89 return Get(kLocation)->AsString();
90 }
91
buzbee5cd21802011-08-26 10:40:14 -070092 static MemberOffset StringsOffset() {
93 return MemberOffset(DataOffset().Int32Value() +
94 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070095 }
96
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070097 static MemberOffset ResolvedFieldsOffset() {
buzbee5cd21802011-08-26 10:40:14 -070098 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070099 kResolvedFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700100 }
101
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700102 static MemberOffset ResolvedMethodsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700103 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700104 kResolvedMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700105 }
106
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700107 size_t NumStrings() const {
108 return GetStrings()->GetLength();
109 }
110
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700111 size_t NumResolvedTypes() const {
112 return GetResolvedTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700113 }
114
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700115 size_t NumResolvedMethods() const {
116 return GetResolvedMethods()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700117 }
118
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700119 size_t NumResolvedFields() const {
120 return GetResolvedFields()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700121 }
122
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700123 size_t NumCodeAndDirectMethods() const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700124 return GetCodeAndDirectMethods()->NumCodeAndDirectMethods();
125 }
126
127 size_t NumInitializedStaticStorage() const {
128 return GetInitializedStaticStorage()->GetLength();
Brian Carlstrom83db7722011-08-26 17:32:56 -0700129 }
130
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700131 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700132 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700133 }
134
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700135 void SetResolvedString(uint32_t string_idx, String* resolved) {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700136 GetStrings()->Set(string_idx, resolved);
137 }
138
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700139 Class* GetResolvedType(uint32_t type_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700140 return GetResolvedTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700141 }
142
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700143 void SetResolvedType(uint32_t type_idx, Class* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700144 GetResolvedTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700145 }
146
147 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700148 return GetResolvedMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700149 }
150
151 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700152 GetResolvedMethods()->Set(method_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700153 }
154
155 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700156 return GetResolvedFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700157 }
158
Elliott Hughes4a2b4172011-09-20 17:08:25 -0700159 void SetResolvedField(uint32_t field_idx, Field* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700160 GetResolvedFields()->Set(field_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700161 }
162
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700163 ObjectArray<String>* GetStrings() const {
164 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700165 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700166 ObjectArray<Class>* GetResolvedTypes() const {
167 return static_cast<ObjectArray<Class>*>(GetNonNull(kResolvedTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700168 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700169 ObjectArray<Method>* GetResolvedMethods() const {
170 return static_cast<ObjectArray<Method>*>(GetNonNull(kResolvedMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700171 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700172 ObjectArray<Field>* GetResolvedFields() const {
173 return static_cast<ObjectArray<Field>*>(GetNonNull(kResolvedFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700174 }
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700175 CodeAndDirectMethods* GetCodeAndDirectMethods() const {
176 return static_cast<CodeAndDirectMethods*>(GetNonNull(kCodeAndDirectMethods));
Brian Carlstrom83db7722011-08-26 17:32:56 -0700177 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700178 ObjectArray<StaticStorageBase>* GetInitializedStaticStorage() const {
179 return static_cast<ObjectArray<StaticStorageBase>*>(GetNonNull(kInitializedStaticStorage));
180 }
Brian Carlstrom83db7722011-08-26 17:32:56 -0700181
Brian Carlstrom4b620ff2011-09-11 01:11:01 -0700182 static size_t LengthAsArray() {
183 return kMax;
184 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700185
186 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700187
188 enum ArrayIndex {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700189 kLocation = 0,
190 kStrings = 1,
191 kResolvedTypes = 2,
192 kResolvedMethods = 3,
193 kResolvedFields = 4,
194 kCodeAndDirectMethods = 5,
195 kInitializedStaticStorage = 6,
196 kMax = 7,
Brian Carlstrom83db7722011-08-26 17:32:56 -0700197 };
198
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700199 Object* GetNonNull(ArrayIndex array_index) const {
200 Object* obj = Get(array_index);
201 DCHECK(obj != NULL);
202 return obj;
203 }
204 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700205};
206
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700207} // namespace art
208
209#endif // ART_SRC_DEX_CACHE_H_