2 * SPDX-License-Identifier: MIT
4 * Copyright 2015 Antoine Busque <abusque@efficios.com>
6 * Babeltrace - DWARF Information Reader
15 struct bt_dwarf_cu
*bt_dwarf_cu_create(Dwarf
*dwarf_info
)
17 struct bt_dwarf_cu
*cu
;
23 cu
= g_new0(struct bt_dwarf_cu
, 1);
27 cu
->dwarf_info
= dwarf_info
;
34 void bt_dwarf_cu_destroy(struct bt_dwarf_cu
*cu
)
39 int bt_dwarf_cu_next(struct bt_dwarf_cu
*cu
)
42 Dwarf_Off next_offset
;
43 size_t cu_header_size
;
50 ret
= dwarf_nextcu(cu
->dwarf_info
, cu
->next_offset
, &next_offset
,
51 &cu_header_size
, NULL
, NULL
, NULL
);
53 /* ret is -1 on error, 1 if no next CU. */
57 cu
->offset
= cu
->next_offset
;
58 cu
->next_offset
= next_offset
;
59 cu
->header_size
= cu_header_size
;
65 struct bt_dwarf_die
*bt_dwarf_die_create(struct bt_dwarf_cu
*cu
)
67 Dwarf_Die
*dwarf_die
= NULL
;
68 struct bt_dwarf_die
*die
= NULL
;
74 dwarf_die
= g_new0(Dwarf_Die
, 1);
79 dwarf_die
= dwarf_offdie(cu
->dwarf_info
, cu
->offset
+ cu
->header_size
,
85 die
= g_new0(struct bt_dwarf_die
, 1);
91 die
->dwarf_die
= dwarf_die
;
102 void bt_dwarf_die_destroy(struct bt_dwarf_die
*die
)
108 g_free(die
->dwarf_die
);
112 int bt_dwarf_die_has_children(struct bt_dwarf_die
*die
)
114 return dwarf_haschildren(die
->dwarf_die
);
117 int bt_dwarf_die_child(struct bt_dwarf_die
*die
)
120 Dwarf_Die
*child_die
= NULL
;
127 child_die
= g_new0(Dwarf_Die
, 1);
133 ret
= dwarf_child(die
->dwarf_die
, child_die
);
135 /* ret is -1 on error, 1 if no child DIE. */
139 g_free(die
->dwarf_die
);
140 die
->dwarf_die
= child_die
;
149 int bt_dwarf_die_next(struct bt_dwarf_die
*die
)
152 Dwarf_Die
*next_die
= NULL
;
159 next_die
= g_new0(Dwarf_Die
, 1);
165 if (die
->depth
== 0) {
166 ret
= dwarf_child(die
->dwarf_die
, next_die
);
168 /* ret is -1 on error, 1 if no child DIE. */
174 ret
= dwarf_siblingof(die
->dwarf_die
, next_die
);
176 /* ret is -1 on error, 1 if we reached end of
177 * DIEs at this depth. */
182 g_free(die
->dwarf_die
);
183 die
->dwarf_die
= next_die
;
191 int bt_dwarf_die_get_tag(struct bt_dwarf_die
*die
, int *tag
)
199 _tag
= dwarf_tag(die
->dwarf_die
);
200 if (_tag
== DW_TAG_invalid
) {
211 int bt_dwarf_die_get_name(struct bt_dwarf_die
*die
, char **name
)
219 _name
= dwarf_diename(die
->dwarf_die
);
224 *name
= g_strdup(_name
);
235 int bt_dwarf_die_get_call_file(struct bt_dwarf_die
*die
, char **filename
)
239 const char *_filename
= NULL
;
240 Dwarf_Files
*src_files
= NULL
;
241 Dwarf_Attribute
*file_attr
= NULL
;
242 struct bt_dwarf_die
*cu_die
= NULL
;
244 if (!die
|| !filename
) {
248 file_attr
= g_new0(Dwarf_Attribute
, 1);
253 file_attr
= dwarf_attr(die
->dwarf_die
, DW_AT_call_file
, file_attr
);
258 ret
= dwarf_formsdata(file_attr
, &file_no
);
263 cu_die
= bt_dwarf_die_create(die
->cu
);
268 ret
= dwarf_getsrcfiles(cu_die
->dwarf_die
, &src_files
, NULL
);
273 _filename
= dwarf_filesrc(src_files
, file_no
, NULL
, NULL
);
278 *filename
= g_strdup(_filename
);
280 bt_dwarf_die_destroy(cu_die
);
286 bt_dwarf_die_destroy(cu_die
);
292 int bt_dwarf_die_get_call_line(struct bt_dwarf_die
*die
,
296 Dwarf_Attribute
*line_attr
= NULL
;
299 if (!die
|| !line_no
) {
303 line_attr
= g_new0(Dwarf_Attribute
, 1);
308 line_attr
= dwarf_attr(die
->dwarf_die
, DW_AT_call_line
, line_attr
);
313 ret
= dwarf_formudata(line_attr
, &_line_no
);
329 int bt_dwarf_die_contains_addr(struct bt_dwarf_die
*die
, uint64_t addr
,
334 ret
= dwarf_haspc(die
->dwarf_die
, addr
);
339 *contains
= (ret
== 1);
This page took 0.035864 seconds and 4 git commands to generate.