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.
DexCacheArraysLayout()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 
Valid()47   bool Valid() const {
48     return Size() != 0u;
49   }
50 
Size()51   size_t Size() const {
52     return size_;
53   }
54 
55   size_t Alignment() const;
56 
TypesOffset()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 
MethodsOffset()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 
StringsOffset()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 
FieldsOffset()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