xref: /freebsd/contrib/elftoolchain/libdwarf/_libdwarf.h (revision dbf05458e3bd8c46f5e49918593557293a29d41a)
12de3b87aSKai Wang /*-
22de3b87aSKai Wang  * Copyright (c) 2007 John Birrell (jb@freebsd.org)
3cf781b2eSEd Maste  * Copyright (c) 2009-2014 Kai Wang
42de3b87aSKai Wang  * All rights reserved.
52de3b87aSKai Wang  *
62de3b87aSKai Wang  * Redistribution and use in source and binary forms, with or without
72de3b87aSKai Wang  * modification, are permitted provided that the following conditions
82de3b87aSKai Wang  * are met:
92de3b87aSKai Wang  * 1. Redistributions of source code must retain the above copyright
102de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer.
112de3b87aSKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
122de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer in the
132de3b87aSKai Wang  *    documentation and/or other materials provided with the distribution.
142de3b87aSKai Wang  *
152de3b87aSKai Wang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
162de3b87aSKai Wang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
172de3b87aSKai Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
182de3b87aSKai Wang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
192de3b87aSKai Wang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
202de3b87aSKai Wang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
212de3b87aSKai Wang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
222de3b87aSKai Wang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
232de3b87aSKai Wang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
242de3b87aSKai Wang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
252de3b87aSKai Wang  * SUCH DAMAGE.
262de3b87aSKai Wang  *
27839529caSEd Maste  * $Id: _libdwarf.h 3298 2016-01-09 15:43:31Z jkoshy $
282de3b87aSKai Wang  */
292de3b87aSKai Wang 
302de3b87aSKai Wang #ifndef	__LIBDWARF_H_
312de3b87aSKai Wang #define	__LIBDWARF_H_
322de3b87aSKai Wang 
332de3b87aSKai Wang #include <sys/param.h>
342de3b87aSKai Wang #include <sys/queue.h>
352de3b87aSKai Wang #include <assert.h>
362de3b87aSKai Wang #include <limits.h>
372de3b87aSKai Wang #include <stdio.h>
382de3b87aSKai Wang #include <stdlib.h>
392de3b87aSKai Wang #include <string.h>
402de3b87aSKai Wang #include <gelf.h>
412de3b87aSKai Wang #include "dwarf.h"
422de3b87aSKai Wang #include "libdwarf.h"
432de3b87aSKai Wang #include "uthash.h"
442de3b87aSKai Wang 
452de3b87aSKai Wang #include "_elftc.h"
462de3b87aSKai Wang 
472de3b87aSKai Wang #define DWARF_DIE_HASH_SIZE		8191
482de3b87aSKai Wang 
492de3b87aSKai Wang struct _libdwarf_globals {
502de3b87aSKai Wang 	Dwarf_Handler	errhand;
512de3b87aSKai Wang 	Dwarf_Ptr	errarg;
52d133198bSEd Maste 	int		applyreloc;
532de3b87aSKai Wang };
542de3b87aSKai Wang 
552de3b87aSKai Wang extern struct _libdwarf_globals _libdwarf;
562de3b87aSKai Wang 
572de3b87aSKai Wang #define	_DWARF_SET_ERROR(_d, _e, _err, _elf_err)			\
582de3b87aSKai Wang 	_dwarf_set_error(_d, _e, _err, _elf_err, __func__, __LINE__)
592de3b87aSKai Wang #define	DWARF_SET_ERROR(_d, _e, _err)					\
602de3b87aSKai Wang 	_DWARF_SET_ERROR(_d, _e, _err, 0)
612de3b87aSKai Wang #define	DWARF_SET_ELF_ERROR(_d, _e)					\
622de3b87aSKai Wang 	_DWARF_SET_ERROR(_d, _e, DW_DLE_ELF, elf_errno())
632de3b87aSKai Wang 
642de3b87aSKai Wang /*
652de3b87aSKai Wang  * Convenient macros for producer bytes stream generation.
662de3b87aSKai Wang  */
672de3b87aSKai Wang #define	WRITE_VALUE(value, bytes)					\
682de3b87aSKai Wang 	dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size,	\
692de3b87aSKai Wang 	    (value), (bytes), error)
702de3b87aSKai Wang #define	WRITE_ULEB128(value)						\
712de3b87aSKai Wang 	_dwarf_write_uleb128_alloc(&ds->ds_data, &ds->ds_cap,		\
722de3b87aSKai Wang 	    &ds->ds_size, (value), error)
732de3b87aSKai Wang #define	WRITE_SLEB128(value)						\
742de3b87aSKai Wang 	_dwarf_write_sleb128_alloc(&ds->ds_data, &ds->ds_cap,		\
752de3b87aSKai Wang 	    &ds->ds_size, (value), error)
762de3b87aSKai Wang #define	WRITE_STRING(string)						\
772de3b87aSKai Wang 	_dwarf_write_string_alloc(&ds->ds_data, &ds->ds_cap,		\
782de3b87aSKai Wang 	    &ds->ds_size, (string), error)
792de3b87aSKai Wang #define	WRITE_BLOCK(blk, size)						\
802de3b87aSKai Wang 	_dwarf_write_block_alloc(&ds->ds_data, &ds->ds_cap,		\
812de3b87aSKai Wang 	    &ds->ds_size, (blk), (size), error)
822de3b87aSKai Wang #define	WRITE_PADDING(byte, cnt)					\
832de3b87aSKai Wang 	_dwarf_write_padding_alloc(&ds->ds_data, &ds->ds_cap,		\
842de3b87aSKai Wang 	    &ds->ds_size, (byte), (cnt), error)
852de3b87aSKai Wang #define	RCHECK(expr)							\
862de3b87aSKai Wang 	do {								\
872de3b87aSKai Wang 		ret = expr;						\
882de3b87aSKai Wang 		if (ret != DW_DLE_NONE)					\
892de3b87aSKai Wang 			goto gen_fail;					\
902de3b87aSKai Wang 	} while(0)
912de3b87aSKai Wang 
92cf781b2eSEd Maste typedef struct _Dwarf_CU *Dwarf_CU;
932de3b87aSKai Wang 
942de3b87aSKai Wang struct _Dwarf_AttrDef {
95839529caSEd Maste 	Dwarf_Half	ad_attrib;		/* DW_AT_XXX */
96839529caSEd Maste 	Dwarf_Half	ad_form;		/* DW_FORM_XXX */
972de3b87aSKai Wang 	uint64_t	ad_offset;		/* Offset in abbrev section. */
982de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_AttrDef) ad_next;	/* Next attribute define. */
992de3b87aSKai Wang };
1002de3b87aSKai Wang 
1012de3b87aSKai Wang struct _Dwarf_Attribute {
1022de3b87aSKai Wang 	Dwarf_Die		at_die;		/* Ptr to containing DIE. */
1032de3b87aSKai Wang 	Dwarf_Die		at_refdie;	/* Ptr to reference DIE. */
1042de3b87aSKai Wang 	uint64_t		at_offset;	/* Offset in info section. */
105839529caSEd Maste 	Dwarf_Half		at_attrib;	/* DW_AT_XXX */
106839529caSEd Maste 	Dwarf_Half		at_form;	/* DW_FORM_XXX */
1072de3b87aSKai Wang 	int			at_indirect;	/* Has indirect form. */
1082de3b87aSKai Wang 	union {
1092de3b87aSKai Wang 		uint64_t	u64;		/* Unsigned value. */
1102de3b87aSKai Wang 		int64_t		s64;		/* Signed value. */
1112de3b87aSKai Wang 		char		*s;   		/* String. */
1122de3b87aSKai Wang 		uint8_t		*u8p;		/* Block data. */
1132de3b87aSKai Wang 	} u[2];					/* Value. */
1142de3b87aSKai Wang 	Dwarf_Block		at_block;	/* Block. */
1152de3b87aSKai Wang 	Dwarf_Locdesc		*at_ld;		/* at value is locdesc. */
1162de3b87aSKai Wang 	Dwarf_P_Expr		at_expr;	/* at value is expr. */
1172de3b87aSKai Wang 	uint64_t		at_relsym;	/* Relocation symbol index. */
1182de3b87aSKai Wang 	const char		*at_relsec;	/* Rel. to dwarf section. */
1192de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Attribute) at_next;	/* Next attribute. */
1202de3b87aSKai Wang };
1212de3b87aSKai Wang 
1222de3b87aSKai Wang struct _Dwarf_Abbrev {
1232de3b87aSKai Wang 	uint64_t	ab_entry;	/* Abbrev entry. */
1242de3b87aSKai Wang 	uint64_t	ab_tag;		/* Tag: DW_TAG_ */
1252de3b87aSKai Wang 	uint8_t		ab_children;	/* DW_CHILDREN_no or DW_CHILDREN_yes */
1262de3b87aSKai Wang 	uint64_t	ab_offset;	/* Offset in abbrev section. */
1272de3b87aSKai Wang 	uint64_t	ab_length;	/* Length of this abbrev entry. */
1282de3b87aSKai Wang 	uint64_t	ab_atnum;	/* Number of attribute defines. */
1292de3b87aSKai Wang 	UT_hash_handle	ab_hh;		/* Uthash handle. */
1302de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_AttrDef) ab_attrdef; /* List of attribute defs. */
1312de3b87aSKai Wang };
1322de3b87aSKai Wang 
1332de3b87aSKai Wang struct _Dwarf_Die {
1342de3b87aSKai Wang 	Dwarf_Die	die_parent;	/* Parent DIE. */
1352de3b87aSKai Wang 	Dwarf_Die	die_child;	/* First child DIE. */
1362de3b87aSKai Wang 	Dwarf_Die	die_left;	/* Left sibling DIE. */
1372de3b87aSKai Wang 	Dwarf_Die	die_right;	/* Right sibling DIE. */
1382de3b87aSKai Wang 	uint64_t	die_offset;	/* DIE offset in section. */
1392de3b87aSKai Wang 	uint64_t	die_next_off;	/* Next DIE offset in section. */
1402de3b87aSKai Wang 	uint64_t	die_abnum;	/* Abbrev number. */
1412de3b87aSKai Wang 	Dwarf_Abbrev	die_ab;		/* Abbrev pointer. */
1422de3b87aSKai Wang 	Dwarf_Tag	die_tag;	/* DW_TAG_ */
1432de3b87aSKai Wang 	Dwarf_Debug	die_dbg;	/* Dwarf_Debug pointer. */
1442de3b87aSKai Wang 	Dwarf_CU	die_cu;		/* Compilation unit pointer. */
1452de3b87aSKai Wang 	char		*die_name;	/* Ptr to the name string. */
1462de3b87aSKai Wang 	Dwarf_Attribute	*die_attrarray;	/* Array of attributes. */
1472de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Attribute)	die_attr; /* List of attributes. */
1482de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Die) die_pro_next; /* Next die in pro-die list. */
1492de3b87aSKai Wang };
1502de3b87aSKai Wang 
1512de3b87aSKai Wang struct _Dwarf_P_Expr_Entry {
1522de3b87aSKai Wang 	Dwarf_Loc	ee_loc;		/* Location expression. */
1532de3b87aSKai Wang 	Dwarf_Unsigned	ee_sym;		/* Optional related reloc sym index. */
1542de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_P_Expr_Entry) ee_next; /* Next entry in list. */
1552de3b87aSKai Wang };
1562de3b87aSKai Wang 
1572de3b87aSKai Wang struct _Dwarf_P_Expr {
1582de3b87aSKai Wang 	Dwarf_Debug	pe_dbg;		/* Dwarf_Debug pointer. */
1592de3b87aSKai Wang 	uint8_t		*pe_block;	/* Expression block data. */
1602de3b87aSKai Wang 	int		pe_invalid;	/* Block data is up-to-date or not. */
1612de3b87aSKai Wang 	Dwarf_Unsigned	pe_length;	/* Length of the block. */
1622de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_P_Expr_Entry) pe_eelist; /* List of entries. */
1632de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_P_Expr) pe_next; /* Next expr in list. */
1642de3b87aSKai Wang };
1652de3b87aSKai Wang 
1662de3b87aSKai Wang struct _Dwarf_Line {
1672de3b87aSKai Wang 	Dwarf_LineInfo	ln_li;		/* Ptr to line info. */
1682de3b87aSKai Wang 	Dwarf_Addr	ln_addr;	/* Line address. */
1692de3b87aSKai Wang 	Dwarf_Unsigned	ln_symndx;	/* Symbol index for relocation. */
1702de3b87aSKai Wang 	Dwarf_Unsigned	ln_fileno;	/* File number. */
1712de3b87aSKai Wang 	Dwarf_Unsigned	ln_lineno;	/* Line number. */
1722de3b87aSKai Wang 	Dwarf_Signed	ln_column;	/* Column number. */
1732de3b87aSKai Wang 	Dwarf_Bool	ln_bblock;	/* Basic block flag. */
1742de3b87aSKai Wang 	Dwarf_Bool	ln_stmt;	/* Begin statement flag. */
1752de3b87aSKai Wang 	Dwarf_Bool	ln_endseq;	/* End sequence flag. */
1762de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Line) ln_next; /* Next line in list. */
1772de3b87aSKai Wang };
1782de3b87aSKai Wang 
1792de3b87aSKai Wang struct _Dwarf_LineFile {
1802de3b87aSKai Wang 	char		*lf_fname;	/* Filename. */
1812de3b87aSKai Wang 	char		*lf_fullpath;	/* Full pathname of the file. */
1822de3b87aSKai Wang 	Dwarf_Unsigned	lf_dirndx;	/* Dir index. */
1832de3b87aSKai Wang 	Dwarf_Unsigned	lf_mtime;	/* Modification time. */
1842de3b87aSKai Wang 	Dwarf_Unsigned	lf_size;	/* File size. */
1852de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_LineFile) lf_next; /* Next file in list. */
1862de3b87aSKai Wang };
1872de3b87aSKai Wang 
1882de3b87aSKai Wang struct _Dwarf_LineInfo {
1892de3b87aSKai Wang 	Dwarf_Unsigned	li_length;	/* Length of line info data. */
1902de3b87aSKai Wang 	Dwarf_Half	li_version;	/* Version of line info. */
1912de3b87aSKai Wang 	Dwarf_Unsigned	li_hdrlen;	/* Length of line info header. */
1922de3b87aSKai Wang 	Dwarf_Small	li_minlen;	/* Minimum instrutction length. */
19367d97fe7SEd Maste 	Dwarf_Small	li_maxop;	/* Maximum operations per inst. */
1942de3b87aSKai Wang 	Dwarf_Small	li_defstmt;	/* Default value of is_stmt. */
1952de3b87aSKai Wang 	int8_t		li_lbase;    	/* Line base for special opcode. */
1962de3b87aSKai Wang 	Dwarf_Small	li_lrange;    	/* Line range for special opcode. */
1972de3b87aSKai Wang 	Dwarf_Small	li_opbase;	/* Fisrt std opcode number. */
1982de3b87aSKai Wang 	Dwarf_Small	*li_oplen;	/* Array of std opcode len. */
1992de3b87aSKai Wang 	char		**li_incdirs;	/* Array of include dirs. */
2002de3b87aSKai Wang 	Dwarf_Unsigned	li_inclen;	/* Length of inc dir array. */
2012de3b87aSKai Wang 	char		**li_lfnarray;	/* Array of file names. */
2022de3b87aSKai Wang 	Dwarf_Unsigned	li_lflen;	/* Length of filename array. */
2032de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_LineFile) li_lflist; /* List of files. */
2042de3b87aSKai Wang 	Dwarf_Line	*li_lnarray;	/* Array of lines. */
2052de3b87aSKai Wang 	Dwarf_Unsigned	li_lnlen;	/* Length of the line array. */
2062de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Line) li_lnlist; /* List of lines. */
2072de3b87aSKai Wang };
2082de3b87aSKai Wang 
2092de3b87aSKai Wang struct _Dwarf_NamePair {
2102de3b87aSKai Wang 	Dwarf_NameTbl	np_nt;		/* Ptr to containing name table. */
2112de3b87aSKai Wang 	Dwarf_Die	np_die;		/* Ptr to Ref. Die. */
2122de3b87aSKai Wang 	Dwarf_Unsigned	np_offset;	/* Offset in CU. */
2132de3b87aSKai Wang 	char		*np_name;	/* Object/Type name. */
2142de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_NamePair) np_next; /* Next pair in the list. */
2152de3b87aSKai Wang };
2162de3b87aSKai Wang 
2172de3b87aSKai Wang struct _Dwarf_NameTbl {
2182de3b87aSKai Wang 	Dwarf_Unsigned	nt_length;	/* Name lookup table length. */
2192de3b87aSKai Wang 	Dwarf_Half	nt_version;	/* Name lookup table version. */
2202de3b87aSKai Wang 	Dwarf_CU	nt_cu;		/* Ptr to Ref. CU. */
2212de3b87aSKai Wang 	Dwarf_Off	nt_cu_offset;	/* Ref. CU offset in .debug_info */
2222de3b87aSKai Wang 	Dwarf_Unsigned	nt_cu_length;	/* Ref. CU length. */
2232de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_NamePair) nt_nplist; /* List of offset+name pairs. */
2242de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_NameTbl) nt_next; /* Next name table in the list. */
2252de3b87aSKai Wang };
2262de3b87aSKai Wang 
2272de3b87aSKai Wang struct _Dwarf_NameSec {
2282de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_NameTbl) ns_ntlist; /* List of name tables. */
2292de3b87aSKai Wang 	Dwarf_NamePair	*ns_array;	/* Array of pairs of all tables. */
2302de3b87aSKai Wang 	Dwarf_Unsigned	ns_len;		/* Length of the pair array. */
2312de3b87aSKai Wang };
2322de3b87aSKai Wang 
2332de3b87aSKai Wang struct _Dwarf_Fde {
2342de3b87aSKai Wang 	Dwarf_Debug	fde_dbg;	/* Ptr to containing dbg. */
2352de3b87aSKai Wang 	Dwarf_Cie	fde_cie;	/* Ptr to associated CIE. */
2362de3b87aSKai Wang 	Dwarf_FrameSec	fde_fs;		/* Ptr to containing .debug_frame. */
2372de3b87aSKai Wang 	Dwarf_Ptr	fde_addr;	/* Ptr to start of the FDE. */
2382de3b87aSKai Wang 	Dwarf_Unsigned	fde_offset;	/* Offset of the FDE. */
2392de3b87aSKai Wang 	Dwarf_Unsigned	fde_length;	/* Length of the FDE. */
2402de3b87aSKai Wang 	Dwarf_Unsigned	fde_cieoff;	/* Offset of associated CIE. */
2412de3b87aSKai Wang 	Dwarf_Unsigned	fde_initloc;	/* Initial location. */
2422de3b87aSKai Wang 	Dwarf_Unsigned	fde_adrange;	/* Address range. */
2432de3b87aSKai Wang 	Dwarf_Unsigned	fde_auglen;	/* Augmentation length. */
2442de3b87aSKai Wang 	uint8_t		*fde_augdata;	/* Augmentation data. */
2452de3b87aSKai Wang 	uint8_t		*fde_inst;	/* Instructions. */
2462de3b87aSKai Wang 	Dwarf_Unsigned	fde_instlen;	/* Length of instructions. */
2472de3b87aSKai Wang 	Dwarf_Unsigned	fde_instcap;	/* Capacity of inst buffer. */
2482de3b87aSKai Wang 	Dwarf_Unsigned	fde_symndx;	/* Symbol index for relocation. */
2492de3b87aSKai Wang 	Dwarf_Unsigned	fde_esymndx;	/* End symbol index for relocation. */
2502de3b87aSKai Wang 	Dwarf_Addr	fde_eoff;	/* Offset from the end symbol. */
2512de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Fde) fde_next; /* Next FDE in list. */
2522de3b87aSKai Wang };
2532de3b87aSKai Wang 
2542de3b87aSKai Wang struct _Dwarf_Cie {
2552de3b87aSKai Wang 	Dwarf_Debug	cie_dbg;	/* Ptr to containing dbg. */
2562de3b87aSKai Wang 	Dwarf_Unsigned	cie_index;	/* Index of the CIE. */
2572de3b87aSKai Wang 	Dwarf_Unsigned	cie_offset;	/* Offset of the CIE. */
2582de3b87aSKai Wang 	Dwarf_Unsigned	cie_length;	/* Length of the CIE. */
2592de3b87aSKai Wang 	Dwarf_Half	cie_version;	/* CIE version. */
2602de3b87aSKai Wang 	uint8_t		*cie_augment;	/* CIE augmentation (UTF-8). */
2612de3b87aSKai Wang 	Dwarf_Unsigned	cie_ehdata;	/* Optional EH Data. */
262cf781b2eSEd Maste 	uint8_t		cie_addrsize;	/* Address size. (DWARF4) */
263cf781b2eSEd Maste 	uint8_t		cie_segmentsize; /* Segment size. (DWARF4) */
2642de3b87aSKai Wang 	Dwarf_Unsigned	cie_caf;	/* Code alignment factor. */
2652de3b87aSKai Wang 	Dwarf_Signed	cie_daf;	/* Data alignment factor. */
2662de3b87aSKai Wang 	Dwarf_Unsigned	cie_ra;		/* Return address register. */
2672de3b87aSKai Wang 	Dwarf_Unsigned	cie_auglen;	/* Augmentation length. */
2682de3b87aSKai Wang 	uint8_t		*cie_augdata;	/* Augmentation data; */
2692de3b87aSKai Wang 	uint8_t		cie_fde_encode; /* FDE PC start/range encode. */
2702de3b87aSKai Wang 	Dwarf_Ptr	cie_initinst;	/* Initial instructions. */
2712de3b87aSKai Wang 	Dwarf_Unsigned	cie_instlen;	/* Length of init instructions. */
2722de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Cie) cie_next;  /* Next CIE in list. */
2732de3b87aSKai Wang };
2742de3b87aSKai Wang 
2752de3b87aSKai Wang struct _Dwarf_FrameSec {
2762de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Cie) fs_cielist; /* List of CIE. */
2772de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Fde) fs_fdelist; /* List of FDE. */
2782de3b87aSKai Wang 	Dwarf_Cie	*fs_ciearray;	/* Array of CIE. */
2792de3b87aSKai Wang 	Dwarf_Unsigned	fs_cielen;	/* Length of CIE array. */
2802de3b87aSKai Wang 	Dwarf_Fde	*fs_fdearray;	/* Array of FDE.*/
2812de3b87aSKai Wang 	Dwarf_Unsigned	fs_fdelen;	/* Length of FDE array. */
2822de3b87aSKai Wang };
2832de3b87aSKai Wang 
2842de3b87aSKai Wang struct _Dwarf_Arange {
2852de3b87aSKai Wang 	Dwarf_ArangeSet	ar_as;		/* Ptr to the set it belongs to. */
2862de3b87aSKai Wang 	Dwarf_Unsigned	ar_address;	/* Start PC. */
2872de3b87aSKai Wang 	Dwarf_Unsigned	ar_range;	/* PC range. */
2882de3b87aSKai Wang 	Dwarf_Unsigned	ar_symndx;	/* First symbol index for reloc. */
2892de3b87aSKai Wang 	Dwarf_Unsigned	ar_esymndx;	/* Second symbol index for reloc. */
2902de3b87aSKai Wang 	Dwarf_Addr	ar_eoff;	/* Offset from second symbol. */
2912de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Arange) ar_next; /* Next arange in list. */
2922de3b87aSKai Wang };
2932de3b87aSKai Wang 
2942de3b87aSKai Wang struct _Dwarf_ArangeSet {
2952de3b87aSKai Wang 	Dwarf_Unsigned	as_length;	/* Length of the arange set. */
2962de3b87aSKai Wang 	Dwarf_Half	as_version;	/* Version of the arange set. */
2972de3b87aSKai Wang 	Dwarf_Off	as_cu_offset;	/* Offset of associated CU. */
2982de3b87aSKai Wang 	Dwarf_CU	as_cu;		/* Ptr to associated CU. */
2992de3b87aSKai Wang 	Dwarf_Small	as_addrsz;	/* Target address size. */
3002de3b87aSKai Wang 	Dwarf_Small	as_segsz;	/* Target segment size. */
3012de3b87aSKai Wang 	STAILQ_HEAD (, _Dwarf_Arange) as_arlist; /* List of ae entries. */
3022de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_ArangeSet) as_next; /* Next set in list. */
3032de3b87aSKai Wang };
3042de3b87aSKai Wang 
3052de3b87aSKai Wang struct _Dwarf_MacroSet {
3062de3b87aSKai Wang 	Dwarf_Macro_Details *ms_mdlist; /* Array of macinfo entries. */
3072de3b87aSKai Wang 	Dwarf_Unsigned	ms_cnt;		/* Length of the array. */
3082de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_MacroSet) ms_next; /* Next set in list. */
3092de3b87aSKai Wang };
3102de3b87aSKai Wang 
3112de3b87aSKai Wang struct _Dwarf_Rangelist {
3122de3b87aSKai Wang 	Dwarf_CU	rl_cu;		/* Ptr to associated CU. */
3132de3b87aSKai Wang 	Dwarf_Unsigned	rl_offset;	/* Offset of the rangelist. */
3142de3b87aSKai Wang 	Dwarf_Ranges	*rl_rgarray;	/* Array of ranges. */
3152de3b87aSKai Wang 	Dwarf_Unsigned	rl_rglen;	/* Length of the ranges array. */
3162de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Rangelist) rl_next; /* Next rangelist in list. */
3172de3b87aSKai Wang };
3182de3b87aSKai Wang 
3192de3b87aSKai Wang struct _Dwarf_CU {
3202de3b87aSKai Wang 	Dwarf_Debug	cu_dbg;		/* Ptr to containing dbg. */
3212de3b87aSKai Wang 	Dwarf_Off	cu_offset;	/* Offset to the this CU. */
3222de3b87aSKai Wang 	uint32_t	cu_length;	/* Length of CU data. */
3232de3b87aSKai Wang 	uint16_t	cu_length_size; /* Size in bytes of the length field. */
3242de3b87aSKai Wang 	uint16_t	cu_version;	/* DWARF version. */
3252de3b87aSKai Wang 	uint64_t	cu_abbrev_offset; /* Offset into .debug_abbrev. */
3262de3b87aSKai Wang 	uint64_t	cu_abbrev_offset_cur; /* Current abbrev offset. */
3272de3b87aSKai Wang 	int		cu_abbrev_loaded; /* Abbrev table parsed. */
3282de3b87aSKai Wang 	uint64_t	cu_abbrev_cnt;	/* Abbrev entry count. */
3292de3b87aSKai Wang 	uint64_t	cu_lineno_offset; /* Offset into .debug_lineno. */
3302de3b87aSKai Wang 	uint8_t		cu_pointer_size;/* Number of bytes in pointer. */
3312de3b87aSKai Wang 	uint8_t		cu_dwarf_size;	/* CU section dwarf size. */
332cf781b2eSEd Maste 	Dwarf_Sig8	cu_type_sig;	/* Type unit's signature. */
333cf781b2eSEd Maste 	uint64_t	cu_type_offset; /* Type unit's type offset. */
3342de3b87aSKai Wang 	Dwarf_Off	cu_next_offset; /* Offset to the next CU. */
3352de3b87aSKai Wang 	uint64_t	cu_1st_offset;	/* First DIE offset. */
3362de3b87aSKai Wang 	int		cu_pass2;	/* Two pass DIE traverse. */
3372de3b87aSKai Wang 	Dwarf_LineInfo	cu_lineinfo;	/* Ptr to Dwarf_LineInfo. */
3382de3b87aSKai Wang 	Dwarf_Abbrev	cu_abbrev_hash; /* Abbrev hash table. */
339cf781b2eSEd Maste 	Dwarf_Bool	cu_is_info;	/* Compilation/type unit flag. */
3402de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_CU) cu_next; /* Next compilation unit. */
3412de3b87aSKai Wang };
3422de3b87aSKai Wang 
3432de3b87aSKai Wang typedef struct _Dwarf_Section {
3442de3b87aSKai Wang 	const char	*ds_name;	/* Section name. */
3452de3b87aSKai Wang 	Dwarf_Small	*ds_data;	/* Section data. */
3462de3b87aSKai Wang 	Dwarf_Unsigned	ds_addr;	/* Section virtual addr. */
3472de3b87aSKai Wang 	Dwarf_Unsigned	ds_size;	/* Section size. */
3482de3b87aSKai Wang } Dwarf_Section;
3492de3b87aSKai Wang 
3502de3b87aSKai Wang typedef struct _Dwarf_P_Section {
3512de3b87aSKai Wang 	char		*ds_name;	/* Section name. */
3522de3b87aSKai Wang 	Dwarf_Small	*ds_data;	/* Section data. */
3532de3b87aSKai Wang 	Dwarf_Unsigned	ds_size;	/* Section size. */
3542de3b87aSKai Wang 	Dwarf_Unsigned	ds_cap;		/* Section capacity. */
3552de3b87aSKai Wang 	Dwarf_Unsigned	ds_ndx;		/* ELF section index. */
3562de3b87aSKai Wang 	Dwarf_Unsigned	ds_symndx;	/* Section symbol index. (for reloc) */
3572de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_P_Section) ds_next; /* Next section in the list. */
3582de3b87aSKai Wang } *Dwarf_P_Section;
3592de3b87aSKai Wang 
3602de3b87aSKai Wang typedef struct _Dwarf_Rel_Entry {
3612de3b87aSKai Wang 	unsigned char	dre_type;	/* Reloc type. */
3622de3b87aSKai Wang 	unsigned char	dre_length;	/* Reloc storage unit length. */
3632de3b87aSKai Wang 	Dwarf_Unsigned	dre_offset;	/* Reloc storage unit offset. */
3642de3b87aSKai Wang 	Dwarf_Unsigned	dre_addend;	/* Reloc addend. */
3652de3b87aSKai Wang 	Dwarf_Unsigned	dre_symndx;	/* Reloc symbol index. */
3662de3b87aSKai Wang 	const char	*dre_secname;	/* Refer to some debug section. */
3672de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Rel_Entry) dre_next; /* Next reloc entry. */
3682de3b87aSKai Wang } *Dwarf_Rel_Entry;
3692de3b87aSKai Wang 
3702de3b87aSKai Wang typedef struct _Dwarf_Rel_Section {
3712de3b87aSKai Wang 	struct _Dwarf_P_Section *drs_ds; /* Ptr to actual reloc ELF section. */
3722de3b87aSKai Wang 	struct _Dwarf_P_Section *drs_ref; /* Which debug section it refers. */
3732de3b87aSKai Wang 	struct Dwarf_Relocation_Data_s *drs_drd; /* Reloc data array. */
3742de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Rel_Entry) drs_dre; /* Reloc entry list. */
3752de3b87aSKai Wang 	Dwarf_Unsigned	drs_drecnt;	/* Count of entries. */
3762de3b87aSKai Wang 	Dwarf_Unsigned	drs_size;	/* Size of ELF section in bytes. */
3772de3b87aSKai Wang 	int		drs_addend;	/* Elf_Rel or Elf_Rela */
3782de3b87aSKai Wang 	STAILQ_ENTRY(_Dwarf_Rel_Section) drs_next; /* Next reloc section. */
3792de3b87aSKai Wang } *Dwarf_Rel_Section;
3802de3b87aSKai Wang 
3812de3b87aSKai Wang typedef struct {
3822de3b87aSKai Wang 	Elf_Data	*ed_data;
3832de3b87aSKai Wang 	void		*ed_alloc;
384*dbf05458SMark Johnston 	size_t		ed_size;	/* Uncompressed size. */
3852de3b87aSKai Wang } Dwarf_Elf_Data;
3862de3b87aSKai Wang 
3872de3b87aSKai Wang typedef struct {
3882de3b87aSKai Wang 	Elf		*eo_elf;
3892de3b87aSKai Wang 	GElf_Ehdr	eo_ehdr;
3902de3b87aSKai Wang 	GElf_Shdr	*eo_shdr;
3912de3b87aSKai Wang 	Dwarf_Elf_Data	*eo_data;
3922de3b87aSKai Wang 	Dwarf_Unsigned	eo_seccnt;
3932de3b87aSKai Wang 	size_t		eo_strndx;
3942de3b87aSKai Wang 	Dwarf_Obj_Access_Methods eo_methods;
3952de3b87aSKai Wang } Dwarf_Elf_Object;
3962de3b87aSKai Wang 
3972de3b87aSKai Wang struct _Dwarf_Debug {
3982de3b87aSKai Wang 	Dwarf_Obj_Access_Interface *dbg_iface;
3992de3b87aSKai Wang 	Dwarf_Section	*dbg_section;	/* Dwarf section list. */
4002de3b87aSKai Wang 	Dwarf_Section	*dbg_info_sec;	/* Pointer to info section. */
4012de3b87aSKai Wang 	Dwarf_Off	dbg_info_off;	/* Current info section offset. */
402cf781b2eSEd Maste 	Dwarf_Section	*dbg_types_sec; /* Pointer to type section. */
403cf781b2eSEd Maste 	Dwarf_Off	dbg_types_off;	/* Current types section offset. */
4042de3b87aSKai Wang 	Dwarf_Unsigned	dbg_seccnt;	/* Total number of dwarf sections. */
4052de3b87aSKai Wang 	int		dbg_mode;	/* Access mode. */
4062de3b87aSKai Wang 	int		dbg_pointer_size; /* Object address size. */
4072de3b87aSKai Wang 	int		dbg_offset_size;  /* DWARF offset size. */
4082de3b87aSKai Wang 	int		dbg_info_loaded; /* Flag indicating all CU loaded. */
409cf781b2eSEd Maste 	int		dbg_types_loaded; /* Flag indicating all TU loaded. */
4102de3b87aSKai Wang 	Dwarf_Half	dbg_machine;	/* ELF machine architecture. */
4112de3b87aSKai Wang 	Dwarf_Handler	dbg_errhand;	/* Error handler. */
4122de3b87aSKai Wang 	Dwarf_Ptr	dbg_errarg;	/* Argument to the error handler. */
4132de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_CU) dbg_cu;/* List of compilation units. */
414cf781b2eSEd Maste 	STAILQ_HEAD(, _Dwarf_CU) dbg_tu;/* List of type units. */
4152de3b87aSKai Wang 	Dwarf_CU	dbg_cu_current; /* Ptr to the current CU. */
416cf781b2eSEd Maste 	Dwarf_CU	dbg_tu_current; /* Ptr to the current TU. */
4172de3b87aSKai Wang 	Dwarf_NameSec	dbg_globals;	/* Ptr to pubnames lookup section. */
4182de3b87aSKai Wang 	Dwarf_NameSec	dbg_pubtypes;	/* Ptr to pubtypes lookup section. */
4192de3b87aSKai Wang 	Dwarf_NameSec	dbg_weaks;	/* Ptr to weaknames lookup section. */
4202de3b87aSKai Wang 	Dwarf_NameSec	dbg_funcs;	/* Ptr to static funcs lookup sect. */
4212de3b87aSKai Wang 	Dwarf_NameSec	dbg_vars;	/* Ptr to static vars lookup sect. */
4222de3b87aSKai Wang 	Dwarf_NameSec	dbg_types;	/* Ptr to types lookup section. */
4232de3b87aSKai Wang 	Dwarf_FrameSec	dbg_frame;	/* Ptr to .debug_frame section. */
4242de3b87aSKai Wang 	Dwarf_FrameSec	dbg_eh_frame;	/* Ptr to .eh_frame section. */
4252de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_ArangeSet) dbg_aslist; /* List of arange set. */
4262de3b87aSKai Wang 	Dwarf_Arange	*dbg_arange_array; /* Array of arange. */
4272de3b87aSKai Wang 	Dwarf_Unsigned	dbg_arange_cnt;	/* Length of the arange array. */
4282de3b87aSKai Wang 	char		*dbg_strtab;	/* Dwarf string table. */
4292de3b87aSKai Wang 	Dwarf_Unsigned	dbg_strtab_cap; /* Dwarf string table capacity. */
4302de3b87aSKai Wang 	Dwarf_Unsigned	dbg_strtab_size; /* Dwarf string table size. */
4312de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_MacroSet) dbg_mslist; /* List of macro set. */
4322de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Rangelist) dbg_rllist; /* List of rangelist. */
4332de3b87aSKai Wang 	uint64_t	(*read)(uint8_t *, uint64_t *, int);
4342de3b87aSKai Wang 	void		(*write)(uint8_t *, uint64_t *, uint64_t, int);
4352de3b87aSKai Wang 	int		(*write_alloc)(uint8_t **, uint64_t *, uint64_t *,
4362de3b87aSKai Wang 			    uint64_t, int, Dwarf_Error *);
4372de3b87aSKai Wang 	uint64_t	(*decode)(uint8_t **, int);
4382de3b87aSKai Wang 
4392de3b87aSKai Wang 	Dwarf_Half	dbg_frame_rule_table_size;
4402de3b87aSKai Wang 	Dwarf_Half	dbg_frame_rule_initial_value;
4412de3b87aSKai Wang 	Dwarf_Half	dbg_frame_cfa_value;
4422de3b87aSKai Wang 	Dwarf_Half	dbg_frame_same_value;
4432de3b87aSKai Wang 	Dwarf_Half	dbg_frame_undefined_value;
4442de3b87aSKai Wang 
4452de3b87aSKai Wang 	Dwarf_Regtable3	*dbg_internal_reg_table;
4462de3b87aSKai Wang 
4472de3b87aSKai Wang 	/*
4482de3b87aSKai Wang 	 * Fields used by libdwarf producer.
4492de3b87aSKai Wang 	 */
4502de3b87aSKai Wang 
4512de3b87aSKai Wang 	Dwarf_Unsigned	dbgp_flags;
4522de3b87aSKai Wang 	Dwarf_Unsigned	dbgp_isa;
4532de3b87aSKai Wang 	Dwarf_Callback_Func dbgp_func;
4542de3b87aSKai Wang 	Dwarf_Callback_Func_b dbgp_func_b;
4552de3b87aSKai Wang 	Dwarf_Die	dbgp_root_die;
4562de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Die) dbgp_dielist;
4572de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_P_Expr) dbgp_pelist;
4582de3b87aSKai Wang 	Dwarf_LineInfo	dbgp_lineinfo;
4592de3b87aSKai Wang 	Dwarf_ArangeSet dbgp_as;
4602de3b87aSKai Wang 	Dwarf_Macro_Details *dbgp_mdlist;
4612de3b87aSKai Wang 	Dwarf_Unsigned	dbgp_mdcnt;
4622de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Cie) dbgp_cielist;
4632de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Fde) dbgp_fdelist;
4642de3b87aSKai Wang 	Dwarf_Unsigned	dbgp_cielen;
4652de3b87aSKai Wang 	Dwarf_Unsigned	dbgp_fdelen;
4662de3b87aSKai Wang 	Dwarf_NameTbl	dbgp_pubs;
4672de3b87aSKai Wang 	Dwarf_NameTbl	dbgp_weaks;
4682de3b87aSKai Wang 	Dwarf_NameTbl	dbgp_funcs;
4692de3b87aSKai Wang 	Dwarf_NameTbl	dbgp_types;
4702de3b87aSKai Wang 	Dwarf_NameTbl	dbgp_vars;
4712de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_P_Section) dbgp_seclist;
4722de3b87aSKai Wang 	Dwarf_Unsigned	dbgp_seccnt;
4732de3b87aSKai Wang 	Dwarf_P_Section	dbgp_secpos;
4742de3b87aSKai Wang 	Dwarf_P_Section	dbgp_info;
4752de3b87aSKai Wang 	STAILQ_HEAD(, _Dwarf_Rel_Section) dbgp_drslist;
4762de3b87aSKai Wang 	Dwarf_Unsigned	dbgp_drscnt;
4772de3b87aSKai Wang 	Dwarf_Rel_Section dbgp_drspos;
4782de3b87aSKai Wang };
4792de3b87aSKai Wang 
4802de3b87aSKai Wang /*
4812de3b87aSKai Wang  * Internal function prototypes.
4822de3b87aSKai Wang  */
4832de3b87aSKai Wang 
4842de3b87aSKai Wang int		_dwarf_abbrev_add(Dwarf_CU, uint64_t, uint64_t, uint8_t,
4852de3b87aSKai Wang 		    uint64_t, Dwarf_Abbrev *, Dwarf_Error *);
4862de3b87aSKai Wang void		_dwarf_abbrev_cleanup(Dwarf_CU);
4872de3b87aSKai Wang int		_dwarf_abbrev_find(Dwarf_CU, uint64_t, Dwarf_Abbrev *,
4882de3b87aSKai Wang 		    Dwarf_Error *);
4892de3b87aSKai Wang int		_dwarf_abbrev_gen(Dwarf_P_Debug, Dwarf_Error *);
4902de3b87aSKai Wang int		_dwarf_abbrev_parse(Dwarf_Debug, Dwarf_CU, Dwarf_Unsigned *,
4912de3b87aSKai Wang 		    Dwarf_Abbrev *, Dwarf_Error *);
4922de3b87aSKai Wang int		_dwarf_add_AT_dataref(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half,
4932de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Unsigned, const char *,
4942de3b87aSKai Wang 		    Dwarf_P_Attribute *, Dwarf_Error *);
4952de3b87aSKai Wang int		_dwarf_add_string_attr(Dwarf_P_Die, Dwarf_P_Attribute *,
4962de3b87aSKai Wang 		    Dwarf_Half, char *, Dwarf_Error *);
4972de3b87aSKai Wang int		_dwarf_alloc(Dwarf_Debug *, int, Dwarf_Error *);
4982de3b87aSKai Wang void		_dwarf_arange_cleanup(Dwarf_Debug);
4992de3b87aSKai Wang int		_dwarf_arange_gen(Dwarf_P_Debug, Dwarf_Error *);
5002de3b87aSKai Wang int		_dwarf_arange_init(Dwarf_Debug, Dwarf_Error *);
5012de3b87aSKai Wang void		_dwarf_arange_pro_cleanup(Dwarf_P_Debug);
5022de3b87aSKai Wang int		_dwarf_attr_alloc(Dwarf_Die, Dwarf_Attribute *, Dwarf_Error *);
5032de3b87aSKai Wang Dwarf_Attribute	_dwarf_attr_find(Dwarf_Die, Dwarf_Half);
5042de3b87aSKai Wang int		_dwarf_attr_gen(Dwarf_P_Debug, Dwarf_P_Section, Dwarf_Rel_Section,
5052de3b87aSKai Wang 		    Dwarf_CU, Dwarf_Die, int, Dwarf_Error *);
5062de3b87aSKai Wang int		_dwarf_attr_init(Dwarf_Debug, Dwarf_Section *, uint64_t *, int,
5072de3b87aSKai Wang 		    Dwarf_CU, Dwarf_Die, Dwarf_AttrDef, uint64_t, int,
5082de3b87aSKai Wang 		    Dwarf_Error *);
5092de3b87aSKai Wang int		_dwarf_attrdef_add(Dwarf_Debug, Dwarf_Abbrev, uint64_t,
5102de3b87aSKai Wang 		    uint64_t, uint64_t, Dwarf_AttrDef *, Dwarf_Error *);
5112de3b87aSKai Wang uint64_t	_dwarf_decode_lsb(uint8_t **, int);
5122de3b87aSKai Wang uint64_t	_dwarf_decode_msb(uint8_t **, int);
5132de3b87aSKai Wang int64_t		_dwarf_decode_sleb128(uint8_t **);
5142de3b87aSKai Wang uint64_t	_dwarf_decode_uleb128(uint8_t **);
5152de3b87aSKai Wang void		_dwarf_deinit(Dwarf_Debug);
5162de3b87aSKai Wang int		_dwarf_die_alloc(Dwarf_Debug, Dwarf_Die *, Dwarf_Error *);
5172de3b87aSKai Wang int		_dwarf_die_count_links(Dwarf_P_Die, Dwarf_P_Die,
5182de3b87aSKai Wang 		    Dwarf_P_Die, Dwarf_P_Die);
5192de3b87aSKai Wang Dwarf_Die	_dwarf_die_find(Dwarf_Die, Dwarf_Unsigned);
5202de3b87aSKai Wang int		_dwarf_die_gen(Dwarf_P_Debug, Dwarf_CU, Dwarf_Rel_Section,
5212de3b87aSKai Wang 		    Dwarf_Error *);
5222de3b87aSKai Wang void		_dwarf_die_link(Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die,
5232de3b87aSKai Wang 		    Dwarf_P_Die, Dwarf_P_Die);
5242de3b87aSKai Wang int		_dwarf_die_parse(Dwarf_Debug, Dwarf_Section *, Dwarf_CU, int,
5252de3b87aSKai Wang 		    uint64_t, uint64_t, Dwarf_Die *, int, Dwarf_Error *);
5262de3b87aSKai Wang void		_dwarf_die_pro_cleanup(Dwarf_P_Debug);
5272de3b87aSKai Wang void		_dwarf_elf_deinit(Dwarf_Debug);
5282de3b87aSKai Wang int		_dwarf_elf_init(Dwarf_Debug, Elf *, Dwarf_Error *);
5292de3b87aSKai Wang int		_dwarf_elf_load_section(void *, Dwarf_Half, Dwarf_Small **,
5302de3b87aSKai Wang 		    int *);
5312de3b87aSKai Wang Dwarf_Endianness _dwarf_elf_get_byte_order(void *);
5322de3b87aSKai Wang Dwarf_Small	_dwarf_elf_get_length_size(void *);
5332de3b87aSKai Wang Dwarf_Small	_dwarf_elf_get_pointer_size(void *);
5342de3b87aSKai Wang Dwarf_Unsigned	_dwarf_elf_get_section_count(void *);
5352de3b87aSKai Wang int		_dwarf_elf_get_section_info(void *, Dwarf_Half,
5362de3b87aSKai Wang 		    Dwarf_Obj_Access_Section *, int *);
5372de3b87aSKai Wang void		_dwarf_expr_cleanup(Dwarf_P_Debug);
5382de3b87aSKai Wang int		_dwarf_expr_into_block(Dwarf_P_Expr, Dwarf_Error *);
539cf781b2eSEd Maste Dwarf_Section	*_dwarf_find_next_types_section(Dwarf_Debug, Dwarf_Section *);
5402de3b87aSKai Wang Dwarf_Section	*_dwarf_find_section(Dwarf_Debug, const char *);
5412de3b87aSKai Wang void		_dwarf_frame_cleanup(Dwarf_Debug);
5422de3b87aSKai Wang int		_dwarf_frame_fde_add_inst(Dwarf_P_Fde, Dwarf_Small,
5432de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *);
5442de3b87aSKai Wang int		_dwarf_frame_gen(Dwarf_P_Debug, Dwarf_Error *);
545cf781b2eSEd Maste int		_dwarf_frame_get_fop(Dwarf_Debug, uint8_t, uint8_t *,
546cf781b2eSEd Maste 		    Dwarf_Unsigned, Dwarf_Frame_Op **, Dwarf_Signed *,
547cf781b2eSEd Maste 		    Dwarf_Error *);
5482de3b87aSKai Wang int		_dwarf_frame_get_internal_table(Dwarf_Fde, Dwarf_Addr,
5492de3b87aSKai Wang 		    Dwarf_Regtable3 **, Dwarf_Addr *, Dwarf_Error *);
5502de3b87aSKai Wang int		_dwarf_frame_interal_table_init(Dwarf_Debug, Dwarf_Error *);
5512de3b87aSKai Wang void		_dwarf_frame_params_init(Dwarf_Debug);
5522de3b87aSKai Wang void		_dwarf_frame_pro_cleanup(Dwarf_P_Debug);
5532de3b87aSKai Wang int		_dwarf_frame_regtable_copy(Dwarf_Debug, Dwarf_Regtable3 **,
5542de3b87aSKai Wang 		    Dwarf_Regtable3 *, Dwarf_Error *);
5552de3b87aSKai Wang int		_dwarf_frame_section_load(Dwarf_Debug, Dwarf_Error *);
5562de3b87aSKai Wang int		_dwarf_frame_section_load_eh(Dwarf_Debug, Dwarf_Error *);
5572de3b87aSKai Wang int		_dwarf_generate_sections(Dwarf_P_Debug, Dwarf_Error *);
5582de3b87aSKai Wang Dwarf_Unsigned	_dwarf_get_reloc_type(Dwarf_P_Debug, int);
5592de3b87aSKai Wang int		_dwarf_get_reloc_size(Dwarf_Debug, Dwarf_Unsigned);
5602de3b87aSKai Wang void		_dwarf_info_cleanup(Dwarf_Debug);
5612de3b87aSKai Wang int		_dwarf_info_first_cu(Dwarf_Debug, Dwarf_Error *);
562cf781b2eSEd Maste int		_dwarf_info_first_tu(Dwarf_Debug, Dwarf_Error *);
5632de3b87aSKai Wang int		_dwarf_info_gen(Dwarf_P_Debug, Dwarf_Error *);
564cf781b2eSEd Maste int		_dwarf_info_load(Dwarf_Debug, Dwarf_Bool, Dwarf_Bool,
565cf781b2eSEd Maste 		    Dwarf_Error *);
5662de3b87aSKai Wang int		_dwarf_info_next_cu(Dwarf_Debug, Dwarf_Error *);
567cf781b2eSEd Maste int		_dwarf_info_next_tu(Dwarf_Debug, Dwarf_Error *);
5682de3b87aSKai Wang void		_dwarf_info_pro_cleanup(Dwarf_P_Debug);
5692de3b87aSKai Wang int		_dwarf_init(Dwarf_Debug, Dwarf_Unsigned, Dwarf_Handler,
5702de3b87aSKai Wang 		    Dwarf_Ptr, Dwarf_Error *);
5712de3b87aSKai Wang int		_dwarf_lineno_gen(Dwarf_P_Debug, Dwarf_Error *);
5722de3b87aSKai Wang int		_dwarf_lineno_init(Dwarf_Die, uint64_t, Dwarf_Error *);
5732de3b87aSKai Wang void		_dwarf_lineno_cleanup(Dwarf_LineInfo);
5742de3b87aSKai Wang void		_dwarf_lineno_pro_cleanup(Dwarf_P_Debug);
575cf781b2eSEd Maste int		_dwarf_loc_fill_locdesc(Dwarf_Debug, Dwarf_Locdesc *,
576cf781b2eSEd Maste 		    uint8_t *, uint64_t, uint8_t, uint8_t, uint8_t,
577cf781b2eSEd Maste 		    Dwarf_Error *);
5782de3b87aSKai Wang int		_dwarf_loc_fill_locexpr(Dwarf_Debug, Dwarf_Locdesc **,
579cf781b2eSEd Maste 		    uint8_t *, uint64_t, uint8_t, uint8_t, uint8_t,
580cf781b2eSEd Maste 		    Dwarf_Error *);
5812de3b87aSKai Wang int		_dwarf_loc_add(Dwarf_Die, Dwarf_Attribute, Dwarf_Error *);
5822de3b87aSKai Wang int		_dwarf_loc_expr_add_atom(Dwarf_Debug, uint8_t *, uint8_t *,
5832de3b87aSKai Wang 		    Dwarf_Small, Dwarf_Unsigned, Dwarf_Unsigned, int *,
5842de3b87aSKai Wang 		    Dwarf_Error *);
5852de3b87aSKai Wang int		_dwarf_loclist_find(Dwarf_Debug, Dwarf_CU, uint64_t,
586cf781b2eSEd Maste 		    Dwarf_Locdesc ***, Dwarf_Signed *, Dwarf_Unsigned *,
587cf781b2eSEd Maste 		    Dwarf_Error *);
5882de3b87aSKai Wang void		_dwarf_macinfo_cleanup(Dwarf_Debug);
5892de3b87aSKai Wang int		_dwarf_macinfo_gen(Dwarf_P_Debug, Dwarf_Error *);
5902de3b87aSKai Wang int		_dwarf_macinfo_init(Dwarf_Debug, Dwarf_Error *);
5912de3b87aSKai Wang void		_dwarf_macinfo_pro_cleanup(Dwarf_P_Debug);
5922de3b87aSKai Wang int		_dwarf_nametbl_init(Dwarf_Debug, Dwarf_NameSec *,
5932de3b87aSKai Wang 		    Dwarf_Section *, Dwarf_Error *);
5942de3b87aSKai Wang void		_dwarf_nametbl_cleanup(Dwarf_NameSec *);
5952de3b87aSKai Wang int		_dwarf_nametbl_gen(Dwarf_P_Debug, const char *, Dwarf_NameTbl,
5962de3b87aSKai Wang 		    Dwarf_Error *);
5972de3b87aSKai Wang void		_dwarf_nametbl_pro_cleanup(Dwarf_NameTbl *);
5982de3b87aSKai Wang int		_dwarf_pro_callback(Dwarf_P_Debug, char *, int, Dwarf_Unsigned,
5992de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned,
6002de3b87aSKai Wang 		    Dwarf_Unsigned *, int *);
6012de3b87aSKai Wang Dwarf_P_Section	_dwarf_pro_find_section(Dwarf_P_Debug, const char *);
6022de3b87aSKai Wang int		_dwarf_ranges_add(Dwarf_Debug, Dwarf_CU, uint64_t,
6032de3b87aSKai Wang 		    Dwarf_Rangelist *, Dwarf_Error *);
6042de3b87aSKai Wang void		_dwarf_ranges_cleanup(Dwarf_Debug);
6052de3b87aSKai Wang int		_dwarf_ranges_find(Dwarf_Debug, uint64_t, Dwarf_Rangelist *);
6062de3b87aSKai Wang uint64_t	_dwarf_read_lsb(uint8_t *, uint64_t *, int);
6072de3b87aSKai Wang uint64_t	_dwarf_read_msb(uint8_t *, uint64_t *, int);
6082de3b87aSKai Wang int64_t		_dwarf_read_sleb128(uint8_t *, uint64_t *);
6092de3b87aSKai Wang uint64_t	_dwarf_read_uleb128(uint8_t *, uint64_t *);
6102de3b87aSKai Wang char		*_dwarf_read_string(void *, Dwarf_Unsigned, uint64_t *);
6112de3b87aSKai Wang uint8_t		*_dwarf_read_block(void *, uint64_t *, uint64_t);
6122de3b87aSKai Wang int		_dwarf_reloc_section_finalize(Dwarf_P_Debug, Dwarf_Rel_Section,
6132de3b87aSKai Wang 		    Dwarf_Error *);
6142de3b87aSKai Wang int		_dwarf_reloc_entry_add(Dwarf_P_Debug, Dwarf_Rel_Section,
6152de3b87aSKai Wang 		    Dwarf_P_Section, unsigned char, unsigned char,
6162de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned,
6172de3b87aSKai Wang 		    const char *, Dwarf_Error *);
6182de3b87aSKai Wang int		_dwarf_reloc_entry_add_pair(Dwarf_P_Debug, Dwarf_Rel_Section,
6192de3b87aSKai Wang 		    Dwarf_P_Section, unsigned char, Dwarf_Unsigned,
6202de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned,
6212de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Error *);
6222de3b87aSKai Wang void		_dwarf_reloc_cleanup(Dwarf_P_Debug);
6232de3b87aSKai Wang int		_dwarf_reloc_gen(Dwarf_P_Debug, Dwarf_Error *);
6242de3b87aSKai Wang int		_dwarf_reloc_section_gen(Dwarf_P_Debug, Dwarf_Rel_Section,
6252de3b87aSKai Wang 		    Dwarf_Error *);
6262de3b87aSKai Wang int		_dwarf_reloc_section_init(Dwarf_P_Debug, Dwarf_Rel_Section *,
6272de3b87aSKai Wang 		    Dwarf_P_Section, Dwarf_Error *);
6282de3b87aSKai Wang void		_dwarf_reloc_section_free(Dwarf_P_Debug, Dwarf_Rel_Section *);
6292de3b87aSKai Wang void		_dwarf_section_cleanup(Dwarf_P_Debug);
6302de3b87aSKai Wang int		_dwarf_section_callback(Dwarf_P_Debug, Dwarf_P_Section,
6312de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned,
6322de3b87aSKai Wang 		    Dwarf_Unsigned, Dwarf_Error *);
6332de3b87aSKai Wang void		_dwarf_section_free(Dwarf_P_Debug, Dwarf_P_Section *);
6342de3b87aSKai Wang int		_dwarf_section_init(Dwarf_P_Debug, Dwarf_P_Section *,
6352de3b87aSKai Wang 		    const char *, int, Dwarf_Error *);
6362de3b87aSKai Wang void		_dwarf_set_error(Dwarf_Debug, Dwarf_Error *, int, int,
6372de3b87aSKai Wang 		    const char *, int);
6382de3b87aSKai Wang int		_dwarf_strtab_add(Dwarf_Debug, char *, uint64_t *,
6392de3b87aSKai Wang 		    Dwarf_Error *);
6402de3b87aSKai Wang void		_dwarf_strtab_cleanup(Dwarf_Debug);
6412de3b87aSKai Wang int		_dwarf_strtab_gen(Dwarf_P_Debug, Dwarf_Error *);
6422de3b87aSKai Wang char		*_dwarf_strtab_get_table(Dwarf_Debug);
6432de3b87aSKai Wang int		_dwarf_strtab_init(Dwarf_Debug, Dwarf_Error *);
644cf781b2eSEd Maste void		_dwarf_type_unit_cleanup(Dwarf_Debug);
6452de3b87aSKai Wang void		_dwarf_write_block(void *, uint64_t *, uint8_t *, uint64_t);
6462de3b87aSKai Wang int		_dwarf_write_block_alloc(uint8_t **, uint64_t *, uint64_t *,
6472de3b87aSKai Wang 		    uint8_t *, uint64_t, Dwarf_Error *);
6482de3b87aSKai Wang void		_dwarf_write_lsb(uint8_t *, uint64_t *, uint64_t, int);
6492de3b87aSKai Wang int		_dwarf_write_lsb_alloc(uint8_t **, uint64_t *, uint64_t *,
6502de3b87aSKai Wang 		    uint64_t, int, Dwarf_Error *);
6512de3b87aSKai Wang void		_dwarf_write_msb(uint8_t *, uint64_t *, uint64_t, int);
6522de3b87aSKai Wang int		_dwarf_write_msb_alloc(uint8_t **, uint64_t *, uint64_t *,
6532de3b87aSKai Wang 		    uint64_t, int, Dwarf_Error *);
6542de3b87aSKai Wang void		_dwarf_write_padding(void *, uint64_t *, uint8_t, uint64_t);
6552de3b87aSKai Wang int		_dwarf_write_padding_alloc(uint8_t **, uint64_t *, uint64_t *,
6562de3b87aSKai Wang 		    uint8_t, uint64_t, Dwarf_Error *);
6572de3b87aSKai Wang void		_dwarf_write_string(void *, uint64_t *, char *);
6582de3b87aSKai Wang int		_dwarf_write_string_alloc(uint8_t **, uint64_t *, uint64_t *,
6592de3b87aSKai Wang 		    char *, Dwarf_Error *);
6602de3b87aSKai Wang int		_dwarf_write_sleb128(uint8_t *, uint8_t *, int64_t);
6612de3b87aSKai Wang int		_dwarf_write_sleb128_alloc(uint8_t **, uint64_t *, uint64_t *,
6622de3b87aSKai Wang 		    int64_t, Dwarf_Error *);
6632de3b87aSKai Wang int		_dwarf_write_uleb128(uint8_t *, uint8_t *, uint64_t);
6642de3b87aSKai Wang int		_dwarf_write_uleb128_alloc(uint8_t **, uint64_t *, uint64_t *,
6652de3b87aSKai Wang 		    uint64_t, Dwarf_Error *);
6662de3b87aSKai Wang 
6672de3b87aSKai Wang #endif /* !__LIBDWARF_H_ */
668