summaryrefslogtreecommitdiff
path: root/gdb/frame.c
diff options
context:
space:
mode:
authorRichard Bunt <richard.bunt@linaro.org>2023-03-31 15:31:40 +0100
committerMaciej W. Rozycki <macro@embecosm.com>2023-03-31 15:31:40 +0100
commit571eb2644c7a52a78250ce9906d9c5127006e164 (patch)
tree707e57fbf03d7930e96e711a86ec3503e124b5dd /gdb/frame.c
parent85413975d80cdb69efd09211d01fc96e00a84dd0 (diff)
downloadbinutils-gdb-571eb2644c7a52a78250ce9906d9c5127006e164.tar.gz
GDB: Favor full symbol main name for backtrace stop
In the case where a Fortran program has a program name of "main" and there is also a minimal symbol called main, such as with programs built with GCC version 4.4.7 or below, the backtrace will erroneously stop at the minimal symbol rather than the user specified main, e.g.: (gdb) bt #0 bar () at .../gdb/testsuite/gdb.fortran/backtrace.f90:17 #1 0x0000000000402556 in foo () at .../gdb/testsuite/gdb.fortran/backtrace.f90:21 #2 0x0000000000402575 in main () at .../gdb/testsuite/gdb.fortran/backtrace.f90:31 #3 0x00000000004025aa in main () (gdb) This patch fixes this issue by increasing the precedence of the full symbol when the language of the current frame is Fortran. Newer versions of GCC transform the program name to "MAIN__" in this case, avoiding the problem. Co-Authored-By: Maciej W. Rozycki <macro@embecosm.com>
Diffstat (limited to 'gdb/frame.c')
-rw-r--r--gdb/frame.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/gdb/frame.c b/gdb/frame.c
index de3c7de440d..4f420f138f6 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -2542,29 +2542,34 @@ inside_main_func (frame_info_ptr this_frame)
bound_minimal_symbol msymbol
= lookup_minimal_symbol (name, NULL,
current_program_space->symfile_object_file);
- if (msymbol.minsym == nullptr)
+
+ if (msymbol.minsym != nullptr)
+ sym_addr = msymbol.value_address ();
+
+ /* Favor a full symbol in Fortran, for the case where the Fortran main
+ is also called "main". */
+ if (msymbol.minsym == nullptr
+ || get_frame_language (this_frame) == language_fortran)
{
/* In some language (for example Fortran) there will be no minimal
symbol with the name of the main function. In this case we should
search the full symbols to see if we can find a match. */
struct block_symbol bs = lookup_symbol (name, NULL, VAR_DOMAIN, 0);
- if (bs.symbol == nullptr)
- return false;
/* We might have found some unrelated symbol. For example, the
Rust compiler can emit both a subprogram and a namespace with
the same name in the same scope; and due to how gdb's symbol
tables currently work, we can't request the one we'd
prefer. */
- if (bs.symbol->aclass () != LOC_BLOCK)
+ if (bs.symbol != nullptr && bs.symbol->aclass () == LOC_BLOCK)
+ {
+ const struct block *block = bs.symbol->value_block ();
+ gdb_assert (block != nullptr);
+ sym_addr = block->start ();
+ }
+ else if (msymbol.minsym == nullptr)
return false;
-
- const struct block *block = bs.symbol->value_block ();
- gdb_assert (block != nullptr);
- sym_addr = block->start ();
}
- else
- sym_addr = msymbol.value_address ();
/* Convert any function descriptor addresses into the actual function
code address. */