libdwP.h revision 6724c90d02659f7466b67b357563042e403d154e
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Internal definitions for libdwarf.
2b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
3b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   This program is Open Source software; you can redistribute it and/or
6b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   modify it under the terms of the Open Software License version 1.0 as
7b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   published by the Open Source Initiative.
8b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
9b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   You should have received a copy of the Open Software License along
10b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   with this program; if not, you may obtain a copy of the Open Software
11b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   License version 1.0 from http://www.opensource.org/licenses/osl.php or
12b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   3001 King Ranch Road, Ukiah, CA 95482.   */
14b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
15b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifndef _LIBDWP_H
16b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define _LIBDWP_H 1
17b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
18b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libintl.h>
19b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdbool.h>
20b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
21b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libdw.h>
22b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
23b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
24b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* gettext helper macros.  */
25b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define _(Str) dgettext ("elfutils", Str)
26b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
27b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
28b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Version of the DWARF specification we support.  */
29b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define DWARF_VERSION 2
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Version of the CIE format.  */
32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define CIE_VERSION 1
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
34b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
356724c90d02659f7466b67b357563042e403d154eRoland McGrath/* Known location expressions already decoded.  */
36b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct loc_s
37b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
38b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  void *addr;
396724c90d02659f7466b67b357563042e403d154eRoland McGrath  Dwarf_Op *loc;
40b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t nloc;
41b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
42b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
43b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Valid indeces for the section data.  */
44b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperenum
45b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_info = 0,
47b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_abbrev,
48b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_aranges,
49b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_line,
50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_frame,
51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_eh_frame,
52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_loc,
53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_pubnames,
54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_str,
55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_funcnames,
56b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_typenames,
57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_varnames,
58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_weaknames,
59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_macinfo,
60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_debug_ranges,
61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    IDX_last
62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  };
63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Error values.  */
66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperenum
67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NOERROR = 0,
69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_UNKNOWN_ERROR,
70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_ACCESS,
71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_REGFILE,
72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_IO_ERROR,
73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_ELF,
74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_DWARF,
75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NOELF,
76b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_GETEHDR_ERROR,
77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NOMEM,
78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_UNIMPL,
79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_CMD,
80b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_VERSION,
81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_FILE,
82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_ENTRY,
83b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_DWARF,
84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_STRING,
85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_ADDR,
86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_CONSTANT,
87b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_REFERENCE,
88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_REFERENCE,
89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_DEBUG_LINE,
90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_DEBUG_LINE,
91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_TOO_BIG,
92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_VERSION,
93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_DIR_IDX,
94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_ADDR_OUTOFRANGE,
95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_LOCLIST,
96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_BLOCK,
97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_LINE_IDX,
98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_ARANGE_IDX,
99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_MATCH,
100b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_FLAG,
101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_INVALID_OFFSET,
102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWARF_E_NO_DEBUG_RANGES,
103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* This is the structure representing the debugging state.  */
107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwarf
108b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
109b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* The underlying ELF file.  */
110b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf *elf;
111b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
112b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* The section data.  */
113b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf_Data *sectiondata[IDX_last];
114b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
115b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* True if the file has a byte order different from the host.  */
116b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  bool other_byte_order;
117b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
118b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* If true, we allocated the ELF descriptor ourselves.  */
119b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  bool free_elf;
120b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
121b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Information for traversing the .debug_pubnames section.  This is
122b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     an array and separately allocated with malloc.  */
123b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct pubnames_s
124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
125b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    Dwarf_Off cu_offset;
126b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    Dwarf_Off set_start;
127b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    unsigned int cu_header_size;
128b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    int address_len;
129b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  } *pubnames_sets;
130b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t pubnames_nsets;
131b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
132b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Search tree for the CUs.  */
133b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  void *cu_tree;
134b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Off next_cu_offset;
135b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
136b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Address ranges.  */
137b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Aranges *aranges;
138b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
139b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Internal memory handling.  This is basically a simplified
140b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     reimplementation of obstacks.  Unfortunately the standard obstack
141b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     implementation is not usable in libraries.  */
142b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct libdw_memblock
143b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
144b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    size_t size;
145b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    size_t remaining;
146b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    struct libdw_memblock *prev;
147b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    char mem[0];
148b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  } *mem_tail;
149b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
150b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Default size of allocated memory blocks.  */
151b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t mem_default_size;
152b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
153b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Registered OOM handler.  */
154b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_OOM oom_handler;
155b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
156b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
157b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
158b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Abbreviation representation.  */
159b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwarf_Abbrev
160b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
161b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int code;
162b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int tag;
163b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int has_children;
164b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int attrcnt;
165b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned char *attrp;
166b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Off offset;
167b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
168b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
169b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "dwarf_abbrev_hash.h"
170b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
171b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
172b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Files in line information records.  */
173b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwarf_Files_s
174b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
175b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    Dwarf *dbg;
176b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    unsigned int nfiles;
177b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    struct Dwarf_Fileinfo_s
178b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
179b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      char *name;
180b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Word mtime;
181b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Word length;
182b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    } info[0];
183b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  };
184b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppertypedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
185b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
186b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
187b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Representation of a row in the line table.  */
188b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwarf_Lines_s
189b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
190b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    size_t nlines;
191b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
192b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    struct Dwarf_Line_s
193b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
194b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Addr addr;
195b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int file;
196b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      int line;
197b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned short int column;
198b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int is_stmt:1;
199b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int basic_block:1;
200b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int end_sequence:1;
201b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int prologue_end:1;
202b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int epilogue_begin:1;
203b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
204b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Files *files;
205b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    } info[0];
206b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  };
207b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
208b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
209b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Representation of address ranges.  */
210b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwarf_Aranges_s
211b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
212b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf *dbg;
213b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t naranges;
214b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
215b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct Dwarf_Arange_s
216b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
217b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    Dwarf_Addr addr;
218b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    Dwarf_Word length;
219b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    Dwarf_Off offset;
220b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  } info[0];
221b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
222b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
223b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
224b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* CU representation.  */
225b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwarf_CU
226b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
227b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf *dbg;
228b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Off start;
229b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Off end;
230b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  uint8_t address_size;
231b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  uint8_t offset_size;
232b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
233b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Hash table for the abbreviations.  */
234b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Abbrev_Hash abbrev_hash;
235b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Offset of the first abbreviation.  */
236b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t orig_abbrev_offset;
237b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Offset past last read abbreviation.  */
238b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t last_abbrev_offset;
239b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
240b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* The srcline information.  */
241b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Lines *lines;
242b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
243b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* The source file information.  */
244b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Files *files;
245b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
246b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Known location lists.  */
247b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  void *locs;
248b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
249b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
2506724c90d02659f7466b67b357563042e403d154eRoland McGrath#define CUDIE(fromcu)							      \
2516724c90d02659f7466b67b357563042e403d154eRoland McGrath  ((Dwarf_Die)								      \
2526724c90d02659f7466b67b357563042e403d154eRoland McGrath   {									      \
2536724c90d02659f7466b67b357563042e403d154eRoland McGrath     .cu = (fromcu),							      \
2546724c90d02659f7466b67b357563042e403d154eRoland McGrath     .addr = ((char *) (fromcu)->dbg->sectiondata[IDX_debug_info]->d_buf      \
2556724c90d02659f7466b67b357563042e403d154eRoland McGrath	      + (fromcu)->start + 3 * (fromcu)->offset_size - 4 + 3),	      \
2566724c90d02659f7466b67b357563042e403d154eRoland McGrath   })
257b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
258b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
259b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Macro information.  */
260b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwarf_Macro_s
261b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
262b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int opcode;
263b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Word param1;
264b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  union
265b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
266b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    Dwarf_Word u;
267b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    const char *s;
268b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  } param2;
269b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
270b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
271b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
272b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* We have to include the file at this point because the inline
273b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   functions access internals of the Dwarf structure.  */
274b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "memory-access.h"
275b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
276b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
277b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Set error value.  */
278b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern void __libdw_seterrno (int value) internal_function;
279b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
280b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
281b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Memory handling, the easy parts.  This macro does not do any locking.  */
282b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define libdw_alloc(dbg, type, tsize, cnt) \
283b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  ({ struct libdw_memblock *_tail = (dbg)->mem_tail;			      \
284b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     size_t _required = (tsize) * (cnt);				      \
285b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\
286b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     size_t _padding = ((__alignof (type)				      \
287b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper			 - ((uintptr_t) _result & (__alignof (type) - 1)))    \
288b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper			& (__alignof (type) - 1));			      \
289b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     if (unlikely (_tail->remaining < _required + _padding))		      \
290b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper       {								      \
291b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 _result = (type *) __libdw_allocate (dbg, _required);		      \
292b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 _tail = (dbg)->mem_tail;					      \
293b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper       }								      \
294b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     else								      \
295b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper       {								      \
296b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 _required += _padding;						      \
297b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 _result = (type *) ((char *) _result + _padding);		      \
298b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper       }								      \
299b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     _tail->remaining -= _required;					      \
300b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     _result; })
301b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
302b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define libdw_typed_alloc(dbg, type) \
303b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  libdw_alloc (dbg, type, sizeof (type), 1)
304b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
305b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Callback to allocate more.  */
306b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern void *__libdw_allocate (Dwarf *dbg, size_t minsize)
307b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     __attribute__ ((__malloc__)) __nonnull_attribute__ (1);
308b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
309b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Default OOM handler.  */
310b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern void __libdw_oom (void) __attribute ((noreturn, visibility ("hidden")));
311b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
312b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Find CU for given offset.  */
313b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern struct Dwarf_CU *__libdw_findcu (Dwarf *dbg, Dwarf_Off offset)
314b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     __nonnull_attribute__ (1) internal_function;
315b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
316b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Return tag of given DIE.  */
317b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu,
318b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					 unsigned int code)
319b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     __nonnull_attribute__ (1) internal_function;
320b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
321b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Get abbreviation at given offset.  */
322b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu,
323b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					Dwarf_Off offset, size_t *lengthp,
324b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					Dwarf_Abbrev *result)
325b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     __nonnull_attribute__ (1) internal_function;
326b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
327b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Helper functions for form handling.  */
328b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern size_t __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu,
329b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				    unsigned int form,
330b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				    const unsigned char *valp)
331b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     __nonnull_attribute__ (1, 2, 4) internal_function;
332b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
333b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Helper function to locate attribute.  */
334b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern unsigned char *__libdw_find_attr (Dwarf_Die *die,
335b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					 unsigned int search_name,
336b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					 unsigned int *codep,
337b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					 unsigned int *formp)
338b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     __nonnull_attribute__ (1) internal_function;
339b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
340b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Helper function to access integer attribute.  */
3416724c90d02659f7466b67b357563042e403d154eRoland McGrathextern int __libdw_attr_intval (Dwarf_Die *die, int *valp, int attval)
342b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     __nonnull_attribute__ (1, 2) internal_function;
343b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
3441ecb606f5af22838bf42b50dcc581d2b0f9191feRoland McGrath/* Helper function to walk scopes.  */
34571e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrathstruct Dwarf_Die_Chain
34671e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath{
34771e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath  Dwarf_Die die;
34871e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath  struct Dwarf_Die_Chain *parent;
34971e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath  bool prune;			/* The PREVISIT function can set this.  */
35071e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath};
35171e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrathextern int __libdw_visit_scopes (unsigned int depth,
35271e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath				 struct Dwarf_Die_Chain *root,
35371e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath				 int (*previsit) (unsigned int depth,
35471e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath						  struct Dwarf_Die_Chain *,
35571e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath						  void *arg),
35671e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath				 int (*postvisit) (unsigned int depth,
35771e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath						   struct Dwarf_Die_Chain *,
35871e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrath						   void *arg),
3591ecb606f5af22838bf42b50dcc581d2b0f9191feRoland McGrath				 void *arg)
3601ecb606f5af22838bf42b50dcc581d2b0f9191feRoland McGrath  __nonnull_attribute__ (2, 3) internal_function;
3611ecb606f5af22838bf42b50dcc581d2b0f9191feRoland McGrath
362b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Return error code of last failing function call.  This value is kept
363b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   separately for each thread.  */
364b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern int __dwarf_errno_internal (void);
365b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
366b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
367b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Aliases to avoid PLTs.  */
368b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_attr)
369b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_attr_integrate)
370b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_begin_elf)
371b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_child)
372b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_dieoffset)
37371e15a01742e5d5de9c6260d4526146be54e5a8aRoland McGrathINTDECL (dwarf_diename)
3744959bf89d92b59ba72bea5786d7b3f9b5564f750Roland McGrathINTDECL (dwarf_end)
37507d4f2fc1cb53f170a71bc13617bbdd9cb1c3c60Roland McGrathINTDECL (dwarf_entrypc)
3764959bf89d92b59ba72bea5786d7b3f9b5564f750Roland McGrathINTDECL (dwarf_errmsg)
377b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_formaddr)
378b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_formblock)
379b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_formref)
380b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_formref_die)
381b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_formsdata)
382b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_formstring)
383b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_formudata)
384b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_getarange_addr)
385b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_getarangeinfo)
386b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_getaranges)
387b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_getsrcfiles)
388b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_getsrclines)
389b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_hasattr)
390b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_haschildren)
391b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_haspc)
392b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_highpc)
393b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_lowpc)
394b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_nextcu)
395b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_offdie)
39607d4f2fc1cb53f170a71bc13617bbdd9cb1c3c60Roland McGrathINTDECL (dwarf_ranges)
397b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_siblingof)
398b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwarf_tag)
399b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
400b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif	/* libdwP.h */
401