gdb: detect main function even when there's no matching msymbol

Currently, GDB will only stop the backtrace at the main function if
there is a minimal symbol with the matching name.  In Fortran programs
compiled with gfortran this is not the case.  The main function is
present in the DWARF, and as marked as DW_AT_main_subprogram, but
there's no minimal symbol.

This commit extends `inside_main_func` to check the full symbols if no
matching minimal symbol is found.

There's an updated test case that covers this change.

gdb/ChangeLog:

	* frame.c (inside_main_func): Check full symbols as well as
	minimal symbols.

gdb/testsuite/ChangeLog:

	* gdb.fortran/mixed-lang-stack.exp (run_tests): Update expected
	output of backtrace.
This commit is contained in:
Andrew Burgess 2020-10-08 12:28:19 +01:00
parent f7c1edaa78
commit 9370fd51eb
4 changed files with 33 additions and 10 deletions

View file

@ -1,3 +1,8 @@
2020-10-11 Andrew Burgess <andrew.burgess@embecosm.com>
* frame.c (inside_main_func): Check full symbols as well as
minimal symbols.
2020-10-09 Joel Brobecker <brobecker@adacore.com>
* ada-lang.c (advance_wild_match): Rewrite the function's

View file

@ -2295,19 +2295,33 @@ inside_main_func (frame_info *this_frame)
if (symfile_objfile == nullptr)
return false;
CORE_ADDR sym_addr;
const char *name = main_name ();
bound_minimal_symbol msymbol
= lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
= lookup_minimal_symbol (name, NULL, symfile_objfile);
if (msymbol.minsym == nullptr)
return false;
{
/* 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;
/* Make certain that the code, and not descriptor, address is
returned. */
CORE_ADDR maddr
const struct block *block = SYMBOL_BLOCK_VALUE (bs.symbol);
gdb_assert (block != nullptr);
sym_addr = BLOCK_START (block);
}
else
sym_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
/* Convert any function descriptor addresses into the actual function
code address. */
sym_addr
= gdbarch_convert_from_func_ptr_addr (get_frame_arch (this_frame),
BMSYMBOL_VALUE_ADDRESS (msymbol),
current_top_target ());
sym_addr, current_top_target ());
return maddr == get_frame_func (this_frame);
return sym_addr == get_frame_func (this_frame);
}
/* Test whether THIS_FRAME is inside the process entry point function. */

View file

@ -1,3 +1,8 @@
2020-10-11 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.fortran/mixed-lang-stack.exp (run_tests): Update expected
output of backtrace.
2020-10-09 Tom Tromey <tromey@adacore.com>
* gdb.ada/scalar_storage/storage.adb (Another_Range): New type.

View file

@ -73,8 +73,7 @@ proc run_tests { lang } {
"#6\\s+$hex in mixed_func_1c \\(\[^\r\n\]+\\) at \[^\r\n\]+" \
"#7\\s+$hex in mixed_func_1b \\($1b_args\\) at \[^\r\n\]+" \
"#8\\s+$hex in mixed_func_1a \\(\\) at \[^\r\n\]+" \
"#9\\s+$hex in mixed_stack_main \\(\\) at \[^\r\n\]+" \
"#10\\s+$hex in main \\(\[^\r\n\]+\\) at .*" ]
"#9\\s+$hex in mixed_stack_main \\(\\) at \[^\r\n\]+" ]
gdb_test "bt -frame-arguments all" $bt_stack
# Check the language for frame #0.