libdw.h revision 8701663f8720eaae76448f5d61890e142a67eba1
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