| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ART_RUNTIME_UTILS_DEX_CACHE_ARRAYS_LAYOUT_H_ |
| #define ART_RUNTIME_UTILS_DEX_CACHE_ARRAYS_LAYOUT_H_ |
| |
| #include "dex_file.h" |
| #include "dex_file_types.h" |
| |
| namespace art { |
| |
| /** |
| * @class DexCacheArraysLayout |
| * @details This class provides the layout information for the type, method, field and |
| * string arrays for a DexCache with a fixed arrays' layout (such as in the boot image), |
| */ |
| class DexCacheArraysLayout { |
| public: |
| // Construct an invalid layout. |
| DexCacheArraysLayout() |
| : /* types_offset_ is always 0u */ |
| pointer_size_(kRuntimePointerSize), |
| methods_offset_(0u), |
| strings_offset_(0u), |
| fields_offset_(0u), |
| method_types_offset_(0u), |
| call_sites_offset_(0u), |
| size_(0u) { |
| } |
| |
| // Construct a layout for a particular dex file header. |
| DexCacheArraysLayout(PointerSize pointer_size, |
| const DexFile::Header& header, |
| uint32_t num_call_sites); |
| |
| // Construct a layout for a particular dex file. |
| DexCacheArraysLayout(PointerSize pointer_size, const DexFile* dex_file); |
| |
| bool Valid() const { |
| return Size() != 0u; |
| } |
| |
| size_t Size() const { |
| return size_; |
| } |
| |
| size_t Alignment() const; |
| |
| static constexpr size_t Alignment(PointerSize pointer_size); |
| |
| size_t TypesOffset() const { |
| return types_offset_; |
| } |
| |
| size_t TypeOffset(dex::TypeIndex type_idx) const; |
| |
| size_t TypesSize(size_t num_elements) const; |
| |
| size_t TypesAlignment() const; |
| |
| size_t MethodsOffset() const { |
| return methods_offset_; |
| } |
| |
| size_t MethodOffset(uint32_t method_idx) const; |
| |
| size_t MethodsSize(size_t num_elements) const; |
| |
| size_t MethodsAlignment() const; |
| |
| size_t StringsOffset() const { |
| return strings_offset_; |
| } |
| |
| size_t StringOffset(uint32_t string_idx) const; |
| |
| size_t StringsSize(size_t num_elements) const; |
| |
| size_t StringsAlignment() const; |
| |
| size_t FieldsOffset() const { |
| return fields_offset_; |
| } |
| |
| size_t FieldOffset(uint32_t field_idx) const; |
| |
| size_t FieldsSize(size_t num_elements) const; |
| |
| size_t FieldsAlignment() const; |
| |
| size_t MethodTypesOffset() const { |
| return method_types_offset_; |
| } |
| |
| size_t MethodTypesSize(size_t num_elements) const; |
| |
| size_t MethodTypesAlignment() const; |
| |
| size_t CallSitesOffset() const { |
| return call_sites_offset_; |
| } |
| |
| size_t CallSitesSize(size_t num_elements) const; |
| |
| size_t CallSitesAlignment() const; |
| |
| private: |
| static constexpr size_t types_offset_ = 0u; |
| const PointerSize pointer_size_; // Must be first for construction initialization order. |
| const size_t methods_offset_; |
| const size_t strings_offset_; |
| const size_t fields_offset_; |
| const size_t method_types_offset_; |
| const size_t call_sites_offset_; |
| const size_t size_; |
| |
| static size_t ElementOffset(PointerSize element_size, uint32_t idx); |
| |
| static size_t ArraySize(PointerSize element_size, uint32_t num_elements); |
| static size_t PairArraySize(PointerSize element_size, uint32_t num_elements); |
| }; |
| |
| } // namespace art |
| |
| #endif // ART_RUNTIME_UTILS_DEX_CACHE_ARRAYS_LAYOUT_H_ |