summaryrefslogtreecommitdiff
path: root/gdb/blockframe.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <dan@debian.org>2006-07-19 02:17:23 +0000
committerDaniel Jacobowitz <dan@debian.org>2006-07-19 02:17:23 +0000
commitc04bd4920aeb2b476412ae8c5731cfbcf7e2dcdf (patch)
treed05986b0430fb3987edce0774a8d31a84260a47f /gdb/blockframe.c
parentf30e936afa2560c2b4ec91ad44de0fc0ee6328e8 (diff)
downloadgdb-c04bd4920aeb2b476412ae8c5731cfbcf7e2dcdf.tar.gz
* blockframe.c (find_pc_partial_function): Use the minimal symbol
size to control the cache entry, if available. * minsyms.c (lookup_minimal_symbol_by_pc_section): Handle minimal symbols with zero and non-zero sizes differently. * gdb.arch/i386-size.c, gdb.arch/i386-size.exp: New files.
Diffstat (limited to 'gdb/blockframe.c')
-rw-r--r--gdb/blockframe.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/gdb/blockframe.c b/gdb/blockframe.c
index dbb1b4343e3..ba298c3f61f 100644
--- a/gdb/blockframe.c
+++ b/gdb/blockframe.c
@@ -280,27 +280,34 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address,
cache_pc_function_name = DEPRECATED_SYMBOL_NAME (msymbol);
cache_pc_function_section = section;
- /* Use the lesser of the next minimal symbol in the same section, or
- the end of the section, as the end of the function. */
+ /* If the minimal symbol has a size, use it for the cache.
+ Otherwise use the lesser of the next minimal symbol in the same
+ section, or the end of the section, as the end of the
+ function. */
- /* Step over other symbols at this same address, and symbols in
- other sections, to find the next symbol in this section with
- a different address. */
-
- for (i = 1; DEPRECATED_SYMBOL_NAME (msymbol + i) != NULL; i++)
+ if (MSYMBOL_SIZE (msymbol) != 0)
+ cache_pc_function_high = cache_pc_function_low + MSYMBOL_SIZE (msymbol);
+ else
{
- if (SYMBOL_VALUE_ADDRESS (msymbol + i) != SYMBOL_VALUE_ADDRESS (msymbol)
- && SYMBOL_BFD_SECTION (msymbol + i) == SYMBOL_BFD_SECTION (msymbol))
- break;
- }
+ /* Step over other symbols at this same address, and symbols in
+ other sections, to find the next symbol in this section with
+ a different address. */
- if (DEPRECATED_SYMBOL_NAME (msymbol + i) != NULL
- && SYMBOL_VALUE_ADDRESS (msymbol + i) < osect->endaddr)
- cache_pc_function_high = SYMBOL_VALUE_ADDRESS (msymbol + i);
- else
- /* We got the start address from the last msymbol in the objfile.
- So the end address is the end of the section. */
- cache_pc_function_high = osect->endaddr;
+ for (i = 1; DEPRECATED_SYMBOL_NAME (msymbol + i) != NULL; i++)
+ {
+ if (SYMBOL_VALUE_ADDRESS (msymbol + i) != SYMBOL_VALUE_ADDRESS (msymbol)
+ && SYMBOL_BFD_SECTION (msymbol + i) == SYMBOL_BFD_SECTION (msymbol))
+ break;
+ }
+
+ if (DEPRECATED_SYMBOL_NAME (msymbol + i) != NULL
+ && SYMBOL_VALUE_ADDRESS (msymbol + i) < osect->endaddr)
+ cache_pc_function_high = SYMBOL_VALUE_ADDRESS (msymbol + i);
+ else
+ /* We got the start address from the last msymbol in the objfile.
+ So the end address is the end of the section. */
+ cache_pc_function_high = osect->endaddr;
+ }
return_cached_value: