Index: contrib/elftoolchain/addr2line/addr2line.c =================================================================== --- contrib/elftoolchain/addr2line/addr2line.c +++ contrib/elftoolchain/addr2line/addr2line.c @@ -229,6 +229,7 @@ const char *funcname; struct Func *f; int found_ranges, ret; + bool label; f = NULL; abst_die = spec_die = NULL; @@ -247,6 +248,7 @@ ranges = NULL; ranges_cnt = 0; found_ranges = 0; + label = (tag == DW_TAG_label); if (dwarf_attrval_unsigned(die, DW_AT_ranges, &ranges_off, &de) == DW_DLV_OK && dwarf_get_ranges(dbg, (Dwarf_Off) ranges_off, &ranges, @@ -321,7 +323,8 @@ f->ranges_cnt = ranges_cnt; } else { f->lopc = lopc; - f->hipc = hipc; + /* Use hipc found in range if it's a label */ + f->hipc = label ? range->hipc : hipc; } if (tag == DW_TAG_inlined_subroutine) { f->inlined_caller = parent; @@ -460,6 +463,8 @@ if (dwarf_tag(prev_die, &tag, &de) != DW_DLV_OK) { warnx("dwarf_tag failed: %s", dwarf_errmsg(de)); + if (prev_die != NULL) + dwarf_dealloc(dbg, prev_die, DW_DLA_DIE); return DW_DLV_ERROR; } if (tag == DW_TAG_label) { @@ -493,6 +498,8 @@ if (dwarf_tag(prev_die, &tag, &de) != DW_DLV_OK) { warnx("dwarf_tag failed: %s", dwarf_errmsg(de)); + if (prev_die != NULL) + dwarf_dealloc(dbg, prev_die, DW_DLA_DIE); return DW_DLV_ERROR; } if (tag == DW_TAG_label) { @@ -504,6 +511,8 @@ free(labels[i]); } free(labels); + if (prev_die != NULL) + dwarf_dealloc(dbg, prev_die, DW_DLA_DIE); return DW_DLV_ERROR; } if ((labelp = calloc(1, sizeof(struct range))) == NULL)