Home | History | Annotate | Download | only in utils
      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 
     22 namespace art {
     23 
     24 /**
     25  * @class DexCacheArraysLayout
     26  * @details This class provides the layout information for the type, method, field and
     27  * string arrays for a DexCache with a fixed arrays' layout (such as in the boot image),
     28  */
     29 class DexCacheArraysLayout {
     30  public:
     31   // Construct an invalid layout.
     32   DexCacheArraysLayout()
     33       : /* types_offset_ is always 0u */
     34         pointer_size_(0u),
     35         methods_offset_(0u),
     36         strings_offset_(0u),
     37         fields_offset_(0u),
     38         size_(0u) {
     39   }
     40 
     41   // Construct a layout for a particular dex file header.
     42   DexCacheArraysLayout(size_t pointer_size, const DexFile::Header& header);
     43 
     44   // Construct a layout for a particular dex file.
     45   DexCacheArraysLayout(size_t pointer_size, const DexFile* dex_file);
     46 
     47   bool Valid() const {
     48     return Size() != 0u;
     49   }
     50 
     51   size_t Size() const {
     52     return size_;
     53   }
     54 
     55   size_t Alignment() const;
     56 
     57   size_t TypesOffset() const {
     58     return types_offset_;
     59   }
     60 
     61   size_t TypeOffset(uint32_t type_idx) const;
     62 
     63   size_t TypesSize(size_t num_elements) const;
     64 
     65   size_t TypesAlignment() const;
     66 
     67   size_t MethodsOffset() const {
     68     return methods_offset_;
     69   }
     70 
     71   size_t MethodOffset(uint32_t method_idx) const;
     72 
     73   size_t MethodsSize(size_t num_elements) const;
     74 
     75   size_t MethodsAlignment() const;
     76 
     77   size_t StringsOffset() const {
     78     return strings_offset_;
     79   }
     80 
     81   size_t StringOffset(uint32_t string_idx) const;
     82 
     83   size_t StringsSize(size_t num_elements) const;
     84 
     85   size_t StringsAlignment() const;
     86 
     87   size_t FieldsOffset() const {
     88     return fields_offset_;
     89   }
     90 
     91   size_t FieldOffset(uint32_t field_idx) const;
     92 
     93   size_t FieldsSize(size_t num_elements) const;
     94 
     95   size_t FieldsAlignment() const;
     96 
     97  private:
     98   static constexpr size_t types_offset_ = 0u;
     99   const size_t pointer_size_;  // Must be first for construction initialization order.
    100   const size_t methods_offset_;
    101   const size_t strings_offset_;
    102   const size_t fields_offset_;
    103   const size_t size_;
    104 
    105   static size_t Alignment(size_t pointer_size);
    106 
    107   static size_t ElementOffset(size_t element_size, uint32_t idx);
    108 
    109   static size_t ArraySize(size_t element_size, uint32_t num_elements);
    110 };
    111 
    112 }  // namespace art
    113 
    114 #endif  // ART_RUNTIME_UTILS_DEX_CACHE_ARRAYS_LAYOUT_H_
    115