1260684Skaiw/*-
2260684Skaiw * Copyright (c) 2007 John Birrell (jb@freebsd.org)
3276371Semaste * Copyright (c) 2009-2011,2014 Kai Wang
4260684Skaiw * All rights reserved.
5260684Skaiw *
6260684Skaiw * Redistribution and use in source and binary forms, with or without
7260684Skaiw * modification, are permitted provided that the following conditions
8260684Skaiw * are met:
9260684Skaiw * 1. Redistributions of source code must retain the above copyright
10260684Skaiw *    notice, this list of conditions and the following disclaimer.
11260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright
12260684Skaiw *    notice, this list of conditions and the following disclaimer in the
13260684Skaiw *    documentation and/or other materials provided with the distribution.
14260684Skaiw *
15260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18260684Skaiw * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25260684Skaiw * SUCH DAMAGE.
26260684Skaiw *
27338414Semaste * $Id: libdwarf.h 3578 2017-09-14 02:21:28Z emaste $
28260684Skaiw */
29260684Skaiw
30260684Skaiw#ifndef	_LIBDWARF_H_
31260684Skaiw#define	_LIBDWARF_H_
32260684Skaiw
33260684Skaiw#include <libelf.h>
34260684Skaiw
35260684Skaiwtypedef int		Dwarf_Bool;
36295577Semastetypedef uint64_t	Dwarf_Off;
37260684Skaiwtypedef uint64_t	Dwarf_Unsigned;
38260684Skaiwtypedef uint16_t	Dwarf_Half;
39260684Skaiwtypedef uint8_t		Dwarf_Small;
40260684Skaiwtypedef int64_t		Dwarf_Signed;
41260684Skaiwtypedef uint64_t	Dwarf_Addr;
42260684Skaiwtypedef void		*Dwarf_Ptr;
43260684Skaiw
44260684Skaiwtypedef struct _Dwarf_Abbrev	*Dwarf_Abbrev;
45260684Skaiwtypedef struct _Dwarf_Arange	*Dwarf_Arange;
46260684Skaiwtypedef struct _Dwarf_ArangeSet	*Dwarf_ArangeSet;
47260684Skaiwtypedef struct _Dwarf_Attribute	*Dwarf_Attribute;
48260684Skaiwtypedef struct _Dwarf_Attribute *Dwarf_P_Attribute;
49260684Skaiwtypedef struct _Dwarf_AttrDef	*Dwarf_AttrDef;
50260684Skaiwtypedef struct _Dwarf_Cie	*Dwarf_Cie;
51260684Skaiwtypedef struct _Dwarf_Cie	*Dwarf_P_Cie;
52260684Skaiwtypedef struct _Dwarf_Debug	*Dwarf_Debug;
53260684Skaiwtypedef struct _Dwarf_Debug	*Dwarf_P_Debug;
54260684Skaiwtypedef struct _Dwarf_Die	*Dwarf_Die;
55260684Skaiwtypedef struct _Dwarf_Die	*Dwarf_P_Die;
56260684Skaiwtypedef struct _Dwarf_Fde	*Dwarf_Fde;
57260684Skaiwtypedef struct _Dwarf_Fde	*Dwarf_P_Fde;
58260684Skaiwtypedef struct _Dwarf_FrameSec	*Dwarf_FrameSec;
59260684Skaiwtypedef struct _Dwarf_Line	*Dwarf_Line;
60260684Skaiwtypedef struct _Dwarf_LineFile	*Dwarf_LineFile;
61260684Skaiwtypedef struct _Dwarf_LineInfo	*Dwarf_LineInfo;
62260684Skaiwtypedef struct _Dwarf_MacroSet	*Dwarf_MacroSet;
63260684Skaiwtypedef struct _Dwarf_NamePair	*Dwarf_NamePair;
64260684Skaiwtypedef struct _Dwarf_NamePair	*Dwarf_Func;
65260684Skaiwtypedef struct _Dwarf_NamePair	*Dwarf_Global;
66260684Skaiwtypedef struct _Dwarf_NamePair	*Dwarf_Type;
67260684Skaiwtypedef struct _Dwarf_NamePair	*Dwarf_Var;
68260684Skaiwtypedef struct _Dwarf_NamePair	*Dwarf_Weak;
69260684Skaiwtypedef struct _Dwarf_NameTbl	*Dwarf_NameTbl;
70260684Skaiwtypedef struct _Dwarf_NameSec	*Dwarf_NameSec;
71260684Skaiwtypedef struct _Dwarf_P_Expr	*Dwarf_P_Expr;
72260684Skaiwtypedef struct _Dwarf_Rangelist	*Dwarf_Rangelist;
73260684Skaiw
74260684Skaiwtypedef enum {
75260684Skaiw	DW_OBJECT_MSB,
76260684Skaiw	DW_OBJECT_LSB
77260684Skaiw} Dwarf_Endianness;
78260684Skaiw
79260684Skaiwtypedef struct {
80260684Skaiw	Dwarf_Addr addr;
81260684Skaiw	Dwarf_Unsigned size;
82260684Skaiw	const char *name;
83260684Skaiw} Dwarf_Obj_Access_Section;
84260684Skaiw
85260684Skaiwtypedef struct {
86260684Skaiw	int (*get_section_info)(void *_obj, Dwarf_Half _index,
87260684Skaiw	    Dwarf_Obj_Access_Section *_ret_section, int *_error);
88260684Skaiw	Dwarf_Endianness (*get_byte_order)(void *_obj);
89260684Skaiw	Dwarf_Small (*get_length_size)(void *_obj);
90260684Skaiw	Dwarf_Small (*get_pointer_size)(void *_obj);
91260684Skaiw	Dwarf_Unsigned (*get_section_count)(void *_obj);
92260684Skaiw	int (*load_section)(void *_obj, Dwarf_Half _index,
93260684Skaiw	    Dwarf_Small **_ret_data, int *_error);
94260684Skaiw} Dwarf_Obj_Access_Methods;
95260684Skaiw
96260684Skaiwtypedef struct {
97260684Skaiw	void *object;
98260684Skaiw	const Dwarf_Obj_Access_Methods *methods;
99260684Skaiw} Dwarf_Obj_Access_Interface;
100260684Skaiw
101260684Skaiwtypedef int (*Dwarf_Callback_Func)(char *_name, int _size,
102260684Skaiw    Dwarf_Unsigned _type, Dwarf_Unsigned _flags, Dwarf_Unsigned _link,
103260684Skaiw    Dwarf_Unsigned _info, int *_index, int *_error);
104260684Skaiw
105260684Skaiwtypedef int (*Dwarf_Callback_Func_b)(char *_name, int _size,
106260684Skaiw    Dwarf_Unsigned _type, Dwarf_Unsigned _flags, Dwarf_Unsigned _link,
107260684Skaiw    Dwarf_Unsigned _info, Dwarf_Unsigned *_index, int *_error);
108260684Skaiw
109260684Skaiwtypedef Dwarf_Unsigned Dwarf_Tag;
110260684Skaiw
111260684Skaiwtypedef struct {
112260684Skaiw        Dwarf_Small	lr_atom;
113260684Skaiw        Dwarf_Unsigned	lr_number;
114260684Skaiw	Dwarf_Unsigned	lr_number2;
115260684Skaiw	Dwarf_Unsigned	lr_offset;
116260684Skaiw} Dwarf_Loc;
117260684Skaiw
118260684Skaiwtypedef struct {
119260684Skaiw	Dwarf_Addr      ld_lopc;
120260684Skaiw	Dwarf_Addr      ld_hipc;
121260684Skaiw	Dwarf_Half      ld_cents;
122260684Skaiw	Dwarf_Loc	*ld_s;
123260684Skaiw} Dwarf_Locdesc;
124260684Skaiw
125260684Skaiwtypedef struct {
126260684Skaiw	char signature[8];
127260684Skaiw} Dwarf_Sig8;
128260684Skaiw
129260684Skaiwtypedef struct {
130260684Skaiw	Dwarf_Unsigned	bl_len;
131260684Skaiw	Dwarf_Ptr	bl_data;
132260684Skaiw} Dwarf_Block;
133260684Skaiw
134260684Skaiwenum Dwarf_Ranges_Entry_Type {
135260684Skaiw	DW_RANGES_ENTRY,
136260684Skaiw	DW_RANGES_ADDRESS_SELECTION,
137260684Skaiw	DW_RANGES_END
138260684Skaiw};
139260684Skaiw
140260684Skaiwtypedef struct {
141260684Skaiw	Dwarf_Unsigned	dwr_addr1;
142260684Skaiw	Dwarf_Unsigned	dwr_addr2;
143260684Skaiw	enum Dwarf_Ranges_Entry_Type dwr_type;
144260684Skaiw} Dwarf_Ranges;
145260684Skaiw
146260684Skaiwenum Dwarf_Form_Class {
147260684Skaiw	DW_FORM_CLASS_UNKNOWN,
148260684Skaiw	DW_FORM_CLASS_ADDRESS,
149260684Skaiw	DW_FORM_CLASS_BLOCK,
150260684Skaiw	DW_FORM_CLASS_CONSTANT,
151260684Skaiw	DW_FORM_CLASS_EXPRLOC,
152260684Skaiw	DW_FORM_CLASS_FLAG,
153260684Skaiw	DW_FORM_CLASS_LINEPTR,
154260684Skaiw	DW_FORM_CLASS_LOCLISTPTR,
155260684Skaiw	DW_FORM_CLASS_MACPTR,
156260684Skaiw	DW_FORM_CLASS_RANGELISTPTR,
157260684Skaiw	DW_FORM_CLASS_REFERENCE,
158260684Skaiw	DW_FORM_CLASS_STRING
159260684Skaiw};
160260684Skaiw
161260684Skaiw#ifndef	DW_FRAME_HIGHEST_NORMAL_REGISTER
162260684Skaiw#define	DW_FRAME_HIGHEST_NORMAL_REGISTER 63
163260684Skaiw#endif
164260684Skaiw
165260684Skaiw#define	DW_FRAME_RA_COL		(DW_FRAME_HIGHEST_NORMAL_REGISTER + 1)
166260684Skaiw#define	DW_FRAME_STATIC_LINK	(DW_FRAME_HIGHEST_NORMAL_REGISTER + 2)
167260684Skaiw
168260684Skaiw#ifndef	DW_FRAME_LAST_REG_NUM
169260684Skaiw#define DW_FRAME_LAST_REG_NUM	(DW_FRAME_HIGHEST_NORMAL_REGISTER + 3)
170260684Skaiw#endif
171260684Skaiw
172260684Skaiw#ifndef	DW_FRAME_REG_INITIAL_VALUE
173260684Skaiw#define	DW_FRAME_REG_INITIAL_VALUE DW_FRAME_SAME_VAL
174260684Skaiw#endif
175260684Skaiw
176260684Skaiw#define	DW_FRAME_UNDEFINED_VAL		1034
177260684Skaiw#define DW_FRAME_SAME_VAL		1035
178260684Skaiw#define DW_FRAME_CFA_COL3		1436
179260684Skaiw
180260684Skaiw#define	DW_EXPR_OFFSET 0
181260684Skaiw#define	DW_EXPR_VAL_OFFSET 1
182260684Skaiw#define	DW_EXPR_EXPRESSION 2
183260684Skaiw#define	DW_EXPR_VAL_EXPRESSION 3
184260684Skaiw
185260684Skaiw/*
186260684Skaiw * Frame operation only for DWARF 2.
187260684Skaiw */
188260684Skaiw
189260684Skaiw#define DW_FRAME_CFA_COL 0
190260684Skaiw
191260684Skaiwtypedef struct {
192260684Skaiw	Dwarf_Small	fp_base_op;
193260684Skaiw	Dwarf_Small	fp_extended_op;
194260684Skaiw	Dwarf_Half	fp_register;
195260684Skaiw	Dwarf_Signed	fp_offset;
196260684Skaiw	Dwarf_Off	fp_instr_offset;
197260684Skaiw} Dwarf_Frame_Op;
198260684Skaiw
199260684Skaiw#ifndef	DW_REG_TABLE_SIZE
200260684Skaiw#define	DW_REG_TABLE_SIZE	66
201260684Skaiw#endif
202260684Skaiw
203260684Skaiwtypedef struct {
204260684Skaiw	struct {
205260684Skaiw		Dwarf_Small	dw_offset_relevant;
206260684Skaiw		Dwarf_Half	dw_regnum;
207260684Skaiw		Dwarf_Addr	dw_offset;
208260684Skaiw	} rules[DW_REG_TABLE_SIZE];
209260684Skaiw} Dwarf_Regtable;
210260684Skaiw
211260684Skaiw/*
212260684Skaiw * Frame operation for DWARF 3 and DWARF 2.
213260684Skaiw */
214260684Skaiw
215260684Skaiwtypedef struct {
216260684Skaiw	Dwarf_Small	fp_base_op;
217260684Skaiw	Dwarf_Small	fp_extended_op;
218260684Skaiw	Dwarf_Half	fp_register;
219260684Skaiw	Dwarf_Unsigned	fp_offset_or_block_len;
220260684Skaiw	Dwarf_Small	*fp_expr_block;
221260684Skaiw	Dwarf_Off	fp_instr_offset;
222260684Skaiw} Dwarf_Frame_Op3;
223260684Skaiw
224260684Skaiwtypedef struct {
225260684Skaiw	Dwarf_Small	dw_offset_relevant;
226260684Skaiw	Dwarf_Small	dw_value_type;
227260684Skaiw	Dwarf_Half	dw_regnum;
228260684Skaiw	Dwarf_Unsigned	dw_offset_or_block_len;
229260684Skaiw	Dwarf_Ptr	dw_block_ptr;
230260684Skaiw} Dwarf_Regtable_Entry3;
231260684Skaiw
232260684Skaiwtypedef struct {
233260684Skaiw	Dwarf_Regtable_Entry3	rt3_cfa_rule;
234260684Skaiw	Dwarf_Half		rt3_reg_table_size;
235260684Skaiw	Dwarf_Regtable_Entry3	*rt3_rules;
236260684Skaiw} Dwarf_Regtable3;
237260684Skaiw
238260684Skaiwtypedef struct {
239260684Skaiw	Dwarf_Off	dmd_offset;
240260684Skaiw	Dwarf_Small	dmd_type;
241260684Skaiw	Dwarf_Signed	dmd_lineno;
242260684Skaiw	Dwarf_Signed	dmd_fileindex;
243260684Skaiw	char		*dmd_macro;
244260684Skaiw} Dwarf_Macro_Details;
245260684Skaiw
246260684Skaiw/*
247260684Skaiw * Symbols denoting allocation types, for use with dwarf_dealloc(3).
248260684Skaiw */
249260684Skaiw
250260684Skaiwenum Dwarf_Allocation_Type {
251260684Skaiw	DW_DLA_ABBREV,
252260684Skaiw	DW_DLA_ADDR,
253260684Skaiw	DW_DLA_ARANGE,
254260684Skaiw	DW_DLA_ATTR,
255260684Skaiw	DW_DLA_BLOCK,
256260684Skaiw	DW_DLA_BOUNDS,
257260684Skaiw	DW_DLA_CIE,
258260684Skaiw	DW_DLA_DEBUG,
259260684Skaiw	DW_DLA_DIE,
260260684Skaiw	DW_DLA_ELLIST,
261260684Skaiw	DW_DLA_ERROR,
262260684Skaiw	DW_DLA_FDE,
263260684Skaiw	DW_DLA_FRAME_BLOCK,
264260684Skaiw	DW_DLA_FRAME_OP,
265260684Skaiw	DW_DLA_FUNC,
266260684Skaiw	DW_DLA_GLOBAL,
267260684Skaiw	DW_DLA_LINE,
268260684Skaiw	DW_DLA_LINEBUF,
269260684Skaiw	DW_DLA_LIST,
270260684Skaiw	DW_DLA_LOC,
271260684Skaiw	DW_DLA_LOCDESC,
272260684Skaiw	DW_DLA_LOC_BLOCK,
273260684Skaiw	DW_DLA_RANGES,
274260684Skaiw	DW_DLA_STRING,
275260684Skaiw	DW_DLA_SUBSCR,
276260684Skaiw	DW_DLA_TYPE,
277260684Skaiw	DW_DLA_TYPENAME,
278260684Skaiw	DW_DLA_VAR,
279260684Skaiw	DW_DLA_WEAK
280260684Skaiw};
281260684Skaiw
282260684Skaiw/*
283260684Skaiw * Relocation Type.
284260684Skaiw */
285260684Skaiwenum Dwarf_Rel_Type {
286260684Skaiw	dwarf_drt_none = 0,
287260684Skaiw	dwarf_drt_data_reloc,
288260684Skaiw	dwarf_drt_segment_rel,
289260684Skaiw	dwarf_drt_first_of_length_pair,
290260684Skaiw	dwarf_drt_second_of_length_pair
291260684Skaiw};
292260684Skaiw
293260684Skaiw/*
294260684Skaiw * Relocation Entry.
295260684Skaiw */
296260684Skaiwtypedef struct Dwarf_Relocation_Data_s {
297260684Skaiw	unsigned char drd_type;
298260684Skaiw	unsigned char drd_length;
299260684Skaiw	Dwarf_Unsigned drd_offset;
300260684Skaiw	Dwarf_Unsigned drd_symbol_index;
301260684Skaiw} *Dwarf_Relocation_Data;
302260684Skaiw
303260684Skaiw#define	DWARF_DRD_BUFFER_VERSION	2
304260684Skaiw
305260684Skaiw/*
306260684Skaiw * Error numbers which are specific to this implementation.
307260684Skaiw */
308260684Skaiwenum {
309260684Skaiw	DW_DLE_NONE,			/* No error. */
310260684Skaiw	DW_DLE_ERROR,			/* An error! */
311260684Skaiw	DW_DLE_ARGUMENT,		/* Invalid argument. */
312260684Skaiw	DW_DLE_DEBUG_INFO_NULL,		/* Debug info NULL. */
313260684Skaiw	DW_DLE_NO_ENTRY,		/* No entry. */
314260684Skaiw	DW_DLE_MEMORY,			/* Insufficient memory. */
315260684Skaiw	DW_DLE_ELF,			/* ELF error. */
316260684Skaiw	DW_DLE_CU_LENGTH_ERROR,		/* Invalid compilation unit data. */
317260684Skaiw	DW_DLE_VERSION_STAMP_ERROR,	/* Invalid version. */
318260684Skaiw	DW_DLE_DEBUG_ABBREV_NULL,	/* Abbrev not found. */
319260684Skaiw	DW_DLE_DIE_NO_CU_CONTEXT,	/* No current compilation unit. */
320260684Skaiw	DW_DLE_LOC_EXPR_BAD,		/* Invalid location expression. */
321260684Skaiw	DW_DLE_EXPR_LENGTH_BAD,		/* Invalid DWARF expression. */
322260684Skaiw	DW_DLE_DEBUG_LOC_SECTION_SHORT,	/* Loclist section too short. */
323260684Skaiw	DW_DLE_ATTR_FORM_BAD,		/* Invalid attribute form. */
324260684Skaiw	DW_DLE_DEBUG_LINE_LENGTH_BAD,	/* Line info section too short. */
325260684Skaiw	DW_DLE_LINE_FILE_NUM_BAD,	/* Invalid file number. */
326260684Skaiw	DW_DLE_DIR_INDEX_BAD,		/* Invalid dir index. */
327260684Skaiw	DW_DLE_DEBUG_FRAME_LENGTH_BAD,	/* Frame section too short. */
328260684Skaiw	DW_DLE_NO_CIE_FOR_FDE,		/* CIE not found for certain FDE. */
329260684Skaiw	DW_DLE_FRAME_AUGMENTATION_UNKNOWN, /* Unknown CIE augmentation. */
330260684Skaiw	DW_DLE_FRAME_INSTR_EXEC_ERROR,	/* Frame instruction exec error. */
331260684Skaiw	DW_DLE_FRAME_VERSION_BAD,	/* Invalid frame section version. */
332260684Skaiw	DW_DLE_FRAME_TABLE_COL_BAD,	/* Invalid table column. */
333260684Skaiw	DW_DLE_DF_REG_NUM_TOO_HIGH,	/* Insufficient regtable space. */
334260684Skaiw	DW_DLE_PC_NOT_IN_FDE_RANGE,	/* PC requested not in the FDE range. */
335260684Skaiw	DW_DLE_ARANGE_OFFSET_BAD,	/* Invalid arange offset. */
336260684Skaiw	DW_DLE_DEBUG_MACRO_INCONSISTENT,/* Invalid macinfo data. */
337260684Skaiw	DW_DLE_ELF_SECT_ERR,		/* Application callback failed. */
338260684Skaiw	DW_DLE_NUM			/* Max error number. */
339260684Skaiw};
340260684Skaiw
341260684Skaiw/*
342260684Skaiw * Mapping of SGI libdwarf error codes for comptibility.
343260684Skaiw */
344260684Skaiw#define	DW_DLE_DBG_ALLOC			DW_DLE_MEMORY
345260684Skaiw#define	DW_DLE_ALLOC_FAIL			DW_DLE_MEMORY
346260684Skaiw#define	DW_DLE_SECT_ALLOC			DW_DLE_MEMORY
347260684Skaiw#define	DW_DLE_FILE_ENTRY_ALLOC			DW_DLE_MEMORY
348260684Skaiw#define	DW_DLE_LINE_ALLOC			DW_DLE_MEMORY
349260684Skaiw#define	DW_DLE_FPGM_ALLOC			DW_DLE_MEMORY
350260684Skaiw#define	DW_DLE_INCDIR_ALLOC			DW_DLE_MEMORY
351260684Skaiw#define	DW_DLE_STRING_ALLOC			DW_DLE_MEMORY
352260684Skaiw#define	DW_DLE_CHUNK_ALLOC			DW_DLE_MEMORY
353260684Skaiw#define	DW_DLE_CIE_ALLOC			DW_DLE_MEMORY
354260684Skaiw#define	DW_DLE_FDE_ALLOC			DW_DLE_MEMORY
355260684Skaiw#define	DW_DLE_CIE_OFFS_ALLOC			DW_DLE_MEMORY
356260684Skaiw#define	DW_DLE_DIE_ALLOC			DW_DLE_MEMORY
357260684Skaiw#define	DW_DLE_ATTR_ALLOC			DW_DLE_MEMORY
358260684Skaiw#define	DW_DLE_ABBREV_ALLOC			DW_DLE_MEMORY
359260684Skaiw#define	DW_DLE_ADDR_ALLOC			DW_DLE_MEMORY
360260684Skaiw#define	DW_DLE_REL_ALLOC			DW_DLE_MEMORY
361260684Skaiw#define	DW_DLE_MACINFO_MALLOC_FAIL		DW_DLE_MEMORY
362260684Skaiw#define	DW_DLE_DEBUG_MACRO_MALLOC_SPACE		DW_DLE_MEMORY
363260684Skaiw#define	DW_DLE_DF_ALLOC_FAIL			DW_DLE_MEMORY
364260684Skaiw#define	DW_DLE_RELOC_SECTION_MALLOC_FAIL	DW_DLE_MEMORY
365260684Skaiw#define	DW_DLE_DBG_NULL				DW_DLE_ARGUMENT
366260684Skaiw#define	DW_DLE_DIE_NULL				DW_DLE_ARGUMENT
367260684Skaiw#define	DW_DLE_FDE_NULL				DW_DLE_ARGUMENT
368260684Skaiw#define	DW_DLE_CIE_NULL				DW_DLE_ARGUMENT
369260684Skaiw#define	DW_DLE_ATTR_NULL			DW_DLE_ARGUMENT
370260684Skaiw#define	DW_DLE_GLOBAL_NULL			DW_DLE_ARGUMENT
371260684Skaiw#define	DW_DLE_ARANGES_NULL			DW_DLE_ARGUMENT
372260684Skaiw#define	DW_DLE_ARANGE_NULL			DW_DLE_ARGUMENT
373260684Skaiw#define	DW_DLE_EXPR_NULL			DW_DLE_ARGUMENT
374260684Skaiw#define	DW_DLE_FUNC_NULL			DW_DLE_ARGUMENT
375260684Skaiw#define	DW_DLE_TYPE_NULL			DW_DLE_ARGUMENT
376260684Skaiw#define	DW_DLE_VAR_NULL				DW_DLE_ARGUMENT
377260684Skaiw#define	DW_DLE_WEAK_NULL			DW_DLE_ARGUMENT
378260684Skaiw#define	DW_DLE_ELF_BEGIN_ERROR			DW_DLE_ELF
379260684Skaiw#define	DW_DLE_ELF_GETEHDR_ERROR		DW_DLE_ELF
380260684Skaiw#define	DW_DLE_ELF_GETSHDR_ERROR		DW_DLE_ELF
381260684Skaiw#define	DW_DLE_ELF_STRPTR_ERROR			DW_DLE_ELF
382260684Skaiw#define	DW_DLE_ELF_SECT_ERROR			DW_DLE_ELF
383260684Skaiw#define	DW_DLE_ELF_GETIDENT_ERROR		DW_DLE_ELF
384260684Skaiw
385260684Skaiwtypedef struct _Dwarf_Error {
386260684Skaiw	int		err_error;	/* DWARF error. */
387260684Skaiw	int		err_elferror;	/* ELF error. */
388260684Skaiw	const char	*err_func;	/* Function name where error occurred. */
389260684Skaiw	int		err_line;	/* Line number where error occurred. */
390260684Skaiw	char		err_msg[1024];	/* Formatted error message. */
391260684Skaiw} Dwarf_Error;
392260684Skaiw
393260684Skaiw/*
394260684Skaiw * Dwarf error handler.
395260684Skaiw */
396260684Skaiwtypedef void (*Dwarf_Handler)(Dwarf_Error, Dwarf_Ptr);
397260684Skaiw
398260684Skaiw#define	dwarf_errno(error)	error.err_error
399260684Skaiw#define	dwarf_errmsg(error)	dwarf_errmsg_(&error)
400260684Skaiw
401260684Skaiw/*
402260684Skaiw * Return values which have to be compatible with other
403260684Skaiw * implementations of libdwarf.
404260684Skaiw */
405260684Skaiw#define DW_DLV_NO_ENTRY		-1
406260684Skaiw#define DW_DLV_OK		0
407260684Skaiw#define	DW_DLV_ERROR		1
408260684Skaiw#define DW_DLV_BADADDR		NULL
409260684Skaiw#define DW_DLV_NOCOUNT		((Dwarf_Signed) -1)
410260684Skaiw
411260684Skaiw/*
412260684Skaiw * Access modes.
413260684Skaiw */
414260684Skaiw#define DW_DLC_READ        	0x0001
415260684Skaiw#define DW_DLC_WRITE		0x0002
416260684Skaiw#define	DW_DLC_RDWR		0x0004
417260684Skaiw
418260684Skaiw/*
419260684Skaiw * Flags used by libdwarf producer.
420260684Skaiw */
421260684Skaiw#define DW_DLC_SIZE_64			0x40000000
422260684Skaiw#define DW_DLC_SIZE_32			0x20000000
423260684Skaiw#define DW_DLC_OFFSET_SIZE_64		0x10000000
424260684Skaiw#define DW_DLC_ISA_MIPS			0x80000000
425260684Skaiw#define DW_DLC_ISA_IA64			0x01000000
426260684Skaiw#define DW_DLC_STREAM_RELOCATIONS	0x02000000
427260684Skaiw#define DW_DLC_SYMBOLIC_RELOCATIONS	0x04000000
428260684Skaiw#define DW_DLC_TARGET_BIGENDIAN		0x08000000
429260684Skaiw#define DW_DLC_TARGET_LITTLEENDIAN	0x00100000
430260684Skaiw
431260684Skaiw/*
432260684Skaiw * Instruction set architectures supported by this implementation.
433260684Skaiw */
434260684Skaiwenum Dwarf_ISA {
435260684Skaiw	DW_ISA_ARM,
436260684Skaiw	DW_ISA_IA64,
437260684Skaiw	DW_ISA_MIPS,
438260684Skaiw	DW_ISA_PPC,
439260684Skaiw	DW_ISA_SPARC,
440260684Skaiw	DW_ISA_X86,
441260684Skaiw	DW_ISA_X86_64,
442278580Semaste	DW_ISA_AARCH64,
443300675Sbr	DW_ISA_RISCV,
444260684Skaiw	DW_ISA_MAX
445260684Skaiw};
446260684Skaiw
447260684Skaiw/* Function prototype definitions. */
448280932Semaste#ifdef __cplusplus
449280932Semasteextern "C" {
450280932Semaste#endif
451260684SkaiwDwarf_P_Attribute dwarf_add_AT_comp_dir(Dwarf_P_Die, char *, Dwarf_Error *);
452260684SkaiwDwarf_P_Attribute dwarf_add_AT_const_value_signedint(Dwarf_P_Die, Dwarf_Signed,
453260684Skaiw		    Dwarf_Error *);
454260684SkaiwDwarf_P_Attribute dwarf_add_AT_const_value_string(Dwarf_P_Die, char *,
455260684Skaiw		    Dwarf_Error *);
456260684SkaiwDwarf_P_Attribute dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die,
457260684Skaiw		    Dwarf_Unsigned, Dwarf_Error *);
458260684SkaiwDwarf_P_Attribute dwarf_add_AT_dataref(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half,
459260684Skaiw		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *);
460260684SkaiwDwarf_P_Attribute dwarf_add_AT_flag(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half,
461260684Skaiw		    Dwarf_Small, Dwarf_Error *);
462260684SkaiwDwarf_P_Attribute dwarf_add_AT_location_expr(Dwarf_P_Debug, Dwarf_P_Die,
463260684Skaiw		    Dwarf_Half, Dwarf_P_Expr, Dwarf_Error *);
464260684SkaiwDwarf_P_Attribute dwarf_add_AT_name(Dwarf_P_Die, char *, Dwarf_Error *);
465260684SkaiwDwarf_P_Attribute dwarf_add_AT_producer(Dwarf_P_Die, char *, Dwarf_Error *);
466260684SkaiwDwarf_P_Attribute dwarf_add_AT_ref_address(Dwarf_P_Debug, Dwarf_P_Die,
467260684Skaiw		    Dwarf_Half, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *);
468260684SkaiwDwarf_P_Attribute dwarf_add_AT_reference(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half,
469260684Skaiw		    Dwarf_P_Die, Dwarf_Error *);
470260684SkaiwDwarf_P_Attribute dwarf_add_AT_signed_const(Dwarf_P_Debug, Dwarf_P_Die,
471260684Skaiw		    Dwarf_Half, Dwarf_Signed, Dwarf_Error *);
472260684SkaiwDwarf_P_Attribute dwarf_add_AT_string(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half,
473260684Skaiw		    char *, Dwarf_Error *);
474260684SkaiwDwarf_P_Attribute dwarf_add_AT_targ_address(Dwarf_P_Debug, Dwarf_P_Die,
475260684Skaiw		    Dwarf_Half, Dwarf_Unsigned, Dwarf_Signed, Dwarf_Error *);
476260684SkaiwDwarf_P_Attribute dwarf_add_AT_targ_address_b(Dwarf_P_Debug, Dwarf_P_Die,
477260684Skaiw		    Dwarf_Half, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *);
478260684SkaiwDwarf_P_Attribute dwarf_add_AT_unsigned_const(Dwarf_P_Debug, Dwarf_P_Die,
479260684Skaiw		    Dwarf_Half, Dwarf_Unsigned, Dwarf_Error *);
480260684SkaiwDwarf_Unsigned	dwarf_add_arange(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Unsigned,
481260684Skaiw		    Dwarf_Signed, Dwarf_Error *);
482260684SkaiwDwarf_Unsigned	dwarf_add_arange_b(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Unsigned,
483260684Skaiw		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Addr, Dwarf_Error *);
484260684SkaiwDwarf_Unsigned	dwarf_add_die_to_debug(Dwarf_P_Debug, Dwarf_P_Die,
485260684Skaiw		    Dwarf_Error *);
486260684SkaiwDwarf_Unsigned	dwarf_add_directory_decl(Dwarf_P_Debug, char *, Dwarf_Error *);
487260684SkaiwDwarf_Unsigned	dwarf_add_expr_addr(Dwarf_P_Expr, Dwarf_Unsigned,
488260684Skaiw		    Dwarf_Signed, Dwarf_Error *);
489260684SkaiwDwarf_Unsigned	dwarf_add_expr_addr_b(Dwarf_P_Expr, Dwarf_Unsigned,
490260684Skaiw		    Dwarf_Unsigned, Dwarf_Error *);
491260684SkaiwDwarf_Unsigned	dwarf_add_expr_gen(Dwarf_P_Expr, Dwarf_Small, Dwarf_Unsigned,
492260684Skaiw		    Dwarf_Unsigned, Dwarf_Error *);
493260684SkaiwDwarf_P_Fde	dwarf_add_fde_inst(Dwarf_P_Fde, Dwarf_Small, Dwarf_Unsigned,
494260684Skaiw		    Dwarf_Unsigned, Dwarf_Error *);
495260684SkaiwDwarf_Unsigned	dwarf_add_file_decl(Dwarf_P_Debug, char *, Dwarf_Unsigned,
496260684Skaiw		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *);
497260684SkaiwDwarf_Unsigned	dwarf_add_frame_cie(Dwarf_P_Debug, char *, Dwarf_Small,
498260684Skaiw		    Dwarf_Small, Dwarf_Small, Dwarf_Ptr, Dwarf_Unsigned,
499260684Skaiw		    Dwarf_Error *);
500260684SkaiwDwarf_Unsigned	dwarf_add_frame_fde(Dwarf_P_Debug, Dwarf_P_Fde, Dwarf_P_Die,
501260684Skaiw		    Dwarf_Unsigned, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Unsigned,
502260684Skaiw		    Dwarf_Error *);
503260684SkaiwDwarf_Unsigned	dwarf_add_frame_fde_b(Dwarf_P_Debug, Dwarf_P_Fde, Dwarf_P_Die,
504260684Skaiw		    Dwarf_Unsigned, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Unsigned,
505260684Skaiw		    Dwarf_Unsigned, Dwarf_Addr, Dwarf_Error *);
506260684SkaiwDwarf_Unsigned	dwarf_add_funcname(Dwarf_P_Debug, Dwarf_P_Die, char *,
507260684Skaiw		    Dwarf_Error *);
508260684SkaiwDwarf_Unsigned	dwarf_add_line_entry(Dwarf_P_Debug, Dwarf_Unsigned,
509260684Skaiw		    Dwarf_Addr, Dwarf_Unsigned, Dwarf_Signed, Dwarf_Bool,
510260684Skaiw		    Dwarf_Bool, Dwarf_Error *);
511260684SkaiwDwarf_Unsigned	dwarf_add_pubname(Dwarf_P_Debug, Dwarf_P_Die, char *,
512260684Skaiw		    Dwarf_Error *);
513260684SkaiwDwarf_Unsigned	dwarf_add_typename(Dwarf_P_Debug, Dwarf_P_Die, char *,
514260684Skaiw		    Dwarf_Error *);
515260684SkaiwDwarf_Unsigned	dwarf_add_varname(Dwarf_P_Debug, Dwarf_P_Die, char *,
516260684Skaiw		    Dwarf_Error *);
517260684SkaiwDwarf_Unsigned	dwarf_add_weakname(Dwarf_P_Debug, Dwarf_P_Die, char *,
518260684Skaiw		    Dwarf_Error *);
519260684Skaiwint		dwarf_arrayorder(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *);
520260684Skaiwint		dwarf_attr(Dwarf_Die, Dwarf_Half, Dwarf_Attribute *,
521260684Skaiw		    Dwarf_Error *);
522260684Skaiwint		dwarf_attrlist(Dwarf_Die, Dwarf_Attribute **,
523260684Skaiw		    Dwarf_Signed *, Dwarf_Error *);
524276371Semasteint		dwarf_attroffset(Dwarf_Attribute, Dwarf_Off *, Dwarf_Error *);
525260684Skaiwint		dwarf_attrval_flag(Dwarf_Die, Dwarf_Half, Dwarf_Bool *,
526260684Skaiw		    Dwarf_Error *);
527260684Skaiwint		dwarf_attrval_signed(Dwarf_Die, Dwarf_Half, Dwarf_Signed *,
528260684Skaiw		    Dwarf_Error *);
529260684Skaiwint		dwarf_attrval_string(Dwarf_Die, Dwarf_Half, const char **,
530260684Skaiw		    Dwarf_Error *);
531260684Skaiwint		dwarf_attrval_unsigned(Dwarf_Die, Dwarf_Half, Dwarf_Unsigned *,
532260684Skaiw		    Dwarf_Error *);
533260684Skaiwint		dwarf_bitoffset(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *);
534260684Skaiwint		dwarf_bitsize(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *);
535260684Skaiwint		dwarf_bytesize(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *);
536260684Skaiwint		dwarf_child(Dwarf_Die, Dwarf_Die *, Dwarf_Error *);
537260684Skaiwvoid		dwarf_dealloc(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned);
538260684Skaiwint		dwarf_def_macro(Dwarf_P_Debug, Dwarf_Unsigned, char *, char *,
539260684Skaiw		    Dwarf_Error *);
540260684Skaiwint		dwarf_die_CU_offset(Dwarf_Die, Dwarf_Off *, Dwarf_Error *);
541260684Skaiwint		dwarf_die_CU_offset_range(Dwarf_Die, Dwarf_Off *, Dwarf_Off *,
542260684Skaiw		    Dwarf_Error *);
543260684Skaiwint		dwarf_die_abbrev_code(Dwarf_Die);
544260684SkaiwDwarf_P_Die	dwarf_die_link(Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die,
545260684Skaiw		    Dwarf_P_Die, Dwarf_P_Die, Dwarf_Error *);
546260684Skaiwint		dwarf_diename(Dwarf_Die, char **, Dwarf_Error *);
547260684Skaiwint		dwarf_dieoffset(Dwarf_Die, Dwarf_Off *, Dwarf_Error *);
548260684Skaiwint		dwarf_elf_init(Elf *, int, Dwarf_Handler, Dwarf_Ptr,
549260684Skaiw		    Dwarf_Debug *, Dwarf_Error *);
550260684Skaiwint		dwarf_end_macro_file(Dwarf_P_Debug, Dwarf_Error *);
551260684Skaiwconst char	*dwarf_errmsg_(Dwarf_Error *);
552260684Skaiwint		dwarf_expand_frame_instructions(Dwarf_Cie, Dwarf_Ptr,
553260684Skaiw		    Dwarf_Unsigned, Dwarf_Frame_Op **, Dwarf_Signed *,
554260684Skaiw		    Dwarf_Error *);
555260684SkaiwDwarf_Unsigned	dwarf_expr_current_offset(Dwarf_P_Expr, Dwarf_Error *);
556260684SkaiwDwarf_Addr	dwarf_expr_into_block(Dwarf_P_Expr, Dwarf_Unsigned *,
557260684Skaiw		    Dwarf_Error *);
558260684SkaiwDwarf_P_Fde	dwarf_fde_cfa_offset(Dwarf_P_Fde, Dwarf_Unsigned, Dwarf_Signed,
559260684Skaiw		    Dwarf_Error *);
560260684Skaiwvoid		dwarf_fde_cie_list_dealloc(Dwarf_Debug, Dwarf_Cie *,
561260684Skaiw		    Dwarf_Signed, Dwarf_Fde *, Dwarf_Signed);
562260684Skaiwchar		*dwarf_find_macro_value_start(char *);
563260684Skaiwint		dwarf_finish(Dwarf_Debug, Dwarf_Error *);
564260684Skaiwint		dwarf_formaddr(Dwarf_Attribute, Dwarf_Addr *, Dwarf_Error *);
565260684Skaiwint		dwarf_formblock(Dwarf_Attribute, Dwarf_Block **, Dwarf_Error *);
566260684Skaiwint		dwarf_formexprloc(Dwarf_Attribute, Dwarf_Unsigned *,
567260684Skaiw		    Dwarf_Ptr *, Dwarf_Error *);
568260684Skaiwint		dwarf_formflag(Dwarf_Attribute, Dwarf_Bool *, Dwarf_Error *);
569260684Skaiwint		dwarf_formref(Dwarf_Attribute, Dwarf_Off *, Dwarf_Error *);
570260684Skaiwint		dwarf_formsdata(Dwarf_Attribute, Dwarf_Signed *, Dwarf_Error *);
571260684Skaiwint		dwarf_formsig8(Dwarf_Attribute, Dwarf_Sig8 *, Dwarf_Error *);
572260684Skaiwint		dwarf_formstring(Dwarf_Attribute, char **, Dwarf_Error *);
573260684Skaiwint		dwarf_formudata(Dwarf_Attribute, Dwarf_Unsigned *,
574260684Skaiw		    Dwarf_Error *);
575260684Skaiwint		dwarf_func_cu_offset(Dwarf_Func, Dwarf_Off *, Dwarf_Error *);
576260684Skaiwint		dwarf_func_die_offset(Dwarf_Func, Dwarf_Off *,
577260684Skaiw		    Dwarf_Error *);
578260684Skaiwint		dwarf_func_name_offsets(Dwarf_Func, char **,
579260684Skaiw		    Dwarf_Off *, Dwarf_Off *, Dwarf_Error *);
580260684Skaiwint		dwarf_funcname(Dwarf_Func, char **, Dwarf_Error *);
581260684Skaiwvoid		dwarf_funcs_dealloc(Dwarf_Debug, Dwarf_Func *, Dwarf_Signed);
582260684Skaiwint		dwarf_get_ACCESS_name(unsigned, const char **);
583260684Skaiwint		dwarf_get_ATE_name(unsigned, const char **);
584260684Skaiwint		dwarf_get_AT_name(unsigned, const char **);
585260684Skaiwint		dwarf_get_CC_name(unsigned, const char **);
586260684Skaiwint		dwarf_get_CFA_name(unsigned, const char **);
587260684Skaiwint		dwarf_get_CHILDREN_name(unsigned, const char **);
588260684Skaiwint		dwarf_get_DSC_name(unsigned, const char **);
589260684Skaiwint		dwarf_get_DS_name(unsigned, const char **);
590260684Skaiwint		dwarf_get_EH_name(unsigned, const char **);
591260684Skaiwint		dwarf_get_END_name(unsigned, const char **);
592260684Skaiwint		dwarf_get_FORM_name(unsigned, const char **);
593260684Skaiwint		dwarf_get_ID_name(unsigned, const char **);
594260684Skaiwint		dwarf_get_INL_name(unsigned, const char **);
595260684Skaiwint		dwarf_get_LANG_name(unsigned, const char **);
596260684Skaiwint		dwarf_get_LNE_name(unsigned, const char **);
597260684Skaiwint		dwarf_get_LNS_name(unsigned, const char **);
598260684Skaiwint		dwarf_get_MACINFO_name(unsigned, const char **);
599260684Skaiwint		dwarf_get_OP_name(unsigned, const char **);
600260684Skaiwint		dwarf_get_ORD_name(unsigned, const char **);
601260684Skaiwint		dwarf_get_TAG_name(unsigned, const char **);
602260684Skaiwint		dwarf_get_VIRTUALITY_name(unsigned, const char **);
603260684Skaiwint		dwarf_get_VIS_name(unsigned, const char **);
604260684Skaiwint		dwarf_get_abbrev(Dwarf_Debug, Dwarf_Unsigned, Dwarf_Abbrev *,
605260684Skaiw		    Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Error *);
606260684Skaiwint		dwarf_get_abbrev_children_flag(Dwarf_Abbrev, Dwarf_Signed *,
607260684Skaiw		    Dwarf_Error *);
608260684Skaiwint		dwarf_get_abbrev_code(Dwarf_Abbrev, Dwarf_Unsigned *,
609260684Skaiw		    Dwarf_Error *);
610260684Skaiwint		dwarf_get_abbrev_entry(Dwarf_Abbrev, Dwarf_Signed, Dwarf_Half *,
611260684Skaiw		    Dwarf_Signed *, Dwarf_Off *, Dwarf_Error *);
612260684Skaiwint		dwarf_get_abbrev_tag(Dwarf_Abbrev, Dwarf_Half *, Dwarf_Error *);
613260684Skaiwint		dwarf_get_address_size(Dwarf_Debug, Dwarf_Half *,
614260684Skaiw		    Dwarf_Error *);
615260684Skaiwint		dwarf_get_arange(Dwarf_Arange *, Dwarf_Unsigned, Dwarf_Addr,
616260684Skaiw		    Dwarf_Arange *, Dwarf_Error *);
617260684Skaiwint		dwarf_get_arange_cu_header_offset(Dwarf_Arange, Dwarf_Off *,
618260684Skaiw		    Dwarf_Error *);
619260684Skaiwint		dwarf_get_arange_info(Dwarf_Arange, Dwarf_Addr *,
620260684Skaiw		    Dwarf_Unsigned *, Dwarf_Off *, Dwarf_Error *);
621260684Skaiwint		dwarf_get_aranges(Dwarf_Debug, Dwarf_Arange **, Dwarf_Signed *,
622260684Skaiw		    Dwarf_Error *);
623260684Skaiwint		dwarf_get_cie_index(Dwarf_Cie, Dwarf_Signed *, Dwarf_Error *);
624260684Skaiwint		dwarf_get_cie_info(Dwarf_Cie, Dwarf_Unsigned *, Dwarf_Small *,
625260684Skaiw		    char **, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Half *,
626260684Skaiw		    Dwarf_Ptr *, Dwarf_Unsigned *, Dwarf_Error *);
627260684Skaiwint		dwarf_get_cie_of_fde(Dwarf_Fde, Dwarf_Cie *, Dwarf_Error *);
628260684Skaiwint		dwarf_get_cu_die_offset(Dwarf_Arange, Dwarf_Off *,
629260684Skaiw		    Dwarf_Error *);
630260684Skaiwint		dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug,
631260684Skaiw		    Dwarf_Off, Dwarf_Off *, Dwarf_Error *);
632276371Semasteint		dwarf_get_cu_die_offset_given_cu_header_offset_b(Dwarf_Debug,
633276371Semaste		    Dwarf_Off, Dwarf_Bool, Dwarf_Off *, Dwarf_Error *);
634276371SemasteDwarf_Bool	dwarf_get_die_infotypes_flag(Dwarf_Die);
635260684Skaiwint		dwarf_get_elf(Dwarf_Debug, Elf **, Dwarf_Error *);
636260684Skaiwint		dwarf_get_fde_at_pc(Dwarf_Fde *, Dwarf_Addr, Dwarf_Fde *,
637260684Skaiw		    Dwarf_Addr *, Dwarf_Addr *, Dwarf_Error *);
638260684Skaiwint		dwarf_get_fde_info_for_all_regs(Dwarf_Fde, Dwarf_Addr,
639260684Skaiw		    Dwarf_Regtable *, Dwarf_Addr *, Dwarf_Error *);
640260684Skaiwint		dwarf_get_fde_info_for_all_regs3(Dwarf_Fde, Dwarf_Addr,
641260684Skaiw		    Dwarf_Regtable3 *, Dwarf_Addr *, Dwarf_Error *);
642260684Skaiwint		dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde, Dwarf_Addr,
643260684Skaiw		    Dwarf_Small *, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Signed *,
644260684Skaiw		    Dwarf_Ptr *, Dwarf_Addr *, Dwarf_Error *);
645260684Skaiwint		dwarf_get_fde_info_for_reg(Dwarf_Fde, Dwarf_Half, Dwarf_Addr,
646260684Skaiw		    Dwarf_Signed *, Dwarf_Signed *, Dwarf_Signed *,
647260684Skaiw		    Dwarf_Addr *, Dwarf_Error *);
648260684Skaiwint		dwarf_get_fde_info_for_reg3(Dwarf_Fde, Dwarf_Half, Dwarf_Addr,
649260684Skaiw		    Dwarf_Small *, Dwarf_Signed *, Dwarf_Signed *,
650260684Skaiw		    Dwarf_Signed *, Dwarf_Ptr *, Dwarf_Addr *, Dwarf_Error *);
651260684Skaiwint		dwarf_get_fde_instr_bytes(Dwarf_Fde, Dwarf_Ptr *,
652260684Skaiw		    Dwarf_Unsigned *, Dwarf_Error *);
653260684Skaiwint		dwarf_get_fde_list(Dwarf_Debug, Dwarf_Cie **, Dwarf_Signed *,
654260684Skaiw		    Dwarf_Fde **, Dwarf_Signed *, Dwarf_Error *);
655260684Skaiwint		dwarf_get_fde_list_eh(Dwarf_Debug, Dwarf_Cie **, Dwarf_Signed *,
656260684Skaiw		    Dwarf_Fde **, Dwarf_Signed *, Dwarf_Error *);
657260684Skaiwint		dwarf_get_fde_n(Dwarf_Fde *, Dwarf_Unsigned, Dwarf_Fde *,
658260684Skaiw		    Dwarf_Error *);
659260684Skaiwint		dwarf_get_fde_range(Dwarf_Fde, Dwarf_Addr *, Dwarf_Unsigned *,
660260684Skaiw		    Dwarf_Ptr *, Dwarf_Unsigned *, Dwarf_Off *, Dwarf_Signed *,
661260684Skaiw		    Dwarf_Off *, Dwarf_Error *);
662260684Skaiwenum Dwarf_Form_Class dwarf_get_form_class(Dwarf_Half, Dwarf_Half, Dwarf_Half,
663260684Skaiw		    Dwarf_Half);
664260684Skaiwint		dwarf_get_funcs(Dwarf_Debug, Dwarf_Func **, Dwarf_Signed *,
665260684Skaiw		    Dwarf_Error *);
666260684Skaiwint		dwarf_get_globals(Dwarf_Debug, Dwarf_Global **, Dwarf_Signed *,
667260684Skaiw		    Dwarf_Error *);
668260684Skaiwint		dwarf_get_loclist_entry(Dwarf_Debug, Dwarf_Unsigned,
669260684Skaiw		    Dwarf_Addr *, Dwarf_Addr *, Dwarf_Ptr *, Dwarf_Unsigned *,
670260684Skaiw		    Dwarf_Unsigned *, Dwarf_Error *);
671260684Skaiwint		dwarf_get_macro_details(Dwarf_Debug, Dwarf_Off, Dwarf_Unsigned,
672260684Skaiw		    Dwarf_Signed *, Dwarf_Macro_Details **, Dwarf_Error *);
673260684Skaiwint		dwarf_get_pubtypes(Dwarf_Debug, Dwarf_Type **, Dwarf_Signed *,
674260684Skaiw		    Dwarf_Error *);
675260684Skaiwint		dwarf_get_ranges(Dwarf_Debug, Dwarf_Off, Dwarf_Ranges **,
676260684Skaiw		    Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Error *);
677260684Skaiwint		dwarf_get_ranges_a(Dwarf_Debug, Dwarf_Off, Dwarf_Die,
678260684Skaiw		    Dwarf_Ranges **, Dwarf_Signed *, Dwarf_Unsigned *,
679260684Skaiw		    Dwarf_Error *);
680260684Skaiwint		dwarf_get_relocation_info(Dwarf_P_Debug, Dwarf_Signed *,
681260684Skaiw		    Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Relocation_Data *,
682260684Skaiw		    Dwarf_Error *);
683260684Skaiwint		dwarf_get_relocation_info_count(Dwarf_P_Debug, Dwarf_Unsigned *,
684260684Skaiw		    int *, Dwarf_Error *);
685260684SkaiwDwarf_Ptr	dwarf_get_section_bytes(Dwarf_P_Debug, Dwarf_Signed,
686260684Skaiw		    Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Error *);
687276371Semasteint		dwarf_get_section_max_offsets(Dwarf_Debug, Dwarf_Unsigned *,
688276371Semaste		    Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *,
689276371Semaste		    Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *,
690276371Semaste		    Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *,
691276371Semaste		    Dwarf_Unsigned *);
692276371Semasteint		dwarf_get_section_max_offsets_b(Dwarf_Debug, Dwarf_Unsigned *,
693276371Semaste		    Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *,
694276371Semaste		    Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *,
695276371Semaste		    Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *,
696276371Semaste		    Dwarf_Unsigned *, Dwarf_Unsigned *);
697260684Skaiwint		dwarf_get_str(Dwarf_Debug, Dwarf_Off, char **, Dwarf_Signed *,
698260684Skaiw		    Dwarf_Error *);
699260684Skaiwint		dwarf_get_types(Dwarf_Debug, Dwarf_Type **, Dwarf_Signed *,
700260684Skaiw		    Dwarf_Error *);
701260684Skaiwint		dwarf_get_vars(Dwarf_Debug, Dwarf_Var **, Dwarf_Signed *,
702260684Skaiw		    Dwarf_Error *);
703260684Skaiwint		dwarf_get_weaks(Dwarf_Debug, Dwarf_Weak **, Dwarf_Signed *,
704260684Skaiw		    Dwarf_Error *);
705260684Skaiwint		dwarf_global_cu_offset(Dwarf_Global, Dwarf_Off *, Dwarf_Error *);
706260684Skaiwint		dwarf_global_die_offset(Dwarf_Global, Dwarf_Off *,
707260684Skaiw		    Dwarf_Error *);
708260684Skaiwint		dwarf_global_formref(Dwarf_Attribute, Dwarf_Off *,
709260684Skaiw		    Dwarf_Error *);
710260684Skaiwint		dwarf_global_name_offsets(Dwarf_Global, char **,
711260684Skaiw		    Dwarf_Off *, Dwarf_Off *, Dwarf_Error *);
712260684Skaiwvoid		dwarf_globals_dealloc(Dwarf_Debug, Dwarf_Global *, Dwarf_Signed);
713260684Skaiwint		dwarf_globname(Dwarf_Global, char **, Dwarf_Error *);
714260684Skaiwint		dwarf_hasattr(Dwarf_Die, Dwarf_Half, Dwarf_Bool *,
715260684Skaiw		    Dwarf_Error *);
716260684Skaiwint		dwarf_hasform(Dwarf_Attribute, Dwarf_Half, Dwarf_Bool *,
717260684Skaiw		    Dwarf_Error *);
718260684Skaiwint		dwarf_highpc(Dwarf_Die, Dwarf_Addr *, Dwarf_Error *);
719276371Semasteint		dwarf_highpc_b(Dwarf_Die, Dwarf_Addr *, Dwarf_Half *,
720276371Semaste		    enum Dwarf_Form_Class *, Dwarf_Error *);
721260684Skaiwint		dwarf_init(int, int, Dwarf_Handler, Dwarf_Ptr, Dwarf_Debug *,
722260684Skaiw		    Dwarf_Error *);
723260684Skaiwint		dwarf_line_srcfileno(Dwarf_Line, Dwarf_Unsigned *,
724260684Skaiw		    Dwarf_Error *);
725260684Skaiwint		dwarf_lineaddr(Dwarf_Line, Dwarf_Addr *, Dwarf_Error *);
726260684Skaiwint		dwarf_linebeginstatement(Dwarf_Line, Dwarf_Bool *,
727260684Skaiw		    Dwarf_Error *);
728260684Skaiwint		dwarf_lineblock(Dwarf_Line, Dwarf_Bool *, Dwarf_Error *);
729260684Skaiwint		dwarf_lineendsequence(Dwarf_Line, Dwarf_Bool *, Dwarf_Error *);
730260684Skaiwint		dwarf_lineno(Dwarf_Line, Dwarf_Unsigned *, Dwarf_Error *);
731260684Skaiwint		dwarf_lineoff(Dwarf_Line, Dwarf_Signed *, Dwarf_Error *);
732260684Skaiwint		dwarf_linesrc(Dwarf_Line, char **, Dwarf_Error *);
733260684SkaiwDwarf_Unsigned	dwarf_lne_end_sequence(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Error *);
734260684SkaiwDwarf_Unsigned	dwarf_lne_set_address(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Unsigned,
735260684Skaiw		    Dwarf_Error *);
736260684Skaiwint		dwarf_loclist(Dwarf_Attribute, Dwarf_Locdesc **, Dwarf_Signed *,
737260684Skaiw		    Dwarf_Error *);
738260684Skaiwint		dwarf_loclist_from_expr(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned,
739260684Skaiw		    Dwarf_Locdesc **, Dwarf_Signed *, Dwarf_Error *);
740260684Skaiwint		dwarf_loclist_from_expr_a(Dwarf_Debug, Dwarf_Ptr,
741260684Skaiw		    Dwarf_Unsigned, Dwarf_Half, Dwarf_Locdesc **,
742260684Skaiw		    Dwarf_Signed *, Dwarf_Error *);
743276371Semasteint		dwarf_loclist_from_expr_b(Dwarf_Debug, Dwarf_Ptr,
744276371Semaste		    Dwarf_Unsigned, Dwarf_Half, Dwarf_Half,
745276371Semaste		    Dwarf_Small, Dwarf_Locdesc **, Dwarf_Signed *,
746276371Semaste		    Dwarf_Error *);
747260684Skaiwint		dwarf_loclist_n(Dwarf_Attribute, Dwarf_Locdesc ***,
748260684Skaiw		    Dwarf_Signed *, Dwarf_Error *);
749260684Skaiwint		dwarf_lowpc(Dwarf_Die, Dwarf_Addr *, Dwarf_Error *);
750260684SkaiwDwarf_P_Die	dwarf_new_die(Dwarf_P_Debug, Dwarf_Tag, Dwarf_P_Die,
751260684Skaiw		    Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die, Dwarf_Error *);
752260684SkaiwDwarf_P_Expr	dwarf_new_expr(Dwarf_P_Debug, Dwarf_Error *);
753260684SkaiwDwarf_P_Fde	dwarf_new_fde(Dwarf_P_Debug, Dwarf_Error *);
754260684Skaiwint		dwarf_next_cu_header(Dwarf_Debug, Dwarf_Unsigned *,
755260684Skaiw		    Dwarf_Half *, Dwarf_Off *, Dwarf_Half *,
756260684Skaiw		    Dwarf_Unsigned *, Dwarf_Error *);
757260684Skaiwint		dwarf_next_cu_header_b(Dwarf_Debug, Dwarf_Unsigned *,
758260684Skaiw		    Dwarf_Half *, Dwarf_Off *, Dwarf_Half *, Dwarf_Half *,
759260684Skaiw		    Dwarf_Half *, Dwarf_Unsigned *, Dwarf_Error *);
760276371Semasteint		dwarf_next_cu_header_c(Dwarf_Debug, Dwarf_Bool,
761276371Semaste		    Dwarf_Unsigned *, Dwarf_Half *, Dwarf_Off *, Dwarf_Half *,
762276371Semaste		    Dwarf_Half *, Dwarf_Half *, Dwarf_Sig8 *, Dwarf_Unsigned *,
763276371Semaste		    Dwarf_Unsigned *, Dwarf_Error *);
764276371Semasteint		dwarf_next_types_section(Dwarf_Debug, Dwarf_Error *);
765260684Skaiwint		dwarf_object_finish(Dwarf_Debug, Dwarf_Error *);
766260684Skaiwint		dwarf_object_init(Dwarf_Obj_Access_Interface *, Dwarf_Handler,
767260684Skaiw		    Dwarf_Ptr, Dwarf_Debug *, Dwarf_Error *);
768260684Skaiwint		dwarf_offdie(Dwarf_Debug, Dwarf_Off, Dwarf_Die *,
769260684Skaiw		    Dwarf_Error *);
770276371Semasteint		dwarf_offdie_b(Dwarf_Debug, Dwarf_Off, Dwarf_Bool, Dwarf_Die *,
771276371Semaste		    Dwarf_Error *);
772260684SkaiwDwarf_Unsigned	dwarf_producer_finish(Dwarf_P_Debug, Dwarf_Error *);
773260684SkaiwDwarf_P_Debug	dwarf_producer_init(Dwarf_Unsigned, Dwarf_Callback_Func,
774260684Skaiw		    Dwarf_Handler, Dwarf_Ptr, Dwarf_Error *);
775260684SkaiwDwarf_P_Debug	dwarf_producer_init_b(Dwarf_Unsigned, Dwarf_Callback_Func_b,
776260684Skaiw		    Dwarf_Handler, Dwarf_Ptr, Dwarf_Error *);
777260684Skaiwint		dwarf_producer_set_isa(Dwarf_P_Debug, enum Dwarf_ISA,
778260684Skaiw		    Dwarf_Error *);
779260684Skaiwint		dwarf_pubtype_cu_offset(Dwarf_Type, Dwarf_Off *, Dwarf_Error *);
780260684Skaiwint		dwarf_pubtype_die_offset(Dwarf_Type, Dwarf_Off *,
781260684Skaiw		    Dwarf_Error *);
782260684Skaiwint		dwarf_pubtype_name_offsets(Dwarf_Type, char **,
783260684Skaiw		    Dwarf_Off *, Dwarf_Off *, Dwarf_Error *);
784260684Skaiwint		dwarf_pubtypename(Dwarf_Type, char **, Dwarf_Error *);
785260684Skaiwvoid		dwarf_pubtypes_dealloc(Dwarf_Debug, Dwarf_Type *, Dwarf_Signed);
786260684Skaiwvoid		dwarf_ranges_dealloc(Dwarf_Debug, Dwarf_Ranges *, Dwarf_Signed);
787260684Skaiwvoid		dwarf_reset_section_bytes(Dwarf_P_Debug);
788260684SkaiwDwarf_Half	dwarf_set_frame_cfa_value(Dwarf_Debug, Dwarf_Half);
789260684SkaiwDwarf_Half	dwarf_set_frame_rule_initial_value(Dwarf_Debug, Dwarf_Half);
790260684SkaiwDwarf_Half	dwarf_set_frame_rule_table_size(Dwarf_Debug, Dwarf_Half);
791260684SkaiwDwarf_Half	dwarf_set_frame_same_value(Dwarf_Debug, Dwarf_Half);
792260684SkaiwDwarf_Half	dwarf_set_frame_undefined_value(Dwarf_Debug, Dwarf_Half);
793260684Skaiwint		dwarf_set_reloc_application(int);
794260684SkaiwDwarf_Ptr	dwarf_seterrarg(Dwarf_Debug, Dwarf_Ptr);
795260684SkaiwDwarf_Handler	dwarf_seterrhand(Dwarf_Debug, Dwarf_Handler);
796260684Skaiwint		dwarf_siblingof(Dwarf_Debug, Dwarf_Die, Dwarf_Die *, Dwarf_Error *);
797276371Semasteint		dwarf_siblingof_b(Dwarf_Debug, Dwarf_Die, Dwarf_Die *, Dwarf_Bool,
798276371Semaste		    Dwarf_Error *);
799260684Skaiwint		dwarf_srcfiles(Dwarf_Die, char ***, Dwarf_Signed *, Dwarf_Error *);
800260684Skaiwint		dwarf_srclang(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *);
801260684Skaiwint		dwarf_srclines(Dwarf_Die, Dwarf_Line **, Dwarf_Signed *,
802260684Skaiw		    Dwarf_Error *);
803260684Skaiwvoid		dwarf_srclines_dealloc(Dwarf_Debug, Dwarf_Line *,
804260684Skaiw		    Dwarf_Signed);
805260684Skaiwint		dwarf_start_macro_file(Dwarf_P_Debug, Dwarf_Unsigned,
806260684Skaiw		    Dwarf_Unsigned, Dwarf_Error *);
807260684Skaiwint		dwarf_tag(Dwarf_Die, Dwarf_Half *, Dwarf_Error *);
808260684SkaiwDwarf_Signed	dwarf_transform_to_disk_form(Dwarf_P_Debug, Dwarf_Error *);
809260684Skaiwint		dwarf_type_cu_offset(Dwarf_Type, Dwarf_Off *, Dwarf_Error *);
810260684Skaiwint		dwarf_type_die_offset(Dwarf_Type, Dwarf_Off *, Dwarf_Error *);
811260684Skaiwint		dwarf_type_name_offsets(Dwarf_Type, char **,
812260684Skaiw		    Dwarf_Off *, Dwarf_Off *, Dwarf_Error *);
813260684Skaiwint		dwarf_typename(Dwarf_Type, char **, Dwarf_Error *);
814260684Skaiwvoid		dwarf_types_dealloc(Dwarf_Debug, Dwarf_Type *, Dwarf_Signed);
815260684Skaiwint		dwarf_undef_macro(Dwarf_P_Debug, Dwarf_Unsigned, char *,
816260684Skaiw		    Dwarf_Error *);
817260684Skaiwint		dwarf_var_cu_offset(Dwarf_Var, Dwarf_Off *, Dwarf_Error *);
818260684Skaiwint		dwarf_var_die_offset(Dwarf_Var, Dwarf_Off *,
819260684Skaiw		    Dwarf_Error *);
820260684Skaiwint		dwarf_var_name_offsets(Dwarf_Var, char **,
821260684Skaiw		    Dwarf_Off *, Dwarf_Off *, Dwarf_Error *);
822260684Skaiwint		dwarf_varname(Dwarf_Var, char **, Dwarf_Error *);
823260684Skaiwvoid		dwarf_vars_dealloc(Dwarf_Debug, Dwarf_Var *, Dwarf_Signed);
824260684Skaiwint		dwarf_vendor_ext(Dwarf_P_Debug, Dwarf_Unsigned, char *,
825260684Skaiw		    Dwarf_Error *);
826260684Skaiwint		dwarf_weak_cu_offset(Dwarf_Weak, Dwarf_Off *, Dwarf_Error *);
827260684Skaiwint		dwarf_weak_die_offset(Dwarf_Weak, Dwarf_Off *,
828260684Skaiw		    Dwarf_Error *);
829260684Skaiwint		dwarf_weak_name_offsets(Dwarf_Weak, char **,
830260684Skaiw		    Dwarf_Off *, Dwarf_Off *, Dwarf_Error *);
831260684Skaiwint		dwarf_weakname(Dwarf_Weak, char **, Dwarf_Error *);
832260684Skaiwvoid		dwarf_weaks_dealloc(Dwarf_Debug, Dwarf_Weak *, Dwarf_Signed);
833260684Skaiwint		dwarf_whatattr(Dwarf_Attribute, Dwarf_Half *, Dwarf_Error *);
834260684Skaiwint		dwarf_whatform(Dwarf_Attribute, Dwarf_Half *, Dwarf_Error *);
835260684Skaiwint		dwarf_whatform_direct(Dwarf_Attribute, Dwarf_Half *,
836260684Skaiw		    Dwarf_Error *);
837280932Semaste#ifdef __cplusplus
838280932Semaste}
839280932Semaste#endif
840260684Skaiw
841260684Skaiw#endif /* !_LIBDWARF_H_ */
842