blob: ebdd78bd7450cab6f088c6f2758b0aa921a6b98c [file] [log] [blame]
Mathieu Chartier641a3af2017-12-15 11:42:58 -08001/*
2 * Copyright (C) 2017 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_CODE_ITEM_ACCESSORS_NO_ART_INL_H_
18#define ART_RUNTIME_CODE_ITEM_ACCESSORS_NO_ART_INL_H_
19
20#include "code_item_accessors.h"
21
22#include "cdex/compact_dex_file.h"
23#include "dex_file-inl.h"
24#include "standard_dex_file.h"
25
26// The no ART version is used by binaries that don't include the whole runtime.
Mathieu Chartier641a3af2017-12-15 11:42:58 -080027namespace art {
28
29inline void CodeItemInstructionAccessor::Init(const CompactDexFile::CodeItem& code_item) {
30 insns_size_in_code_units_ = code_item.insns_size_in_code_units_;
31 insns_ = code_item.insns_;
32}
33
34inline void CodeItemInstructionAccessor::Init(const StandardDexFile::CodeItem& code_item) {
35 insns_size_in_code_units_ = code_item.insns_size_in_code_units_;
36 insns_ = code_item.insns_;
37}
38
39inline void CodeItemInstructionAccessor::Init(const DexFile* dex_file,
40 const DexFile::CodeItem* code_item) {
Mathieu Chartier808c7a52017-12-15 11:19:33 -080041 if (code_item != nullptr) {
42 DCHECK(dex_file != nullptr);
43 if (dex_file->IsCompactDexFile()) {
44 Init(down_cast<const CompactDexFile::CodeItem&>(*code_item));
45 } else {
46 DCHECK(dex_file->IsStandardDexFile());
47 Init(down_cast<const StandardDexFile::CodeItem&>(*code_item));
48 }
Mathieu Chartier641a3af2017-12-15 11:42:58 -080049 }
50}
51
52inline CodeItemInstructionAccessor::CodeItemInstructionAccessor(
53 const DexFile* dex_file,
54 const DexFile::CodeItem* code_item) {
55 Init(dex_file, code_item);
56}
57
58inline DexInstructionIterator CodeItemInstructionAccessor::begin() const {
59 return DexInstructionIterator(insns_, 0u);
60}
61
62inline DexInstructionIterator CodeItemInstructionAccessor::end() const {
63 return DexInstructionIterator(insns_, insns_size_in_code_units_);
64}
65
Mathieu Chartier808c7a52017-12-15 11:19:33 -080066inline IterationRange<DexInstructionIterator> CodeItemInstructionAccessor::InstructionsFrom(
67 uint32_t start_dex_pc) const {
68 DCHECK_LT(start_dex_pc, InsnsSizeInCodeUnits());
69 return {
70 DexInstructionIterator(insns_, start_dex_pc),
71 DexInstructionIterator(insns_, insns_size_in_code_units_) };
72}
73
Mathieu Chartier641a3af2017-12-15 11:42:58 -080074inline void CodeItemDataAccessor::Init(const CompactDexFile::CodeItem& code_item) {
75 CodeItemInstructionAccessor::Init(code_item);
76 registers_size_ = code_item.registers_size_;
77 ins_size_ = code_item.ins_size_;
78 outs_size_ = code_item.outs_size_;
79 tries_size_ = code_item.tries_size_;
80}
81
82inline void CodeItemDataAccessor::Init(const StandardDexFile::CodeItem& code_item) {
83 CodeItemInstructionAccessor::Init(code_item);
84 registers_size_ = code_item.registers_size_;
85 ins_size_ = code_item.ins_size_;
86 outs_size_ = code_item.outs_size_;
87 tries_size_ = code_item.tries_size_;
88}
89
90inline void CodeItemDataAccessor::Init(const DexFile* dex_file,
91 const DexFile::CodeItem* code_item) {
Mathieu Chartier808c7a52017-12-15 11:19:33 -080092 if (code_item != nullptr) {
93 DCHECK(dex_file != nullptr);
94 if (dex_file->IsCompactDexFile()) {
95 CodeItemDataAccessor::Init(down_cast<const CompactDexFile::CodeItem&>(*code_item));
96 } else {
97 DCHECK(dex_file->IsStandardDexFile());
98 CodeItemDataAccessor::Init(down_cast<const StandardDexFile::CodeItem&>(*code_item));
99 }
Mathieu Chartier641a3af2017-12-15 11:42:58 -0800100 }
101}
102
103inline CodeItemDataAccessor::CodeItemDataAccessor(const DexFile* dex_file,
104 const DexFile::CodeItem* code_item) {
105 Init(dex_file, code_item);
106}
107
Mathieu Chartier641a3af2017-12-15 11:42:58 -0800108inline IterationRange<const DexFile::TryItem*> CodeItemDataAccessor::TryItems() const {
109 const DexFile::TryItem* try_items = DexFile::GetTryItems(end(), 0u);
110 return {
111 try_items,
112 try_items + TriesSize() };
113}
114
115inline const uint8_t* CodeItemDataAccessor::GetCatchHandlerData(size_t offset) const {
116 return DexFile::GetCatchHandlerData(end(), TriesSize(), offset);
117}
118
119inline const DexFile::TryItem* CodeItemDataAccessor::FindTryItem(uint32_t try_dex_pc) const {
120 IterationRange<const DexFile::TryItem*> try_items(TryItems());
121 int32_t index = DexFile::FindTryItem(try_items.begin(),
122 try_items.end() - try_items.begin(),
123 try_dex_pc);
124 return index != -1 ? &try_items.begin()[index] : nullptr;
125}
126
127inline void CodeItemDebugInfoAccessor::Init(const DexFile* dex_file,
128 const DexFile::CodeItem* code_item,
129 uint32_t debug_info_offset) {
130 dex_file_ = dex_file;
131 debug_info_offset_ = debug_info_offset;
132 if (dex_file->IsCompactDexFile()) {
133 Init(down_cast<const CompactDexFile::CodeItem&>(*code_item));
134 } else {
135 DCHECK(dex_file->IsStandardDexFile());
136 Init(down_cast<const StandardDexFile::CodeItem&>(*code_item));
137 }
138}
139
140inline void CodeItemDebugInfoAccessor::Init(const CompactDexFile::CodeItem& code_item) {
141 CodeItemDataAccessor::Init(code_item);
142}
143
144inline void CodeItemDebugInfoAccessor::Init(const StandardDexFile::CodeItem& code_item) {
145 CodeItemDataAccessor::Init(code_item);
146}
147
148template<typename NewLocalCallback>
149inline bool CodeItemDebugInfoAccessor::DecodeDebugLocalInfo(bool is_static,
150 uint32_t method_idx,
151 NewLocalCallback new_local,
152 void* context) const {
153 return dex_file_->DecodeDebugLocalInfo(RegistersSize(),
154 InsSize(),
155 InsnsSizeInCodeUnits(),
156 DebugInfoOffset(),
157 is_static,
158 method_idx,
159 new_local,
160 context);
161}
162
Mathieu Chartier641a3af2017-12-15 11:42:58 -0800163} // namespace art
164
165#endif // ART_RUNTIME_CODE_ITEM_ACCESSORS_NO_ART_INL_H_