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