diff options
author | Elena Zannoni <ezannoni@kwikemart.cygnus.com> | 2004-02-19 19:01:26 +0000 |
---|---|---|
committer | Elena Zannoni <ezannoni@kwikemart.cygnus.com> | 2004-02-19 19:01:26 +0000 |
commit | c24d7236424df9cb0dd20c19c6f6aeee88ec0b87 (patch) | |
tree | 2f988932feee58df1e129f1707ecda8856d49d52 | |
parent | 63f9fccfb7b92fa6a5e538b5d8575ddce15bbe3e (diff) | |
download | gdb-c24d7236424df9cb0dd20c19c6f6aeee88ec0b87.tar.gz |
2004-02-19 Joel Brobecker <brobecker@gnat.com>
Committed by Elena Zannoni <ezannoni@redhat.com>
* symtab.c (find_pc_sect_psymtab): Return the psymtab that
contains a symbol wich is the best, non-exact match for the given
pc. Update comments.
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/symtab.c | 41 |
2 files changed, 47 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 083fcaa3fc1..21d73d8b5c2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ -2004-02-19 Elena Zannoni <ezannoni@redhat.com> +2004-02-19 Joel Brobecker <brobecker@gnat.com> + + Committed by Elena Zannoni <ezannoni@redhat.com> + + * symtab.c (find_pc_sect_psymtab): Return the psymtab that + contains a symbol wich is the best, non-exact match for the given + pc. Update comments. +2004-02-19 Elena Zannoni <ezannoni@redhat.com> + * event-top.c (async_request_quit): Remove uses of REQUEST_QUIT macro, which was part of the now removed Mach 3 port. * utils.c (request_quit): Ditto. diff --git a/gdb/symtab.c b/gdb/symtab.c index 99f138a3063..6995891b5ae 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -672,8 +672,10 @@ init_sal (struct symtab_and_line *sal) -/* Find which partial symtab on contains PC and SECTION. Return 0 if none. */ - +/* Find which partial symtab contains PC and SECTION. Return 0 if + none. We return the psymtab that contains a symbol whose address + exactly matches PC, or, if we cannot find an exact match, the + psymtab that contains a symbol whose address is closest to PC. */ struct partial_symtab * find_pc_sect_psymtab (CORE_ADDR pc, asection *section) { @@ -698,6 +700,8 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section) if (pc >= pst->textlow && pc < pst->texthigh) { struct partial_symtab *tpst; + struct partial_symtab *best_pst = pst; + struct partial_symbol *best_psym = NULL; /* An objfile that has its functions reordered might have many partial symbol tables containing the PC, but @@ -710,6 +714,13 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section) if (msymbol == NULL) return (pst); + /* The code range of partial symtabs sometimes overlap, so, in + the loop below, we need to check all partial symtabs and + find the one that fits better for the given PC address. We + select the partial symtab that contains a symbol whose + address is closest to the PC address. By closest we mean + that find_pc_sect_symbol returns the symbol with address + that is closest and still less than the given PC. */ for (tpst = pst; tpst != NULL; tpst = tpst->next) { if (pc >= tpst->textlow && pc < tpst->texthigh) @@ -721,9 +732,33 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section) && SYMBOL_VALUE_ADDRESS (p) == SYMBOL_VALUE_ADDRESS (msymbol)) return (tpst); + if (p != NULL) + { + /* We found a symbol in this partial symtab which + matches (or is closest to) PC, check whether it + is closer than our current BEST_PSYM. Since + this symbol address is necessarily lower or + equal to PC, the symbol closer to PC is the + symbol which address is the highest. */ + /* This way we return the psymtab which contains + such best match symbol. This can help in cases + where the symbol information/debuginfo is not + complete, like for instance on IRIX6 with gcc, + where no debug info is emitted for + statics. (See also the nodebug.exp + testcase.) */ + if (best_psym == NULL + || SYMBOL_VALUE_ADDRESS (p) + > SYMBOL_VALUE_ADDRESS (best_psym)) + { + best_psym = p; + best_pst = tpst; + } + } + } } - return (pst); + return (best_pst); } } return (NULL); |