1 /* $NetBSD: _libdwarf.h,v 1.2 2014/03/09 16:58:03 christos Exp $ */
4 * Copyright (c) 2007 John Birrell (jb@freebsd.org)
5 * Copyright (c) 2009-2011 Kai Wang
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * Id: _libdwarf.h 2075 2011-10-27 03:47:28Z jkoshy
35 #if HAVE_NBTOOL_CONFIG_H
36 # include "nbtool_config.h"
39 #include <sys/param.h>
40 #include <sys/queue.h>
53 #define DWARF_DIE_HASH_SIZE 8191
55 struct _libdwarf_globals
{
56 Dwarf_Handler errhand
;
61 extern struct _libdwarf_globals _libdwarf
;
63 #define _DWARF_SET_ERROR(_d, _e, _err, _elf_err) \
64 _dwarf_set_error(_d, _e, _err, _elf_err, __func__, __LINE__)
65 #define DWARF_SET_ERROR(_d, _e, _err) \
66 _DWARF_SET_ERROR(_d, _e, _err, 0)
67 #define DWARF_SET_ELF_ERROR(_d, _e) \
68 _DWARF_SET_ERROR(_d, _e, DW_DLE_ELF, elf_errno())
71 * Convenient macros for producer bytes stream generation.
73 #define WRITE_VALUE(value, bytes) \
74 dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, \
75 (value), (bytes), error)
76 #define WRITE_ULEB128(value) \
77 _dwarf_write_uleb128_alloc(&ds->ds_data, &ds->ds_cap, \
78 &ds->ds_size, (value), error)
79 #define WRITE_SLEB128(value) \
80 _dwarf_write_sleb128_alloc(&ds->ds_data, &ds->ds_cap, \
81 &ds->ds_size, (value), error)
82 #define WRITE_STRING(string) \
83 _dwarf_write_string_alloc(&ds->ds_data, &ds->ds_cap, \
84 &ds->ds_size, (string), error)
85 #define WRITE_BLOCK(blk, size) \
86 _dwarf_write_block_alloc(&ds->ds_data, &ds->ds_cap, \
87 &ds->ds_size, (blk), (size), error)
88 #define WRITE_PADDING(byte, cnt) \
89 _dwarf_write_padding_alloc(&ds->ds_data, &ds->ds_cap, \
90 &ds->ds_size, (byte), (cnt), error)
91 #define RCHECK(expr) \
94 if (ret != DW_DLE_NONE) \
96 } while (/*CONSTCOND*/0)
99 struct _Dwarf_AttrDef
{
100 uint64_t ad_attrib
; /* DW_AT_XXX */
101 uint64_t ad_form
; /* DW_FORM_XXX */
102 uint64_t ad_offset
; /* Offset in abbrev section. */
103 STAILQ_ENTRY(_Dwarf_AttrDef
) ad_next
; /* Next attribute define. */
106 struct _Dwarf_Attribute
{
107 Dwarf_Die at_die
; /* Ptr to containing DIE. */
108 Dwarf_Die at_refdie
; /* Ptr to reference DIE. */
109 uint64_t at_offset
; /* Offset in info section. */
110 uint64_t at_attrib
; /* DW_AT_XXX */
111 uint64_t at_form
; /* DW_FORM_XXX */
112 int at_indirect
; /* Has indirect form. */
114 uint64_t u64
; /* Unsigned value. */
115 int64_t s64
; /* Signed value. */
116 char *s
; /* String. */
117 uint8_t *u8p
; /* Block data. */
119 Dwarf_Block at_block
; /* Block. */
120 Dwarf_Locdesc
*at_ld
; /* at value is locdesc. */
121 Dwarf_P_Expr at_expr
; /* at value is expr. */
122 uint64_t at_relsym
; /* Relocation symbol index. */
123 const char *at_relsec
; /* Rel. to dwarf section. */
124 STAILQ_ENTRY(_Dwarf_Attribute
) at_next
; /* Next attribute. */
127 struct _Dwarf_Abbrev
{
128 uint64_t ab_entry
; /* Abbrev entry. */
129 uint64_t ab_tag
; /* Tag: DW_TAG_ */
130 uint8_t ab_children
; /* DW_CHILDREN_no or DW_CHILDREN_yes */
131 uint64_t ab_offset
; /* Offset in abbrev section. */
132 uint64_t ab_length
; /* Length of this abbrev entry. */
133 uint64_t ab_atnum
; /* Number of attribute defines. */
134 UT_hash_handle ab_hh
; /* Uthash handle. */
135 STAILQ_HEAD(, _Dwarf_AttrDef
) ab_attrdef
; /* List of attribute defs. */
139 Dwarf_Die die_parent
; /* Parent DIE. */
140 Dwarf_Die die_child
; /* First child DIE. */
141 Dwarf_Die die_left
; /* Left sibling DIE. */
142 Dwarf_Die die_right
; /* Right sibling DIE. */
143 uint64_t die_offset
; /* DIE offset in section. */
144 uint64_t die_next_off
; /* Next DIE offset in section. */
145 uint64_t die_abnum
; /* Abbrev number. */
146 Dwarf_Abbrev die_ab
; /* Abbrev pointer. */
147 Dwarf_Tag die_tag
; /* DW_TAG_ */
148 Dwarf_Debug die_dbg
; /* Dwarf_Debug pointer. */
149 Dwarf_CU die_cu
; /* Compilation unit pointer. */
150 char *die_name
; /* Ptr to the name string. */
151 Dwarf_Attribute
*die_attrarray
; /* Array of attributes. */
152 STAILQ_HEAD(, _Dwarf_Attribute
) die_attr
; /* List of attributes. */
153 STAILQ_ENTRY(_Dwarf_Die
) die_pro_next
; /* Next die in pro-die list. */
156 struct _Dwarf_Loclist
{
157 Dwarf_Locdesc
**ll_ldlist
; /* Array of Locdesc pointer. */
158 int ll_ldlen
; /* Number of Locdesc. */
159 Dwarf_Unsigned ll_offset
; /* Offset in .debug_loc section. */
160 Dwarf_Unsigned ll_length
; /* Length (in bytes) of the loclist. */
161 TAILQ_ENTRY(_Dwarf_Loclist
) ll_next
; /* Next loclist in list. */
164 struct _Dwarf_P_Expr_Entry
{
165 Dwarf_Loc ee_loc
; /* Location expression. */
166 Dwarf_Unsigned ee_sym
; /* Optional related reloc sym index. */
167 STAILQ_ENTRY(_Dwarf_P_Expr_Entry
) ee_next
; /* Next entry in list. */
170 struct _Dwarf_P_Expr
{
171 Dwarf_Debug pe_dbg
; /* Dwarf_Debug pointer. */
172 uint8_t *pe_block
; /* Expression block data. */
173 int pe_invalid
; /* Block data is up-to-date or not. */
174 Dwarf_Unsigned pe_length
; /* Length of the block. */
175 STAILQ_HEAD(, _Dwarf_P_Expr_Entry
) pe_eelist
; /* List of entries. */
176 STAILQ_ENTRY(_Dwarf_P_Expr
) pe_next
; /* Next expr in list. */
180 Dwarf_LineInfo ln_li
; /* Ptr to line info. */
181 Dwarf_Addr ln_addr
; /* Line address. */
182 Dwarf_Unsigned ln_symndx
; /* Symbol index for relocation. */
183 Dwarf_Unsigned ln_fileno
; /* File number. */
184 Dwarf_Unsigned ln_lineno
; /* Line number. */
185 Dwarf_Signed ln_column
; /* Column number. */
186 Dwarf_Bool ln_bblock
; /* Basic block flag. */
187 Dwarf_Bool ln_stmt
; /* Begin statement flag. */
188 Dwarf_Bool ln_endseq
; /* End sequence flag. */
189 STAILQ_ENTRY(_Dwarf_Line
) ln_next
; /* Next line in list. */
192 struct _Dwarf_LineFile
{
193 char *lf_fname
; /* Filename. */
194 char *lf_fullpath
; /* Full pathname of the file. */
195 Dwarf_Unsigned lf_dirndx
; /* Dir index. */
196 Dwarf_Unsigned lf_mtime
; /* Modification time. */
197 Dwarf_Unsigned lf_size
; /* File size. */
198 STAILQ_ENTRY(_Dwarf_LineFile
) lf_next
; /* Next file in list. */
201 struct _Dwarf_LineInfo
{
202 Dwarf_Unsigned li_length
; /* Length of line info data. */
203 Dwarf_Half li_version
; /* Version of line info. */
204 Dwarf_Unsigned li_hdrlen
; /* Length of line info header. */
205 Dwarf_Small li_minlen
; /* Minimum instrutction length. */
206 Dwarf_Small li_defstmt
; /* Default value of is_stmt. */
207 int8_t li_lbase
; /* Line base for special opcode. */
208 Dwarf_Small li_lrange
; /* Line range for special opcode. */
209 Dwarf_Small li_opbase
; /* Fisrt std opcode number. */
210 Dwarf_Small
*li_oplen
; /* Array of std opcode len. */
211 char **li_incdirs
; /* Array of include dirs. */
212 Dwarf_Unsigned li_inclen
; /* Length of inc dir array. */
213 char **li_lfnarray
; /* Array of file names. */
214 Dwarf_Unsigned li_lflen
; /* Length of filename array. */
215 STAILQ_HEAD(, _Dwarf_LineFile
) li_lflist
; /* List of files. */
216 Dwarf_Line
*li_lnarray
; /* Array of lines. */
217 Dwarf_Unsigned li_lnlen
; /* Length of the line array. */
218 STAILQ_HEAD(, _Dwarf_Line
) li_lnlist
; /* List of lines. */
221 struct _Dwarf_NamePair
{
222 Dwarf_NameTbl np_nt
; /* Ptr to containing name table. */
223 Dwarf_Die np_die
; /* Ptr to Ref. Die. */
224 Dwarf_Unsigned np_offset
; /* Offset in CU. */
225 char *np_name
; /* Object/Type name. */
226 STAILQ_ENTRY(_Dwarf_NamePair
) np_next
; /* Next pair in the list. */
229 struct _Dwarf_NameTbl
{
230 Dwarf_Unsigned nt_length
; /* Name lookup table length. */
231 Dwarf_Half nt_version
; /* Name lookup table version. */
232 Dwarf_CU nt_cu
; /* Ptr to Ref. CU. */
233 Dwarf_Off nt_cu_offset
; /* Ref. CU offset in .debug_info */
234 Dwarf_Unsigned nt_cu_length
; /* Ref. CU length. */
235 STAILQ_HEAD(, _Dwarf_NamePair
) nt_nplist
; /* List of offset+name pairs. */
236 STAILQ_ENTRY(_Dwarf_NameTbl
) nt_next
; /* Next name table in the list. */
239 struct _Dwarf_NameSec
{
240 STAILQ_HEAD(, _Dwarf_NameTbl
) ns_ntlist
; /* List of name tables. */
241 Dwarf_NamePair
*ns_array
; /* Array of pairs of all tables. */
242 Dwarf_Unsigned ns_len
; /* Length of the pair array. */
246 Dwarf_Debug fde_dbg
; /* Ptr to containing dbg. */
247 Dwarf_Cie fde_cie
; /* Ptr to associated CIE. */
248 Dwarf_FrameSec fde_fs
; /* Ptr to containing .debug_frame. */
249 Dwarf_Ptr fde_addr
; /* Ptr to start of the FDE. */
250 Dwarf_Unsigned fde_offset
; /* Offset of the FDE. */
251 Dwarf_Unsigned fde_length
; /* Length of the FDE. */
252 Dwarf_Unsigned fde_cieoff
; /* Offset of associated CIE. */
253 Dwarf_Unsigned fde_initloc
; /* Initial location. */
254 Dwarf_Unsigned fde_adrange
; /* Address range. */
255 Dwarf_Unsigned fde_auglen
; /* Augmentation length. */
256 uint8_t *fde_augdata
; /* Augmentation data. */
257 uint8_t *fde_inst
; /* Instructions. */
258 Dwarf_Unsigned fde_instlen
; /* Length of instructions. */
259 Dwarf_Unsigned fde_instcap
; /* Capacity of inst buffer. */
260 Dwarf_Unsigned fde_symndx
; /* Symbol index for relocation. */
261 Dwarf_Unsigned fde_esymndx
; /* End symbol index for relocation. */
262 Dwarf_Addr fde_eoff
; /* Offset from the end symbol. */
263 STAILQ_ENTRY(_Dwarf_Fde
) fde_next
; /* Next FDE in list. */
267 Dwarf_Debug cie_dbg
; /* Ptr to containing dbg. */
268 Dwarf_Unsigned cie_index
; /* Index of the CIE. */
269 Dwarf_Unsigned cie_offset
; /* Offset of the CIE. */
270 Dwarf_Unsigned cie_length
; /* Length of the CIE. */
271 Dwarf_Half cie_version
; /* CIE version. */
272 uint8_t *cie_augment
; /* CIE augmentation (UTF-8). */
273 Dwarf_Unsigned cie_ehdata
; /* Optional EH Data. */
274 Dwarf_Unsigned cie_caf
; /* Code alignment factor. */
275 Dwarf_Signed cie_daf
; /* Data alignment factor. */
276 Dwarf_Unsigned cie_ra
; /* Return address register. */
277 Dwarf_Unsigned cie_auglen
; /* Augmentation length. */
278 uint8_t *cie_augdata
; /* Augmentation data; */
279 uint8_t cie_fde_encode
; /* FDE PC start/range encode. */
280 Dwarf_Ptr cie_initinst
; /* Initial instructions. */
281 Dwarf_Unsigned cie_instlen
; /* Length of init instructions. */
282 STAILQ_ENTRY(_Dwarf_Cie
) cie_next
; /* Next CIE in list. */
285 struct _Dwarf_FrameSec
{
286 STAILQ_HEAD(, _Dwarf_Cie
) fs_cielist
; /* List of CIE. */
287 STAILQ_HEAD(, _Dwarf_Fde
) fs_fdelist
; /* List of FDE. */
288 Dwarf_Cie
*fs_ciearray
; /* Array of CIE. */
289 Dwarf_Unsigned fs_cielen
; /* Length of CIE array. */
290 Dwarf_Fde
*fs_fdearray
; /* Array of FDE.*/
291 Dwarf_Unsigned fs_fdelen
; /* Length of FDE array. */
294 struct _Dwarf_Arange
{
295 Dwarf_ArangeSet ar_as
; /* Ptr to the set it belongs to. */
296 Dwarf_Unsigned ar_address
; /* Start PC. */
297 Dwarf_Unsigned ar_range
; /* PC range. */
298 Dwarf_Unsigned ar_symndx
; /* First symbol index for reloc. */
299 Dwarf_Unsigned ar_esymndx
; /* Second symbol index for reloc. */
300 Dwarf_Addr ar_eoff
; /* Offset from second symbol. */
301 STAILQ_ENTRY(_Dwarf_Arange
) ar_next
; /* Next arange in list. */
304 struct _Dwarf_ArangeSet
{
305 Dwarf_Unsigned as_length
; /* Length of the arange set. */
306 Dwarf_Half as_version
; /* Version of the arange set. */
307 Dwarf_Off as_cu_offset
; /* Offset of associated CU. */
308 Dwarf_CU as_cu
; /* Ptr to associated CU. */
309 Dwarf_Small as_addrsz
; /* Target address size. */
310 Dwarf_Small as_segsz
; /* Target segment size. */
311 STAILQ_HEAD (, _Dwarf_Arange
) as_arlist
; /* List of ae entries. */
312 STAILQ_ENTRY(_Dwarf_ArangeSet
) as_next
; /* Next set in list. */
315 struct _Dwarf_MacroSet
{
316 Dwarf_Macro_Details
*ms_mdlist
; /* Array of macinfo entries. */
317 Dwarf_Unsigned ms_cnt
; /* Length of the array. */
318 STAILQ_ENTRY(_Dwarf_MacroSet
) ms_next
; /* Next set in list. */
321 struct _Dwarf_Rangelist
{
322 Dwarf_CU rl_cu
; /* Ptr to associated CU. */
323 Dwarf_Unsigned rl_offset
; /* Offset of the rangelist. */
324 Dwarf_Ranges
*rl_rgarray
; /* Array of ranges. */
325 Dwarf_Unsigned rl_rglen
; /* Length of the ranges array. */
326 STAILQ_ENTRY(_Dwarf_Rangelist
) rl_next
; /* Next rangelist in list. */
330 Dwarf_Debug cu_dbg
; /* Ptr to containing dbg. */
331 Dwarf_Off cu_offset
; /* Offset to the this CU. */
332 uint32_t cu_length
; /* Length of CU data. */
333 uint16_t cu_length_size
; /* Size in bytes of the length field. */
334 uint16_t cu_version
; /* DWARF version. */
335 uint64_t cu_abbrev_offset
; /* Offset into .debug_abbrev. */
336 uint64_t cu_abbrev_offset_cur
; /* Current abbrev offset. */
337 int cu_abbrev_loaded
; /* Abbrev table parsed. */
338 uint64_t cu_abbrev_cnt
; /* Abbrev entry count. */
339 uint64_t cu_lineno_offset
; /* Offset into .debug_lineno. */
340 uint8_t cu_pointer_size
;/* Number of bytes in pointer. */
341 uint8_t cu_dwarf_size
; /* CU section dwarf size. */
342 Dwarf_Off cu_next_offset
; /* Offset to the next CU. */
343 uint64_t cu_1st_offset
; /* First DIE offset. */
344 int cu_pass2
; /* Two pass DIE traverse. */
345 Dwarf_LineInfo cu_lineinfo
; /* Ptr to Dwarf_LineInfo. */
346 Dwarf_Abbrev cu_abbrev_hash
; /* Abbrev hash table. */
347 STAILQ_ENTRY(_Dwarf_CU
) cu_next
; /* Next compilation unit. */
350 typedef struct _Dwarf_Section
{
351 const char *ds_name
; /* Section name. */
352 Dwarf_Small
*ds_data
; /* Section data. */
353 Dwarf_Unsigned ds_addr
; /* Section virtual addr. */
354 Dwarf_Unsigned ds_size
; /* Section size. */
357 typedef struct _Dwarf_P_Section
{
358 char *ds_name
; /* Section name. */
359 Dwarf_Small
*ds_data
; /* Section data. */
360 Dwarf_Unsigned ds_size
; /* Section size. */
361 Dwarf_Unsigned ds_cap
; /* Section capacity. */
362 Dwarf_Unsigned ds_ndx
; /* ELF section index. */
363 Dwarf_Unsigned ds_symndx
; /* Section symbol index. (for reloc) */
364 STAILQ_ENTRY(_Dwarf_P_Section
) ds_next
; /* Next section in the list. */
367 typedef struct _Dwarf_Rel_Entry
{
368 unsigned char dre_type
; /* Reloc type. */
369 unsigned char dre_length
; /* Reloc storage unit length. */
370 Dwarf_Unsigned dre_offset
; /* Reloc storage unit offset. */
371 Dwarf_Unsigned dre_addend
; /* Reloc addend. */
372 Dwarf_Unsigned dre_symndx
; /* Reloc symbol index. */
373 const char *dre_secname
; /* Refer to some debug section. */
374 STAILQ_ENTRY(_Dwarf_Rel_Entry
) dre_next
; /* Next reloc entry. */
377 typedef struct _Dwarf_Rel_Section
{
378 struct _Dwarf_P_Section
*drs_ds
; /* Ptr to actual reloc ELF section. */
379 struct _Dwarf_P_Section
*drs_ref
; /* Which debug section it refers. */
380 struct Dwarf_Relocation_Data_s
*drs_drd
; /* Reloc data array. */
381 STAILQ_HEAD(, _Dwarf_Rel_Entry
) drs_dre
; /* Reloc entry list. */
382 Dwarf_Unsigned drs_drecnt
; /* Count of entries. */
383 Dwarf_Unsigned drs_size
; /* Size of ELF section in bytes. */
384 int drs_addend
; /* Elf_Rel or Elf_Rela */
385 STAILQ_ENTRY(_Dwarf_Rel_Section
) drs_next
; /* Next reloc section. */
386 } *Dwarf_Rel_Section
;
397 Dwarf_Elf_Data
*eo_data
;
398 Dwarf_Unsigned eo_seccnt
;
400 Dwarf_Obj_Access_Methods eo_methods
;
403 struct _Dwarf_Debug
{
404 Dwarf_Obj_Access_Interface
*dbg_iface
;
405 Dwarf_Section
*dbg_section
; /* Dwarf section list. */
406 Dwarf_Section
*dbg_info_sec
; /* Pointer to info section. */
407 Dwarf_Off dbg_info_off
; /* Current info section offset. */
408 Dwarf_Unsigned dbg_seccnt
; /* Total number of dwarf sections. */
409 int dbg_mode
; /* Access mode. */
410 int dbg_pointer_size
; /* Object address size. */
411 int dbg_offset_size
; /* DWARF offset size. */
412 int dbg_info_loaded
; /* Flag indicating all CU loaded. */
413 Dwarf_Half dbg_machine
; /* ELF machine architecture. */
414 Dwarf_Handler dbg_errhand
; /* Error handler. */
415 Dwarf_Ptr dbg_errarg
; /* Argument to the error handler. */
416 STAILQ_HEAD(, _Dwarf_CU
) dbg_cu
;/* List of compilation units. */
417 Dwarf_CU dbg_cu_current
; /* Ptr to the current CU. */
418 TAILQ_HEAD(, _Dwarf_Loclist
) dbg_loclist
; /* List of location list. */
419 Dwarf_NameSec dbg_globals
; /* Ptr to pubnames lookup section. */
420 Dwarf_NameSec dbg_pubtypes
; /* Ptr to pubtypes lookup section. */
421 Dwarf_NameSec dbg_weaks
; /* Ptr to weaknames lookup section. */
422 Dwarf_NameSec dbg_funcs
; /* Ptr to static funcs lookup sect. */
423 Dwarf_NameSec dbg_vars
; /* Ptr to static vars lookup sect. */
424 Dwarf_NameSec dbg_types
; /* Ptr to types lookup section. */
425 Dwarf_FrameSec dbg_frame
; /* Ptr to .debug_frame section. */
426 Dwarf_FrameSec dbg_eh_frame
; /* Ptr to .eh_frame section. */
427 STAILQ_HEAD(, _Dwarf_ArangeSet
) dbg_aslist
; /* List of arange set. */
428 Dwarf_Arange
*dbg_arange_array
; /* Array of arange. */
429 Dwarf_Unsigned dbg_arange_cnt
; /* Length of the arange array. */
430 char *dbg_strtab
; /* Dwarf string table. */
431 Dwarf_Unsigned dbg_strtab_cap
; /* Dwarf string table capacity. */
432 Dwarf_Unsigned dbg_strtab_size
; /* Dwarf string table size. */
433 STAILQ_HEAD(, _Dwarf_MacroSet
) dbg_mslist
; /* List of macro set. */
434 STAILQ_HEAD(, _Dwarf_Rangelist
) dbg_rllist
; /* List of rangelist. */
435 uint64_t (*read
)(uint8_t *, uint64_t *, int);
436 void (*write
)(uint8_t *, uint64_t *, uint64_t, int);
437 int (*write_alloc
)(uint8_t **, uint64_t *, uint64_t *,
438 uint64_t, int, Dwarf_Error
*);
439 uint64_t (*decode
)(uint8_t **, int);
441 Dwarf_Half dbg_frame_rule_table_size
;
442 Dwarf_Half dbg_frame_rule_initial_value
;
443 Dwarf_Half dbg_frame_cfa_value
;
444 Dwarf_Half dbg_frame_same_value
;
445 Dwarf_Half dbg_frame_undefined_value
;
447 Dwarf_Regtable3
*dbg_internal_reg_table
;
450 * Fields used by libdwarf producer.
453 Dwarf_Unsigned dbgp_flags
;
454 Dwarf_Unsigned dbgp_isa
;
455 Dwarf_Callback_Func dbgp_func
;
456 Dwarf_Callback_Func_b dbgp_func_b
;
457 Dwarf_Die dbgp_root_die
;
458 STAILQ_HEAD(, _Dwarf_Die
) dbgp_dielist
;
459 STAILQ_HEAD(, _Dwarf_P_Expr
) dbgp_pelist
;
460 Dwarf_LineInfo dbgp_lineinfo
;
461 Dwarf_ArangeSet dbgp_as
;
462 Dwarf_Macro_Details
*dbgp_mdlist
;
463 Dwarf_Unsigned dbgp_mdcnt
;
464 STAILQ_HEAD(, _Dwarf_Cie
) dbgp_cielist
;
465 STAILQ_HEAD(, _Dwarf_Fde
) dbgp_fdelist
;
466 Dwarf_Unsigned dbgp_cielen
;
467 Dwarf_Unsigned dbgp_fdelen
;
468 Dwarf_NameTbl dbgp_pubs
;
469 Dwarf_NameTbl dbgp_weaks
;
470 Dwarf_NameTbl dbgp_funcs
;
471 Dwarf_NameTbl dbgp_types
;
472 Dwarf_NameTbl dbgp_vars
;
473 STAILQ_HEAD(, _Dwarf_P_Section
) dbgp_seclist
;
474 Dwarf_Unsigned dbgp_seccnt
;
475 Dwarf_P_Section dbgp_secpos
;
476 Dwarf_P_Section dbgp_info
;
477 STAILQ_HEAD(, _Dwarf_Rel_Section
) dbgp_drslist
;
478 Dwarf_Unsigned dbgp_drscnt
;
479 Dwarf_Rel_Section dbgp_drspos
;
483 * Internal function prototypes.
486 int _dwarf_abbrev_add(Dwarf_CU
, uint64_t, uint64_t, uint8_t,
487 uint64_t, Dwarf_Abbrev
*, Dwarf_Error
*);
488 void _dwarf_abbrev_cleanup(Dwarf_CU
);
489 int _dwarf_abbrev_find(Dwarf_CU
, uint64_t, Dwarf_Abbrev
*,
491 int _dwarf_abbrev_gen(Dwarf_P_Debug
, Dwarf_Error
*);
492 int _dwarf_abbrev_parse(Dwarf_Debug
, Dwarf_CU
, Dwarf_Unsigned
*,
493 Dwarf_Abbrev
*, Dwarf_Error
*);
494 int _dwarf_add_AT_dataref(Dwarf_P_Debug
, Dwarf_P_Die
, Dwarf_Half
,
495 Dwarf_Unsigned
, Dwarf_Unsigned
, const char *,
496 Dwarf_P_Attribute
*, Dwarf_Error
*);
497 int _dwarf_add_string_attr(Dwarf_P_Die
, Dwarf_P_Attribute
*,
498 Dwarf_Half
, char *, Dwarf_Error
*);
499 int _dwarf_alloc(Dwarf_Debug
*, int, Dwarf_Error
*);
500 void _dwarf_arange_cleanup(Dwarf_Debug
);
501 int _dwarf_arange_gen(Dwarf_P_Debug
, Dwarf_Error
*);
502 int _dwarf_arange_init(Dwarf_Debug
, Dwarf_Error
*);
503 void _dwarf_arange_pro_cleanup(Dwarf_P_Debug
);
504 int _dwarf_attr_alloc(Dwarf_Die
, Dwarf_Attribute
*, Dwarf_Error
*);
505 Dwarf_Attribute
_dwarf_attr_find(Dwarf_Die
, Dwarf_Half
);
506 int _dwarf_attr_gen(Dwarf_P_Debug
, Dwarf_P_Section
, Dwarf_Rel_Section
,
507 Dwarf_CU
, Dwarf_Die
, int, Dwarf_Error
*);
508 int _dwarf_attr_init(Dwarf_Debug
, Dwarf_Section
*, uint64_t *, int,
509 Dwarf_CU
, Dwarf_Die
, Dwarf_AttrDef
, uint64_t, int,
511 int _dwarf_attrdef_add(Dwarf_Debug
, Dwarf_Abbrev
, uint64_t,
512 uint64_t, uint64_t, Dwarf_AttrDef
*, Dwarf_Error
*);
513 uint64_t _dwarf_decode_lsb(uint8_t **, int);
514 uint64_t _dwarf_decode_msb(uint8_t **, int);
515 int64_t _dwarf_decode_sleb128(uint8_t **);
516 uint64_t _dwarf_decode_uleb128(uint8_t **);
517 void _dwarf_deinit(Dwarf_Debug
);
518 int _dwarf_die_alloc(Dwarf_Debug
, Dwarf_Die
*, Dwarf_Error
*);
519 int _dwarf_die_count_links(Dwarf_P_Die
, Dwarf_P_Die
,
520 Dwarf_P_Die
, Dwarf_P_Die
);
521 Dwarf_Die
_dwarf_die_find(Dwarf_Die
, Dwarf_Unsigned
);
522 int _dwarf_die_gen(Dwarf_P_Debug
, Dwarf_CU
, Dwarf_Rel_Section
,
524 void _dwarf_die_link(Dwarf_P_Die
, Dwarf_P_Die
, Dwarf_P_Die
,
525 Dwarf_P_Die
, Dwarf_P_Die
);
526 int _dwarf_die_parse(Dwarf_Debug
, Dwarf_Section
*, Dwarf_CU
, int,
527 uint64_t, uint64_t, Dwarf_Die
*, int, Dwarf_Error
*);
528 void _dwarf_die_pro_cleanup(Dwarf_P_Debug
);
529 void _dwarf_elf_deinit(Dwarf_Debug
);
530 int _dwarf_elf_init(Dwarf_Debug
, Elf
*, Dwarf_Error
*);
531 int _dwarf_elf_load_section(void *, Dwarf_Half
, Dwarf_Small
**,
533 Dwarf_Endianness
_dwarf_elf_get_byte_order(void *);
534 Dwarf_Small
_dwarf_elf_get_length_size(void *);
535 Dwarf_Small
_dwarf_elf_get_pointer_size(void *);
536 Dwarf_Unsigned
_dwarf_elf_get_section_count(void *);
537 int _dwarf_elf_get_section_info(void *, Dwarf_Half
,
538 Dwarf_Obj_Access_Section
*, int *);
539 void _dwarf_expr_cleanup(Dwarf_P_Debug
);
540 int _dwarf_expr_into_block(Dwarf_P_Expr
, Dwarf_Error
*);
541 Dwarf_Section
*_dwarf_find_section(Dwarf_Debug
, const char *);
542 void _dwarf_frame_cleanup(Dwarf_Debug
);
543 int _dwarf_frame_fde_add_inst(Dwarf_P_Fde
, Dwarf_Small
,
544 Dwarf_Unsigned
, Dwarf_Unsigned
, Dwarf_Error
*);
545 int _dwarf_frame_gen(Dwarf_P_Debug
, Dwarf_Error
*);
546 int _dwarf_frame_get_fop(Dwarf_Debug
, uint8_t *, Dwarf_Unsigned
,
547 Dwarf_Frame_Op
**, Dwarf_Signed
*, Dwarf_Error
*);
548 int _dwarf_frame_get_internal_table(Dwarf_Fde
, Dwarf_Addr
,
549 Dwarf_Regtable3
**, Dwarf_Addr
*, Dwarf_Error
*);
550 int _dwarf_frame_interal_table_init(Dwarf_Debug
, Dwarf_Error
*);
551 void _dwarf_frame_params_init(Dwarf_Debug
);
552 void _dwarf_frame_pro_cleanup(Dwarf_P_Debug
);
553 int _dwarf_frame_regtable_copy(Dwarf_Debug
, Dwarf_Regtable3
**,
554 Dwarf_Regtable3
*, Dwarf_Error
*);
555 int _dwarf_frame_section_load(Dwarf_Debug
, Dwarf_Error
*);
556 int _dwarf_frame_section_load_eh(Dwarf_Debug
, Dwarf_Error
*);
557 int _dwarf_generate_sections(Dwarf_P_Debug
, Dwarf_Error
*);
558 Dwarf_Unsigned
_dwarf_get_reloc_type(Dwarf_P_Debug
, int);
559 int _dwarf_get_reloc_size(Dwarf_Debug
, Dwarf_Unsigned
);
560 void _dwarf_info_cleanup(Dwarf_Debug
);
561 int _dwarf_info_first_cu(Dwarf_Debug
, Dwarf_Error
*);
562 int _dwarf_info_gen(Dwarf_P_Debug
, Dwarf_Error
*);
563 int _dwarf_info_load(Dwarf_Debug
, int, Dwarf_Error
*);
564 int _dwarf_info_next_cu(Dwarf_Debug
, Dwarf_Error
*);
565 void _dwarf_info_pro_cleanup(Dwarf_P_Debug
);
566 int _dwarf_init(Dwarf_Debug
, Dwarf_Unsigned
, Dwarf_Handler
,
567 Dwarf_Ptr
, Dwarf_Error
*);
568 int _dwarf_lineno_gen(Dwarf_P_Debug
, Dwarf_Error
*);
569 int _dwarf_lineno_init(Dwarf_Die
, uint64_t, Dwarf_Error
*);
570 void _dwarf_lineno_cleanup(Dwarf_LineInfo
);
571 void _dwarf_lineno_pro_cleanup(Dwarf_P_Debug
);
572 int _dwarf_loc_fill_locdesc(Dwarf_Debug
, Dwarf_Locdesc
*, uint8_t *,
573 uint64_t, uint8_t, Dwarf_Error
*);
574 int _dwarf_loc_fill_locexpr(Dwarf_Debug
, Dwarf_Locdesc
**,
575 uint8_t *, uint64_t, uint8_t, Dwarf_Error
*);
576 int _dwarf_loc_add(Dwarf_Die
, Dwarf_Attribute
, Dwarf_Error
*);
577 int _dwarf_loc_expr_add_atom(Dwarf_Debug
, uint8_t *, uint8_t *,
578 Dwarf_Small
, Dwarf_Unsigned
, Dwarf_Unsigned
, int *,
580 int _dwarf_loclist_find(Dwarf_Debug
, Dwarf_CU
, uint64_t,
581 Dwarf_Loclist
*, Dwarf_Error
*);
582 void _dwarf_loclist_cleanup(Dwarf_Debug
);
583 void _dwarf_loclist_free(Dwarf_Loclist
);
584 int _dwarf_loclist_add(Dwarf_Debug
, Dwarf_CU
, uint64_t,
585 Dwarf_Loclist
*, Dwarf_Error
*);
586 void _dwarf_macinfo_cleanup(Dwarf_Debug
);
587 int _dwarf_macinfo_gen(Dwarf_P_Debug
, Dwarf_Error
*);
588 int _dwarf_macinfo_init(Dwarf_Debug
, Dwarf_Error
*);
589 void _dwarf_macinfo_pro_cleanup(Dwarf_P_Debug
);
590 int _dwarf_nametbl_init(Dwarf_Debug
, Dwarf_NameSec
*,
591 Dwarf_Section
*, Dwarf_Error
*);
592 void _dwarf_nametbl_cleanup(Dwarf_NameSec
*);
593 int _dwarf_nametbl_gen(Dwarf_P_Debug
, const char *, Dwarf_NameTbl
,
595 void _dwarf_nametbl_pro_cleanup(Dwarf_NameTbl
*);
596 int _dwarf_pro_callback(Dwarf_P_Debug
, char *, int, Dwarf_Unsigned
,
597 Dwarf_Unsigned
, Dwarf_Unsigned
, Dwarf_Unsigned
,
598 Dwarf_Unsigned
*, int *);
599 Dwarf_P_Section
_dwarf_pro_find_section(Dwarf_P_Debug
, const char *);
600 int _dwarf_ranges_add(Dwarf_Debug
, Dwarf_CU
, uint64_t,
601 Dwarf_Rangelist
*, Dwarf_Error
*);
602 void _dwarf_ranges_cleanup(Dwarf_Debug
);
603 int _dwarf_ranges_find(Dwarf_Debug
, uint64_t, Dwarf_Rangelist
*);
604 uint64_t _dwarf_read_lsb(uint8_t *, uint64_t *, int);
605 uint64_t _dwarf_read_msb(uint8_t *, uint64_t *, int);
606 int64_t _dwarf_read_sleb128(uint8_t *, uint64_t *);
607 uint64_t _dwarf_read_uleb128(uint8_t *, uint64_t *);
608 char *_dwarf_read_string(void *, Dwarf_Unsigned
, uint64_t *);
609 uint8_t *_dwarf_read_block(void *, uint64_t *, uint64_t);
610 int _dwarf_reloc_section_finalize(Dwarf_P_Debug
, Dwarf_Rel_Section
,
612 int _dwarf_reloc_entry_add(Dwarf_P_Debug
, Dwarf_Rel_Section
,
613 Dwarf_P_Section
, unsigned char, unsigned char,
614 Dwarf_Unsigned
, Dwarf_Unsigned
, Dwarf_Unsigned
,
615 const char *, Dwarf_Error
*);
616 int _dwarf_reloc_entry_add_pair(Dwarf_P_Debug
, Dwarf_Rel_Section
,
617 Dwarf_P_Section
, unsigned char, Dwarf_Unsigned
,
618 Dwarf_Unsigned
, Dwarf_Unsigned
, Dwarf_Unsigned
,
619 Dwarf_Unsigned
, Dwarf_Error
*);
620 void _dwarf_reloc_cleanup(Dwarf_P_Debug
);
621 int _dwarf_reloc_gen(Dwarf_P_Debug
, Dwarf_Error
*);
622 int _dwarf_reloc_section_gen(Dwarf_P_Debug
, Dwarf_Rel_Section
,
624 int _dwarf_reloc_section_init(Dwarf_P_Debug
, Dwarf_Rel_Section
*,
625 Dwarf_P_Section
, Dwarf_Error
*);
626 void _dwarf_reloc_section_free(Dwarf_P_Debug
, Dwarf_Rel_Section
*);
627 void _dwarf_section_cleanup(Dwarf_P_Debug
);
628 int _dwarf_section_callback(Dwarf_P_Debug
, Dwarf_P_Section
,
629 Dwarf_Unsigned
, Dwarf_Unsigned
, Dwarf_Unsigned
,
630 Dwarf_Unsigned
, Dwarf_Error
*);
631 void _dwarf_section_free(Dwarf_P_Debug
, Dwarf_P_Section
*);
632 int _dwarf_section_init(Dwarf_P_Debug
, Dwarf_P_Section
*,
633 const char *, int, Dwarf_Error
*);
634 void _dwarf_set_error(Dwarf_Debug
, Dwarf_Error
*, int, int,
636 int _dwarf_strtab_add(Dwarf_Debug
, char *, uint64_t *,
638 void _dwarf_strtab_cleanup(Dwarf_Debug
);
639 int _dwarf_strtab_gen(Dwarf_P_Debug
, Dwarf_Error
*);
640 char *_dwarf_strtab_get_table(Dwarf_Debug
);
641 int _dwarf_strtab_init(Dwarf_Debug
, Dwarf_Error
*);
642 void _dwarf_write_block(void *, uint64_t *, uint8_t *, uint64_t);
643 int _dwarf_write_block_alloc(uint8_t **, uint64_t *, uint64_t *,
644 uint8_t *, uint64_t, Dwarf_Error
*);
645 void _dwarf_write_lsb(uint8_t *, uint64_t *, uint64_t, int);
646 int _dwarf_write_lsb_alloc(uint8_t **, uint64_t *, uint64_t *,
647 uint64_t, int, Dwarf_Error
*);
648 void _dwarf_write_msb(uint8_t *, uint64_t *, uint64_t, int);
649 int _dwarf_write_msb_alloc(uint8_t **, uint64_t *, uint64_t *,
650 uint64_t, int, Dwarf_Error
*);
651 void _dwarf_write_padding(void *, uint64_t *, uint8_t, uint64_t);
652 int _dwarf_write_padding_alloc(uint8_t **, uint64_t *, uint64_t *,
653 uint8_t, uint64_t, Dwarf_Error
*);
654 void _dwarf_write_string(void *, uint64_t *, char *);
655 int _dwarf_write_string_alloc(uint8_t **, uint64_t *, uint64_t *,
656 char *, Dwarf_Error
*);
657 int _dwarf_write_sleb128(uint8_t *, uint8_t *, int64_t);
658 int _dwarf_write_sleb128_alloc(uint8_t **, uint64_t *, uint64_t *,
659 int64_t, Dwarf_Error
*);
660 int _dwarf_write_uleb128(uint8_t *, uint8_t *, uint64_t);
661 int _dwarf_write_uleb128_alloc(uint8_t **, uint64_t *, uint64_t *,
662 uint64_t, Dwarf_Error
*);
664 #endif /* !__LIBDWARF_H_ */