xref: /aosp_15_r20/system/unwinding/libunwindstack/DwarfOp.h (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker  *
4*eb293b8fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker  *
8*eb293b8fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker  *
10*eb293b8fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker  * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker  */
16*eb293b8fSAndroid Build Coastguard Worker 
17*eb293b8fSAndroid Build Coastguard Worker #pragma once
18*eb293b8fSAndroid Build Coastguard Worker 
19*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h>
20*eb293b8fSAndroid Build Coastguard Worker 
21*eb293b8fSAndroid Build Coastguard Worker #include <deque>
22*eb293b8fSAndroid Build Coastguard Worker #include <string>
23*eb293b8fSAndroid Build Coastguard Worker #include <type_traits>
24*eb293b8fSAndroid Build Coastguard Worker #include <vector>
25*eb293b8fSAndroid Build Coastguard Worker 
26*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/DwarfError.h>
27*eb293b8fSAndroid Build Coastguard Worker 
28*eb293b8fSAndroid Build Coastguard Worker #include "DwarfEncoding.h"
29*eb293b8fSAndroid Build Coastguard Worker #include "RegsInfo.h"
30*eb293b8fSAndroid Build Coastguard Worker 
31*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
32*eb293b8fSAndroid Build Coastguard Worker 
33*eb293b8fSAndroid Build Coastguard Worker // Forward declarations.
34*eb293b8fSAndroid Build Coastguard Worker class DwarfMemory;
35*eb293b8fSAndroid Build Coastguard Worker class Memory;
36*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
37*eb293b8fSAndroid Build Coastguard Worker class RegsImpl;
38*eb293b8fSAndroid Build Coastguard Worker 
39*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
40*eb293b8fSAndroid Build Coastguard Worker class DwarfOp {
41*eb293b8fSAndroid Build Coastguard Worker   // Signed version of AddressType
42*eb293b8fSAndroid Build Coastguard Worker   typedef typename std::make_signed<AddressType>::type SignedType;
43*eb293b8fSAndroid Build Coastguard Worker 
44*eb293b8fSAndroid Build Coastguard Worker  public:
DwarfOp(DwarfMemory * memory,Memory * regular_memory)45*eb293b8fSAndroid Build Coastguard Worker   DwarfOp(DwarfMemory* memory, Memory* regular_memory)
46*eb293b8fSAndroid Build Coastguard Worker       : memory_(memory), regular_memory_(regular_memory) {}
47*eb293b8fSAndroid Build Coastguard Worker   virtual ~DwarfOp() = default;
48*eb293b8fSAndroid Build Coastguard Worker 
49*eb293b8fSAndroid Build Coastguard Worker   bool Decode();
50*eb293b8fSAndroid Build Coastguard Worker 
51*eb293b8fSAndroid Build Coastguard Worker   bool Eval(uint64_t start, uint64_t end);
52*eb293b8fSAndroid Build Coastguard Worker 
53*eb293b8fSAndroid Build Coastguard Worker   void GetLogInfo(uint64_t start, uint64_t end, std::vector<std::string>* lines);
54*eb293b8fSAndroid Build Coastguard Worker 
StackAt(size_t index)55*eb293b8fSAndroid Build Coastguard Worker   AddressType StackAt(size_t index) { return stack_[index]; }
StackSize()56*eb293b8fSAndroid Build Coastguard Worker   size_t StackSize() { return stack_.size(); }
57*eb293b8fSAndroid Build Coastguard Worker 
set_regs_info(RegsInfo<AddressType> * regs_info)58*eb293b8fSAndroid Build Coastguard Worker   void set_regs_info(RegsInfo<AddressType>* regs_info) { regs_info_ = regs_info; }
59*eb293b8fSAndroid Build Coastguard Worker 
last_error()60*eb293b8fSAndroid Build Coastguard Worker   const DwarfErrorData& last_error() { return last_error_; }
LastErrorCode()61*eb293b8fSAndroid Build Coastguard Worker   DwarfErrorCode LastErrorCode() { return last_error_.code; }
LastErrorAddress()62*eb293b8fSAndroid Build Coastguard Worker   uint64_t LastErrorAddress() { return last_error_.address; }
63*eb293b8fSAndroid Build Coastguard Worker 
dex_pc_set()64*eb293b8fSAndroid Build Coastguard Worker   bool dex_pc_set() { return dex_pc_set_; }
65*eb293b8fSAndroid Build Coastguard Worker 
is_register()66*eb293b8fSAndroid Build Coastguard Worker   bool is_register() { return is_register_; }
67*eb293b8fSAndroid Build Coastguard Worker 
cur_op()68*eb293b8fSAndroid Build Coastguard Worker   uint8_t cur_op() { return cur_op_; }
69*eb293b8fSAndroid Build Coastguard Worker 
regular_memory()70*eb293b8fSAndroid Build Coastguard Worker   Memory* regular_memory() { return regular_memory_; }
71*eb293b8fSAndroid Build Coastguard Worker 
72*eb293b8fSAndroid Build Coastguard Worker  protected:
OperandAt(size_t index)73*eb293b8fSAndroid Build Coastguard Worker   AddressType OperandAt(size_t index) { return operands_[index]; }
OperandsSize()74*eb293b8fSAndroid Build Coastguard Worker   size_t OperandsSize() { return operands_.size(); }
75*eb293b8fSAndroid Build Coastguard Worker 
StackPop()76*eb293b8fSAndroid Build Coastguard Worker   AddressType StackPop() {
77*eb293b8fSAndroid Build Coastguard Worker     AddressType value = stack_.front();
78*eb293b8fSAndroid Build Coastguard Worker     stack_.pop_front();
79*eb293b8fSAndroid Build Coastguard Worker     return value;
80*eb293b8fSAndroid Build Coastguard Worker   }
81*eb293b8fSAndroid Build Coastguard Worker 
82*eb293b8fSAndroid Build Coastguard Worker  private:
83*eb293b8fSAndroid Build Coastguard Worker   DwarfMemory* memory_;
84*eb293b8fSAndroid Build Coastguard Worker   Memory* regular_memory_;
85*eb293b8fSAndroid Build Coastguard Worker 
86*eb293b8fSAndroid Build Coastguard Worker   RegsInfo<AddressType>* regs_info_;
87*eb293b8fSAndroid Build Coastguard Worker   bool dex_pc_set_ = false;
88*eb293b8fSAndroid Build Coastguard Worker   bool is_register_ = false;
89*eb293b8fSAndroid Build Coastguard Worker   DwarfErrorData last_error_{DWARF_ERROR_NONE, 0};
90*eb293b8fSAndroid Build Coastguard Worker   uint8_t cur_op_;
91*eb293b8fSAndroid Build Coastguard Worker   std::vector<AddressType> operands_;
92*eb293b8fSAndroid Build Coastguard Worker   std::deque<AddressType> stack_;
93*eb293b8fSAndroid Build Coastguard Worker 
bool_to_dwarf_bool(bool value)94*eb293b8fSAndroid Build Coastguard Worker   inline AddressType bool_to_dwarf_bool(bool value) { return value ? 1 : 0; }
95*eb293b8fSAndroid Build Coastguard Worker 
96*eb293b8fSAndroid Build Coastguard Worker   // Op processing functions.
97*eb293b8fSAndroid Build Coastguard Worker   bool op_deref();
98*eb293b8fSAndroid Build Coastguard Worker   bool op_deref_size();
99*eb293b8fSAndroid Build Coastguard Worker   bool op_push();
100*eb293b8fSAndroid Build Coastguard Worker   bool op_dup();
101*eb293b8fSAndroid Build Coastguard Worker   bool op_drop();
102*eb293b8fSAndroid Build Coastguard Worker   bool op_over();
103*eb293b8fSAndroid Build Coastguard Worker   bool op_pick();
104*eb293b8fSAndroid Build Coastguard Worker   bool op_swap();
105*eb293b8fSAndroid Build Coastguard Worker   bool op_rot();
106*eb293b8fSAndroid Build Coastguard Worker   bool op_abs();
107*eb293b8fSAndroid Build Coastguard Worker   bool op_and();
108*eb293b8fSAndroid Build Coastguard Worker   bool op_div();
109*eb293b8fSAndroid Build Coastguard Worker   bool op_minus();
110*eb293b8fSAndroid Build Coastguard Worker   bool op_mod();
111*eb293b8fSAndroid Build Coastguard Worker   bool op_mul();
112*eb293b8fSAndroid Build Coastguard Worker   bool op_neg();
113*eb293b8fSAndroid Build Coastguard Worker   bool op_not();
114*eb293b8fSAndroid Build Coastguard Worker   bool op_or();
115*eb293b8fSAndroid Build Coastguard Worker   bool op_plus();
116*eb293b8fSAndroid Build Coastguard Worker   bool op_plus_uconst();
117*eb293b8fSAndroid Build Coastguard Worker   bool op_shl();
118*eb293b8fSAndroid Build Coastguard Worker   bool op_shr();
119*eb293b8fSAndroid Build Coastguard Worker   bool op_shra();
120*eb293b8fSAndroid Build Coastguard Worker   bool op_xor();
121*eb293b8fSAndroid Build Coastguard Worker   bool op_bra();
122*eb293b8fSAndroid Build Coastguard Worker   bool op_eq();
123*eb293b8fSAndroid Build Coastguard Worker   bool op_ge();
124*eb293b8fSAndroid Build Coastguard Worker   bool op_gt();
125*eb293b8fSAndroid Build Coastguard Worker   bool op_le();
126*eb293b8fSAndroid Build Coastguard Worker   bool op_lt();
127*eb293b8fSAndroid Build Coastguard Worker   bool op_ne();
128*eb293b8fSAndroid Build Coastguard Worker   bool op_skip();
129*eb293b8fSAndroid Build Coastguard Worker   bool op_lit();
130*eb293b8fSAndroid Build Coastguard Worker   bool op_reg();
131*eb293b8fSAndroid Build Coastguard Worker   bool op_regx();
132*eb293b8fSAndroid Build Coastguard Worker   bool op_breg();
133*eb293b8fSAndroid Build Coastguard Worker   bool op_bregx();
134*eb293b8fSAndroid Build Coastguard Worker   bool op_nop();
135*eb293b8fSAndroid Build Coastguard Worker   bool op_not_implemented();
136*eb293b8fSAndroid Build Coastguard Worker 
137*eb293b8fSAndroid Build Coastguard Worker   using OpHandleFuncPtr = bool (DwarfOp::*)();
138*eb293b8fSAndroid Build Coastguard Worker   static const OpHandleFuncPtr kOpHandleFuncList[];
139*eb293b8fSAndroid Build Coastguard Worker };
140*eb293b8fSAndroid Build Coastguard Worker 
141*eb293b8fSAndroid Build Coastguard Worker }  // namespace unwindstack
142