mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-26 07:54:36 +00:00
Sync libbacktrace with 2446c6.
This commit is contained in:
parent
dc874a732e
commit
3bb2094751
@ -52,6 +52,7 @@ enum dwarf_tag {
|
|||||||
DW_TAG_compile_unit = 0x11,
|
DW_TAG_compile_unit = 0x11,
|
||||||
DW_TAG_inlined_subroutine = 0x1d,
|
DW_TAG_inlined_subroutine = 0x1d,
|
||||||
DW_TAG_subprogram = 0x2e,
|
DW_TAG_subprogram = 0x2e,
|
||||||
|
DW_TAG_skeleton_unit = 0x4a,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum dwarf_form {
|
enum dwarf_form {
|
||||||
@ -2325,14 +2326,16 @@ find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DW_AT_stmt_list:
|
case DW_AT_stmt_list:
|
||||||
if (abbrev->tag == DW_TAG_compile_unit
|
if ((abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
&& (val.encoding == ATTR_VAL_UINT
|
&& (val.encoding == ATTR_VAL_UINT
|
||||||
|| val.encoding == ATTR_VAL_REF_SECTION))
|
|| val.encoding == ATTR_VAL_REF_SECTION))
|
||||||
u->lineoff = val.u.uint;
|
u->lineoff = val.u.uint;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DW_AT_name:
|
case DW_AT_name:
|
||||||
if (abbrev->tag == DW_TAG_compile_unit)
|
if (abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
{
|
{
|
||||||
name_val = val;
|
name_val = val;
|
||||||
have_name_val = 1;
|
have_name_val = 1;
|
||||||
@ -2340,7 +2343,8 @@ find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DW_AT_comp_dir:
|
case DW_AT_comp_dir:
|
||||||
if (abbrev->tag == DW_TAG_compile_unit)
|
if (abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
{
|
{
|
||||||
comp_dir_val = val;
|
comp_dir_val = val;
|
||||||
have_comp_dir_val = 1;
|
have_comp_dir_val = 1;
|
||||||
@ -2348,19 +2352,22 @@ find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DW_AT_str_offsets_base:
|
case DW_AT_str_offsets_base:
|
||||||
if (abbrev->tag == DW_TAG_compile_unit
|
if ((abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
&& val.encoding == ATTR_VAL_REF_SECTION)
|
&& val.encoding == ATTR_VAL_REF_SECTION)
|
||||||
u->str_offsets_base = val.u.uint;
|
u->str_offsets_base = val.u.uint;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DW_AT_addr_base:
|
case DW_AT_addr_base:
|
||||||
if (abbrev->tag == DW_TAG_compile_unit
|
if ((abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
&& val.encoding == ATTR_VAL_REF_SECTION)
|
&& val.encoding == ATTR_VAL_REF_SECTION)
|
||||||
u->addr_base = val.u.uint;
|
u->addr_base = val.u.uint;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DW_AT_rnglists_base:
|
case DW_AT_rnglists_base:
|
||||||
if (abbrev->tag == DW_TAG_compile_unit
|
if ((abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
&& val.encoding == ATTR_VAL_REF_SECTION)
|
&& val.encoding == ATTR_VAL_REF_SECTION)
|
||||||
u->rnglists_base = val.u.uint;
|
u->rnglists_base = val.u.uint;
|
||||||
break;
|
break;
|
||||||
@ -2388,7 +2395,8 @@ find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (abbrev->tag == DW_TAG_compile_unit
|
if (abbrev->tag == DW_TAG_compile_unit
|
||||||
|| abbrev->tag == DW_TAG_subprogram)
|
|| abbrev->tag == DW_TAG_subprogram
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
{
|
{
|
||||||
if (!add_ranges (state, dwarf_sections, base_address,
|
if (!add_ranges (state, dwarf_sections, base_address,
|
||||||
is_bigendian, u, pcrange.lowpc, &pcrange,
|
is_bigendian, u, pcrange.lowpc, &pcrange,
|
||||||
@ -2396,9 +2404,10 @@ find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
|
|||||||
(void *) addrs))
|
(void *) addrs))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* If we found the PC range in the DW_TAG_compile_unit, we
|
/* If we found the PC range in the DW_TAG_compile_unit or
|
||||||
can stop now. */
|
DW_TAG_skeleton_unit, we can stop now. */
|
||||||
if (abbrev->tag == DW_TAG_compile_unit
|
if ((abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
&& (pcrange.have_ranges
|
&& (pcrange.have_ranges
|
||||||
|| (pcrange.have_lowpc && pcrange.have_highpc)))
|
|| (pcrange.have_lowpc && pcrange.have_highpc)))
|
||||||
return 1;
|
return 1;
|
||||||
@ -2557,6 +2566,9 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address,
|
|||||||
u->comp_dir = NULL;
|
u->comp_dir = NULL;
|
||||||
u->abs_filename = NULL;
|
u->abs_filename = NULL;
|
||||||
u->lineoff = 0;
|
u->lineoff = 0;
|
||||||
|
u->str_offsets_base = 0;
|
||||||
|
u->addr_base = 0;
|
||||||
|
u->rnglists_base = 0;
|
||||||
|
|
||||||
/* The actual line number mappings will be read as needed. */
|
/* The actual line number mappings will be read as needed. */
|
||||||
u->lines = NULL;
|
u->lines = NULL;
|
||||||
@ -3607,7 +3619,8 @@ read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata,
|
|||||||
|
|
||||||
/* The compile unit sets the base address for any address
|
/* The compile unit sets the base address for any address
|
||||||
ranges in the function entries. */
|
ranges in the function entries. */
|
||||||
if (abbrev->tag == DW_TAG_compile_unit
|
if ((abbrev->tag == DW_TAG_compile_unit
|
||||||
|
|| abbrev->tag == DW_TAG_skeleton_unit)
|
||||||
&& abbrev->attrs[i].name == DW_AT_low_pc)
|
&& abbrev->attrs[i].name == DW_AT_low_pc)
|
||||||
{
|
{
|
||||||
if (val.encoding == ATTR_VAL_ADDRESS)
|
if (val.encoding == ATTR_VAL_ADDRESS)
|
||||||
|
Loading…
Reference in New Issue
Block a user