Home | History | Annotate | Download | only in dex
      1 /*
      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 
     28 namespace art {
     29 
     30 class DexWriter;
     31 
     32 namespace dex {
     33 
     34 struct MapItem {
     35   uint16_t type_;
     36   uint16_t unused_;
     37   uint32_t size_;
     38   uint32_t offset_;
     39 };
     40 
     41 struct 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.
     52 struct 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.
     60 struct 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.
     68 struct 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.
     78 struct 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.
     89 struct 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.
     99 struct CodeItem {
    100  protected:
    101   CodeItem() = default;
    102 
    103  private:
    104   DISALLOW_COPY_AND_ASSIGN(CodeItem);
    105 };
    106 
    107 // Raw class_def_item.
    108 struct 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.
    143 struct 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.
    151 class 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
    179 struct 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
    189 struct 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.
    196 struct 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 
    209 struct 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 
    219 struct FieldAnnotationsItem {
    220   uint32_t field_idx_;
    221   uint32_t annotations_off_;
    222 
    223  private:
    224   DISALLOW_COPY_AND_ASSIGN(FieldAnnotationsItem);
    225 };
    226 
    227 struct MethodAnnotationsItem {
    228   uint32_t method_idx_;
    229   uint32_t annotations_off_;
    230 
    231  private:
    232   DISALLOW_COPY_AND_ASSIGN(MethodAnnotationsItem);
    233 };
    234 
    235 struct ParameterAnnotationsItem {
    236   uint32_t method_idx_;
    237   uint32_t annotations_off_;
    238 
    239  private:
    240   DISALLOW_COPY_AND_ASSIGN(ParameterAnnotationsItem);
    241 };
    242 
    243 struct AnnotationSetRefItem {
    244   uint32_t annotations_off_;
    245 
    246  private:
    247   DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefItem);
    248 };
    249 
    250 struct AnnotationSetRefList {
    251   uint32_t size_;
    252   AnnotationSetRefItem list_[1];
    253 
    254  private:
    255   DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefList);
    256 };
    257 
    258 struct AnnotationSetItem {
    259   uint32_t size_;
    260   uint32_t entries_[1];
    261 
    262  private:
    263   DISALLOW_COPY_AND_ASSIGN(AnnotationSetItem);
    264 };
    265 
    266 struct AnnotationItem {
    267   uint8_t visibility_;
    268   uint8_t annotation_[1];
    269 
    270  private:
    271   DISALLOW_COPY_AND_ASSIGN(AnnotationItem);
    272 };
    273 
    274 struct 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_
    299