# Copyright 1998-2022 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/>.

# This file was written by Elena Zannoni (ezannoni@cygnus.com)

# this file tests maintenance commands and help on those.

# source file used is break.c


#maintenance check-psymtabs -- Check consistency of psymtabs vs symtabs
#maintenance check-symtabs -- Check consistency of symtabs
#maintenance expand-symtabs -- Expand symtabs matching a file regexp
#maintenance set -- Set GDB internal variables used by the GDB maintainer
#maintenance show -- Show GDB internal variables used by the GDB maintainer
#maintenance dump-me -- Get fatal error; make debugger dump its core
#maintenance print -- Maintenance command for printing GDB internal state
#maintenance info -- Commands for showing internal info about the program being debugged
#maintenance internal-error -- Give GDB an internal error.
#
#maintenance print dummy-frames -- Print the dummy frame stack
#maintenance print statistics -- Print statistics about internal gdb state
#maintenance print objfiles -- Print dump of current object file definitions
#maintenance print psymbols -- Print dump of current partial symbol definitions
#maintenance print msymbols -- Print dump of current minimal symbol definitions
#maintenance print symbols -- Print dump of current symbol definitions
#maintenance print type -- Print a type chain for a given symbol
#maintenance print unwind -- Print unwind table entry at given address
#
#
#maintenance info breakpoints -- Status of all breakpoints
#



standard_testfile break.c break1.c

if {[prepare_for_testing "failed to prepare" $testfile \
	 [list $srcfile $srcfile2] {debug nowarnings}]} {
    return -1
}

set readnow_p [readnow]

# The commands we test here produce many lines of output; disable "press
# <return> to continue" prompts.
gdb_test_no_output "set height 0"

# Tests that require that no program is running

gdb_file_cmd ${binfile}

# Test for a regression where this command would internal-error if the
# program wasn't running.  If there's a lot of registers then this
# might overflow expect's buffers, so process the output line at a
# time.
set saw_registers 0
set saw_headers 0
set test "maint print registers"
gdb_test_multiple $test $test {
    -re "\[^\r\n\]+Name\[^\r\n\]+Nr\[^\r\n\]+Rel\[^\r\n\]+Offset\[^\r\n\]+Size\[^\r\n\]+Type\[^\r\n\]+\r\n" {
	set saw_headers 1
	exp_continue
    }
    -re "^\[^\r\n\]+\[0-9\]+\[^\r\n\]+\[0-9\]+\[^\r\n\]+\[0-9\]+\[^\r\n\]+\[0-9\]+\[^\r\n\]+\r\n" {
        set saw_registers 1
        exp_continue
    }
    -re "^\\*\[0-9\]+\[^\r\n\]+\r\n" {
        exp_continue
    }
    -re "$gdb_prompt $" {
        gdb_assert { $saw_registers && $saw_headers } $test
    }
}

# Test "mt expand-symtabs" here as it's easier to verify before we
# run the program.
gdb_test_no_output "mt set per on" "mt set per on for expand-symtabs"
gdb_test_multiple "mt expand-symtabs $subdir/break\[.\]c$" \
    "mt expand-symtabs" {
	-re "#compunits: (1|2) \\(\[+\](0|1|2)\\),.*$gdb_prompt $" {
	    # This should expand at most two primary symtabs.
	    # "Normally" it will not expand any, because the symtab
	    # holding "main" will already have been expanded, but if the
	    # file is compiled with -fdebug-types-section then a second primary
	    # symtab for break.c will be created for any types.
	    pass "$gdb_test_name"
	}
	-re "#compunits: ($decimal) \\(\[+\]0\\),.*$gdb_prompt $" {
	    if { $readnow_p } {
		pass "$gdb_test_name"
	    } else {
		fail "$gdb_test_name"
	    }
	}
    }
gdb_test "mt set per off" ".*" "mt set per off for expand-symtabs"

# Tests that can or should be done with a running program

gdb_load ${binfile}

if ![runto_main] then {
        perror "tests suppressed"
}

# If we're using .gdb_index or .debug_names there will be no psymtabs.
set have_gdb_index [ exec_has_index_section ${binfile} ]

# There also won't be any psymtabs if we read the index from the index cache.
# We can detect this by looking if the index-cache is enabled and if the number
# of cache misses is 0.
set index_cache_misses -1
gdb_test_multiple "show index-cache stats" "check index cache stats" {
    -re ".*Cache misses \\(this session\\): (\\d+)\r\n.*$gdb_prompt $" {
	set index_cache_misses $expect_out(1,string)
    }
}

set using_index_cache 0
gdb_test_multiple "show index-cache enabled" "check index cache status" {
    -re ".*is off.\r\n$gdb_prompt $" {
	set using_index_cache 0
    }
    -re ".*is on.\r\n$gdb_prompt $" {
	set using_index_cache 1
    }
}

if { $index_cache_misses == 0 && $using_index_cache } {
    set have_gdb_index 1
}

set have_psyms [expr ! ( $have_gdb_index || $readnow_p )]

#
# this command does not produce any output
# unless there is some problem with the symtabs and psymtabs
# so that branch will really never be covered in this tests here!!
#

# guo: on linux this command output is huge.  for some reason splitting up
# the regexp checks works.
#
send_gdb "maint check-psymtabs\n"
gdb_expect  {
    -re "^maint check-psymtabs" {
	gdb_expect {
	    -re "$gdb_prompt $" {
		pass "maint check-psymtabs"
	    }
	    timeout { fail "(timeout) maint check-psymtabs" }
	}
    }
    -re ".*$gdb_prompt $"     { fail "maint check-psymtabs" }
    timeout         { fail "(timeout) maint check-psymtabs" }
}

# This command does not produce any output unless there is some problem
# with the symtabs, so that branch will really never be covered in the
# tests here!!
gdb_test_no_output "maint check-symtabs"

# Test per-command stats.
gdb_test_no_output "maint set per-command on"
set decimal "\[0-9\]+"
set time_fmt "${decimal}-${decimal}-${decimal} ${decimal}:${decimal}:${decimal}\\.${decimal}"
gdb_test "pwd" \
    "${time_fmt} - command started\r\n.*\r\n${time_fmt} - command finished\r\nCommand execution time: \[0-9.\]+ \\(cpu\\), \[0-9.\]+ \\(wall\\)\[\r\n\]+Space used: $decimal \\(\\+$decimal for this command\\)\[\r\n\]+#symtabs: $decimal \\(\\+$decimal\\), #compunits: $decimal \\(\\+$decimal\\), #blocks: $decimal \\(\\+$decimal\\)"
gdb_test "maint set per-command off" \
    "${time_fmt} - command started"

# The timeout value is raised, because printing all the symbols and
# statistical information about Cygwin and Windows libraries takes a lot
# of time.
if [istarget "*-*-cygwin*"] {
	set oldtimeout $timeout
	set timeout [expr $timeout + 500]
}

set re \
    [list \
	 "Statistics for\[^\n\r\]*maint\[^\n\r\]*:" \
	 "  Number of \"minimal\" symbols read: $decimal" \
	 "  Number of \"full\" symbols read: $decimal" \
	 "  Number of \"types\" defined: $decimal" \
	 "  Number of symbol tables: $decimal" \
	 "  Number of symbol tables with line tables: $decimal" \
	 "  Number of symbol tables with blockvectors: $decimal" \
	 "(  Number of read CUs: $decimal" \
	 "  Number of unread CUs: $decimal" \
	 ")?(  Number of \"partial\" symbols read: $decimal" \
	 ")?(  Number of psym tables \\(not yet expanded\\): $decimal" \
	 ")?(  Total memory used for psymbol cache: $decimal" \
	 ")?  Total memory used for objfile obstack: $decimal" \
	 "  Total memory used for BFD obstack: $decimal" \
	 "  Total memory used for string cache: $decimal" \
	 ""]

set re [multi_line {*}$re]
gdb_test_lines "maint print statistics" "" $re

# There aren't any ...
gdb_test_no_output "maint print dummy-frames"



# To avoid timeouts, we avoid expects with many .* patterns that match
# many lines.  Instead, we keep track of which milestones we've seen
# in the output, and stop when we've seen all of them.

set header 0
set psymtabs 0
set symtabs 0
gdb_test_multiple "maint print objfiles" "" -lbl {
    -re "\r\nObject file.*maint($EXEEXT)?:  Objfile at ${hex}" {
	set header 1
	exp_continue
    }
    -re "\r\nPsymtabs:\[\r\t \]+" {
	set psymtabs 1
	exp_continue
    }
    -re "\r\nSymtabs:\[\r\t \]+\n" {
	set symtabs 1
	exp_continue
    }
    -re -wrap "" {
	pass $gdb_test_name
    }
}

proc maint_pass_if {val name} {
    if $val { pass $name } else { fail $name }
}

maint_pass_if $header   "maint print objfiles: header"
if { $have_psyms } {
    maint_pass_if $psymtabs "maint print objfiles: psymtabs"
}
maint_pass_if $symtabs  "maint print objfiles: symtabs"

if { $have_psyms } {
    set psymbols_output [standard_output_file psymbols_output]
    set psymbols_output_re [string_to_regexp $psymbols_output]
    set test_list [list \
		       "maint print psymbols -source" \
		       "maint print psymbols -source ${srcdir}/${subdir}/${srcfile} $psymbols_output" \
		       "maint print psymbols -pc" \
		       "maint print psymbols -pc main $psymbols_output"]
    foreach { test_name command } $test_list {
	send_gdb "$command\n"
	    gdb_expect  {
		-re "^maint print psymbols \[^\n\]*\r\n$gdb_prompt $" {
		    send_gdb "shell ls $psymbols_output\n"
		    gdb_expect {
			-re "$psymbols_output_re\r\n$gdb_prompt $" {
			    # We want this grep to be as specific as possible,
			    # so it's less likely to match symbol file names in
			    # psymbols_output.  Yes, this actually happened;
			    # poor expect got tons of output, and timed out
			    # trying to match it.   --- Jim Blandy <jimb@cygnus.com>
			    send_gdb "shell grep 'main.*function' $psymbols_output\n"
			    gdb_expect {
				-re ".main., function, $hex.*$gdb_prompt $" {
				    pass "$test_name 1"
				}
				-re ".*main.  .., function, $hex.*$gdb_prompt $" {
				    pass "$test_name 2"
				}
				-re ".*$gdb_prompt $" { fail "$test_name" }
				timeout { fail "$test_name (timeout)" }
			    }
			    gdb_test "shell rm -f $psymbols_output" ".*" \
				"${test_name}: shell rm -f psymbols_output"
			}
			-re ".*$gdb_prompt $" { fail "$test_name" }
			timeout { fail "$test_name (timeout)" }
		    }
		}
		-re ".*$gdb_prompt $" { fail "$test_name" }
		timeout { fail "$test_name (timeout)" }
	    }
    }
}


set msymbols_output [standard_output_file msymbols_output]
set msymbols_output_re [string_to_regexp $msymbols_output]
send_gdb "maint print msymbols -objfile ${binfile} $msymbols_output\n"
gdb_expect  {
    -re "^maint print msymbols \[^\n\]*\r\n$gdb_prompt $" {
	send_gdb "shell ls $msymbols_output\n"
	gdb_expect {
	    -re "$msymbols_output_re\r\n$gdb_prompt $" {
		gdb_test "shell grep factorial $msymbols_output" \
		    "\\\[ *$decimal\\\] \[tT\]\[ \t\]+$hex \\.?factorial.*" \
		    "maint print msymbols, absolute pathname"
		gdb_test "shell rm -f $msymbols_output" ".*" \
		    "shell rm -f msymbols_output"
	    }
	    -re ".*$gdb_prompt $" { fail "maint print msymbols" }
	    timeout { fail "maint print msymbols (timeout)" }
	}
    }
    -re ".*$gdb_prompt $" { fail "maint print msymbols" }
    timeout { fail "maint print msymbols (timeout)" }
}

# Check that maint print msymbols allows relative pathnames
set mydir [pwd]
gdb_test "cd [standard_output_file {}]" \
    "Working directory .*\..*" \
    "cd to objdir"

gdb_test_multiple "maint print msymbols -objfile ${testfile} msymbols_output2" "maint print msymbols" {
    -re "^maint print msymbols \[^\n\]*\r\n$gdb_prompt $" {
    	gdb_test_multiple "shell ls msymbols_output2" "maint print msymbols" {
	    -re "msymbols_output2\r\n$gdb_prompt $" {
		gdb_test "shell grep factorial msymbols_output2" \
		    "\\\[ *$decimal\\\] \[tT\]\[ \t\]+$hex \\.?factorial.*" \
		    "maint print msymbols, relative pathname"
		gdb_test "shell rm -f msymbols_output2" ".*"
	    }
	}
    }
}
gdb_test "cd ${mydir}" \
    "Working directory [string_to_regexp ${mydir}]\..*" \
    "cd to mydir"


# Request symbols for one particular source file so that we don't try to
# dump the symbol information for the entire C library - over 500MB nowadays
# for GNU libc.

set symbols_output [standard_output_file symbols_output]
set symbols_output_re [string_to_regexp $symbols_output]
set test_list [list \
		   "maint print symbols -source" \
		   "maint print symbols -source ${srcdir}/${subdir}/${srcfile} $symbols_output" \
		   "maint print symbols -pc" \
		   "maint print symbols -pc main $symbols_output"]
foreach { test_name command } $test_list {
    send_gdb "$command\n"
    gdb_expect {
	-re "^maint print symbols \[^\n\]*\r\n$gdb_prompt $" {
	    send_gdb "shell ls $symbols_output\n"
	    gdb_expect {
		-re "$symbols_output_re\r\n$gdb_prompt $" {
		    # See comments for `maint print psymbols'.
		    send_gdb "shell grep 'main(.*block' $symbols_output\n"
		    gdb_expect {
			-re "int main\\(int, char \\*\\*, char \\*\\*\\); block.*$gdb_prompt $" {
			    pass "$test_name"
			}
			-re ".*$gdb_prompt $" { fail "$test_name" }
			timeout { fail "$test_name (timeout)" }
		    }
		    gdb_test "shell rm -f $symbols_output" ".*" \
			"$test_name: shell rm -f symbols_output"
		}
		-re ".*$gdb_prompt $" { fail "$test_name" }
		timeout { fail "$test_name (timeout)" }
	    }
	}
	-re ".*$gdb_prompt $" { fail "$test_name" }
	timeout { fail "$test_name (timeout)" }
    }
}

set msg "maint print type"
gdb_test_multiple "maint print type argc" $msg {
    -re "type node $hex\r\nname .int. \\($hex\\)\r\ncode $hex \\(TYPE_CODE_INT\\)\r\nlength \[24\]\r\nobjfile $hex\r\ntarget_type $hex\r\npointer_type $hex\r\nreference_type $hex\r\ntype_chain $hex\r\ninstance_flags $hex\r\nflags\r\nnfields 0 $hex\r\n$gdb_prompt $" {
        pass $msg
    }
}

if [istarget "hppa*-*-11*"] {
    setup_xfail hppa*-*-*11* CLLbs14860
    gdb_test_multiple "maint print unwind &main" "maint print unwind" {
        -re ".*unwind_table_entry \\($hex\\):\r\n\tregion_start = $hex <main>\r\n\tregion_end = $hex <main\\+\[0-9\]*>\r\n\tflags = Args_stored Save_RP\r\n\tRegion_description = $hex\r\n\tEntry_FR = $hex\r\n\tEntry_GR = $hex\r\n\tTotal_frame_size = $hex\r\n$gdb_prompt $" {
	    pass "maint print unwind"
	}
        -re ".*unwind_table_entry \\($hex\\):\r\n\tregion_start = $hex <main>\r\n\tregion_end = $hex <main\\+\[0-9\]*>\r\n\tflags = Args_stored Save_RP\r\n\tFLD = $hex\r\n\tFLD = $hex\r\n\tFLD = $hex\r\n\tFLD = $hex\r\n$gdb_prompt $" {
	    xfail "maint print unwind"
	}
    }
}

set oldtimeout $timeout
set timeout [expr $timeout + 300]

set bp_location6 [gdb_get_line_number "set breakpoint 6 here"]

gdb_test_multiple "maint info breakpoints" "maint info breakpoints" {
    -re "Num\[ \t\]+Type\[ \t\]+Disp\[ \t\]+Enb\[ \t\]+Address\[ \t\]+What\r\n1\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex\[ \t\]+in main at.*break.c:$bp_location6 inf 1\r\n\[ \t\]+breakpoint already hit 1 time\r\n.*$gdb_prompt $" {
	pass "maint info breakpoints"
    }
    -re "Num\[ \t\]+Type\[ \t\]+Disp\[ \t\]+Enb\[ \t\]+Address\[ \t\]+What\r\n1\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex in main at.*break.c:$bp_location6 sspace 1\r\n\[ \t\]+breakpoint already hit 1 time\r\n-1\[ \t\]+shlib events\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex.*breakpoint already hit.*$gdb_prompt $" {
	pass "maint info breakpoints (with shlib events)"
    }
}

gdb_test "maint print" \
    "List.*unambiguous\\..*" \
    "maint print w/o args" 

gdb_test "maint info" \
    "List.*unambiguous\\..*" \
    "maint info w/o args"

gdb_test "maint" \
    "List.*unambiguous\\..*" \
    "maint w/o args"

# Test that "main info line-table" w/o a file name shows the symtab for
# $srcfile.
set saw_srcfile 0
gdb_test_multiple "maint info line-table" \
    "maint info line-table w/o a file name" {
	-re "symtab: \[^\n\r\]+${srcfile} \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS\[^\r\n\]*" {
	set saw_srcfile 1
	exp_continue
    }
    -re "symtab: \[^\n\r\]+ \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS\[^\r\n\]*" {
	# Match each symtab to avoid overflowing expect's buffer.
	exp_continue
    }
    -re "symtab: \[^\n\r\]+ \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) 0x0\\):\r\nNo line table.\r\n" {
	# For symtabs with no linetable.
	exp_continue
    }
    -re "^$decimal\[ \t\]+$decimal\[ \t\]+$hex\[^\r\n\]*\r\n" {
	# Line table entries can be long too:
	#
	#  INDEX    LINE ADDRESS
	#  0          29 0x00000000004006f6
	#  1          30 0x00000000004006fa
	#  2          31 0x0000000000400704
	#  3          42 0x0000000000400706
	#  4          43 0x0000000000400719
	#  5          44 0x0000000000400722
	#  6          45 0x0000000000400740
	#  (...)
	#  454       129 0x00007ffff7df1d28
	#  455       END 0x00007ffff7df1d3f
	#
	# Match each line to avoid overflowing expect's buffer.
	exp_continue
    }
    -re "^$decimal\[ \t\]+END\[ \t\]+$hex\[^\r\n\]*\r\n" {
	# Matches an end marker in the above.
	exp_continue
    }
    -re "^\r\n" {
	# Empty line between tables.
	exp_continue
    }
    -re "^$gdb_prompt $" {
	gdb_assert $saw_srcfile $gdb_test_name
    }
}

gdb_test "maint info line-table ${srcfile}" \
    "symtab: \[^\n\r\]+${srcfile}.*INDEX.*LINE.*ADDRESS.*" \
    "maint info line-table with filename of current symtab"

if { ! $readnow_p } {
    gdb_test_no_output "maint info line-table ${srcfile2}" \
	[join \
	     "maint info line-table with filename of symtab that is not" \
	     " currently expanded"]
}

gdb_test_no_output "maint expand-symtabs"

gdb_test "maint info line-table ${srcfile2}" \
    "symtab: \[^\n\r\]+${srcfile2}.*INDEX.*LINE.*ADDRESS.*" \
    "maint info line-table with filename of symtab that is not current"

gdb_test_no_output "maint info line-table xxx.c" \
    "maint info line-table with invalid filename"

set timeout $oldtimeout

# Just check that the DWARF unwinders control flag is visible.
gdb_test "maint show dwarf unwinders" \
    "The DWARF stack unwinders are currently (on|off)\\."

#============test help on maint commands

test_prefix_command_help {"maint info" "maintenance info"} {
    "Commands for showing internal info about the program being debugged\\.\[\r\n\]+"
}

test_prefix_command_help {"maint print" "maintenance print"} {
    "Maintenance command for printing GDB internal state\\.\[\r\n\]+"
}

test_prefix_command_help {"maint" "maintenance"} {
    "Commands for use by GDB maintainers\\.\[\r\n\]+"
    "Includes commands to dump specific internal GDB structures in\[\r\n\]+"
    "a human readable form, to cause GDB to deliberately dump core, etc\\.\[\r\n\]+"
}

#set oldtimeout $timeout
#set timeout [expr $timeout + 300]

gdb_test_multiple "maint dump-me" "maint dump-me" {
    -re "Should GDB dump core.*\\(y or n\\) $" {
	gdb_test "n" ".*" "maint dump-me"
    }
    -re "Undefined maintenance command: .*$gdb_prompt $" {
	# Command 'maint dump-me' is registered on non-win32 host.
	unsupported "maint dump-me"
    }
}

send_gdb "maint internal-error\n"
gdb_expect {
    -re "A problem internal to GDB has been detected" {
	pass "maint internal-error"
	if [gdb_internal_error_resync] {
	    pass "internal-error resync"
	} else {
	    fail "internal-error resync"
	}
    }
    -re ".*$gdb_prompt $" {
	fail "maint internal-error"
	untested "internal-error resync"
    }
    timeout {
	fail "maint internal-error (timeout)"
	untested "internal-error resync"
    }
}

#set timeout $oldtimeout

# Test that the commands work without an argument.  For this test, we
# don't need an inferior loaded/running.  See PR gdb/21164.
gdb_exit
gdb_start
gdb_test_no_output "maint print symbols"
gdb_test_no_output "maint print msymbols"
gdb_test_no_output "maint print psymbols"

gdb_exit
return 0
