4 * Copyright (c) 2007 John Birrell (jb@freebsd.org)
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * $FreeBSD: src/lib/libdwarf/libdwarf.h,v 1.1.4.1 2009/08/03 08:13:06 kensmith Exp $
36 typedef int Dwarf_Bool
;
37 typedef off_t Dwarf_Off
;
38 typedef uint64_t Dwarf_Unsigned
;
39 typedef uint16_t Dwarf_Half
;
40 typedef uint8_t Dwarf_Small
;
41 typedef int64_t Dwarf_Signed
;
42 typedef uint64_t Dwarf_Addr
;
43 typedef void *Dwarf_Ptr
;
45 /* Forward definitions. */
46 typedef struct _Dwarf_Abbrev
*Dwarf_Abbrev
;
47 typedef struct _Dwarf_Arange
*Dwarf_Arange
;
48 typedef struct _Dwarf_Attribute
*Dwarf_Attribute
;
49 typedef struct _Dwarf_AttrValue
*Dwarf_AttrValue
;
50 typedef struct _Dwarf_CU
*Dwarf_CU
;
51 typedef struct _Dwarf_Cie
*Dwarf_Cie
;
52 typedef struct _Dwarf_Debug
*Dwarf_Debug
;
53 typedef struct _Dwarf_Die
*Dwarf_Die
;
54 typedef struct _Dwarf_Fde
*Dwarf_Fde
;
55 typedef struct _Dwarf_Func
*Dwarf_Func
;
56 typedef struct _Dwarf_Global
*Dwarf_Global
;
57 typedef struct _Dwarf_Line
*Dwarf_Line
;
58 typedef struct _Dwarf_Type
*Dwarf_Type
;
59 typedef struct _Dwarf_Var
*Dwarf_Var
;
60 typedef struct _Dwarf_Weak
*Dwarf_Weak
;
64 Dwarf_Unsigned lr_number
;
65 Dwarf_Unsigned lr_number2
;
66 Dwarf_Unsigned lr_offset
;
77 * Error numbers which are specific to this implementation.
80 DWARF_E_NONE
, /* No error. */
81 DWARF_E_ERROR
, /* An error! */
82 DWARF_E_NO_ENTRY
, /* No entry. */
83 DWARF_E_ARGUMENT
, /* Invalid argument. */
84 DWARF_E_DEBUG_INFO
, /* Debug info NULL. */
85 DWARF_E_MEMORY
, /* Insufficient memory. */
86 DWARF_E_ELF
, /* ELF error. */
87 DWARF_E_INVALID_CU
, /* Invalid compilation unit data. */
88 DWARF_E_CU_VERSION
, /* Wrong CU version. */
89 DWARF_E_MISSING_ABBREV
, /* Abbrev not found. */
90 DWARF_E_NOT_IMPLEMENTED
, /* Not implemented. */
91 DWARF_E_CU_CURRENT
, /* No current compilation unit. */
92 DWARF_E_BAD_FORM
, /* Wrong form type for attribute value. */
93 DWARF_E_INVALID_EXPR
, /* Invalid DWARF expression. */
94 DWARF_E_NUM
/* Max error number. */
97 typedef struct _Dwarf_Error
{
98 int err_error
; /* DWARF error. */
99 int elf_error
; /* ELF error. */
100 const char *err_func
; /* Function name where error occurred. */
101 int err_line
; /* Line number where error occurred. */
102 char err_msg
[1024]; /* Formatted error message. */
106 * Return values which have to be compatible with other
107 * implementations of libdwarf.
109 #define DW_DLV_NO_ENTRY DWARF_E_NO_ENTRY
110 #define DW_DLV_OK DWARF_E_NONE
111 #define DW_DLE_DEBUG_INFO_NULL DWARF_E_DEBUG_INFO
113 #define DW_DLC_READ 0 /* read only access */
115 /* Function prototype definitions. */
117 Dwarf_Abbrev
dwarf_abbrev_find(Dwarf_CU
, uint64_t);
118 Dwarf_AttrValue
dwarf_attrval_find(Dwarf_Die
, Dwarf_Half
);
119 Dwarf_Die
dwarf_die_find(Dwarf_Die
, Dwarf_Unsigned
);
120 const char *dwarf_errmsg(Dwarf_Error
*);
121 const char *get_sht_desc(uint32_t);
122 const char *get_attr_desc(uint32_t);
123 const char *get_form_desc(uint32_t);
124 const char *get_tag_desc(uint32_t);
125 int dwarf_abbrev_add(Dwarf_CU
, uint64_t, uint64_t, uint8_t, Dwarf_Abbrev
*, Dwarf_Error
*);
126 int dwarf_attr(Dwarf_Die
, Dwarf_Half
, Dwarf_Attribute
*, Dwarf_Error
*);
127 int dwarf_attr_add(Dwarf_Abbrev
, uint64_t, uint64_t, Dwarf_Attribute
*, Dwarf_Error
*);
128 int dwarf_attrval(Dwarf_Die
, Dwarf_Half
, Dwarf_AttrValue
*, Dwarf_Error
*);
129 int dwarf_attrval_add(Dwarf_Die
, Dwarf_AttrValue
, Dwarf_AttrValue
*, Dwarf_Error
*);
130 int dwarf_attrval_flag(Dwarf_Die
, uint64_t, Dwarf_Bool
*, Dwarf_Error
*);
131 int dwarf_attrval_signed(Dwarf_Die
, uint64_t, Dwarf_Signed
*, Dwarf_Error
*);
132 int dwarf_attrval_string(Dwarf_Die
, uint64_t, const char **, Dwarf_Error
*);
133 int dwarf_attrval_unsigned(Dwarf_Die
, uint64_t, Dwarf_Unsigned
*, Dwarf_Error
*);
134 int dwarf_child(Dwarf_Die
, Dwarf_Die
*, Dwarf_Error
*);
135 int dwarf_die_add(Dwarf_CU
, int, uint64_t, uint64_t, Dwarf_Abbrev
, Dwarf_Die
*, Dwarf_Error
*);
136 int dwarf_dieoffset(Dwarf_Die
, Dwarf_Off
*, Dwarf_Error
*);
137 int dwarf_elf_init(Elf
*, int, Dwarf_Debug
*, Dwarf_Error
*);
138 int dwarf_errno(Dwarf_Error
*);
139 int dwarf_finish(Dwarf_Debug
*, Dwarf_Error
*);
140 int dwarf_locdesc(Dwarf_Die
, uint64_t, Dwarf_Locdesc
**, Dwarf_Signed
*, Dwarf_Error
*);
141 int dwarf_locdesc_free(Dwarf_Locdesc
*, Dwarf_Error
*);
142 int dwarf_init(int, int, Dwarf_Debug
*, Dwarf_Error
*);
143 int dwarf_next_cu_header(Dwarf_Debug
, Dwarf_Unsigned
*, Dwarf_Half
*,
144 Dwarf_Unsigned
*, Dwarf_Half
*, Dwarf_Unsigned
*, Dwarf_Error
*);
145 int dwarf_op_num(uint8_t, uint8_t *, int);
146 int dwarf_siblingof(Dwarf_Debug
, Dwarf_Die
, Dwarf_Die
*, Dwarf_Error
*);
147 int dwarf_tag(Dwarf_Die
, Dwarf_Half
*, Dwarf_Error
*);
148 int dwarf_whatform(Dwarf_Attribute
, Dwarf_Half
*, Dwarf_Error
*);
149 void dwarf_dealloc(Dwarf_Debug
, Dwarf_Ptr
, Dwarf_Unsigned
);
150 void dwarf_dump(Dwarf_Debug
);
151 void dwarf_dump_abbrev(Dwarf_Debug
);
152 void dwarf_dump_av(Dwarf_Die
, Dwarf_AttrValue
);
153 void dwarf_dump_dbgstr(Dwarf_Debug
);
154 void dwarf_dump_die(Dwarf_Die
);
155 void dwarf_dump_die_at_offset(Dwarf_Debug
, Dwarf_Off
);
156 void dwarf_dump_info(Dwarf_Debug
);
157 void dwarf_dump_shstrtab(Dwarf_Debug
);
158 void dwarf_dump_strtab(Dwarf_Debug
);
159 void dwarf_dump_symtab(Dwarf_Debug
);
160 void dwarf_dump_raw(Dwarf_Debug
);
161 void dwarf_dump_tree(Dwarf_Debug
);
164 #endif /* !_LIBDWARF_H_ */