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