1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Internal definitions for libdwarf.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
5441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   In addition, as a special exception, Red Hat, Inc. gives You the
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   additional right to link the code of Red Hat elfutils with code licensed
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   under any Open Source Initiative certified open source license
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   (http://www.opensource.org/licenses/index.php) which requires the
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribution of source code with any binary distribution and to
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribute linked combinations of the two.  Non-GPL Code permitted under
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this exception must only link to the code of Red Hat elfutils through
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   those well defined interfaces identified in the file named EXCEPTION
27cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   found in the source code files (the "Approved Interfaces").  The files
28cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   of Non-GPL Code may instantiate templates or use macros or inline
29cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   functions from the Approved Interfaces without causing the resulting
30cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   work to be covered by the GNU General Public License.  Only Red Hat,
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc. may make changes or additions to the list of Approved Interfaces.
32cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat's grant of this exception is conditioned upon your not adding
33cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   any new exceptions.  If you wish to add a new Approved Interface or
34cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception, please contact Red Hat.  You must obey the GNU General Public
35cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   License in all respects for all of the Red Hat elfutils code and other
36cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   code used in conjunction with Red Hat elfutils except the Non-GPL Code
37cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   covered by this exception.  If you modify this file, you may extend this
38cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception to your version of the file, but you are not obligated to do
39cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   so.  If you do not wish to provide this exception without modification,
40cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   you must delete this exception statement from your version and license
41cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this file solely under the GPL without exception.
42cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
43cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
44cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
45cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
46cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
47cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
48cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
49cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifndef _LIBDWP_H
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _LIBDWP_H 1
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libintl.h>
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdbool.h>
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libdw.h>
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* gettext helper macros.  */
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _(Str) dgettext ("elfutils", Str)
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Version of the DWARF specification we support.  */
65cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define DWARF_VERSION 3
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Version of the CIE format.  */
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define CIE_VERSION 1
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
71cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Known location expressions already decoded.  */
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct loc_s
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *addr;
75cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Op *loc;
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nloc;
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Valid indeces for the section data.  */
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_info = 0,
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_abbrev,
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_aranges,
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_line,
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_frame,
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_eh_frame,
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_loc,
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_pubnames,
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_str,
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_funcnames,
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_typenames,
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_varnames,
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_weaknames,
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_macinfo,
96cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    IDX_debug_ranges,
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_last
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Error values.  */
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NOERROR = 0,
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_UNKNOWN_ERROR,
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_ACCESS,
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_REGFILE,
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_IO_ERROR,
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_ELF,
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_DWARF,
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NOELF,
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_GETEHDR_ERROR,
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NOMEM,
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_UNIMPL,
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_CMD,
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_VERSION,
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_FILE,
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_ENTRY,
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_DWARF,
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_STRING,
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_ADDR,
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_CONSTANT,
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_REFERENCE,
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_REFERENCE,
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_DEBUG_LINE,
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_DEBUG_LINE,
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_TOO_BIG,
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_VERSION,
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_DIR_IDX,
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_ADDR_OUTOFRANGE,
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_LOCLIST,
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_BLOCK,
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_LINE_IDX,
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_ARANGE_IDX,
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_MATCH,
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_FLAG,
137cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWARF_E_INVALID_OFFSET,
138cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWARF_E_NO_DEBUG_RANGES,
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* This is the structure representing the debugging state.  */
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The underlying ELF file.  */
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf *elf;
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The section data.  */
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *sectiondata[IDX_last];
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if the file has a byte order different from the host.  */
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool other_byte_order;
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If true, we allocated the ELF descriptor ourselves.  */
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool free_elf;
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Information for traversing the .debug_pubnames section.  This is
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     an array and separately allocated with malloc.  */
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pubnames_s
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Off cu_offset;
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Off set_start;
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    unsigned int cu_header_size;
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    int address_len;
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } *pubnames_sets;
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t pubnames_nsets;
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Search tree for the CUs.  */
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *cu_tree;
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off next_cu_offset;
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Address ranges.  */
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Aranges *aranges;
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Internal memory handling.  This is basically a simplified
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     reimplementation of obstacks.  Unfortunately the standard obstack
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     implementation is not usable in libraries.  */
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct libdw_memblock
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    size_t size;
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    size_t remaining;
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct libdw_memblock *prev;
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    char mem[0];
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } *mem_tail;
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Default size of allocated memory blocks.  */
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t mem_default_size;
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Registered OOM handler.  */
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_OOM oom_handler;
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Abbreviation representation.  */
195441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Abbrev
196441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int code;
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int tag;
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int has_children;
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int attrcnt;
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned char *attrp;
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off offset;
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "dwarf_abbrev_hash.h"
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Files in line information records.  */
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Files_s
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf *dbg;
212cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    unsigned int ndirs;
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    unsigned int nfiles;
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct Dwarf_Fileinfo_s
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char *name;
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word mtime;
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word length;
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } info[0];
220cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    /* nfiles of those, followed by char *[ndirs].  */
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Representation of a row in the line table.  */
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Lines_s
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    size_t nlines;
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct Dwarf_Line_s
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Addr addr;
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int file;
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int line;
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned short int column;
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int is_stmt:1;
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int basic_block:1;
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int end_sequence:1;
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int prologue_end:1;
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int epilogue_begin:1;
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Files *files;
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } info[0];
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Representation of address ranges.  */
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Aranges_s
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf *dbg;
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t naranges;
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Dwarf_Arange_s
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Addr addr;
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Word length;
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Off offset;
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } info[0];
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* CU representation.  */
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_CU
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf *dbg;
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off start;
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off end;
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  uint8_t address_size;
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  uint8_t offset_size;
270cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  uint16_t version;
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Hash table for the abbreviations.  */
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Abbrev_Hash abbrev_hash;
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Offset of the first abbreviation.  */
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t orig_abbrev_offset;
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Offset past last read abbreviation.  */
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t last_abbrev_offset;
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The srcline information.  */
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Lines *lines;
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The source file information.  */
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Files *files;
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Known location lists.  */
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *locs;
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
289cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Compute the offset of a CU's first DIE from its offset.  This
290cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   is either:
291cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng        LEN       VER     OFFSET    ADDR
292cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      4-bytes + 2-bytes + 4-bytes + 1-byte  for 32-bit dwarf
293cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     12-bytes + 2-bytes + 8-bytes + 1-byte  for 64-bit dwarf
294cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
295cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Note the trick in the computation.  If the offset_size is 4
296cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   the '- 4' term changes the '3 *' into a '2 *'.  If the
297cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   offset_size is 8 it accounts for the 4-byte escape value
298cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   used at the start of the length.  */
299cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define DIE_OFFSET_FROM_CU_OFFSET(cu_offset, offset_size) \
300cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  ((cu_offset) + 3 * (offset_size) - 4 + 3)
301cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
302cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define CUDIE(fromcu) \
303cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  ((Dwarf_Die)								      \
304cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   {									      \
305cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     .cu = (fromcu),							      \
306cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     .addr = ((char *) (fromcu)->dbg->sectiondata[IDX_debug_info]->d_buf      \
307cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	      + (fromcu)->start + 3 * (fromcu)->offset_size - 4 + 3),	      \
308cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   })
309cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
310cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
311cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Macro information.  */
312cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct Dwarf_Macro_s
313cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
314cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  unsigned int opcode;
315cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Word param1;
316cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  union
317cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  {
318cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    Dwarf_Word u;
319cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    const char *s;
320cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  } param2;
321cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
322cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* We have to include the file at this point because the inline
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   functions access internals of the Dwarf structure.  */
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "memory-access.h"
327441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
328441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
329441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Set error value.  */
330441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void __libdw_seterrno (int value) internal_function;
331441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
332441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
333441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Memory handling, the easy parts.  This macro does not do any locking.  */
334441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define libdw_alloc(dbg, type, tsize, cnt) \
335441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ({ struct libdw_memblock *_tail = (dbg)->mem_tail;			      \
336441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     size_t _required = (tsize) * (cnt);				      \
337441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\
338441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     size_t _padding = ((__alignof (type)				      \
339441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			 - ((uintptr_t) _result & (__alignof (type) - 1)))    \
340441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			& (__alignof (type) - 1));			      \
341441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     if (unlikely (_tail->remaining < _required + _padding))		      \
342cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng       _result = (type *) __libdw_allocate (dbg, _required, __alignof (type));\
343441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     else								      \
344441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       {								      \
345441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 _required += _padding;						      \
346441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 _result = (type *) ((char *) _result + _padding);		      \
347cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	 _tail->remaining -= _required;					      \
348441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       }								      \
349441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     _result; })
350441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
351441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define libdw_typed_alloc(dbg, type) \
352441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  libdw_alloc (dbg, type, sizeof (type), 1)
353441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
354441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Callback to allocate more.  */
355cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern void *__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
356441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __attribute__ ((__malloc__)) __nonnull_attribute__ (1);
357441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
358441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Default OOM handler.  */
359441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void __libdw_oom (void) __attribute ((noreturn, visibility ("hidden")));
360441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
361441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Find CU for given offset.  */
362441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Dwarf_CU *__libdw_findcu (Dwarf *dbg, Dwarf_Off offset)
363441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
364441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
365441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return tag of given DIE.  */
366441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu,
367441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int code)
368441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
369441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
370441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get abbreviation at given offset.  */
371441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu,
372441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					Dwarf_Off offset, size_t *lengthp,
373441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					Dwarf_Abbrev *result)
374441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
375441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
376441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper functions for form handling.  */
377441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu,
378cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				    unsigned int form,
379cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				    const unsigned char *valp)
380441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1, 2, 4) internal_function;
381441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
382cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Helper function for DW_FORM_ref* handling.  */
383cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libdw_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset)
384cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     __nonnull_attribute__ (1, 2) internal_function;
385cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
386cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
387441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper function to locate attribute.  */
388441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned char *__libdw_find_attr (Dwarf_Die *die,
389441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int search_name,
390441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int *codep,
391441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int *formp)
392441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
393441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
394cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Helper function to access integer attribute.  */
395cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libdw_attr_intval (Dwarf_Die *die, int *valp, int attval)
396cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     __nonnull_attribute__ (1, 2) internal_function;
397cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
398cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Helper function to walk scopes.  */
399cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct Dwarf_Die_Chain
400cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
401cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Die die;
402cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct Dwarf_Die_Chain *parent;
403cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool prune;			/* The PREVISIT function can set this.  */
404cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
405cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libdw_visit_scopes (unsigned int depth,
406cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 struct Dwarf_Die_Chain *root,
407cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 int (*previsit) (unsigned int depth,
408cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng						  struct Dwarf_Die_Chain *,
409cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng						  void *arg),
410cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 int (*postvisit) (unsigned int depth,
411cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng						   struct Dwarf_Die_Chain *,
412cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng						   void *arg),
413cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 void *arg)
414cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  __nonnull_attribute__ (2, 3) internal_function;
415cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
416cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Return error code of last failing function call.  This value is kept
417cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   separately for each thread.  */
418cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __dwarf_errno_internal (void);
419cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
420cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
421cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Aliases to avoid PLTs.  */
422cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_attr)
423cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_attr_integrate)
424cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_begin_elf)
425cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_child)
426cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_dieoffset)
427cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_diename)
428cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_end)
429cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_entrypc)
430cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_errmsg)
431cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_formaddr)
432cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_formblock)
433cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_formref_die)
434cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_formsdata)
435cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_formstring)
436cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_formudata)
437cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_getarange_addr)
438cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_getarangeinfo)
439cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_getaranges)
440cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_getsrcfiles)
441cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_getsrclines)
442cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_hasattr)
443cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_haschildren)
444cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_haspc)
445cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_highpc)
446cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_lowpc)
447cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_nextcu)
448cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_offdie)
449cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_ranges)
450cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_siblingof)
451cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwarf_tag)
452cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
453441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif	/* libdwP.h */
454