13c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Internal definitions for libdw CFI interpreter. 2b4b2de9f1f1fb694b77371a61f808a1641bbafeaMark Wielaard Copyright (C) 2009-2010, 2013, 2015 Red Hat, Inc. 3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard This file is part of elfutils. 43c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard This file is free software; you can redistribute it and/or modify 6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard it under the terms of either 73c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard * the GNU Lesser General Public License as published by the Free 9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard Software Foundation; either version 3 of the License, or (at 10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard your option) any later version 11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard or 13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard * the GNU General Public License as published by the Free 15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard Software Foundation; either version 2 of the License, or (at 16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard your option) any later version 17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 18de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard or both in parallel, as here. 19de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 20de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard elfutils is distributed in the hope that it will be useful, but 213c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath WITHOUT ANY WARRANTY; without even the implied warranty of 223c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 233c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath General Public License for more details. 243c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 25de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard You should have received copies of the GNU General Public License and 26de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard the GNU Lesser General Public License along with this program. If 27de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard not, see <http://www.gnu.org/licenses/>. */ 283c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 293c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#ifndef _UNWINDP_H 303c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#define _UNWINDP_H 1 313c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 323c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#include "libdwP.h" 333c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#include "libelfP.h" 343c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathstruct ebl; 353c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 363c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Cached CIE representation. */ 373c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathstruct dwarf_cie 383c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath{ 393c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Off offset; /* Our position, as seen in FDEs' CIE_pointer. */ 403c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 413c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Word code_alignment_factor; 423c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Sword data_alignment_factor; 433c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Word return_address_register; 443c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 453c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath size_t fde_augmentation_data_size; 463c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 473c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath // play out to initial state 483c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const uint8_t *initial_instructions; 493c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const uint8_t *initial_instructions_end; 503c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 513c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const Dwarf_Frame *initial_state; 523c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 533c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath uint8_t fde_encoding; /* DW_EH_PE_* for addresses in FDEs. */ 543c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath uint8_t lsda_encoding; /* DW_EH_PE_* for LSDA in FDE augmentation. */ 553c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 563c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath bool sized_augmentation_data; /* Saw 'z': FDEs have self-sized data. */ 573c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath bool signal_frame; /* Saw 'S': FDE is for a signal frame. */ 583c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath}; 593c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 603c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Cached FDE representation. */ 613c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathstruct dwarf_fde 623c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath{ 633c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath struct dwarf_cie *cie; 643c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 653c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* This FDE describes PC values in [start, end). */ 663c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr start; 673c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr end; 683c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 693c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const uint8_t *instructions; 703c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const uint8_t *instructions_end; 713c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath}; 723c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 733c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* This holds everything we cache about the CFI from each ELF file's 743c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath .debug_frame or .eh_frame section. */ 753c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathstruct Dwarf_CFI_s 763c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath{ 773c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Dwarf handle we came from. If null, this is .eh_frame data. */ 783c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf *dbg; 793c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#define CFI_IS_EH(cfi) ((cfi)->dbg == NULL) 803c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 813c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Data of the .debug_frame or .eh_frame section. */ 823c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Elf_Data_Scn *data; 833c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const unsigned char *e_ident; /* For EI_DATA and EI_CLASS. */ 843c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 853c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr frame_vaddr; /* DW_EH_PE_pcrel, address of frame section. */ 863c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr textrel; /* DW_EH_PE_textrel base address. */ 873c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr datarel; /* DW_EH_PE_datarel base address. */ 883c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 893c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Location of next unread entry in the section. */ 903c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Off next_offset; 913c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 923c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Search tree for the CIEs, indexed by CIE_pointer (section offset). */ 933c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath void *cie_tree; 943c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 953c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Search tree for the FDEs, indexed by PC address. */ 963c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath void *fde_tree; 973c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 983c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Search tree for parsed DWARF expressions, indexed by raw pointer. */ 993c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath void *expr_tree; 1003c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1013c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Backend hook. */ 1023c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath struct ebl *ebl; 1033c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1043c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Binary search table in .eh_frame_hdr section. */ 1053c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const uint8_t *search_table; 106b4b2de9f1f1fb694b77371a61f808a1641bbafeaMark Wielaard size_t search_table_len; 1073c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr search_table_vaddr; 1083c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath size_t search_table_entries; 1093c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath uint8_t search_table_encoding; 1103c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1113c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* True if the file has a byte order different from the host. */ 1123c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath bool other_byte_order; 1133c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1143c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Default rule for registers not previously mentioned 1153c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath is same_value, not undefined. */ 1163c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath bool default_same_value; 1173c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath}; 1183c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1193c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1203c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathenum dwarf_frame_rule 1213c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath { 1223c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_unspecified, /* Uninitialized state. */ 1233c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_undefined, /* DW_CFA_undefined */ 1243c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_same_value, /* DW_CFA_same_value */ 1253c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_offset, /* DW_CFA_offset_extended et al */ 1263c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_val_offset, /* DW_CFA_val_offset et al */ 1273c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_register, /* DW_CFA_register */ 1283c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_expression, /* DW_CFA_expression */ 1293c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath reg_val_expression, /* DW_CFA_val_expression */ 1303c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath }; 1313c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1323c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* This describes what we know about an individual register. */ 1333c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathstruct dwarf_frame_register 1343c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath{ 1353c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath enum dwarf_frame_rule rule:3; 1363c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1373c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* The meaning of the value bits depends on the rule: 1383c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1393c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Rule Value 1403c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath ---- ----- 1413c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath undefined unused 1423c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath same_value unused 1433c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath offset(N) N (register saved at CFA + value) 1443c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath val_offset(N) N (register = CFA + value) 1453c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath register(R) R (register = register #value) 1463c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath expression(E) section offset of DW_FORM_block containing E 1473c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath (register saved at address E computes) 1483c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath val_expression(E) section offset of DW_FORM_block containing E 1493c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath (register = value E computes) 1503c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath */ 1513c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Sword value:(sizeof (Dwarf_Sword) * 8 - 3); 1523c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath}; 1533c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1540b867460075c9f02cb305abc91a0e12b90017583Jan Kratochvil/* This holds instructions for unwinding frame at a particular PC location 1550b867460075c9f02cb305abc91a0e12b90017583Jan Kratochvil described by an FDE. */ 1563c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathstruct Dwarf_Frame_s 1573c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath{ 1583c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* This frame description covers PC values in [start, end). */ 1593c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr start; 1603c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr end; 1613c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1623c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_CFI *cache; 1633c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1643c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* Previous state saved by DW_CFA_remember_state, or .cie->initial_state, 1653c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath or NULL in an initial_state pseudo-frame. */ 1663c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Frame *prev; 1673c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1683c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* The FDE that generated this frame state. This points to its CIE, 1693c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath which has the return_address_register and signal_frame flag. */ 1703c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath struct dwarf_fde *fde; 1713c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1723b10ac0ade6aae156b76884421eb82985b4e9be8Roland McGrath /* The CFA is unknown, is R+N, or is computed by a DWARF expression. 1733b10ac0ade6aae156b76884421eb82985b4e9be8Roland McGrath A bogon in the CFI can indicate an invalid/incalculable rule. 1743b10ac0ade6aae156b76884421eb82985b4e9be8Roland McGrath We store that as cfa_invalid rather than barfing when processing it, 1753b10ac0ade6aae156b76884421eb82985b4e9be8Roland McGrath so callers can ignore the bogon unless they really need that CFA. */ 1763b10ac0ade6aae156b76884421eb82985b4e9be8Roland McGrath enum { cfa_undefined, cfa_offset, cfa_expr, cfa_invalid } cfa_rule; 1773c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath union 1783c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath { 1793c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Op offset; 1803c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Block expr; 1813c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath } cfa_data; 1823c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath /* We store an offset rule as a DW_OP_bregx operation. */ 1833c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#define cfa_val_reg cfa_data.offset.number 1843c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#define cfa_val_offset cfa_data.offset.number2 1853c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1863c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath size_t nregs; 1873c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath struct dwarf_frame_register regs[]; 1883c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath}; 1893c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1903c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1913c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Clean up the data structure and all it points to. */ 1923c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathextern void __libdw_destroy_frame_cache (Dwarf_CFI *cache) 1933c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath __nonnull_attribute__ (1) internal_function; 1943c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 1953c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Enter a CIE encountered while reading through for FDEs. */ 1963c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathextern void __libdw_intern_cie (Dwarf_CFI *cache, Dwarf_Off offset, 1973c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const Dwarf_CIE *info) 1983c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath __nonnull_attribute__ (1, 3) internal_function; 1993c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2003c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Look up a CIE_pointer for random access. */ 2013c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathextern struct dwarf_cie *__libdw_find_cie (Dwarf_CFI *cache, Dwarf_Off offset) 2023c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath __nonnull_attribute__ (1) internal_function; 2033c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2043c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2053c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Look for an FDE covering the given PC address. */ 2063c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathextern struct dwarf_fde *__libdw_find_fde (Dwarf_CFI *cache, 2073c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr address) 2083c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath __nonnull_attribute__ (1) internal_function; 2093c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2103e4b5bbeca8987527c11a1ea048459a7ebd4ab5eRoland McGrath/* Look for an FDE by its offset in the section. */ 2113e4b5bbeca8987527c11a1ea048459a7ebd4ab5eRoland McGrathextern struct dwarf_fde *__libdw_fde_by_offset (Dwarf_CFI *cache, 2123e4b5bbeca8987527c11a1ea048459a7ebd4ab5eRoland McGrath Dwarf_Off offset) 2133e4b5bbeca8987527c11a1ea048459a7ebd4ab5eRoland McGrath __nonnull_attribute__ (1) internal_function; 2143e4b5bbeca8987527c11a1ea048459a7ebd4ab5eRoland McGrath 2153c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Process the FDE that contains the given PC address, 2163c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath to yield the frame state when stopped there. 2173c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath The return value is a DWARF_E_* error code. */ 2183c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathextern int __libdw_frame_at_address (Dwarf_CFI *cache, struct dwarf_fde *fde, 2193c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath Dwarf_Addr address, Dwarf_Frame **frame) 2203c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath __nonnull_attribute__ (1, 2, 4) internal_function; 2213c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2223c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2233c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath/* Dummy struct for memory-access.h macros. */ 2243c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#define BYTE_ORDER_DUMMY(var, e_ident) \ 2253c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath const struct { bool other_byte_order; } var = \ 2263c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath { ((BYTE_ORDER == LITTLE_ENDIAN && e_ident[EI_DATA] == ELFDATA2MSB) \ 2273c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath || (BYTE_ORDER == BIG_ENDIAN && e_ident[EI_DATA] == ELFDATA2LSB)) } 2283c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2293c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2303c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathINTDECL (dwarf_next_cfi) 2313c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathINTDECL (dwarf_getcfi) 2323c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathINTDECL (dwarf_getcfi_elf) 2333c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathINTDECL (dwarf_cfi_end) 2343c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrathINTDECL (dwarf_cfi_addrframe) 2353c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath 2363c84db3b4b610bf636c4363abb6d3dac5ae020f9Roland McGrath#endif /* unwindP.h */ 237