android_system_core/libunwindstack/DwarfOp.h
Christopher Ferris 2fcf4cf13e Add error propagation into Unwinder/Elf objects.
The backtrace offline code uses these error codes to diagnose errors.
In addtion, I've had cases where seeing these errors would help diagnose
failures.

This also allows us to add a few features to indicate why an unwind
terminated (such as max frames exceeded).

Bug: 65682279

Test: Updated unit tests pass.
Change-Id: If82b5092698e8a194016d670efff1320f9b44d50
2018-01-24 17:50:46 -08:00

1644 lines
36 KiB
C++

/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _LIBUNWINDSTACK_DWARF_OP_H
#define _LIBUNWINDSTACK_DWARF_OP_H
#include <stdint.h>
#include <deque>
#include <string>
#include <type_traits>
#include <vector>
#include <unwindstack/DwarfError.h>
#include "DwarfEncoding.h"
namespace unwindstack {
enum DwarfVersion : uint8_t {
DWARF_VERSION_2 = 2,
DWARF_VERSION_3 = 3,
DWARF_VERSION_4 = 4,
DWARF_VERSION_MAX = DWARF_VERSION_4,
};
// Forward declarations.
class DwarfMemory;
class Memory;
template <typename AddressType>
class RegsImpl;
template <typename AddressType>
class DwarfOp {
// Signed version of AddressType
typedef typename std::make_signed<AddressType>::type SignedType;
struct OpCallback {
const char* name;
bool (DwarfOp::*handle_func)();
uint8_t supported_version;
uint8_t num_required_stack_values;
uint8_t num_operands;
uint8_t operands[2];
};
public:
DwarfOp(DwarfMemory* memory, Memory* regular_memory)
: memory_(memory), regular_memory_(regular_memory) {}
virtual ~DwarfOp() = default;
bool Decode(uint8_t dwarf_version);
bool Eval(uint64_t start, uint64_t end, uint8_t dwarf_version);
void GetLogInfo(uint64_t start, uint64_t end, std::vector<std::string>* lines);
AddressType StackAt(size_t index) { return stack_[index]; }
size_t StackSize() { return stack_.size(); }
void set_regs(RegsImpl<AddressType>* regs) { regs_ = regs; }
const DwarfErrorData& last_error() { return last_error_; }
DwarfErrorCode LastErrorCode() { return last_error_.code; }
uint64_t LastErrorAddress() { return last_error_.address; }
bool is_register() { return is_register_; }
uint8_t cur_op() { return cur_op_; }
Memory* regular_memory() { return regular_memory_; }
protected:
AddressType OperandAt(size_t index) { return operands_[index]; }
size_t OperandsSize() { return operands_.size(); }
AddressType StackPop() {
AddressType value = stack_.front();
stack_.pop_front();
return value;
}
private:
DwarfMemory* memory_;
Memory* regular_memory_;
RegsImpl<AddressType>* regs_;
bool is_register_ = false;
DwarfErrorData last_error_{DWARF_ERROR_NONE, 0};
uint8_t cur_op_;
std::vector<AddressType> operands_;
std::deque<AddressType> stack_;
inline AddressType bool_to_dwarf_bool(bool value) { return value ? 1 : 0; }
// Op processing functions.
bool op_deref();
bool op_deref_size();
bool op_push();
bool op_dup();
bool op_drop();
bool op_over();
bool op_pick();
bool op_swap();
bool op_rot();
bool op_abs();
bool op_and();
bool op_div();
bool op_minus();
bool op_mod();
bool op_mul();
bool op_neg();
bool op_not();
bool op_or();
bool op_plus();
bool op_plus_uconst();
bool op_shl();
bool op_shr();
bool op_shra();
bool op_xor();
bool op_bra();
bool op_eq();
bool op_ge();
bool op_gt();
bool op_le();
bool op_lt();
bool op_ne();
bool op_skip();
bool op_lit();
bool op_reg();
bool op_regx();
bool op_breg();
bool op_bregx();
bool op_nop();
bool op_not_implemented();
constexpr static OpCallback kCallbackTable[256] = {
{nullptr, nullptr, 0, 0, 0, {}}, // 0x00 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0x01 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0x02 illegal op
{
// 0x03 DW_OP_addr
"DW_OP_addr",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_absptr},
},
{nullptr, nullptr, 0, 0, 0, {}}, // 0x04 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0x05 illegal op
{
// 0x06 DW_OP_deref
"DW_OP_deref",
&DwarfOp::op_deref,
DWARF_VERSION_2,
1,
0,
{},
},
{nullptr, nullptr, 0, 0, 0, {}}, // 0x07 illegal op
{
// 0x08 DW_OP_const1u
"DW_OP_const1u",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_udata1},
},
{
// 0x09 DW_OP_const1s
"DW_OP_const1s",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sdata1},
},
{
// 0x0a DW_OP_const2u
"DW_OP_const2u",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_udata2},
},
{
// 0x0b DW_OP_const2s
"DW_OP_const2s",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sdata2},
},
{
// 0x0c DW_OP_const4u
"DW_OP_const4u",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_udata4},
},
{
// 0x0d DW_OP_const4s
"DW_OP_const4s",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sdata4},
},
{
// 0x0e DW_OP_const8u
"DW_OP_const8u",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_udata8},
},
{
// 0x0f DW_OP_const8s
"DW_OP_const8s",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sdata8},
},
{
// 0x10 DW_OP_constu
"DW_OP_constu",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_uleb128},
},
{
// 0x11 DW_OP_consts
"DW_OP_consts",
&DwarfOp::op_push,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x12 DW_OP_dup
"DW_OP_dup",
&DwarfOp::op_dup,
DWARF_VERSION_2,
1,
0,
{},
},
{
// 0x13 DW_OP_drop
"DW_OP_drop",
&DwarfOp::op_drop,
DWARF_VERSION_2,
1,
0,
{},
},
{
// 0x14 DW_OP_over
"DW_OP_over",
&DwarfOp::op_over,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x15 DW_OP_pick
"DW_OP_pick",
&DwarfOp::op_pick,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_udata1},
},
{
// 0x16 DW_OP_swap
"DW_OP_swap",
&DwarfOp::op_swap,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x17 DW_OP_rot
"DW_OP_rot",
&DwarfOp::op_rot,
DWARF_VERSION_2,
3,
0,
{},
},
{
// 0x18 DW_OP_xderef
"DW_OP_xderef",
&DwarfOp::op_not_implemented,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x19 DW_OP_abs
"DW_OP_abs",
&DwarfOp::op_abs,
DWARF_VERSION_2,
1,
0,
{},
},
{
// 0x1a DW_OP_and
"DW_OP_and",
&DwarfOp::op_and,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x1b DW_OP_div
"DW_OP_div",
&DwarfOp::op_div,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x1c DW_OP_minus
"DW_OP_minus",
&DwarfOp::op_minus,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x1d DW_OP_mod
"DW_OP_mod",
&DwarfOp::op_mod,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x1e DW_OP_mul
"DW_OP_mul",
&DwarfOp::op_mul,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x1f DW_OP_neg
"DW_OP_neg",
&DwarfOp::op_neg,
DWARF_VERSION_2,
1,
0,
{},
},
{
// 0x20 DW_OP_not
"DW_OP_not",
&DwarfOp::op_not,
DWARF_VERSION_2,
1,
0,
{},
},
{
// 0x21 DW_OP_or
"DW_OP_or",
&DwarfOp::op_or,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x22 DW_OP_plus
"DW_OP_plus",
&DwarfOp::op_plus,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x23 DW_OP_plus_uconst
"DW_OP_plus_uconst",
&DwarfOp::op_plus_uconst,
DWARF_VERSION_2,
1,
1,
{DW_EH_PE_uleb128},
},
{
// 0x24 DW_OP_shl
"DW_OP_shl",
&DwarfOp::op_shl,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x25 DW_OP_shr
"DW_OP_shr",
&DwarfOp::op_shr,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x26 DW_OP_shra
"DW_OP_shra",
&DwarfOp::op_shra,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x27 DW_OP_xor
"DW_OP_xor",
&DwarfOp::op_xor,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x28 DW_OP_bra
"DW_OP_bra",
&DwarfOp::op_bra,
DWARF_VERSION_2,
1,
1,
{DW_EH_PE_sdata2},
},
{
// 0x29 DW_OP_eq
"DW_OP_eq",
&DwarfOp::op_eq,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x2a DW_OP_ge
"DW_OP_ge",
&DwarfOp::op_ge,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x2b DW_OP_gt
"DW_OP_gt",
&DwarfOp::op_gt,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x2c DW_OP_le
"DW_OP_le",
&DwarfOp::op_le,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x2d DW_OP_lt
"DW_OP_lt",
&DwarfOp::op_lt,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x2e DW_OP_ne
"DW_OP_ne",
&DwarfOp::op_ne,
DWARF_VERSION_2,
2,
0,
{},
},
{
// 0x2f DW_OP_skip
"DW_OP_skip",
&DwarfOp::op_skip,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sdata2},
},
{
// 0x30 DW_OP_lit0
"DW_OP_lit0",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x31 DW_OP_lit1
"DW_OP_lit1",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x32 DW_OP_lit2
"DW_OP_lit2",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x33 DW_OP_lit3
"DW_OP_lit3",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x34 DW_OP_lit4
"DW_OP_lit4",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x35 DW_OP_lit5
"DW_OP_lit5",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x36 DW_OP_lit6
"DW_OP_lit6",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x37 DW_OP_lit7
"DW_OP_lit7",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x38 DW_OP_lit8
"DW_OP_lit8",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x39 DW_OP_lit9
"DW_OP_lit9",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x3a DW_OP_lit10
"DW_OP_lit10",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x3b DW_OP_lit11
"DW_OP_lit11",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x3c DW_OP_lit12
"DW_OP_lit12",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x3d DW_OP_lit13
"DW_OP_lit13",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x3e DW_OP_lit14
"DW_OP_lit14",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x3f DW_OP_lit15
"DW_OP_lit15",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x40 DW_OP_lit16
"DW_OP_lit16",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x41 DW_OP_lit17
"DW_OP_lit17",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x42 DW_OP_lit18
"DW_OP_lit18",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x43 DW_OP_lit19
"DW_OP_lit19",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x44 DW_OP_lit20
"DW_OP_lit20",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x45 DW_OP_lit21
"DW_OP_lit21",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x46 DW_OP_lit22
"DW_OP_lit22",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x47 DW_OP_lit23
"DW_OP_lit23",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x48 DW_OP_lit24
"DW_OP_lit24",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x49 DW_OP_lit25
"DW_OP_lit25",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x4a DW_OP_lit26
"DW_OP_lit26",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x4b DW_OP_lit27
"DW_OP_lit27",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x4c DW_OP_lit28
"DW_OP_lit28",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x4d DW_OP_lit29
"DW_OP_lit29",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x4e DW_OP_lit30
"DW_OP_lit30",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x4f DW_OP_lit31
"DW_OP_lit31",
&DwarfOp::op_lit,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x50 DW_OP_reg0
"DW_OP_reg0",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x51 DW_OP_reg1
"DW_OP_reg1",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x52 DW_OP_reg2
"DW_OP_reg2",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x53 DW_OP_reg3
"DW_OP_reg3",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x54 DW_OP_reg4
"DW_OP_reg4",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x55 DW_OP_reg5
"DW_OP_reg5",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x56 DW_OP_reg6
"DW_OP_reg6",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x57 DW_OP_reg7
"DW_OP_reg7",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x58 DW_OP_reg8
"DW_OP_reg8",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x59 DW_OP_reg9
"DW_OP_reg9",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x5a DW_OP_reg10
"DW_OP_reg10",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x5b DW_OP_reg11
"DW_OP_reg11",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x5c DW_OP_reg12
"DW_OP_reg12",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x5d DW_OP_reg13
"DW_OP_reg13",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x5e DW_OP_reg14
"DW_OP_reg14",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x5f DW_OP_reg15
"DW_OP_reg15",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x60 DW_OP_reg16
"DW_OP_reg16",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x61 DW_OP_reg17
"DW_OP_reg17",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x62 DW_OP_reg18
"DW_OP_reg18",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x63 DW_OP_reg19
"DW_OP_reg19",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x64 DW_OP_reg20
"DW_OP_reg20",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x65 DW_OP_reg21
"DW_OP_reg21",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x66 DW_OP_reg22
"DW_OP_reg22",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x67 DW_OP_reg23
"DW_OP_reg23",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x68 DW_OP_reg24
"DW_OP_reg24",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x69 DW_OP_reg25
"DW_OP_reg25",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x6a DW_OP_reg26
"DW_OP_reg26",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x6b DW_OP_reg27
"DW_OP_reg27",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x6c DW_OP_reg28
"DW_OP_reg28",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x6d DW_OP_reg29
"DW_OP_reg29",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x6e DW_OP_reg30
"DW_OP_reg30",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x6f DW_OP_reg31
"DW_OP_reg31",
&DwarfOp::op_reg,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x70 DW_OP_breg0
"DW_OP_breg0",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x71 DW_OP_breg1
"DW_OP_breg1",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x72 DW_OP_breg2
"DW_OP_breg2",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x73 DW_OP_breg3
"DW_OP_breg3",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x74 DW_OP_breg4
"DW_OP_breg4",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x75 DW_OP_breg5
"DW_OP_breg5",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x76 DW_OP_breg6
"DW_OP_breg6",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x77 DW_OP_breg7
"DW_OP_breg7",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x78 DW_OP_breg8
"DW_OP_breg8",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x79 DW_OP_breg9
"DW_OP_breg9",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x7a DW_OP_breg10
"DW_OP_breg10",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x7b DW_OP_breg11
"DW_OP_breg11",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x7c DW_OP_breg12
"DW_OP_breg12",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x7d DW_OP_breg13
"DW_OP_breg13",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x7e DW_OP_breg14
"DW_OP_breg14",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x7f DW_OP_breg15
"DW_OP_breg15",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x80 DW_OP_breg16
"DW_OP_breg16",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x81 DW_OP_breg17
"DW_OP_breg17",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x82 DW_OP_breg18
"DW_OP_breg18",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x83 DW_OP_breg19
"DW_OP_breg19",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x84 DW_OP_breg20
"DW_OP_breg20",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x85 DW_OP_breg21
"DW_OP_breg21",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x86 DW_OP_breg22
"DW_OP_breg22",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x87 DW_OP_breg23
"DW_OP_breg23",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x88 DW_OP_breg24
"DW_OP_breg24",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x89 DW_OP_breg25
"DW_OP_breg25",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x8a DW_OP_breg26
"DW_OP_breg26",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x8b DW_OP_breg27
"DW_OP_breg27",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x8c DW_OP_breg28
"DW_OP_breg28",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x8d DW_OP_breg29
"DW_OP_breg29",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x8e DW_OP_breg30
"DW_OP_breg30",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x8f DW_OP_breg31
"DW_OP_breg31",
&DwarfOp::op_breg,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x90 DW_OP_regx
"DW_OP_regx",
&DwarfOp::op_regx,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_uleb128},
},
{
// 0x91 DW_OP_fbreg
"DW_OP_fbreg",
&DwarfOp::op_not_implemented,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_sleb128},
},
{
// 0x92 DW_OP_bregx
"DW_OP_bregx",
&DwarfOp::op_bregx,
DWARF_VERSION_2,
0,
2,
{DW_EH_PE_uleb128, DW_EH_PE_sleb128},
},
{
// 0x93 DW_OP_piece
"DW_OP_piece",
&DwarfOp::op_not_implemented,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_uleb128},
},
{
// 0x94 DW_OP_deref_size
"DW_OP_deref_size",
&DwarfOp::op_deref_size,
DWARF_VERSION_2,
1,
1,
{DW_EH_PE_udata1},
},
{
// 0x95 DW_OP_xderef_size
"DW_OP_xderef_size",
&DwarfOp::op_not_implemented,
DWARF_VERSION_2,
0,
1,
{DW_EH_PE_udata1},
},
{
// 0x96 DW_OP_nop
"DW_OP_nop",
&DwarfOp::op_nop,
DWARF_VERSION_2,
0,
0,
{},
},
{
// 0x97 DW_OP_push_object_address
"DW_OP_push_object_address",
&DwarfOp::op_not_implemented,
DWARF_VERSION_3,
0,
0,
{},
},
{
// 0x98 DW_OP_call2
"DW_OP_call2",
&DwarfOp::op_not_implemented,
DWARF_VERSION_3,
0,
1,
{DW_EH_PE_udata2},
},
{
// 0x99 DW_OP_call4
"DW_OP_call4",
&DwarfOp::op_not_implemented,
DWARF_VERSION_3,
0,
1,
{DW_EH_PE_udata4},
},
{
// 0x9a DW_OP_call_ref
"DW_OP_call_ref",
&DwarfOp::op_not_implemented,
DWARF_VERSION_3,
0,
0, // Has a different sized operand (4 bytes or 8 bytes).
{},
},
{
// 0x9b DW_OP_form_tls_address
"DW_OP_form_tls_address",
&DwarfOp::op_not_implemented,
DWARF_VERSION_3,
0,
0,
{},
},
{
// 0x9c DW_OP_call_frame_cfa
"DW_OP_call_frame_cfa",
&DwarfOp::op_not_implemented,
DWARF_VERSION_3,
0,
0,
{},
},
{
// 0x9d DW_OP_bit_piece
"DW_OP_bit_piece",
&DwarfOp::op_not_implemented,
DWARF_VERSION_3,
0,
2,
{DW_EH_PE_uleb128, DW_EH_PE_uleb128},
},
{
// 0x9e DW_OP_implicit_value
"DW_OP_implicit_value",
&DwarfOp::op_not_implemented,
DWARF_VERSION_4,
0,
1,
{DW_EH_PE_uleb128},
},
{
// 0x9f DW_OP_stack_value
"DW_OP_stack_value",
&DwarfOp::op_not_implemented,
DWARF_VERSION_4,
1,
0,
{},
},
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa0 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa1 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa2 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa3 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa4 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa5 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa6 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa7 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa8 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xa9 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xaa illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xab illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xac illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xad illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xae illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xaf illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb0 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb1 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb2 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb3 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb4 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb5 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb6 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb7 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb8 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xb9 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xba illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xbb illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xbc illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xbd illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xbe illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xbf illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc0 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc1 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc2 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc3 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc4 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc5 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc6 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc7 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc8 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xc9 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xca illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xcb illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xcc illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xcd illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xce illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xcf illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd0 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd1 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd2 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd3 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd4 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd5 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd6 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd7 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd8 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xd9 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xda illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xdb illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xdc illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xdd illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xde illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xdf illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe0 DW_OP_lo_user
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe1 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe2 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe3 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe4 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe5 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe6 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe7 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe8 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xe9 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xea illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xeb illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xec illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xed illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xee illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xef illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf0 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf1 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf2 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf3 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf4 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf5 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf6 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf7 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf8 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xf9 illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xfa illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xfb illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xfc illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xfd illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xfe illegal op
{nullptr, nullptr, 0, 0, 0, {}}, // 0xff DW_OP_hi_user
};
};
} // namespace unwindstack
#endif // _LIBUNWINDSTACK_DWARF_OP_H