diff options
author | Tristan Gingold <tristan.gingold@adacore.com> | 2014-05-28 09:21:11 +0200 |
---|---|---|
committer | Tristan Gingold <tristan.gingold@adacore.com> | 2014-05-28 09:22:41 +0200 |
commit | 4ba3b3268eaea2c15e7adb1b816a946af3a830bc (patch) | |
tree | 0cea8784d4fd6d24dc48a0c629c985c5507fbd86 /bfd/dwarf2.c | |
parent | ee34b3f945bdf5f854081de8665163657ccf8a1b (diff) | |
download | gdb-4ba3b3268eaea2c15e7adb1b816a946af3a830bc.zip gdb-4ba3b3268eaea2c15e7adb1b816a946af3a830bc.tar.gz gdb-4ba3b3268eaea2c15e7adb1b816a946af3a830bc.tar.bz2 |
addr2line: fix missing inlined frames.
2014-05-28 Tristan Gingold <gingold@adacore.com>
* dwarf2.c (lookup_address_in_function_table): Add best_fit_len
to keep the length of the best fit range.
(lookup_symbol_in_function_table, info_hash_lookup_funcinfo):
Likewise.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r-- | bfd/dwarf2.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index e5579d8..5e322ce 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -1994,6 +1994,7 @@ lookup_address_in_function_table (struct comp_unit *unit, { struct funcinfo* each_func; struct funcinfo* best_fit = NULL; + bfd_vma best_fit_len = 0; struct arange *arange; for (each_func = unit->function_table; @@ -2007,9 +2008,11 @@ lookup_address_in_function_table (struct comp_unit *unit, if (addr >= arange->low && addr < arange->high) { if (!best_fit - || (arange->high - arange->low - < best_fit->arange.high - best_fit->arange.low)) - best_fit = each_func; + || arange->high - arange->low < best_fit_len) + { + best_fit = each_func; + best_fit_len = arange->high - arange->low; + } } } } @@ -2038,6 +2041,7 @@ lookup_symbol_in_function_table (struct comp_unit *unit, { struct funcinfo* each_func; struct funcinfo* best_fit = NULL; + bfd_vma best_fit_len = 0; struct arange *arange; const char *name = bfd_asymbol_name (sym); asection *sec = bfd_get_section (sym); @@ -2056,9 +2060,11 @@ lookup_symbol_in_function_table (struct comp_unit *unit, && each_func->name && strcmp (name, each_func->name) == 0 && (!best_fit - || (arange->high - arange->low - < best_fit->arange.high - best_fit->arange.low))) - best_fit = each_func; + || arange->high - arange->low < best_fit_len)) + { + best_fit = each_func; + best_fit_len = arange->high - arange->low; + } } } @@ -3173,6 +3179,7 @@ info_hash_lookup_funcinfo (struct info_hash_table *hash_table, { struct funcinfo* each_func; struct funcinfo* best_fit = NULL; + bfd_vma best_fit_len = 0; struct info_list_node *node; struct arange *arange; const char *name = bfd_asymbol_name (sym); @@ -3191,9 +3198,11 @@ info_hash_lookup_funcinfo (struct info_hash_table *hash_table, && addr >= arange->low && addr < arange->high && (!best_fit - || (arange->high - arange->low - < best_fit->arange.high - best_fit->arange.low))) - best_fit = each_func; + || arange->high - arange->low < best_fit_len)) + { + best_fit = each_func; + best_fit_len = arange->high - arange->low; + } } } |