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