blob: 2d252270f3fcb0ff895a612de4de7d68eac0ecb0 [file] [log] [blame]
Fairphone ODM25c12f52023-12-15 17:24:06 +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 */
16
17#ifndef ART_LIBDEXFILE_DEX_DEX_FILE_STRUCTS_H_
18#define ART_LIBDEXFILE_DEX_DEX_FILE_STRUCTS_H_
19
20#include <android-base/logging.h>
21#include <android-base/macros.h>
22
23#include <inttypes.h>
24
25#include "dex_file_types.h"
26#include "modifiers.h"
27
28namespace art {
29
30class DexWriter;
31
32namespace dex {
33
34struct MapItem {
35 uint16_t type_;
36 uint16_t unused_;
37 uint32_t size_;
38 uint32_t offset_;
39};
40
41struct MapList {
42 uint32_t size_;
43 MapItem list_[1];
44
45 size_t Size() const { return sizeof(uint32_t) + (size_ * sizeof(MapItem)); }
46
47 private:
48 DISALLOW_COPY_AND_ASSIGN(MapList);
49};
50
51// Raw string_id_item.
52struct StringId {
53 uint32_t string_data_off_; // offset in bytes from the base address
54
55 private:
56 DISALLOW_COPY_AND_ASSIGN(StringId);
57};
58
59// Raw type_id_item.
60struct TypeId {
61 dex::StringIndex descriptor_idx_; // index into string_ids
62
63 private:
64 DISALLOW_COPY_AND_ASSIGN(TypeId);
65};
66
67// Raw field_id_item.
68struct FieldId {
69 dex::TypeIndex class_idx_; // index into type_ids_ array for defining class
70 dex::TypeIndex type_idx_; // index into type_ids_ array for field type
71 dex::StringIndex name_idx_; // index into string_ids_ array for field name
72
73 private:
74 DISALLOW_COPY_AND_ASSIGN(FieldId);
75};
76
77// Raw proto_id_item.
78struct ProtoId {
79 dex::StringIndex shorty_idx_; // index into string_ids array for shorty descriptor
80 dex::TypeIndex return_type_idx_; // index into type_ids array for return type
81 uint16_t pad_; // padding = 0
82 uint32_t parameters_off_; // file offset to type_list for parameter types
83
84 private:
85 DISALLOW_COPY_AND_ASSIGN(ProtoId);
86};
87
88// Raw method_id_item.
89struct MethodId {
90 dex::TypeIndex class_idx_; // index into type_ids_ array for defining class
91 dex::ProtoIndex proto_idx_; // index into proto_ids_ array for method prototype
92 dex::StringIndex name_idx_; // index into string_ids_ array for method name
93
94 private:
95 DISALLOW_COPY_AND_ASSIGN(MethodId);
96};
97
98// Base code_item, compact dex and standard dex have different code item layouts.
99struct CodeItem {
100 protected:
101 CodeItem() = default;
102
103 private:
104 DISALLOW_COPY_AND_ASSIGN(CodeItem);
105};
106
107// Raw class_def_item.
108struct ClassDef {
109 dex::TypeIndex class_idx_; // index into type_ids_ array for this class
110 uint16_t pad1_; // padding = 0
111 uint32_t access_flags_;
112 dex::TypeIndex superclass_idx_; // index into type_ids_ array for superclass
113 uint16_t pad2_; // padding = 0
114 uint32_t interfaces_off_; // file offset to TypeList
115 dex::StringIndex source_file_idx_; // index into string_ids_ for source file name
116 uint32_t annotations_off_; // file offset to annotations_directory_item
117 uint32_t class_data_off_; // file offset to class_data_item
118 uint32_t static_values_off_; // file offset to EncodedArray
119
120 // Returns the valid access flags, that is, Java modifier bits relevant to the ClassDef type
121 // (class or interface). These are all in the lower 16b and do not contain runtime flags.
122 uint32_t GetJavaAccessFlags() const {
123 // Make sure that none of our runtime-only flags are set.
124 static_assert((kAccValidClassFlags & kAccJavaFlagsMask) == kAccValidClassFlags,
125 "Valid class flags not a subset of Java flags");
126 static_assert((kAccValidInterfaceFlags & kAccJavaFlagsMask) == kAccValidInterfaceFlags,
127 "Valid interface flags not a subset of Java flags");
128
129 if ((access_flags_ & kAccInterface) != 0) {
130 // Interface.
131 return access_flags_ & kAccValidInterfaceFlags;
132 } else {
133 // Class.
134 return access_flags_ & kAccValidClassFlags;
135 }
136 }
137
138 private:
139 DISALLOW_COPY_AND_ASSIGN(ClassDef);
140};
141
142// Raw type_item.
143struct TypeItem {
144 dex::TypeIndex type_idx_; // index into type_ids section
145
146 private:
147 DISALLOW_COPY_AND_ASSIGN(TypeItem);
148};
149
150// Raw type_list.
151class TypeList {
152 public:
153 uint32_t Size() const {
154 return size_;
155 }
156
157 const TypeItem& GetTypeItem(uint32_t idx) const {
158 DCHECK_LT(idx, this->size_);
159 return this->list_[idx];
160 }
161
162 // Size in bytes of the part of the list that is common.
163 static constexpr size_t GetHeaderSize() {
164 return 4U;
165 }
166
167 // Size in bytes of the whole type list including all the stored elements.
168 static constexpr size_t GetListSize(size_t count) {
169 return GetHeaderSize() + sizeof(TypeItem) * count;
170 }
171
172 private:
173 uint32_t size_; // size of the list, in entries
174 TypeItem list_[1]; // elements of the list
175 DISALLOW_COPY_AND_ASSIGN(TypeList);
176};
177
178// raw method_handle_item
179struct MethodHandleItem {
180 uint16_t method_handle_type_;
181 uint16_t reserved1_; // Reserved for future use.
182 uint16_t field_or_method_idx_; // Field index for accessors, method index otherwise.
183 uint16_t reserved2_; // Reserved for future use.
184 private:
185 DISALLOW_COPY_AND_ASSIGN(MethodHandleItem);
186};
187
188// raw call_site_id_item
189struct CallSiteIdItem {
190 uint32_t data_off_; // Offset into data section pointing to encoded array items.
191 private:
192 DISALLOW_COPY_AND_ASSIGN(CallSiteIdItem);
193};
194
195// Raw try_item.
196struct TryItem {
197 static constexpr size_t kAlignment = sizeof(uint32_t);
198
199 uint32_t start_addr_;
200 uint16_t insn_count_;
201 uint16_t handler_off_;
202
203 private:
204 TryItem() = default;
205 friend class ::art::DexWriter;
206 DISALLOW_COPY_AND_ASSIGN(TryItem);
207};
208
209struct AnnotationsDirectoryItem {
210 uint32_t class_annotations_off_;
211 uint32_t fields_size_;
212 uint32_t methods_size_;
213 uint32_t parameters_size_;
214
215 private:
216 DISALLOW_COPY_AND_ASSIGN(AnnotationsDirectoryItem);
217};
218
219struct FieldAnnotationsItem {
220 uint32_t field_idx_;
221 uint32_t annotations_off_;
222
223 private:
224 DISALLOW_COPY_AND_ASSIGN(FieldAnnotationsItem);
225};
226
227struct MethodAnnotationsItem {
228 uint32_t method_idx_;
229 uint32_t annotations_off_;
230
231 private:
232 DISALLOW_COPY_AND_ASSIGN(MethodAnnotationsItem);
233};
234
235struct ParameterAnnotationsItem {
236 uint32_t method_idx_;
237 uint32_t annotations_off_;
238
239 private:
240 DISALLOW_COPY_AND_ASSIGN(ParameterAnnotationsItem);
241};
242
243struct AnnotationSetRefItem {
244 uint32_t annotations_off_;
245
246 private:
247 DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefItem);
248};
249
250struct AnnotationSetRefList {
251 uint32_t size_;
252 AnnotationSetRefItem list_[1];
253
254 private:
255 DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefList);
256};
257
258struct AnnotationSetItem {
259 uint32_t size_;
260 uint32_t entries_[1];
261
262 private:
263 DISALLOW_COPY_AND_ASSIGN(AnnotationSetItem);
264};
265
266struct AnnotationItem {
267 uint8_t visibility_;
268 uint8_t annotation_[1];
269
270 private:
271 DISALLOW_COPY_AND_ASSIGN(AnnotationItem);
272};
273
274struct HiddenapiClassData {
275 uint32_t size_; // total size of the item
276 uint32_t flags_offset_[1]; // array of offsets from the beginning of this item,
277 // indexed by class def index
278
279 // Returns a pointer to the beginning of a uleb128-stream of hiddenapi
280 // flags for a class def of given index. Values are in the same order
281 // as fields/methods in the class data. Returns null if the class does
282 // not have class data.
283 const uint8_t* GetFlagsPointer(uint32_t class_def_idx) const {
284 if (flags_offset_[class_def_idx] == 0) {
285 return nullptr;
286 } else {
287 return reinterpret_cast<const uint8_t*>(this) + flags_offset_[class_def_idx];
288 }
289 }
290
291 private:
292 DISALLOW_COPY_AND_ASSIGN(HiddenapiClassData);
293};
294
295} // namespace dex
296} // namespace art
297
298#endif // ART_LIBDEXFILE_DEX_DEX_FILE_STRUCTS_H_