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