1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Internal definitions for libdwarf.
2441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Copyright (C) 2002, 2003, 2004 Red Hat, Inc.
3441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
5441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   This program is Open Source software; you can redistribute it and/or
6441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   modify it under the terms of the Open Software License version 1.0 as
7441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   published by the Open Source Initiative.
8441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
9441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   You should have received a copy of the Open Software License along
10441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   with this program; if not, you may obtain a copy of the Open Software
11441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   License version 1.0 from http://www.opensource.org/licenses/osl.php or
12441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   3001 King Ranch Road, Ukiah, CA 95482.   */
14441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
15441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifndef _LIBDWP_H
16441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _LIBDWP_H 1
17441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
18441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libintl.h>
19441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdbool.h>
20441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
21441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libdw.h>
22441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
23441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
24441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* gettext helper macros.  */
25441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _(Str) dgettext ("elfutils", Str)
26441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Version of the DWARF specification we support.  */
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define DWARF_VERSION 2
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
31441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Version of the CIE format.  */
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define CIE_VERSION 1
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Known location lists.  */
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct loc_s
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *addr;
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Loc *loc;
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nloc;
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Valid indeces for the section data.  */
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_info = 0,
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_abbrev,
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_aranges,
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_line,
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_frame,
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_eh_frame,
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_loc,
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_pubnames,
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_str,
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_funcnames,
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_typenames,
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_varnames,
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_weaknames,
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_debug_macinfo,
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    IDX_last
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Error values.  */
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NOERROR = 0,
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_UNKNOWN_ERROR,
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_ACCESS,
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_REGFILE,
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_IO_ERROR,
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_ELF,
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_DWARF,
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NOELF,
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_GETEHDR_ERROR,
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NOMEM,
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_UNIMPL,
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_CMD,
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_VERSION,
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_FILE,
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_ENTRY,
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_DWARF,
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_STRING,
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_ADDR,
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_CONSTANT,
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_REFERENCE,
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_REFERENCE,
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_DEBUG_LINE,
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_DEBUG_LINE,
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_TOO_BIG,
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_VERSION,
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_DIR_IDX,
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_ADDR_OUTOFRANGE,
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_LOCLIST,
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_BLOCK,
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_LINE_IDX,
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_INVALID_ARANGE_IDX,
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_MATCH,
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DWARF_E_NO_FLAG,
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* This is the structure representing the debugging state.  */
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The underlying ELF file.  */
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf *elf;
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The section data.  */
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *sectiondata[IDX_last];
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if the file has a byte order different from the host.  */
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool other_byte_order;
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If true, we allocated the ELF descriptor ourselves.  */
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool free_elf;
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Information for traversing the .debug_pubnames section.  This is
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     an array and separately allocated with malloc.  */
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pubnames_s
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Off cu_offset;
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Off set_start;
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    unsigned int cu_header_size;
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    int address_len;
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } *pubnames_sets;
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t pubnames_nsets;
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Search tree for the CUs.  */
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *cu_tree;
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off next_cu_offset;
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Address ranges.  */
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Aranges *aranges;
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Internal memory handling.  This is basically a simplified
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     reimplementation of obstacks.  Unfortunately the standard obstack
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     implementation is not usable in libraries.  */
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct libdw_memblock
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    size_t size;
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    size_t remaining;
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct libdw_memblock *prev;
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    char mem[0];
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } *mem_tail;
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Default size of allocated memory blocks.  */
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t mem_default_size;
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Registered OOM handler.  */
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_OOM oom_handler;
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Abbreviation representation.  */
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Abbrev
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int code;
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int tag;
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int has_children;
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int attrcnt;
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned char *attrp;
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off offset;
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "dwarf_abbrev_hash.h"
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Files in line information records.  */
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Files_s
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf *dbg;
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    unsigned int nfiles;
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct Dwarf_Fileinfo_s
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      char *name;
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word mtime;
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word length;
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } info[0];
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecttypedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Representation of a row in the line table.  */
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Lines_s
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    size_t nlines;
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct Dwarf_Line_s
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Addr addr;
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int file;
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int line;
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned short int column;
195441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int is_stmt:1;
196441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int basic_block:1;
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int end_sequence:1;
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int prologue_end:1;
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int epilogue_begin:1;
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Files *files;
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } info[0];
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Representation of address ranges.  */
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_Aranges_s
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf *dbg;
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t naranges;
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Dwarf_Arange_s
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Addr addr;
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Word length;
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Dwarf_Off offset;
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } info[0];
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* CU representation.  */
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Dwarf_CU
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf *dbg;
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off start;
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off end;
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  uint8_t address_size;
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  uint8_t offset_size;
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Hash table for the abbreviations.  */
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Abbrev_Hash abbrev_hash;
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Offset of the first abbreviation.  */
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t orig_abbrev_offset;
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Offset past last read abbreviation.  */
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t last_abbrev_offset;
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The srcline information.  */
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Lines *lines;
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The source file information.  */
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Files *files;
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Known location lists.  */
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *locs;
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* We have to include the file at this point because the inline
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   functions access internals of the Dwarf structure.  */
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "memory-access.h"
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Set error value.  */
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void __libdw_seterrno (int value) internal_function;
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Memory handling, the easy parts.  This macro does not do any locking.  */
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define libdw_alloc(dbg, type, tsize, cnt) \
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ({ struct libdw_memblock *_tail = (dbg)->mem_tail;			      \
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     size_t _required = (tsize) * (cnt);				      \
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     size_t _padding = ((__alignof (type)				      \
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			 - ((uintptr_t) _result & (__alignof (type) - 1)))    \
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			& (__alignof (type) - 1));			      \
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     if (unlikely (_tail->remaining < _required + _padding))		      \
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       {								      \
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 _result = (type *) __libdw_allocate (dbg, _required);		      \
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 _tail = (dbg)->mem_tail;					      \
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       }								      \
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     else								      \
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       {								      \
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 _required += _padding;						      \
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 _result = (type *) ((char *) _result + _padding);		      \
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       }								      \
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     _tail->remaining -= _required;					      \
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     _result; })
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define libdw_typed_alloc(dbg, type) \
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  libdw_alloc (dbg, type, sizeof (type), 1)
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Callback to allocate more.  */
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void *__libdw_allocate (Dwarf *dbg, size_t minsize)
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __attribute__ ((__malloc__)) __nonnull_attribute__ (1);
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Default OOM handler.  */
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void __libdw_oom (void) __attribute ((noreturn, visibility ("hidden")));
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Find CU for given offset.  */
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Dwarf_CU *__libdw_findcu (Dwarf *dbg, Dwarf_Off offset)
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return tag of given DIE.  */
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu,
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int code)
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get abbreviation at given offset.  */
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu,
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					Dwarf_Off offset, size_t *lengthp,
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					Dwarf_Abbrev *result)
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper functions for form handling.  */
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu,
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    unsigned int form, unsigned char *valp)
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1, 2, 4) internal_function;
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper function to locate attribute.  */
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern unsigned char *__libdw_find_attr (Dwarf_Die *die,
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int search_name,
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int *codep,
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 unsigned int *formp)
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     __nonnull_attribute__ (1) internal_function;
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif	/* libdwP.h */
316