10b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Interfaces for libdw.
28701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Copyright (C) 2002-2010 Red Hat, Inc.
30b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   This file is part of Red Hat elfutils.
40b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
50b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
60b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   it under the terms of the GNU General Public License as published by the
70b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Free Software Foundation; version 2 of the License.
80b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
90b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
100b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
110b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
120b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   General Public License for more details.
130b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
140b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   You should have received a copy of the GNU General Public License along
150b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
160b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
170b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
180b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   In addition, as a special exception, Red Hat, Inc. gives You the
190b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   additional right to link the code of Red Hat elfutils with code licensed
200b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   under any Open Source Initiative certified open source license
210b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (http://www.opensource.org/licenses/index.php) which requires the
220b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   distribution of source code with any binary distribution and to
230b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   distribute linked combinations of the two.  Non-GPL Code permitted under
240b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   this exception must only link to the code of Red Hat elfutils through
250b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   those well defined interfaces identified in the file named EXCEPTION
260b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   found in the source code files (the "Approved Interfaces").  The files
270b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   of Non-GPL Code may instantiate templates or use macros or inline
280b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   functions from the Approved Interfaces without causing the resulting
290b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   work to be covered by the GNU General Public License.  Only Red Hat,
300b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Inc. may make changes or additions to the list of Approved Interfaces.
310b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Red Hat's grant of this exception is conditioned upon your not adding
320b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   any new exceptions.  If you wish to add a new Approved Interface or
330b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   exception, please contact Red Hat.  You must obey the GNU General Public
340b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   License in all respects for all of the Red Hat elfutils code and other
350b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   code used in conjunction with Red Hat elfutils except the Non-GPL Code
360b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   covered by this exception.  If you modify this file, you may extend this
370b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   exception to your version of the file, but you are not obligated to do
380b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   so.  If you do not wish to provide this exception without modification,
390b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   you must delete this exception statement from your version and license
400b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   this file solely under the GPL without exception.
410b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
420b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
430b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   An included package of the Open Invention Network is a package for which
440b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
450b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   license is granted, either expressly or impliedly, by designation as an
460b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   included package.  Should you wish to participate in the Open Invention
470b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
480b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   <http://www.openinventionnetwork.com>.  */
490b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
500b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#ifndef _LIBDW_H
510b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#define _LIBDW_H	1
520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
530b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#include <gelf.h>
540b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#include <stdbool.h>
550b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#include <stddef.h>
560b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
570b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
580b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
590b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng# define __nonnull_attribute__(...) __attribute__ ((__nonnull__ (__VA_ARGS__)))
600b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng# define __deprecated_attribute__ __attribute__ ((__deprecated__))
610b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#else
620b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng# define __nonnull_attribute__(args...)
630b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng# define __deprecated_attribute__
640b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#endif
650b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
670b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#ifdef __GNUC_STDC_INLINE__
680b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng# define __libdw_extern_inline extern __inline __attribute__ ((__gnu_inline__))
690b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#else
700b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng# define __libdw_extern_inline extern __inline
710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#endif
720b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
730b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
740b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Mode for the session.  */
750b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef enum
760b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  {
770b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng    DWARF_C_READ,		/* Read .. */
780b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng    DWARF_C_RDWR,		/* Read and write .. */
790b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng    DWARF_C_WRITE,		/* Write .. */
800b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  }
810b863155f625de76a1e3e76bb424497b1870bff3Ben ChengDwarf_Cmd;
820b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
830b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
840b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Callback results.  */
850b863155f625de76a1e3e76bb424497b1870bff3Ben Chengenum
860b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
870b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  DWARF_CB_OK = 0,
880b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  DWARF_CB_ABORT
890b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng};
900b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
910b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
920b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Error values.  */
930b863155f625de76a1e3e76bb424497b1870bff3Ben Chengenum
940b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  {
950b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng    DW_TAG_invalid = 0
960b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#define DW_TAG_invalid	DW_TAG_invalid
970b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  };
980b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
990b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1000b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Type for offset in DWARF file.  */
1010b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef GElf_Off Dwarf_Off;
1020b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1030b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Type for address in DWARF file.  */
1040b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef GElf_Addr Dwarf_Addr;
1050b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1060b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Integer types.  Big enough to hold any numeric value.  */
1070b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef GElf_Xword Dwarf_Word;
1080b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef GElf_Sxword Dwarf_Sword;
1090b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* For the times we know we do not need that much.  */
1100b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef GElf_Half Dwarf_Half;
1110b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1120b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1130b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* DWARF abbreviation record.  */
1140b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf_Abbrev Dwarf_Abbrev;
1150b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1160b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Returned to show the last DIE has be returned.  */
1170b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#define DWARF_END_ABBREV ((Dwarf_Abbrev *) -1l)
1180b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1190b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Source code line information for CU.  */
1200b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf_Lines_s Dwarf_Lines;
1210b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1220b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* One source code line information.  */
1230b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf_Line_s Dwarf_Line;
1240b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1250b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Source file information.  */
1260b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf_Files_s Dwarf_Files;
1270b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1280b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* One address range record.  */
1290b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf_Arange_s Dwarf_Arange;
1300b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1310b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Address ranges of a file.  */
1320b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf_Aranges_s Dwarf_Aranges;
1330b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1340b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* CU representation.  */
1350b863155f625de76a1e3e76bb424497b1870bff3Ben Chengstruct Dwarf_CU;
1360b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1370b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Macro information.  */
1380b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf_Macro_s Dwarf_Macro;
1390b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1400b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Attribute representation.  */
1410b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct
1420b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
1430b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  unsigned int code;
1440b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  unsigned int form;
1450b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  unsigned char *valp;
1460b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  struct Dwarf_CU *cu;
1470b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng} Dwarf_Attribute;
1480b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1490b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1500b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Data block representation.  */
1510b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct
1520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
1530b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  Dwarf_Word length;
1540b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  unsigned char *data;
1550b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng} Dwarf_Block;
1560b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1570b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1580b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* DIE information.  */
1590b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct
1600b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
1610b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  /* The offset can be computed from the address.  */
1620b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  void *addr;
1630b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  struct Dwarf_CU *cu;
1640b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  Dwarf_Abbrev *abbrev;
1650b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  // XXX We'll see what other information will be needed.
1660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  long int padding__;
1670b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng} Dwarf_Die;
1680b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1690b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Returned to show the last DIE has be returned.  */
1700b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#define DWARF_END_DIE ((Dwarf_Die *) -1l)
1710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1720b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1730b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Global symbol information.  */
1740b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct
1750b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
1760b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  Dwarf_Off cu_offset;
1770b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  Dwarf_Off die_offset;
1780b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  const char *name;
1790b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng} Dwarf_Global;
1800b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1810b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1820b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* One operation in a DWARF location expression.
1830b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   A location expression is an array of these.  */
1840b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct
1850b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
1860b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  uint8_t atom;			/* Operation */
1870b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  Dwarf_Word number;		/* Operand */
1880b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  Dwarf_Word number2;		/* Possible second operand */
1890b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  Dwarf_Word offset;		/* Offset in location expression */
1900b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng} Dwarf_Op;
1910b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1920b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
1938701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* This describes one Common Information Entry read from a CFI section.
1948701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Pointers here point into the DATA->d_buf block passed to dwarf_next_cfi.  */
1958701663f8720eaae76448f5d61890e142a67eba1Ben Chengtypedef struct
1968701663f8720eaae76448f5d61890e142a67eba1Ben Cheng{
1978701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_Off CIE_id;	 /* Always DW_CIE_ID_64 in Dwarf_CIE structures.  */
1988701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
1998701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  /* Instruction stream describing initial state used by FDEs.  If
2008701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     we did not understand the whole augmentation string and it did
2018701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     not use 'z', then there might be more augmentation data here
2028701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     (and in FDEs) before the actual instructions.  */
2038701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  const uint8_t *initial_instructions;
2048701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  const uint8_t *initial_instructions_end;
2058701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2068701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_Word code_alignment_factor;
2078701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_Sword data_alignment_factor;
2088701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_Word return_address_register;
2098701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2108701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  const char *augmentation;	/* Augmentation string.  */
2118701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2128701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  /* Augmentation data, might be NULL.  The size is correct only if
2138701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     we understood the augmentation string sufficiently.  */
2148701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  const uint8_t *augmentation_data;
2158701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  size_t augmentation_data_size;
2168701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  size_t fde_augmentation_data_size;
2178701663f8720eaae76448f5d61890e142a67eba1Ben Cheng} Dwarf_CIE;
2188701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2198701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* This describes one Frame Description Entry read from a CFI section.
2208701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Pointers here point into the DATA->d_buf block passed to dwarf_next_cfi.  */
2218701663f8720eaae76448f5d61890e142a67eba1Ben Chengtypedef struct
2228701663f8720eaae76448f5d61890e142a67eba1Ben Cheng{
2238701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  /* Section offset of CIE this FDE refers to.  This will never be
2248701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     DW_CIE_ID_64 in an FDE.  If this value is DW_CIE_ID_64, this is
2258701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     actually a Dwarf_CIE structure.  */
2268701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_Off CIE_pointer;
2278701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2288701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  /* We can't really decode anything further without looking up the CIE
2298701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     and checking its augmentation string.  Here follows the encoded
2308701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     initial_location and address_range, then any augmentation data,
2318701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     then the instruction stream.  This FDE describes PC locations in
2328701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     the byte range [initial_location, initial_location+address_range).
2338701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     When the CIE augmentation string uses 'z', the augmentation data is
2348701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     a DW_FORM_block (self-sized).  Otherwise, when we understand the
2358701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     augmentation string completely, fde_augmentation_data_size gives
2368701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     the number of bytes of augmentation data before the instructions.  */
2378701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  const uint8_t *start;
2388701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  const uint8_t *end;
2398701663f8720eaae76448f5d61890e142a67eba1Ben Cheng} Dwarf_FDE;
2408701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2418701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Each entry in a CFI section is either a CIE described by Dwarf_CIE or
2428701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   an FDE described by Dward_FDE.  Check CIE_id to see which you have.  */
2438701663f8720eaae76448f5d61890e142a67eba1Ben Chengtypedef union
2448701663f8720eaae76448f5d61890e142a67eba1Ben Cheng{
2458701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_Off CIE_id;	 /* Always DW_CIE_ID_64 in Dwarf_CIE structures.  */
2468701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_CIE cie;
2478701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  Dwarf_FDE fde;
2488701663f8720eaae76448f5d61890e142a67eba1Ben Cheng} Dwarf_CFI_Entry;
2498701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2508701663f8720eaae76448f5d61890e142a67eba1Ben Cheng#define dwarf_cfi_cie_p(entry)	((entry)->cie.CIE_id == DW_CIE_ID_64)
2518701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2528701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Opaque type representing a frame state described by CFI.  */
2538701663f8720eaae76448f5d61890e142a67eba1Ben Chengtypedef struct Dwarf_Frame_s Dwarf_Frame;
2548701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2558701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Opaque type representing a CFI section found in a DWARF or ELF file.  */
2568701663f8720eaae76448f5d61890e142a67eba1Ben Chengtypedef struct Dwarf_CFI_s Dwarf_CFI;
2578701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2588701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
2590b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Handle for debug sessions.  */
2600b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef struct Dwarf Dwarf;
2610b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2620b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2630b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Out-Of-Memory handler.  */
2640b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#if __GNUC__ < 4
2650b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef void (*Dwarf_OOM) (void);
2660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#else
2670b863155f625de76a1e3e76bb424497b1870bff3Ben Chengtypedef void (*__attribute__ ((noreturn)) Dwarf_OOM) (void);
2680b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#endif
2690b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2700b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#ifdef __cplusplus
2720b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern "C" {
2730b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#endif
2740b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2750b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Create a handle for a new debug session.  */
2760b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf *dwarf_begin (int fildes, Dwarf_Cmd cmd);
2770b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2780b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Create a handle for a new debug session for an ELF file.  */
2790b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf *dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp);
2800b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2810b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Retrieve ELF descriptor used for DWARF access.  */
2820b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Elf *dwarf_getelf (Dwarf *dwarf);
2830b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2840b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Release debugging handling context.  */
2850b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_end (Dwarf *dwarf);
2860b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2870b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2880b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get the data block for the .debug_info section.  */
2890b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Elf_Data *dwarf_getscn_info (Dwarf *dwarf);
2900b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2918701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Read the header for the DWARF CU.  */
2920b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_nextcu (Dwarf *dwarf, Dwarf_Off off, Dwarf_Off *next_off,
2930b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			 size_t *header_sizep, Dwarf_Off *abbrev_offsetp,
2940b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			 uint8_t *address_sizep, uint8_t *offset_sizep)
2950b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (3);
2960b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
2978701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Read the header of a DWARF CU or type unit.  If TYPE_SIGNATUREP is not
2988701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   null, this reads a type unit from the .debug_types section; otherwise
2998701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   this reads a CU from the .debug_info section.  */
3008701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_next_unit (Dwarf *dwarf, Dwarf_Off off, Dwarf_Off *next_off,
3018701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			    size_t *header_sizep, Dwarf_Half *versionp,
3028701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			    Dwarf_Off *abbrev_offsetp,
3038701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			    uint8_t *address_sizep, uint8_t *offset_sizep,
3048701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			    uint64_t *type_signaturep, Dwarf_Off *type_offsetp)
3058701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     __nonnull_attribute__ (3);
3060b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3078701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3088701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Decode one DWARF CFI entry (CIE or FDE) from the raw section data.
3098701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   The E_IDENT from the originating ELF file indicates the address
3108701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   size and byte order used in the CFI section contained in DATA;
3118701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   EH_FRAME_P should be true for .eh_frame format and false for
3128701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   .debug_frame format.  OFFSET is the byte position in the section
3138701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   to start at; on return *NEXT_OFFSET is filled in with the byte
3148701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   position immediately after this entry.
3158701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3168701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   On success, returns 0 and fills in *ENTRY; use dwarf_cfi_cie_p to
3178701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   see whether ENTRY->cie or ENTRY->fde is valid.
3188701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3198701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   On errors, returns -1.  Some format errors will permit safely
3208701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   skipping to the next CFI entry though the current one is unusable.
3218701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   In that case, *NEXT_OFF will be updated before a -1 return.
3228701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3238701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   If there are no more CFI entries left in the section,
3248701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   returns 1 and sets *NEXT_OFFSET to (Dwarf_Off) -1.  */
3258701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_next_cfi (const unsigned char e_ident[],
3268701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			   Elf_Data *data, bool eh_frame_p,
3278701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			   Dwarf_Off offset, Dwarf_Off *next_offset,
3288701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			   Dwarf_CFI_Entry *entry)
3298701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  __nonnull_attribute__ (1, 2, 5, 6);
3308701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3318701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Use the CFI in the DWARF .debug_frame section.
3328701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Returns NULL if there is no such section (not an error).
3338701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   The pointer returned can be used until dwarf_end is called on DWARF,
3348701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   and must not be passed to dwarf_cfi_end.
3358701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Calling this more than once returns the same pointer.  */
3368701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern Dwarf_CFI *dwarf_getcfi (Dwarf *dwarf);
3378701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3388701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Use the CFI in the ELF file's exception-handling data.
3398701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Returns NULL if there is no such data.
3408701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   The pointer returned can be used until elf_end is called on ELF,
3418701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   and must be passed to dwarf_cfi_end before then.
3428701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Calling this more than once allocates independent data structures.  */
3438701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern Dwarf_CFI *dwarf_getcfi_elf (Elf *elf);
3448701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3458701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Release resources allocated by dwarf_getcfi_elf.  */
3468701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_cfi_end (Dwarf_CFI *cache);
3478701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3488701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3498701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return DIE at given offset in .debug_info section.  */
3500b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Die *dwarf_offdie (Dwarf *dbg, Dwarf_Off offset,
3510b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				Dwarf_Die *result) __nonnull_attribute__ (3);
3520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3538701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return DIE at given offset in .debug_types section.  */
3548701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern Dwarf_Die *dwarf_offdie_types (Dwarf *dbg, Dwarf_Off offset,
3558701663f8720eaae76448f5d61890e142a67eba1Ben Cheng				      Dwarf_Die *result)
3568701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     __nonnull_attribute__ (3);
3578701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
3580b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return offset of DIE.  */
3590b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Off dwarf_dieoffset (Dwarf_Die *die);
3600b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3610b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return offset of DIE in CU.  */
3620b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Off dwarf_cuoffset (Dwarf_Die *die);
3630b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3640b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return CU DIE containing given DIE.  */
3650b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Die *dwarf_diecu (Dwarf_Die *die, Dwarf_Die *result,
3660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			       uint8_t *address_sizep, uint8_t *offset_sizep)
3670b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
3680b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3690b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return CU DIE containing given address.  */
3700b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Die *dwarf_addrdie (Dwarf *dbg, Dwarf_Addr addr,
3710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				 Dwarf_Die *result) __nonnull_attribute__ (3);
3720b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3730b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return child of current DIE.  */
3740b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result)
3750b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
3760b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3770b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Locates the first sibling of DIE and places it in RESULT.
3780b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Returns 0 if a sibling was found, -1 if something went wrong.
3790b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Returns 1 if no sibling could be found and, if RESULT is not
3800b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   the same as DIE, it sets RESULT->addr to the address of the
3810b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (non-sibling) DIE that follows this one, or NULL if this DIE
3828701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   was the last one in the compilation unit.  */
3830b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result)
3840b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
3850b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3860b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Check whether the DIE has children.  */
3870b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_haschildren (Dwarf_Die *die) __nonnull_attribute__ (1);
3880b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
3890b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Walks the attributes of DIE, starting at the one OFFSET bytes in,
3900b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   calling the CALLBACK function for each one.  Stops if the callback
3910b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   function ever returns a value other than DWARF_CB_OK and returns the
3920b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   offset of the offending attribute.  If the end of the attributes
3930b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   is reached 1 is returned.  If something goes wrong -1 is returned and
3940b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   the dwarf error number is set.  */
3950b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern ptrdiff_t dwarf_getattrs (Dwarf_Die *die,
3960b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				 int (*callback) (Dwarf_Attribute *, void *),
3970b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				 void *arg, ptrdiff_t offset)
3980b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
3990b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4000b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return tag of given DIE.  */
4010b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_tag (Dwarf_Die *die) __nonnull_attribute__ (1);
4020b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4030b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4040b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return specific attribute of DIE.  */
4050b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Attribute *dwarf_attr (Dwarf_Die *die, unsigned int search_name,
4060b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				    Dwarf_Attribute *result)
4070b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (3);
4080b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4090b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Check whether given DIE has specific attribute.  */
4100b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_hasattr (Dwarf_Die *die, unsigned int search_name);
4110b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4120b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* These are the same as dwarf_attr and dwarf_hasattr, respectively,
4130b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   but they resolve an indirect attribute through DW_AT_abstract_origin.  */
4140b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Attribute *dwarf_attr_integrate (Dwarf_Die *die,
4150b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng					      unsigned int search_name,
4160b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng					      Dwarf_Attribute *result)
4170b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (3);
4180b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_hasattr_integrate (Dwarf_Die *die, unsigned int search_name);
4190b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4200b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4210b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4220b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4230b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Check whether given attribute has specific form.  */
4240b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_hasform (Dwarf_Attribute *attr, unsigned int search_form);
4250b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4260b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return attribute code of given attribute.  */
4270b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern unsigned int dwarf_whatattr (Dwarf_Attribute *attr);
4280b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4290b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return form code of given attribute.  */
4300b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern unsigned int dwarf_whatform (Dwarf_Attribute *attr);
4310b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4320b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4330b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return string associated with given attribute.  */
4340b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern const char *dwarf_formstring (Dwarf_Attribute *attrp);
4350b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4360b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return unsigned constant represented by attribute.  */
4370b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval)
4380b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4390b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4400b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return signed constant represented by attribute.  */
4410b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_uval)
4420b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4430b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4440b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return address represented by attribute.  */
4450b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_formaddr (Dwarf_Attribute *attr, Dwarf_Addr *return_addr)
4460b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4470b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4480b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* This function is deprecated.  Always use dwarf_formref_die instead.
4490b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Return reference offset represented by attribute.  */
4500b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset)
4510b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2) __deprecated_attribute__;
4520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4530b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Look up the DIE in a reference-form attribute.  */
4540b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Die *dwarf_formref_die (Dwarf_Attribute *attr, Dwarf_Die *die_mem)
4550b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4560b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4570b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return block represented by attribute.  */
4580b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_formblock (Dwarf_Attribute *attr, Dwarf_Block *return_block)
4590b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4600b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4610b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return flag represented by attribute.  */
4620b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_formflag (Dwarf_Attribute *attr, bool *return_bool)
4630b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4640b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4650b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Simplified attribute value access functions.  */
4670b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4680b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return string in name attribute of DIE.  */
4690b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern const char *dwarf_diename (Dwarf_Die *die);
4700b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return high PC attribute of DIE.  */
4720b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr)
4730b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4740b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4750b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return low PC attribute of DIE.  */
4760b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_lowpc (Dwarf_Die *die, Dwarf_Addr *return_addr)
4770b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4780b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4790b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return entry_pc or low_pc attribute of DIE.  */
4800b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_entrypc (Dwarf_Die *die, Dwarf_Addr *return_addr)
4810b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
4820b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4830b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return 1 if DIE's lowpc/highpc or ranges attributes match the PC address,
4840b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   0 if not, or -1 for errors.  */
4850b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_haspc (Dwarf_Die *die, Dwarf_Addr pc);
4860b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4870b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Enumerate the PC address ranges covered by this DIE, covering all
4880b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   addresses where dwarf_haspc returns true.  In the first call OFFSET
4890b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   should be zero and *BASEP need not be initialized.  Returns -1 for
4900b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   errors, zero when there are no more address ranges to report, or a
4910b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   nonzero OFFSET value to pass to the next call.  Each subsequent call
4920b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   must preserve *BASEP from the prior call.  Successful calls fill in
4930b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   *STARTP and *ENDP with a contiguous address range.  */
4940b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern ptrdiff_t dwarf_ranges (Dwarf_Die *die,
4950b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			       ptrdiff_t offset, Dwarf_Addr *basep,
4960b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			       Dwarf_Addr *startp, Dwarf_Addr *endp);
4970b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4980b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
4990b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return byte size attribute of DIE.  */
5000b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_bytesize (Dwarf_Die *die);
5010b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5020b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return bit size attribute of DIE.  */
5030b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_bitsize (Dwarf_Die *die);
5040b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5050b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return bit offset attribute of DIE.  */
5060b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_bitoffset (Dwarf_Die *die);
5070b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5080b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return array order attribute of DIE.  */
5090b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_arrayorder (Dwarf_Die *die);
5100b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5110b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return source language attribute of DIE.  */
5120b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_srclang (Dwarf_Die *die);
5130b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5140b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5150b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get abbreviation at given offset for given DIE.  */
5160b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Abbrev *dwarf_getabbrev (Dwarf_Die *die, Dwarf_Off offset,
5170b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				      size_t *lengthp);
5180b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5190b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get abbreviation at given offset in .debug_abbrev section.  */
5200b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_offabbrev (Dwarf *dbg, Dwarf_Off offset, size_t *lengthp,
5210b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			    Dwarf_Abbrev *abbrevp)
5220b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (4);
5230b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5240b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get abbreviation code.  */
5250b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern unsigned int dwarf_getabbrevcode (Dwarf_Abbrev *abbrev);
5260b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5270b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get abbreviation tag.  */
5280b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern unsigned int dwarf_getabbrevtag (Dwarf_Abbrev *abbrev);
5290b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5300b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return true if abbreviation is children flag set.  */
5310b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_abbrevhaschildren (Dwarf_Abbrev *abbrev);
5320b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5330b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get number of attributes of abbreviation.  */
5340b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getattrcnt (Dwarf_Abbrev *abbrev, size_t *attrcntp)
5350b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
5360b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5370b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get specific attribute of abbreviation.  */
5380b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getabbrevattr (Dwarf_Abbrev *abbrev, size_t idx,
5390b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				unsigned int *namep, unsigned int *formp,
5400b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				Dwarf_Off *offset);
5410b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5420b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5430b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get string from-debug_str section.  */
5440b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern const char *dwarf_getstring (Dwarf *dbg, Dwarf_Off offset,
5450b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				    size_t *lenp);
5460b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5470b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5480b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get public symbol information.  */
5490b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern ptrdiff_t dwarf_getpubnames (Dwarf *dbg,
5500b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				    int (*callback) (Dwarf *, Dwarf_Global *,
5510b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng						     void *),
5520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				    void *arg, ptrdiff_t offset)
5530b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
5540b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5550b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5560b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get source file information for CU.  */
5570b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines,
5580b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      size_t *nlines) __nonnull_attribute__ (2, 3);
5590b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5600b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return one of the source lines of the CU.  */
5610b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Line *dwarf_onesrcline (Dwarf_Lines *lines, size_t idx);
5620b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5630b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get the file source files used in the CU.  */
5640b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files,
5650b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      size_t *nfiles)
5660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
5670b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5680b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5690b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get source for address in CU.  */
5700b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Line *dwarf_getsrc_die (Dwarf_Die *cudie, Dwarf_Addr addr);
5710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5720b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get source for file and line number.  */
5730b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getsrc_file (Dwarf *dbg, const char *fname, int line, int col,
5740b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      Dwarf_Line ***srcsp, size_t *nsrcs)
5750b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2, 5, 6);
5760b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5770b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5780b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return line address.  */
5790b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_lineaddr (Dwarf_Line *line, Dwarf_Addr *addrp);
5800b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5818701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return line VLIW operation index.  */
5828701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_lineop_index (Dwarf_Line *line, unsigned int *op_indexp);
5838701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
5840b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return line number.  */
5850b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_lineno (Dwarf_Line *line, int *linep)
5860b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
5870b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5880b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return column in line.  */
5890b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_linecol (Dwarf_Line *line, int *colp)
5900b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
5910b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5920b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return true if record is for beginning of a statement.  */
5930b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_linebeginstatement (Dwarf_Line *line, bool *flagp)
5940b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
5950b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
5960b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return true if record is for end of sequence.  */
5970b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_lineendsequence (Dwarf_Line *line, bool *flagp)
5980b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
5990b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6000b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return true if record is for beginning of a basic block.  */
6010b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_lineblock (Dwarf_Line *line, bool *flagp)
6020b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
6030b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6040b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return true if record is for end of prologue.  */
6050b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_lineprologueend (Dwarf_Line *line, bool *flagp)
6060b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
6070b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6080b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return true if record is for beginning of epilogue.  */
6090b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_lineepiloguebegin (Dwarf_Line *line, bool *flagp)
6100b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
6110b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6128701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return instruction-set architecture in this record.  */
6138701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_lineisa (Dwarf_Line *line, unsigned int *isap)
6148701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     __nonnull_attribute__ (2);
6158701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
6168701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return code path discriminator in this record.  */
6178701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_linediscriminator (Dwarf_Line *line, unsigned int *discp)
6188701663f8720eaae76448f5d61890e142a67eba1Ben Cheng     __nonnull_attribute__ (2);
6198701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
6200b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6210b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Find line information for address.  */
6220b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern const char *dwarf_linesrc (Dwarf_Line *line,
6230b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				  Dwarf_Word *mtime, Dwarf_Word *length);
6240b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6250b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return file information.  */
6260b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern const char *dwarf_filesrc (Dwarf_Files *file, size_t idx,
6270b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				  Dwarf_Word *mtime, Dwarf_Word *length);
6280b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6290b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return the directory list used in the file information extracted.
6300b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (*RESULT)[0] is the CU's DW_AT_comp_dir value, and may be null.
6310b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (*RESULT)[0..*NDIRS-1] are the compile-time include directory path
6320b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   encoded by the compiler.  */
6330b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getsrcdirs (Dwarf_Files *files,
6340b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			     const char *const **result, size_t *ndirs)
6350b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  __nonnull_attribute__ (2, 3);
6360b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6370b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6380b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return location expression, decoded as a list of operations.  */
6390b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getlocation (Dwarf_Attribute *attr, Dwarf_Op **expr,
6400b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      size_t *exprlen) __nonnull_attribute__ (2, 3);
6410b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6420b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return location expressions.  If the attribute uses a location list,
6430b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   ADDRESS selects the relevant location expressions from the list.
6440b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   There can be multiple matches, resulting in multiple expressions to
6450b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   return.  EXPRS and EXPRLENS are parallel arrays of NLOCS slots to
6460b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   fill in.  Returns the number of locations filled in, or -1 for
6470b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   errors.  If EXPRS is a null pointer, stores nothing and returns the
6480b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   total number of locations.  A return value of zero means that the
6490b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   location list indicated no value is accessible.  */
6500b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address,
6510b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				   Dwarf_Op **exprs, size_t *exprlens,
6520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				   size_t nlocs);
6530b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6548701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return the block associated with a DW_OP_implicit_value operation.
6558701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   The OP pointer must point into an expression that dwarf_getlocation
6568701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   or dwarf_getlocation_addr has returned given the same ATTR.  */
6578701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_getlocation_implicit_value (Dwarf_Attribute *attr,
6588701663f8720eaae76448f5d61890e142a67eba1Ben Cheng					     const Dwarf_Op *op,
6598701663f8720eaae76448f5d61890e142a67eba1Ben Cheng					     Dwarf_Block *return_block)
6608701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  __nonnull_attribute__ (2, 3);
6618701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
6628701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return the attribute indicated by a DW_OP_GNU_implicit_pointer operation.
6638701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   The OP pointer must point into an expression that dwarf_getlocation
6648701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   or dwarf_getlocation_addr has returned given the same ATTR.
6658701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   The result is the DW_AT_location or DW_AT_const_value attribute
6668701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   of the OP->number DIE.  */
6678701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_getlocation_implicit_pointer (Dwarf_Attribute *attr,
6688701663f8720eaae76448f5d61890e142a67eba1Ben Cheng					       const Dwarf_Op *op,
6698701663f8720eaae76448f5d61890e142a67eba1Ben Cheng					       Dwarf_Attribute *result)
6708701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  __nonnull_attribute__ (2, 3);
6718701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
6728701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
6738701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Compute the byte-size of a type DIE according to DWARF rules.
6748701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   For most types, this is just DW_AT_byte_size.
6758701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   For DW_TAG_array_type it can apply much more complex rules.  */
6768701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size);
6778701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
6780b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6790b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return scope DIEs containing PC address.
6800b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
6810b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   and returns the number of elements in the array.
6820b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (*SCOPES)[0] is the DIE for the innermost scope containing PC,
6830b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (*SCOPES)[1] is the DIE for the scope containing that scope, and so on.
6840b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Returns -1 for errors or 0 if no scopes match PC.  */
6850b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getscopes (Dwarf_Die *cudie, Dwarf_Addr pc,
6860b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			    Dwarf_Die **scopes);
6870b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6880b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return scope DIEs containing the given DIE.
6890b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
6900b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   and returns the number of elements in the array.
6910b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (*SCOPES)[0] is a copy of DIE.
6920b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   (*SCOPES)[1] is the DIE for the scope containing that scope, and so on.
6930b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Returns -1 for errors or 0 if DIE is not found in any scope entry.  */
6940b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getscopes_die (Dwarf_Die *die, Dwarf_Die **scopes);
6950b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6960b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
6970b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Search SCOPES[0..NSCOPES-1] for a variable called NAME.
6980b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Ignore the first SKIP_SHADOWS scopes that match the name.
6990b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   If MATCH_FILE is not null, accept only declaration in that source file;
7000b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   if MATCH_LINENO or MATCH_LINECOL are also nonzero, accept only declaration
7010b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   at that line and column.
7020b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7030b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   If successful, fill in *RESULT with the DIE of the variable found,
7040b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   and return N where SCOPES[N] is the scope defining the variable.
7050b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   Return -1 for errors or -2 for no matching variable found.  */
7060b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getscopevar (Dwarf_Die *scopes, int nscopes,
7070b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      const char *name, int skip_shadows,
7080b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      const char *match_file,
7090b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      int match_lineno, int match_linecol,
7100b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			      Dwarf_Die *result);
7110b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7120b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7130b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7140b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return list address ranges.  */
7150b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getaranges (Dwarf *dbg, Dwarf_Aranges **aranges,
7160b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			     size_t *naranges)
7170b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
7180b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7190b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return one of the address range entries.  */
7200b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Arange *dwarf_onearange (Dwarf_Aranges *aranges, size_t idx);
7210b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7220b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return information in address range record.  */
7230b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_getarangeinfo (Dwarf_Arange *arange, Dwarf_Addr *addrp,
7240b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				Dwarf_Word *lengthp, Dwarf_Off *offsetp);
7250b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7260b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get address range which includes given address.  */
7270b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_Arange *dwarf_getarange_addr (Dwarf_Aranges *aranges,
7280b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng					   Dwarf_Addr addr);
7290b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7300b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7310b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7320b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get functions in CUDIE.  */
7330b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern ptrdiff_t dwarf_getfuncs (Dwarf_Die *cudie,
7340b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				 int (*callback) (Dwarf_Die *, void *),
7350b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				 void *arg, ptrdiff_t offset);
7360b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7370b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7380b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return file name containing definition of the given declaration.  */
7390b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern const char *dwarf_decl_file (Dwarf_Die *decl);
7400b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7410b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get line number of beginning of given declaration.  */
7420b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_decl_line (Dwarf_Die *decl, int *linep)
7430b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
7440b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7450b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Get column number of beginning of given declaration.  */
7460b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_decl_column (Dwarf_Die *decl, int *colp)
7470b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
7480b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7490b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7500b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return nonzero if given function is an abstract inline definition.  */
7510b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_func_inline (Dwarf_Die *func);
7520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7530b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Find each concrete inlined instance of the abstract inline definition.  */
7540b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_func_inline_instances (Dwarf_Die *func,
7550b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng					int (*callback) (Dwarf_Die *, void *),
7560b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng					void *arg);
7570b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7580b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7590b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Find the appropriate PC location or locations for function entry
7600b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   breakpoints for the given DW_TAG_subprogram DIE.  Returns -1 for errors.
7610b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   On success, returns the number of breakpoint locations (never zero)
7620b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   and sets *BKPTS to a malloc'd vector of addresses.  */
7630b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_entry_breakpoints (Dwarf_Die *die, Dwarf_Addr **bkpts);
7640b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7650b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Call callback function for each of the macro information entry for
7670b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   the CU.  */
7680b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern ptrdiff_t dwarf_getmacros (Dwarf_Die *cudie,
7690b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				  int (*callback) (Dwarf_Macro *, void *),
7700b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng				  void *arg, ptrdiff_t offset)
7710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
7720b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7730b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return macro opcode.  */
7740b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_macro_opcode (Dwarf_Macro *macro, unsigned int *opcodep)
7750b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
7760b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7770b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return first macro parameter.  */
7780b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_macro_param1 (Dwarf_Macro *macro, Dwarf_Word *paramp)
7790b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng     __nonnull_attribute__ (2);
7800b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7810b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return second macro parameter.  */
7820b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_macro_param2 (Dwarf_Macro *macro, Dwarf_Word *paramp,
7830b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng			       const char **strp);
7840b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7850b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
7868701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Compute what's known about a call frame when the PC is at ADDRESS.
7878701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Returns 0 for success or -1 for errors.
7888701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   On success, *FRAME is a malloc'd pointer.  */
7898701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_cfi_addrframe (Dwarf_CFI *cache,
7908701663f8720eaae76448f5d61890e142a67eba1Ben Cheng				Dwarf_Addr address, Dwarf_Frame **frame)
7918701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  __nonnull_attribute__ (3);
7928701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
7938701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return the DWARF register number used in FRAME to denote
7948701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   the return address in FRAME's caller frame.  The remaining
7958701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   arguments can be non-null to fill in more information.
7968701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
7978701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Fill [*START, *END) with the PC range to which FRAME's information applies.
7988701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Fill in *SIGNALP to indicate whether this is a signal-handling frame.
7998701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   If true, this is the implicit call frame that calls a signal handler.
8008701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   This frame's "caller" is actually the interrupted state, not a call;
8018701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   its return address is an exact PC, not a PC after a call instruction.  */
8028701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_frame_info (Dwarf_Frame *frame,
8038701663f8720eaae76448f5d61890e142a67eba1Ben Cheng			     Dwarf_Addr *start, Dwarf_Addr *end, bool *signalp);
8048701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8058701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Return a DWARF expression that yields the Canonical Frame Address at
8068701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   this frame state.  Returns -1 for errors, or zero for success, with
8078701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   *NOPS set to the number of operations stored at *OPS.  That pointer
8088701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   can be used only as long as FRAME is alive and unchanged.  *NOPS is
8098701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   zero if the CFA cannot be determined here.  Note that if nonempty,
8108701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   *OPS is a DWARF expression, not a location description--append
8118701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   DW_OP_stack_value to a get a location description for the CFA.  */
8128701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_frame_cfa (Dwarf_Frame *frame, Dwarf_Op **ops, size_t *nops)
8138701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  __nonnull_attribute__ (2);
8148701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8158701663f8720eaae76448f5d61890e142a67eba1Ben Cheng/* Deliver a DWARF location description that yields the location or
8168701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   value of DWARF register number REGNO in the state described by FRAME.
8178701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8188701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   Returns -1 for errors or zero for success, setting *NOPS to the
8198701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   number of operations in the array stored at *OPS.  Note the last
8208701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   operation is DW_OP_stack_value if there is no mutable location but
8218701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   only a computable value.
8228701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8238701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   *NOPS zero with *OPS set to OPS_MEM means CFI says the caller's
8248701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   REGNO is "undefined", i.e. it's call-clobbered and cannot be recovered.
8258701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8268701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   *NOPS zero with *OPS set to a null pointer means CFI says the
8278701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   caller's REGNO is "same_value", i.e. this frame did not change it;
8288701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   ask the caller frame where to find it.
8298701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8308701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   For common simple expressions *OPS is OPS_MEM.  For arbitrary DWARF
8318701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   expressions in the CFI, *OPS is an internal pointer that can be used as
8328701663f8720eaae76448f5d61890e142a67eba1Ben Cheng   long as the Dwarf_CFI used to create FRAME remains alive.  */
8338701663f8720eaae76448f5d61890e142a67eba1Ben Chengextern int dwarf_frame_register (Dwarf_Frame *frame, int regno,
8348701663f8720eaae76448f5d61890e142a67eba1Ben Cheng				 Dwarf_Op ops_mem[3],
8358701663f8720eaae76448f5d61890e142a67eba1Ben Cheng				 Dwarf_Op **ops, size_t *nops)
8368701663f8720eaae76448f5d61890e142a67eba1Ben Cheng  __nonnull_attribute__ (3, 4, 5);
8378701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8388701663f8720eaae76448f5d61890e142a67eba1Ben Cheng
8390b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return error code of last failing function call.  This value is kept
8400b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   separately for each thread.  */
8410b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern int dwarf_errno (void);
8420b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8430b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return error string for ERROR.  If ERROR is zero, return error string
8440b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   for most recent error or NULL is none occurred.  If ERROR is -1 the
8450b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   behaviour is similar to the last case except that not NULL but a legal
8460b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng   string is returned.  */
8470b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern const char *dwarf_errmsg (int err);
8480b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8490b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8500b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Register new Out-Of-Memory handler.  The old handler is returned.  */
8510b863155f625de76a1e3e76bb424497b1870bff3Ben Chengextern Dwarf_OOM dwarf_new_oom_handler (Dwarf *dbg, Dwarf_OOM handler);
8520b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8530b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8540b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Inline optimizations.  */
8550b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#ifdef __OPTIMIZE__
8560b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return attribute code of given attribute.  */
8570b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng__libdw_extern_inline unsigned int
8580b863155f625de76a1e3e76bb424497b1870bff3Ben Chengdwarf_whatattr (Dwarf_Attribute *attr)
8590b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
8600b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  return attr == NULL ? 0 : attr->code;
8610b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng}
8620b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8630b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng/* Return attribute code of given attribute.  */
8640b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng__libdw_extern_inline unsigned int
8650b863155f625de76a1e3e76bb424497b1870bff3Ben Chengdwarf_whatform (Dwarf_Attribute *attr)
8660b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng{
8670b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng  return attr == NULL ? 0 : attr->form;
8680b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng}
8690b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#endif	/* Optimize.  */
8700b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8710b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#ifdef __cplusplus
8720b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng}
8730b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#endif
8740b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng
8750b863155f625de76a1e3e76bb424497b1870bff3Ben Cheng#endif	/* libdw.h */
876