125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Interfaces for libdw. 225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Copyright (C) 2002-2010 Red Hat, Inc. 325b3c049e70834cf33790a28643ab058b507b35cBen Cheng This file is part of Red Hat elfutils. 425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Red Hat elfutils is free software; you can redistribute it and/or modify 625b3c049e70834cf33790a28643ab058b507b35cBen Cheng it under the terms of the GNU General Public License as published by the 725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Free Software Foundation; version 2 of the License. 825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Red Hat elfutils is distributed in the hope that it will be useful, but 1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng WITHOUT ANY WARRANTY; without even the implied warranty of 1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1225b3c049e70834cf33790a28643ab058b507b35cBen Cheng General Public License for more details. 1325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1425b3c049e70834cf33790a28643ab058b507b35cBen Cheng You should have received a copy of the GNU General Public License along 1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng with Red Hat elfutils; if not, write to the Free Software Foundation, 1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. 1725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng In addition, as a special exception, Red Hat, Inc. gives You the 1925b3c049e70834cf33790a28643ab058b507b35cBen Cheng additional right to link the code of Red Hat elfutils with code licensed 2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng under any Open Source Initiative certified open source license 2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng (http://www.opensource.org/licenses/index.php) which requires the 2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng distribution of source code with any binary distribution and to 2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng distribute linked combinations of the two. Non-GPL Code permitted under 2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng this exception must only link to the code of Red Hat elfutils through 2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng those well defined interfaces identified in the file named EXCEPTION 2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng found in the source code files (the "Approved Interfaces"). The files 2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng of Non-GPL Code may instantiate templates or use macros or inline 2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng functions from the Approved Interfaces without causing the resulting 2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng work to be covered by the GNU General Public License. Only Red Hat, 3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Inc. may make changes or additions to the list of Approved Interfaces. 3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Red Hat's grant of this exception is conditioned upon your not adding 3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng any new exceptions. If you wish to add a new Approved Interface or 3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng exception, please contact Red Hat. You must obey the GNU General Public 3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng License in all respects for all of the Red Hat elfutils code and other 3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng code used in conjunction with Red Hat elfutils except the Non-GPL Code 3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng covered by this exception. If you modify this file, you may extend this 3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng exception to your version of the file, but you are not obligated to do 3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng so. If you do not wish to provide this exception without modification, 3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng you must delete this exception statement from your version and license 4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng this file solely under the GPL without exception. 4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Red Hat elfutils is an included package of the Open Invention Network. 4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng An included package of the Open Invention Network is a package for which 4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Open Invention Network licensees cross-license their patents. No patent 4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng license is granted, either expressly or impliedly, by designation as an 4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng included package. Should you wish to participate in the Open Invention 4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Network licensing program, please visit www.openinventionnetwork.com 4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng <http://www.openinventionnetwork.com>. */ 4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef _LIBDW_H 5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define _LIBDW_H 1 5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <gelf.h> 5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdbool.h> 5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stddef.h> 5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) 5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define __nonnull_attribute__(...) __attribute__ ((__nonnull__ (__VA_ARGS__))) 6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define __deprecated_attribute__ __attribute__ ((__deprecated__)) 6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else 6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define __nonnull_attribute__(args...) 6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define __deprecated_attribute__ 6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef __GNUC_STDC_INLINE__ 6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define __libdw_extern_inline extern __inline __attribute__ ((__gnu_inline__)) 6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else 7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define __libdw_extern_inline extern __inline 7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Mode for the session. */ 7525b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef enum 7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DWARF_C_READ, /* Read .. */ 7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng DWARF_C_RDWR, /* Read and write .. */ 7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng DWARF_C_WRITE, /* Write .. */ 8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 8125b3c049e70834cf33790a28643ab058b507b35cBen ChengDwarf_Cmd; 8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Callback results. */ 8525b3c049e70834cf33790a28643ab058b507b35cBen Chengenum 8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DWARF_CB_OK = 0, 8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng DWARF_CB_ABORT 8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Error values. */ 9325b3c049e70834cf33790a28643ab058b507b35cBen Chengenum 9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng DW_TAG_invalid = 0 9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define DW_TAG_invalid DW_TAG_invalid 9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng }; 9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Type for offset in DWARF file. */ 10125b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef GElf_Off Dwarf_Off; 10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Type for address in DWARF file. */ 10425b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef GElf_Addr Dwarf_Addr; 10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Integer types. Big enough to hold any numeric value. */ 10725b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef GElf_Xword Dwarf_Word; 10825b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef GElf_Sxword Dwarf_Sword; 10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* For the times we know we do not need that much. */ 11025b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef GElf_Half Dwarf_Half; 11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* DWARF abbreviation record. */ 11425b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Abbrev Dwarf_Abbrev; 11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Returned to show the last DIE has be returned. */ 11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define DWARF_END_ABBREV ((Dwarf_Abbrev *) -1l) 11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Source code line information for CU. */ 12025b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Lines_s Dwarf_Lines; 12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* One source code line information. */ 12325b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Line_s Dwarf_Line; 12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Source file information. */ 12625b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Files_s Dwarf_Files; 12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* One address range record. */ 12925b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Arange_s Dwarf_Arange; 13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Address ranges of a file. */ 13225b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Aranges_s Dwarf_Aranges; 13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* CU representation. */ 13525b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Dwarf_CU; 13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Macro information. */ 13825b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Macro_s Dwarf_Macro; 13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Attribute representation. */ 14125b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct 14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int code; 14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int form; 14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned char *valp; 14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Dwarf_CU *cu; 14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_Attribute; 14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Data block representation. */ 15125b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct 15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word length; 15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned char *data; 15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_Block; 15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* DIE information. */ 15925b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct 16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The offset can be computed from the address. */ 16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *addr; 16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Dwarf_CU *cu; 16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Abbrev *abbrev; 16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng // XXX We'll see what other information will be needed. 16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng long int padding__; 16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_Die; 16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Returned to show the last DIE has be returned. */ 17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define DWARF_END_DIE ((Dwarf_Die *) -1l) 17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Global symbol information. */ 17425b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct 17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off cu_offset; 17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off die_offset; 17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *name; 17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_Global; 18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* One operation in a DWARF location expression. 18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng A location expression is an array of these. */ 18425b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct 18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint8_t atom; /* Operation */ 18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word number; /* Operand */ 18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word number2; /* Possible second operand */ 18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word offset; /* Offset in location expression */ 19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_Op; 19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* This describes one Common Information Entry read from a CFI section. 19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Pointers here point into the DATA->d_buf block passed to dwarf_next_cfi. */ 19525b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct 19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off CIE_id; /* Always DW_CIE_ID_64 in Dwarf_CIE structures. */ 19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Instruction stream describing initial state used by FDEs. If 20025b3c049e70834cf33790a28643ab058b507b35cBen Cheng we did not understand the whole augmentation string and it did 20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng not use 'z', then there might be more augmentation data here 20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng (and in FDEs) before the actual instructions. */ 20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *initial_instructions; 20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *initial_instructions_end; 20525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word code_alignment_factor; 20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Sword data_alignment_factor; 20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word return_address_register; 20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *augmentation; /* Augmentation string. */ 21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Augmentation data, might be NULL. The size is correct only if 21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng we understood the augmentation string sufficiently. */ 21425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *augmentation_data; 21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t augmentation_data_size; 21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t fde_augmentation_data_size; 21725b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_CIE; 21825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 21925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* This describes one Frame Description Entry read from a CFI section. 22025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Pointers here point into the DATA->d_buf block passed to dwarf_next_cfi. */ 22125b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct 22225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Section offset of CIE this FDE refers to. This will never be 22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng DW_CIE_ID_64 in an FDE. If this value is DW_CIE_ID_64, this is 22525b3c049e70834cf33790a28643ab058b507b35cBen Cheng actually a Dwarf_CIE structure. */ 22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off CIE_pointer; 22725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* We can't really decode anything further without looking up the CIE 22925b3c049e70834cf33790a28643ab058b507b35cBen Cheng and checking its augmentation string. Here follows the encoded 23025b3c049e70834cf33790a28643ab058b507b35cBen Cheng initial_location and address_range, then any augmentation data, 23125b3c049e70834cf33790a28643ab058b507b35cBen Cheng then the instruction stream. This FDE describes PC locations in 23225b3c049e70834cf33790a28643ab058b507b35cBen Cheng the byte range [initial_location, initial_location+address_range). 23325b3c049e70834cf33790a28643ab058b507b35cBen Cheng When the CIE augmentation string uses 'z', the augmentation data is 23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng a DW_FORM_block (self-sized). Otherwise, when we understand the 23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng augmentation string completely, fde_augmentation_data_size gives 23625b3c049e70834cf33790a28643ab058b507b35cBen Cheng the number of bytes of augmentation data before the instructions. */ 23725b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *start; 23825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const uint8_t *end; 23925b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_FDE; 24025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 24125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Each entry in a CFI section is either a CIE described by Dwarf_CIE or 24225b3c049e70834cf33790a28643ab058b507b35cBen Cheng an FDE described by Dward_FDE. Check CIE_id to see which you have. */ 24325b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef union 24425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 24525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off CIE_id; /* Always DW_CIE_ID_64 in Dwarf_CIE structures. */ 24625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_CIE cie; 24725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_FDE fde; 24825b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Dwarf_CFI_Entry; 24925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define dwarf_cfi_cie_p(entry) ((entry)->cie.CIE_id == DW_CIE_ID_64) 25125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Opaque type representing a frame state described by CFI. */ 25325b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_Frame_s Dwarf_Frame; 25425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Opaque type representing a CFI section found in a DWARF or ELF file. */ 25625b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf_CFI_s Dwarf_CFI; 25725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Handle for debug sessions. */ 26025b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct Dwarf Dwarf; 26125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 26225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 26325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Out-Of-Memory handler. */ 26425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#if __GNUC__ < 4 26525b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef void (*Dwarf_OOM) (void); 26625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else 26725b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef void (*__attribute__ ((noreturn)) Dwarf_OOM) (void); 26825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 26925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 27025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 27125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef __cplusplus 27225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern "C" { 27325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 27425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 27525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Create a handle for a new debug session. */ 27625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf *dwarf_begin (int fildes, Dwarf_Cmd cmd); 27725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 27825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Create a handle for a new debug session for an ELF file. */ 27925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf *dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp); 28025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Retrieve ELF descriptor used for DWARF access. */ 28225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Elf *dwarf_getelf (Dwarf *dwarf); 28325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Release debugging handling context. */ 28525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_end (Dwarf *dwarf); 28625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get the data block for the .debug_info section. */ 28925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Elf_Data *dwarf_getscn_info (Dwarf *dwarf); 29025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 29125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Read the header for the DWARF CU. */ 29225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_nextcu (Dwarf *dwarf, Dwarf_Off off, Dwarf_Off *next_off, 29325b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *header_sizep, Dwarf_Off *abbrev_offsetp, 29425b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint8_t *address_sizep, uint8_t *offset_sizep) 29525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (3); 29625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 29725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Read the header of a DWARF CU or type unit. If TYPE_SIGNATUREP is not 29825b3c049e70834cf33790a28643ab058b507b35cBen Cheng null, this reads a type unit from the .debug_types section; otherwise 29925b3c049e70834cf33790a28643ab058b507b35cBen Cheng this reads a CU from the .debug_info section. */ 30025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_next_unit (Dwarf *dwarf, Dwarf_Off off, Dwarf_Off *next_off, 30125b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *header_sizep, Dwarf_Half *versionp, 30225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off *abbrev_offsetp, 30325b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint8_t *address_sizep, uint8_t *offset_sizep, 30425b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint64_t *type_signaturep, Dwarf_Off *type_offsetp) 30525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (3); 30625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 30725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 30825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Decode one DWARF CFI entry (CIE or FDE) from the raw section data. 30925b3c049e70834cf33790a28643ab058b507b35cBen Cheng The E_IDENT from the originating ELF file indicates the address 31025b3c049e70834cf33790a28643ab058b507b35cBen Cheng size and byte order used in the CFI section contained in DATA; 31125b3c049e70834cf33790a28643ab058b507b35cBen Cheng EH_FRAME_P should be true for .eh_frame format and false for 31225b3c049e70834cf33790a28643ab058b507b35cBen Cheng .debug_frame format. OFFSET is the byte position in the section 31325b3c049e70834cf33790a28643ab058b507b35cBen Cheng to start at; on return *NEXT_OFFSET is filled in with the byte 31425b3c049e70834cf33790a28643ab058b507b35cBen Cheng position immediately after this entry. 31525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 31625b3c049e70834cf33790a28643ab058b507b35cBen Cheng On success, returns 0 and fills in *ENTRY; use dwarf_cfi_cie_p to 31725b3c049e70834cf33790a28643ab058b507b35cBen Cheng see whether ENTRY->cie or ENTRY->fde is valid. 31825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 31925b3c049e70834cf33790a28643ab058b507b35cBen Cheng On errors, returns -1. Some format errors will permit safely 32025b3c049e70834cf33790a28643ab058b507b35cBen Cheng skipping to the next CFI entry though the current one is unusable. 32125b3c049e70834cf33790a28643ab058b507b35cBen Cheng In that case, *NEXT_OFF will be updated before a -1 return. 32225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 32325b3c049e70834cf33790a28643ab058b507b35cBen Cheng If there are no more CFI entries left in the section, 32425b3c049e70834cf33790a28643ab058b507b35cBen Cheng returns 1 and sets *NEXT_OFFSET to (Dwarf_Off) -1. */ 32525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_next_cfi (const unsigned char e_ident[], 32625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data *data, bool eh_frame_p, 32725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off offset, Dwarf_Off *next_offset, 32825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_CFI_Entry *entry) 32925b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (1, 2, 5, 6); 33025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 33125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Use the CFI in the DWARF .debug_frame section. 33225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns NULL if there is no such section (not an error). 33325b3c049e70834cf33790a28643ab058b507b35cBen Cheng The pointer returned can be used until dwarf_end is called on DWARF, 33425b3c049e70834cf33790a28643ab058b507b35cBen Cheng and must not be passed to dwarf_cfi_end. 33525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Calling this more than once returns the same pointer. */ 33625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_CFI *dwarf_getcfi (Dwarf *dwarf); 33725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 33825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Use the CFI in the ELF file's exception-handling data. 33925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns NULL if there is no such data. 34025b3c049e70834cf33790a28643ab058b507b35cBen Cheng The pointer returned can be used until elf_end is called on ELF, 34125b3c049e70834cf33790a28643ab058b507b35cBen Cheng and must be passed to dwarf_cfi_end before then. 34225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Calling this more than once allocates independent data structures. */ 34325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_CFI *dwarf_getcfi_elf (Elf *elf); 34425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 34525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Release resources allocated by dwarf_getcfi_elf. */ 34625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_cfi_end (Dwarf_CFI *cache); 34725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 34825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 34925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return DIE at given offset in .debug_info section. */ 35025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Die *dwarf_offdie (Dwarf *dbg, Dwarf_Off offset, 35125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Die *result) __nonnull_attribute__ (3); 35225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 35325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return DIE at given offset in .debug_types section. */ 35425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Die *dwarf_offdie_types (Dwarf *dbg, Dwarf_Off offset, 35525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Die *result) 35625b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (3); 35725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 35825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return offset of DIE. */ 35925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Off dwarf_dieoffset (Dwarf_Die *die); 36025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 36125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return offset of DIE in CU. */ 36225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Off dwarf_cuoffset (Dwarf_Die *die); 36325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 36425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return CU DIE containing given DIE. */ 36525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Die *dwarf_diecu (Dwarf_Die *die, Dwarf_Die *result, 36625b3c049e70834cf33790a28643ab058b507b35cBen Cheng uint8_t *address_sizep, uint8_t *offset_sizep) 36725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 36825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 36925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return CU DIE containing given address. */ 37025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Die *dwarf_addrdie (Dwarf *dbg, Dwarf_Addr addr, 37125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Die *result) __nonnull_attribute__ (3); 37225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 37325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return child of current DIE. */ 37425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result) 37525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 37625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 37725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Locates the first sibling of DIE and places it in RESULT. 37825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns 0 if a sibling was found, -1 if something went wrong. 37925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns 1 if no sibling could be found and, if RESULT is not 38025b3c049e70834cf33790a28643ab058b507b35cBen Cheng the same as DIE, it sets RESULT->addr to the address of the 38125b3c049e70834cf33790a28643ab058b507b35cBen Cheng (non-sibling) DIE that follows this one, or NULL if this DIE 38225b3c049e70834cf33790a28643ab058b507b35cBen Cheng was the last one in the compilation unit. */ 38325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result) 38425b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 38525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 38625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether the DIE has children. */ 38725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_haschildren (Dwarf_Die *die) __nonnull_attribute__ (1); 38825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 38925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Walks the attributes of DIE, starting at the one OFFSET bytes in, 39025b3c049e70834cf33790a28643ab058b507b35cBen Cheng calling the CALLBACK function for each one. Stops if the callback 39125b3c049e70834cf33790a28643ab058b507b35cBen Cheng function ever returns a value other than DWARF_CB_OK and returns the 39225b3c049e70834cf33790a28643ab058b507b35cBen Cheng offset of the offending attribute. If the end of the attributes 39325b3c049e70834cf33790a28643ab058b507b35cBen Cheng is reached 1 is returned. If something goes wrong -1 is returned and 39425b3c049e70834cf33790a28643ab058b507b35cBen Cheng the dwarf error number is set. */ 39525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern ptrdiff_t dwarf_getattrs (Dwarf_Die *die, 39625b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*callback) (Dwarf_Attribute *, void *), 39725b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *arg, ptrdiff_t offset) 39825b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 39925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return tag of given DIE. */ 40125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_tag (Dwarf_Die *die) __nonnull_attribute__ (1); 40225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return specific attribute of DIE. */ 40525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Attribute *dwarf_attr (Dwarf_Die *die, unsigned int search_name, 40625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Attribute *result) 40725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (3); 40825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether given DIE has specific attribute. */ 41025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_hasattr (Dwarf_Die *die, unsigned int search_name); 41125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 41225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* These are the same as dwarf_attr and dwarf_hasattr, respectively, 41325b3c049e70834cf33790a28643ab058b507b35cBen Cheng but they resolve an indirect attribute through DW_AT_abstract_origin. */ 41425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Attribute *dwarf_attr_integrate (Dwarf_Die *die, 41525b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int search_name, 41625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Attribute *result) 41725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (3); 41825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_hasattr_integrate (Dwarf_Die *die, unsigned int search_name); 41925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 42025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 42125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 42225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 42325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether given attribute has specific form. */ 42425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_hasform (Dwarf_Attribute *attr, unsigned int search_form); 42525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 42625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return attribute code of given attribute. */ 42725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern unsigned int dwarf_whatattr (Dwarf_Attribute *attr); 42825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 42925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return form code of given attribute. */ 43025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern unsigned int dwarf_whatform (Dwarf_Attribute *attr); 43125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 43225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 43325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return string associated with given attribute. */ 43425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *dwarf_formstring (Dwarf_Attribute *attrp); 43525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 43625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return unsigned constant represented by attribute. */ 43725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval) 43825b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 43925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 44025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return signed constant represented by attribute. */ 44125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_uval) 44225b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 44325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 44425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return address represented by attribute. */ 44525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_formaddr (Dwarf_Attribute *attr, Dwarf_Addr *return_addr) 44625b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 44725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 44825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* This function is deprecated. Always use dwarf_formref_die instead. 44925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Return reference offset represented by attribute. */ 45025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset) 45125b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2) __deprecated_attribute__; 45225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 45325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Look up the DIE in a reference-form attribute. */ 45425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Die *dwarf_formref_die (Dwarf_Attribute *attr, Dwarf_Die *die_mem) 45525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 45625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 45725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return block represented by attribute. */ 45825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_formblock (Dwarf_Attribute *attr, Dwarf_Block *return_block) 45925b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 46025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 46125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return flag represented by attribute. */ 46225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_formflag (Dwarf_Attribute *attr, bool *return_bool) 46325b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 46425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 46525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 46625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Simplified attribute value access functions. */ 46725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 46825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return string in name attribute of DIE. */ 46925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *dwarf_diename (Dwarf_Die *die); 47025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 47125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return high PC attribute of DIE. */ 47225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr) 47325b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 47425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 47525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return low PC attribute of DIE. */ 47625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lowpc (Dwarf_Die *die, Dwarf_Addr *return_addr) 47725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 47825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 47925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return entry_pc or low_pc attribute of DIE. */ 48025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_entrypc (Dwarf_Die *die, Dwarf_Addr *return_addr) 48125b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 48225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 48325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return 1 if DIE's lowpc/highpc or ranges attributes match the PC address, 48425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 0 if not, or -1 for errors. */ 48525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_haspc (Dwarf_Die *die, Dwarf_Addr pc); 48625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 48725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Enumerate the PC address ranges covered by this DIE, covering all 48825b3c049e70834cf33790a28643ab058b507b35cBen Cheng addresses where dwarf_haspc returns true. In the first call OFFSET 48925b3c049e70834cf33790a28643ab058b507b35cBen Cheng should be zero and *BASEP need not be initialized. Returns -1 for 49025b3c049e70834cf33790a28643ab058b507b35cBen Cheng errors, zero when there are no more address ranges to report, or a 49125b3c049e70834cf33790a28643ab058b507b35cBen Cheng nonzero OFFSET value to pass to the next call. Each subsequent call 49225b3c049e70834cf33790a28643ab058b507b35cBen Cheng must preserve *BASEP from the prior call. Successful calls fill in 49325b3c049e70834cf33790a28643ab058b507b35cBen Cheng *STARTP and *ENDP with a contiguous address range. */ 49425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern ptrdiff_t dwarf_ranges (Dwarf_Die *die, 49525b3c049e70834cf33790a28643ab058b507b35cBen Cheng ptrdiff_t offset, Dwarf_Addr *basep, 49625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr *startp, Dwarf_Addr *endp); 49725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 49825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 49925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return byte size attribute of DIE. */ 50025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_bytesize (Dwarf_Die *die); 50125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 50225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return bit size attribute of DIE. */ 50325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_bitsize (Dwarf_Die *die); 50425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 50525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return bit offset attribute of DIE. */ 50625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_bitoffset (Dwarf_Die *die); 50725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 50825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return array order attribute of DIE. */ 50925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_arrayorder (Dwarf_Die *die); 51025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 51125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return source language attribute of DIE. */ 51225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_srclang (Dwarf_Die *die); 51325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 51425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 51525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get abbreviation at given offset for given DIE. */ 51625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Abbrev *dwarf_getabbrev (Dwarf_Die *die, Dwarf_Off offset, 51725b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *lengthp); 51825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 51925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get abbreviation at given offset in .debug_abbrev section. */ 52025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_offabbrev (Dwarf *dbg, Dwarf_Off offset, size_t *lengthp, 52125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Abbrev *abbrevp) 52225b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (4); 52325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 52425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get abbreviation code. */ 52525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern unsigned int dwarf_getabbrevcode (Dwarf_Abbrev *abbrev); 52625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 52725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get abbreviation tag. */ 52825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern unsigned int dwarf_getabbrevtag (Dwarf_Abbrev *abbrev); 52925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 53025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return true if abbreviation is children flag set. */ 53125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_abbrevhaschildren (Dwarf_Abbrev *abbrev); 53225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 53325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get number of attributes of abbreviation. */ 53425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getattrcnt (Dwarf_Abbrev *abbrev, size_t *attrcntp) 53525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 53625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 53725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get specific attribute of abbreviation. */ 53825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getabbrevattr (Dwarf_Abbrev *abbrev, size_t idx, 53925b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int *namep, unsigned int *formp, 54025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Off *offset); 54125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 54225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 54325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get string from-debug_str section. */ 54425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *dwarf_getstring (Dwarf *dbg, Dwarf_Off offset, 54525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *lenp); 54625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 54725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 54825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get public symbol information. */ 54925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern ptrdiff_t dwarf_getpubnames (Dwarf *dbg, 55025b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*callback) (Dwarf *, Dwarf_Global *, 55125b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *), 55225b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *arg, ptrdiff_t offset) 55325b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 55425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 55525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 55625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get source file information for CU. */ 55725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, 55825b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *nlines) __nonnull_attribute__ (2, 3); 55925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 56025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return one of the source lines of the CU. */ 56125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Line *dwarf_onesrcline (Dwarf_Lines *lines, size_t idx); 56225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 56325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get the file source files used in the CU. */ 56425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, 56525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *nfiles) 56625b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 56725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 56825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 56925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get source for address in CU. */ 57025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Line *dwarf_getsrc_die (Dwarf_Die *cudie, Dwarf_Addr addr); 57125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 57225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get source for file and line number. */ 57325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getsrc_file (Dwarf *dbg, const char *fname, int line, int col, 57425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Line ***srcsp, size_t *nsrcs) 57525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2, 5, 6); 57625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 57725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 57825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return line address. */ 57925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineaddr (Dwarf_Line *line, Dwarf_Addr *addrp); 58025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 58125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return line VLIW operation index. */ 58225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineop_index (Dwarf_Line *line, unsigned int *op_indexp); 58325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 58425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return line number. */ 58525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineno (Dwarf_Line *line, int *linep) 58625b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 58725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 58825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return column in line. */ 58925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_linecol (Dwarf_Line *line, int *colp) 59025b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 59125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 59225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return true if record is for beginning of a statement. */ 59325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_linebeginstatement (Dwarf_Line *line, bool *flagp) 59425b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 59525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 59625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return true if record is for end of sequence. */ 59725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineendsequence (Dwarf_Line *line, bool *flagp) 59825b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 59925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 60025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return true if record is for beginning of a basic block. */ 60125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineblock (Dwarf_Line *line, bool *flagp) 60225b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 60325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 60425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return true if record is for end of prologue. */ 60525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineprologueend (Dwarf_Line *line, bool *flagp) 60625b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 60725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 60825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return true if record is for beginning of epilogue. */ 60925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineepiloguebegin (Dwarf_Line *line, bool *flagp) 61025b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 61125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 61225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return instruction-set architecture in this record. */ 61325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_lineisa (Dwarf_Line *line, unsigned int *isap) 61425b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 61525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 61625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return code path discriminator in this record. */ 61725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_linediscriminator (Dwarf_Line *line, unsigned int *discp) 61825b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 61925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 62025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 62125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Find line information for address. */ 62225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *dwarf_linesrc (Dwarf_Line *line, 62325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word *mtime, Dwarf_Word *length); 62425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 62525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return file information. */ 62625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *dwarf_filesrc (Dwarf_Files *file, size_t idx, 62725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word *mtime, Dwarf_Word *length); 62825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 62925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return the directory list used in the file information extracted. 63025b3c049e70834cf33790a28643ab058b507b35cBen Cheng (*RESULT)[0] is the CU's DW_AT_comp_dir value, and may be null. 63125b3c049e70834cf33790a28643ab058b507b35cBen Cheng (*RESULT)[0..*NDIRS-1] are the compile-time include directory path 63225b3c049e70834cf33790a28643ab058b507b35cBen Cheng encoded by the compiler. */ 63325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getsrcdirs (Dwarf_Files *files, 63425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *const **result, size_t *ndirs) 63525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2, 3); 63625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 63725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 63825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return location expression, decoded as a list of operations. */ 63925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getlocation (Dwarf_Attribute *attr, Dwarf_Op **expr, 64025b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *exprlen) __nonnull_attribute__ (2, 3); 64125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 64225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return location expressions. If the attribute uses a location list, 64325b3c049e70834cf33790a28643ab058b507b35cBen Cheng ADDRESS selects the relevant location expressions from the list. 64425b3c049e70834cf33790a28643ab058b507b35cBen Cheng There can be multiple matches, resulting in multiple expressions to 64525b3c049e70834cf33790a28643ab058b507b35cBen Cheng return. EXPRS and EXPRLENS are parallel arrays of NLOCS slots to 64625b3c049e70834cf33790a28643ab058b507b35cBen Cheng fill in. Returns the number of locations filled in, or -1 for 64725b3c049e70834cf33790a28643ab058b507b35cBen Cheng errors. If EXPRS is a null pointer, stores nothing and returns the 64825b3c049e70834cf33790a28643ab058b507b35cBen Cheng total number of locations. A return value of zero means that the 64925b3c049e70834cf33790a28643ab058b507b35cBen Cheng location list indicated no value is accessible. */ 65025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address, 65125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Op **exprs, size_t *exprlens, 65225b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nlocs); 65325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 65425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return the block associated with a DW_OP_implicit_value operation. 65525b3c049e70834cf33790a28643ab058b507b35cBen Cheng The OP pointer must point into an expression that dwarf_getlocation 65625b3c049e70834cf33790a28643ab058b507b35cBen Cheng or dwarf_getlocation_addr has returned given the same ATTR. */ 65725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getlocation_implicit_value (Dwarf_Attribute *attr, 65825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const Dwarf_Op *op, 65925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Block *return_block) 66025b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2, 3); 66125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 66225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return the attribute indicated by a DW_OP_GNU_implicit_pointer operation. 66325b3c049e70834cf33790a28643ab058b507b35cBen Cheng The OP pointer must point into an expression that dwarf_getlocation 66425b3c049e70834cf33790a28643ab058b507b35cBen Cheng or dwarf_getlocation_addr has returned given the same ATTR. 66525b3c049e70834cf33790a28643ab058b507b35cBen Cheng The result is the DW_AT_location or DW_AT_const_value attribute 66625b3c049e70834cf33790a28643ab058b507b35cBen Cheng of the OP->number DIE. */ 66725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getlocation_implicit_pointer (Dwarf_Attribute *attr, 66825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const Dwarf_Op *op, 66925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Attribute *result) 67025b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2, 3); 67125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 67225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 67325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Compute the byte-size of a type DIE according to DWARF rules. 67425b3c049e70834cf33790a28643ab058b507b35cBen Cheng For most types, this is just DW_AT_byte_size. 67525b3c049e70834cf33790a28643ab058b507b35cBen Cheng For DW_TAG_array_type it can apply much more complex rules. */ 67625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size); 67725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 67825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 67925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return scope DIEs containing PC address. 68025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Sets *SCOPES to a malloc'd array of Dwarf_Die structures, 68125b3c049e70834cf33790a28643ab058b507b35cBen Cheng and returns the number of elements in the array. 68225b3c049e70834cf33790a28643ab058b507b35cBen Cheng (*SCOPES)[0] is the DIE for the innermost scope containing PC, 68325b3c049e70834cf33790a28643ab058b507b35cBen Cheng (*SCOPES)[1] is the DIE for the scope containing that scope, and so on. 68425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns -1 for errors or 0 if no scopes match PC. */ 68525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getscopes (Dwarf_Die *cudie, Dwarf_Addr pc, 68625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Die **scopes); 68725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 68825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return scope DIEs containing the given DIE. 68925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Sets *SCOPES to a malloc'd array of Dwarf_Die structures, 69025b3c049e70834cf33790a28643ab058b507b35cBen Cheng and returns the number of elements in the array. 69125b3c049e70834cf33790a28643ab058b507b35cBen Cheng (*SCOPES)[0] is a copy of DIE. 69225b3c049e70834cf33790a28643ab058b507b35cBen Cheng (*SCOPES)[1] is the DIE for the scope containing that scope, and so on. 69325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns -1 for errors or 0 if DIE is not found in any scope entry. */ 69425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getscopes_die (Dwarf_Die *die, Dwarf_Die **scopes); 69525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 69625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 69725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Search SCOPES[0..NSCOPES-1] for a variable called NAME. 69825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Ignore the first SKIP_SHADOWS scopes that match the name. 69925b3c049e70834cf33790a28643ab058b507b35cBen Cheng If MATCH_FILE is not null, accept only declaration in that source file; 70025b3c049e70834cf33790a28643ab058b507b35cBen Cheng if MATCH_LINENO or MATCH_LINECOL are also nonzero, accept only declaration 70125b3c049e70834cf33790a28643ab058b507b35cBen Cheng at that line and column. 70225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 70325b3c049e70834cf33790a28643ab058b507b35cBen Cheng If successful, fill in *RESULT with the DIE of the variable found, 70425b3c049e70834cf33790a28643ab058b507b35cBen Cheng and return N where SCOPES[N] is the scope defining the variable. 70525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Return -1 for errors or -2 for no matching variable found. */ 70625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getscopevar (Dwarf_Die *scopes, int nscopes, 70725b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *name, int skip_shadows, 70825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *match_file, 70925b3c049e70834cf33790a28643ab058b507b35cBen Cheng int match_lineno, int match_linecol, 71025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Die *result); 71125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 71225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 71325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 71425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return list address ranges. */ 71525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getaranges (Dwarf *dbg, Dwarf_Aranges **aranges, 71625b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t *naranges) 71725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 71825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 71925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return one of the address range entries. */ 72025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Arange *dwarf_onearange (Dwarf_Aranges *aranges, size_t idx); 72125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 72225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return information in address range record. */ 72325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_getarangeinfo (Dwarf_Arange *arange, Dwarf_Addr *addrp, 72425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Word *lengthp, Dwarf_Off *offsetp); 72525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 72625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get address range which includes given address. */ 72725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_Arange *dwarf_getarange_addr (Dwarf_Aranges *aranges, 72825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr addr); 72925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get functions in CUDIE. */ 73325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern ptrdiff_t dwarf_getfuncs (Dwarf_Die *cudie, 73425b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*callback) (Dwarf_Die *, void *), 73525b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *arg, ptrdiff_t offset); 73625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return file name containing definition of the given declaration. */ 73925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *dwarf_decl_file (Dwarf_Die *decl); 74025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 74125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get line number of beginning of given declaration. */ 74225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_decl_line (Dwarf_Die *decl, int *linep) 74325b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 74425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 74525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get column number of beginning of given declaration. */ 74625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_decl_column (Dwarf_Die *decl, int *colp) 74725b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 74825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 74925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 75025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return nonzero if given function is an abstract inline definition. */ 75125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_func_inline (Dwarf_Die *func); 75225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 75325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Find each concrete inlined instance of the abstract inline definition. */ 75425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_func_inline_instances (Dwarf_Die *func, 75525b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*callback) (Dwarf_Die *, void *), 75625b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *arg); 75725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 75825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 75925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Find the appropriate PC location or locations for function entry 76025b3c049e70834cf33790a28643ab058b507b35cBen Cheng breakpoints for the given DW_TAG_subprogram DIE. Returns -1 for errors. 76125b3c049e70834cf33790a28643ab058b507b35cBen Cheng On success, returns the number of breakpoint locations (never zero) 76225b3c049e70834cf33790a28643ab058b507b35cBen Cheng and sets *BKPTS to a malloc'd vector of addresses. */ 76325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_entry_breakpoints (Dwarf_Die *die, Dwarf_Addr **bkpts); 76425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 76525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 76625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Call callback function for each of the macro information entry for 76725b3c049e70834cf33790a28643ab058b507b35cBen Cheng the CU. */ 76825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern ptrdiff_t dwarf_getmacros (Dwarf_Die *cudie, 76925b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*callback) (Dwarf_Macro *, void *), 77025b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *arg, ptrdiff_t offset) 77125b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 77225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 77325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return macro opcode. */ 77425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_macro_opcode (Dwarf_Macro *macro, unsigned int *opcodep) 77525b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 77625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 77725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return first macro parameter. */ 77825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_macro_param1 (Dwarf_Macro *macro, Dwarf_Word *paramp) 77925b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 78025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 78125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return second macro parameter. */ 78225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_macro_param2 (Dwarf_Macro *macro, Dwarf_Word *paramp, 78325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char **strp); 78425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 78525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 78625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Compute what's known about a call frame when the PC is at ADDRESS. 78725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns 0 for success or -1 for errors. 78825b3c049e70834cf33790a28643ab058b507b35cBen Cheng On success, *FRAME is a malloc'd pointer. */ 78925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_cfi_addrframe (Dwarf_CFI *cache, 79025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr address, Dwarf_Frame **frame) 79125b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (3); 79225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 79325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return the DWARF register number used in FRAME to denote 79425b3c049e70834cf33790a28643ab058b507b35cBen Cheng the return address in FRAME's caller frame. The remaining 79525b3c049e70834cf33790a28643ab058b507b35cBen Cheng arguments can be non-null to fill in more information. 79625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 79725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Fill [*START, *END) with the PC range to which FRAME's information applies. 79825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Fill in *SIGNALP to indicate whether this is a signal-handling frame. 79925b3c049e70834cf33790a28643ab058b507b35cBen Cheng If true, this is the implicit call frame that calls a signal handler. 80025b3c049e70834cf33790a28643ab058b507b35cBen Cheng This frame's "caller" is actually the interrupted state, not a call; 80125b3c049e70834cf33790a28643ab058b507b35cBen Cheng its return address is an exact PC, not a PC after a call instruction. */ 80225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_frame_info (Dwarf_Frame *frame, 80325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Addr *start, Dwarf_Addr *end, bool *signalp); 80425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 80525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return a DWARF expression that yields the Canonical Frame Address at 80625b3c049e70834cf33790a28643ab058b507b35cBen Cheng this frame state. Returns -1 for errors, or zero for success, with 80725b3c049e70834cf33790a28643ab058b507b35cBen Cheng *NOPS set to the number of operations stored at *OPS. That pointer 80825b3c049e70834cf33790a28643ab058b507b35cBen Cheng can be used only as long as FRAME is alive and unchanged. *NOPS is 80925b3c049e70834cf33790a28643ab058b507b35cBen Cheng zero if the CFA cannot be determined here. Note that if nonempty, 81025b3c049e70834cf33790a28643ab058b507b35cBen Cheng *OPS is a DWARF expression, not a location description--append 81125b3c049e70834cf33790a28643ab058b507b35cBen Cheng DW_OP_stack_value to a get a location description for the CFA. */ 81225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_frame_cfa (Dwarf_Frame *frame, Dwarf_Op **ops, size_t *nops) 81325b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (2); 81425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 81525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Deliver a DWARF location description that yields the location or 81625b3c049e70834cf33790a28643ab058b507b35cBen Cheng value of DWARF register number REGNO in the state described by FRAME. 81725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 81825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Returns -1 for errors or zero for success, setting *NOPS to the 81925b3c049e70834cf33790a28643ab058b507b35cBen Cheng number of operations in the array stored at *OPS. Note the last 82025b3c049e70834cf33790a28643ab058b507b35cBen Cheng operation is DW_OP_stack_value if there is no mutable location but 82125b3c049e70834cf33790a28643ab058b507b35cBen Cheng only a computable value. 82225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 82325b3c049e70834cf33790a28643ab058b507b35cBen Cheng *NOPS zero with *OPS set to OPS_MEM means CFI says the caller's 82425b3c049e70834cf33790a28643ab058b507b35cBen Cheng REGNO is "undefined", i.e. it's call-clobbered and cannot be recovered. 82525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 82625b3c049e70834cf33790a28643ab058b507b35cBen Cheng *NOPS zero with *OPS set to a null pointer means CFI says the 82725b3c049e70834cf33790a28643ab058b507b35cBen Cheng caller's REGNO is "same_value", i.e. this frame did not change it; 82825b3c049e70834cf33790a28643ab058b507b35cBen Cheng ask the caller frame where to find it. 82925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 83025b3c049e70834cf33790a28643ab058b507b35cBen Cheng For common simple expressions *OPS is OPS_MEM. For arbitrary DWARF 83125b3c049e70834cf33790a28643ab058b507b35cBen Cheng expressions in the CFI, *OPS is an internal pointer that can be used as 83225b3c049e70834cf33790a28643ab058b507b35cBen Cheng long as the Dwarf_CFI used to create FRAME remains alive. */ 83325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_frame_register (Dwarf_Frame *frame, int regno, 83425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Op ops_mem[3], 83525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Dwarf_Op **ops, size_t *nops) 83625b3c049e70834cf33790a28643ab058b507b35cBen Cheng __nonnull_attribute__ (3, 4, 5); 83725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 83825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 83925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return error code of last failing function call. This value is kept 84025b3c049e70834cf33790a28643ab058b507b35cBen Cheng separately for each thread. */ 84125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int dwarf_errno (void); 84225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 84325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return error string for ERROR. If ERROR is zero, return error string 84425b3c049e70834cf33790a28643ab058b507b35cBen Cheng for most recent error or NULL is none occurred. If ERROR is -1 the 84525b3c049e70834cf33790a28643ab058b507b35cBen Cheng behaviour is similar to the last case except that not NULL but a legal 84625b3c049e70834cf33790a28643ab058b507b35cBen Cheng string is returned. */ 84725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *dwarf_errmsg (int err); 84825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 84925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 85025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Register new Out-Of-Memory handler. The old handler is returned. */ 85125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Dwarf_OOM dwarf_new_oom_handler (Dwarf *dbg, Dwarf_OOM handler); 85225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 85325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 85425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Inline optimizations. */ 85525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef __OPTIMIZE__ 85625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return attribute code of given attribute. */ 85725b3c049e70834cf33790a28643ab058b507b35cBen Cheng__libdw_extern_inline unsigned int 85825b3c049e70834cf33790a28643ab058b507b35cBen Chengdwarf_whatattr (Dwarf_Attribute *attr) 85925b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 86025b3c049e70834cf33790a28643ab058b507b35cBen Cheng return attr == NULL ? 0 : attr->code; 86125b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 86225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 86325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return attribute code of given attribute. */ 86425b3c049e70834cf33790a28643ab058b507b35cBen Cheng__libdw_extern_inline unsigned int 86525b3c049e70834cf33790a28643ab058b507b35cBen Chengdwarf_whatform (Dwarf_Attribute *attr) 86625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 86725b3c049e70834cf33790a28643ab058b507b35cBen Cheng return attr == NULL ? 0 : attr->form; 86825b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 86925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif /* Optimize. */ 87025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 87125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef __cplusplus 87225b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 87325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 87425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 87525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif /* libdw.h */ 876