GDB: Add `info main' command

Allow consumers of GDB to extract the name of the main method.  This is
most useful for Fortran programs which have a variable main method.

Used by both MAP and DDT e.g. it is used to detect the presence of debug
information.

Co-Authored-By: Maciej W. Rozycki <macro@embecosm.com>
This commit is contained in:
Richard Bunt 2023-03-31 15:31:40 +01:00 committed by Maciej W. Rozycki
parent 5b2007ad26
commit 03d83cd5f5
5 changed files with 81 additions and 0 deletions

View File

@ -83,6 +83,9 @@ show always-read-ctf
When off, CTF is only read if DWARF is not present. When on, CTF is
read regardless of whether DWARF is present. Off by default.
info main
Get main symbol to identify entry point into program.
* New convenience function "$_shell", to execute a shell command and
return the result. This lets you run shell commands in expressions.
Some examples:

View File

@ -20162,6 +20162,12 @@ The optional flag @samp{-q}, which stands for @samp{quiet}, disables
printing header information and messages explaining why no functions
or variables have been printed.
@kindex info main
@item info main
Print the name of the starting function of the program. This serves
primarily Fortran programs, which have a user-supplied name for the
main subroutine.
@kindex info classes
@cindex Objective-C, classes and selectors
@item info classes

View File

@ -5282,6 +5282,14 @@ info_modules_command (const char *args, int from_tty)
from_tty);
}
/* Implement the 'info main' command. */
static void
info_main_command (const char *args, int from_tty)
{
gdb_printf ("%s\n", main_name ());
}
static void
rbreak_command (const char *regexp, int from_tty)
{
@ -6873,6 +6881,9 @@ Options:\n\
_("All module names, or those matching REGEXP."));
set_cmd_completer_handle_brkchars (c, info_types_command_completer);
add_info ("main", info_main_command,
_("Get main symbol to identify entry point into program."));
add_basic_prefix_cmd ("module", class_info, _("\
Print information about modules."),
&info_module_cmdlist, 0, &infolist);

View File

@ -0,0 +1,42 @@
# Copyright 2023 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
require allow_fortran_tests
load_lib fortran.exp
standard_testfile .f90
set old_gdbflags $GDBFLAGS
set GDBFLAGS [string map {"-readnow" ""} "$GDBFLAGS"]
if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f90}]} {
return -1
}
gdb_test "info main" "simple" "info main prior to start"
if ![fortran_runto_main] {
untested "could not run to main"
return -1
}
gdb_test "info main" "simple" "info main post start"
set GDBFLAGS "$GDBFLAGS -readnow"
clean_restart $testfile
gdb_test "info main" "simple" "info main with readnow"
set GDBFLAGS $old_gdbflags

View File

@ -0,0 +1,19 @@
! Copyright 2023 Free Software Foundation, Inc.
!
! This program is free software; you can redistribute it and/or modify
! it under the terms of the GNU General Public License as published by
! the Free Software Foundation; either version 3 of the License, or
! (at your option) any later version.
!
! This program is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with this program. If not, see <http://www.gnu.org/licenses/>.
program simple
implicit none
print *, "Nothing."
end program simple