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