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