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