125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Internal definitions for libdw CFI interpreter. 203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes Copyright (C) 2009-2010, 2013 Red Hat, Inc. 303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes This file is part of elfutils. 425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes This file is free software; you can redistribute it and/or modify 603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes it under the terms of either 725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes * the GNU Lesser General Public License as published by the Free 903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes Software Foundation; either version 3 of the License, or (at 1003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes your option) any later version 1103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes 1203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes or 1303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes 1403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes * the GNU General Public License as published by the Free 1503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes Software Foundation; either version 2 of the License, or (at 1603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes your option) any later version 1703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes 1803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes or both in parallel, as here. 1903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes 2003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes elfutils is distributed in the hope that it will be useful, but 2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng WITHOUT ANY WARRANTY; without even the implied warranty of 2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng General Public License for more details. 2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 2503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes You should have received copies of the GNU General Public License and 2603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes the GNU Lesser General Public License along with this program. If 2703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes not, see <http://www.gnu.org/licenses/>. */ 2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef _UNWINDP_H 3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define _UNWINDP_H 1 3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "libdwP.h" 3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "libelfP.h" 3425b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct ebl; 3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Cached CIE representation. */ 3725b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct dwarf_cie 3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off offset; /* Our position, as seen in FDEs' CIE_pointer. */ 4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word code_alignment_factor; 4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Sword data_alignment_factor; 4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word return_address_register; 4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t fde_augmentation_data_size; 4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng // play out to initial state 4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *initial_instructions; 4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *initial_instructions_end; 5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng const Dwarf_Frame *initial_state; 5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint8_t fde_encoding; /* DW_EH_PE_* for addresses in FDEs. */ 5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint8_t lsda_encoding; /* DW_EH_PE_* for LSDA in FDE augmentation. */ 5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool sized_augmentation_data; /* Saw 'z': FDEs have self-sized data. */ 5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool signal_frame; /* Saw 'S': FDE is for a signal frame. */ 5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Cached FDE representation. */ 6125b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct dwarf_fde 6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct dwarf_cie *cie; 6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* This FDE describes PC values in [start, end). */ 6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr start; 6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr end; 6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *instructions; 7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *instructions_end; 7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* This holds everything we cache about the CFI from each ELF file's 7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng .debug_frame or .eh_frame section. */ 7525b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Dwarf_CFI_s 7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Dwarf handle we came from. If null, this is .eh_frame data. */ 7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf *dbg; 7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define CFI_IS_EH(cfi) ((cfi)->dbg == NULL) 8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Data of the .debug_frame or .eh_frame section. */ 8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data_Scn *data; 8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const unsigned char *e_ident; /* For EI_DATA and EI_CLASS. */ 8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr frame_vaddr; /* DW_EH_PE_pcrel, address of frame section. */ 8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr textrel; /* DW_EH_PE_textrel base address. */ 8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr datarel; /* DW_EH_PE_datarel base address. */ 8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Location of next unread entry in the section. */ 9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off next_offset; 9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Search tree for the CIEs, indexed by CIE_pointer (section offset). */ 9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *cie_tree; 9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Search tree for the FDEs, indexed by PC address. */ 9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *fde_tree; 9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Search tree for parsed DWARF expressions, indexed by raw pointer. */ 9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *expr_tree; 10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Backend hook. */ 10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct ebl *ebl; 10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Binary search table in .eh_frame_hdr section. */ 10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *search_table; 10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr search_table_vaddr; 10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t search_table_entries; 10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint8_t search_table_encoding; 10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if the file has a byte order different from the host. */ 11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool other_byte_order; 11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Default rule for registers not previously mentioned 11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng is same_value, not undefined. */ 11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool default_same_value; 11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11925b3c049e70834cf33790a28643ab058b507b35cBen Chengenum dwarf_frame_rule 12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_unspecified, /* Uninitialized state. */ 12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_undefined, /* DW_CFA_undefined */ 12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_same_value, /* DW_CFA_same_value */ 12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_offset, /* DW_CFA_offset_extended et al */ 12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_val_offset, /* DW_CFA_val_offset et al */ 12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_register, /* DW_CFA_register */ 12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_expression, /* DW_CFA_expression */ 12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng reg_val_expression, /* DW_CFA_val_expression */ 12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng }; 13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* This describes what we know about an individual register. */ 13225b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct dwarf_frame_register 13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum dwarf_frame_rule rule:3; 13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The meaning of the value bits depends on the rule: 13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Rule Value 13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng ---- ----- 14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng undefined unused 14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng same_value unused 14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng offset(N) N (register saved at CFA + value) 14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng val_offset(N) N (register = CFA + value) 14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng register(R) R (register = register #value) 14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng expression(E) section offset of DW_FORM_block containing E 14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng (register saved at address E computes) 14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng val_expression(E) section offset of DW_FORM_block containing E 14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng (register = value E computes) 14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng */ 15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Sword value:(sizeof (Dwarf_Sword) * 8 - 3); 15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes/* This holds instructions for unwinding frame at a particular PC location 15403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes described by an FDE. */ 15525b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Dwarf_Frame_s 15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* This frame description covers PC values in [start, end). */ 15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr start; 15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr end; 16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_CFI *cache; 16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Previous state saved by DW_CFA_remember_state, or .cie->initial_state, 16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng or NULL in an initial_state pseudo-frame. */ 16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Frame *prev; 16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The FDE that generated this frame state. This points to its CIE, 16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng which has the return_address_register and signal_frame flag. */ 16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct dwarf_fde *fde; 17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The CFA is unknown, is R+N, or is computed by a DWARF expression. 17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng A bogon in the CFI can indicate an invalid/incalculable rule. 17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng We store that as cfa_invalid rather than barfing when processing it, 17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng so callers can ignore the bogon unless they really need that CFA. */ 17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum { cfa_undefined, cfa_offset, cfa_expr, cfa_invalid } cfa_rule; 17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng union 17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Op offset; 17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Block expr; 18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng } cfa_data; 18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* We store an offset rule as a DW_OP_bregx operation. */ 18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define cfa_val_reg cfa_data.offset.number 18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define cfa_val_offset cfa_data.offset.number2 18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nregs; 18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct dwarf_frame_register regs[]; 18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Clean up the data structure and all it points to. */ 19125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void __libdw_destroy_frame_cache (Dwarf_CFI *cache) 19225b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (1) internal_function; 19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Enter a CIE encountered while reading through for FDEs. */ 19525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void __libdw_intern_cie (Dwarf_CFI *cache, Dwarf_Off offset, 19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng const Dwarf_CIE *info) 19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (1, 3) internal_function; 19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Look up a CIE_pointer for random access. */ 20025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct dwarf_cie *__libdw_find_cie (Dwarf_CFI *cache, Dwarf_Off offset) 20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (1) internal_function; 20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Look for an FDE covering the given PC address. */ 20525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct dwarf_fde *__libdw_find_fde (Dwarf_CFI *cache, 20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr address) 20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (1) internal_function; 20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Look for an FDE by its offset in the section. */ 21025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct dwarf_fde *__libdw_fde_by_offset (Dwarf_CFI *cache, 21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off offset) 21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (1) internal_function; 21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 21425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Process the FDE that contains the given PC address, 21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng to yield the frame state when stopped there. 21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng The return value is a DWARF_E_* error code. */ 21725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int __libdw_frame_at_address (Dwarf_CFI *cache, struct dwarf_fde *fde, 21825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr address, Dwarf_Frame **frame) 21925b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (1, 2, 4) internal_function; 22025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 22125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 22225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Dummy struct for memory-access.h macros. */ 22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define BYTE_ORDER_DUMMY(var, e_ident) \ 22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const struct { bool other_byte_order; } var = \ 22525b3c049e70834cf33790a28643ab058b507b35cBen Cheng { ((BYTE_ORDER == LITTLE_ENDIAN && e_ident[EI_DATA] == ELFDATA2MSB) \ 22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng || (BYTE_ORDER == BIG_ENDIAN && e_ident[EI_DATA] == ELFDATA2LSB)) } 22725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 22925b3c049e70834cf33790a28643ab058b507b35cBen ChengINTDECL (dwarf_next_cfi) 23025b3c049e70834cf33790a28643ab058b507b35cBen ChengINTDECL (dwarf_getcfi) 23125b3c049e70834cf33790a28643ab058b507b35cBen ChengINTDECL (dwarf_getcfi_elf) 23225b3c049e70834cf33790a28643ab058b507b35cBen ChengINTDECL (dwarf_cfi_end) 23325b3c049e70834cf33790a28643ab058b507b35cBen ChengINTDECL (dwarf_cfi_addrframe) 23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif /* unwindP.h */ 236