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