1 /* 2 * Copyright (C) 2015 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_RUNTIME_UTILS_DEX_CACHE_ARRAYS_LAYOUT_H_ 18 #define ART_RUNTIME_UTILS_DEX_CACHE_ARRAYS_LAYOUT_H_ 19 20 #include "dex_file.h" 21 #include "dex_file_types.h" 22 23 namespace art { 24 25 /** 26 * @class DexCacheArraysLayout 27 * @details This class provides the layout information for the type, method, field and 28 * string arrays for a DexCache with a fixed arrays' layout (such as in the boot image), 29 */ 30 class DexCacheArraysLayout { 31 public: 32 // Construct an invalid layout. DexCacheArraysLayout()33 DexCacheArraysLayout() 34 : /* types_offset_ is always 0u */ 35 pointer_size_(kRuntimePointerSize), 36 methods_offset_(0u), 37 strings_offset_(0u), 38 fields_offset_(0u), 39 method_types_offset_(0u), 40 call_sites_offset_(0u), 41 size_(0u) { 42 } 43 44 // Construct a layout for a particular dex file header. 45 DexCacheArraysLayout(PointerSize pointer_size, 46 const DexFile::Header& header, 47 uint32_t num_call_sites); 48 49 // Construct a layout for a particular dex file. 50 DexCacheArraysLayout(PointerSize pointer_size, const DexFile* dex_file); 51 Valid()52 bool Valid() const { 53 return Size() != 0u; 54 } 55 Size()56 size_t Size() const { 57 return size_; 58 } 59 60 size_t Alignment() const; 61 62 static constexpr size_t Alignment(PointerSize pointer_size); 63 TypesOffset()64 size_t TypesOffset() const { 65 return types_offset_; 66 } 67 68 size_t TypeOffset(dex::TypeIndex type_idx) const; 69 70 size_t TypesSize(size_t num_elements) const; 71 72 size_t TypesAlignment() const; 73 MethodsOffset()74 size_t MethodsOffset() const { 75 return methods_offset_; 76 } 77 78 size_t MethodOffset(uint32_t method_idx) const; 79 80 size_t MethodsSize(size_t num_elements) const; 81 82 size_t MethodsAlignment() const; 83 StringsOffset()84 size_t StringsOffset() const { 85 return strings_offset_; 86 } 87 88 size_t StringOffset(uint32_t string_idx) const; 89 90 size_t StringsSize(size_t num_elements) const; 91 92 size_t StringsAlignment() const; 93 FieldsOffset()94 size_t FieldsOffset() const { 95 return fields_offset_; 96 } 97 98 size_t FieldOffset(uint32_t field_idx) const; 99 100 size_t FieldsSize(size_t num_elements) const; 101 102 size_t FieldsAlignment() const; 103 MethodTypesOffset()104 size_t MethodTypesOffset() const { 105 return method_types_offset_; 106 } 107 108 size_t MethodTypesSize(size_t num_elements) const; 109 110 size_t MethodTypesAlignment() const; 111 CallSitesOffset()112 size_t CallSitesOffset() const { 113 return call_sites_offset_; 114 } 115 116 size_t CallSitesSize(size_t num_elements) const; 117 118 size_t CallSitesAlignment() const; 119 120 private: 121 static constexpr size_t types_offset_ = 0u; 122 const PointerSize pointer_size_; // Must be first for construction initialization order. 123 const size_t methods_offset_; 124 const size_t strings_offset_; 125 const size_t fields_offset_; 126 const size_t method_types_offset_; 127 const size_t call_sites_offset_; 128 const size_t size_; 129 130 static size_t ElementOffset(PointerSize element_size, uint32_t idx); 131 132 static size_t ArraySize(PointerSize element_size, uint32_t num_elements); 133 static size_t PairArraySize(PointerSize element_size, uint32_t num_elements); 134 }; 135 136 } // namespace art 137 138 #endif // ART_RUNTIME_UTILS_DEX_CACHE_ARRAYS_LAYOUT_H_ 139