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

# Test just for the 'maintenance info sections' command and the
# 'maintenance info target-sections' command.

load_lib completion-support.exp

standard_testfile break.c break1.c

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

if ![runto_main] then {
    return -1
}

# Check the output of 'maint info target-sections' command.
proc check_maint_info_target_sections_output {prefix} {
    global hex gdb_prompt

    with_test_prefix $prefix {
	# Check the output of the 'maint info target-sections' command.
	# Ensures that all the lines have the expected format, and that we see
	# an auxiliary information line after every section information line.
	#
	# We also check that every bfd section has the ALLOC flag.
	set seen_header false
	set seen_a_section false
	set seen_aux_info false
	set expecting_aux_info false
	gdb_test_multiple "maint info target-sections" "" {
	    -re "^maint info target-sections\r\n" {
		# Consume the command we sent to GDB that the terminal echo'd
		# back.
		exp_continue
	    }
	    -re "^From '\[^\r\n\]+', file type \[^\r\n\]+:\r\n" {
		# There might be more than one header, but there should be at
		# least one.
		set seen_header true
		if { $expecting_aux_info } {
		    fail $gdb_test_name
		} else {
		    exp_continue
		}
	    }
	    -re "^ \\\[\[0-9\]+\\\]\\s+$hex->$hex at $hex: \[^*\r\]+\\yALLOC\\y\[^*\r\]*\r\n" {
		# A bfd section description line.
		set seen_a_section true
		if { $expecting_aux_info } {
		    fail $gdb_test_name
		} else {
		    set expecting_aux_info true
		    exp_continue
		}
	    }
	    -re "^\\s+Start: $hex, End: $hex, Owner token: $hex\r\n" {
		# A target section auxiliary information line.
		set seen_aux_info true
		if { !$expecting_aux_info } {
		    fail $gdb_test_name
		} else {
		    set expecting_aux_info false
		    exp_continue
		}
	    }
	    -re "^$gdb_prompt $" {
		gdb_assert { $seen_header && $seen_a_section && $seen_aux_info }
		gdb_assert { !$expecting_aux_info }
		pass $gdb_test_name
	    }
	}
    }
}

# Check that 'maint info sections' output looks correct.  When
# checking the lines for each section we reject section names starting
# with a '*' character, the internal *COM*, *UND*, *ABS*, and *IND*
# sections should not be displayed in this output.
set seen_header false
set seen_a_section false
gdb_test_multiple "maint info sections" "general output check" {
    -re "Exec file: `\[^'\]+', file type \[^.\]+\.\r\n" {
	set seen_header true
	exp_continue
    }
    -re "^ \\\[\[0-9\]+\\\]\[\t \]+$hex->$hex at $hex: \[^*\r\]+\r\n" {
	set seen_a_section true
	exp_continue
    }
    -re "^$gdb_prompt $" {
	gdb_assert { $seen_header && $seen_a_section }
	pass $gdb_test_name
    }
}

# It'd be nice to check for every possible section.  However, that's
# problematic, since the relative ordering wanders from release to
# release of the compilers.  Instead, we'll just check for two
# sections which appear to always come out in the same relative
# order.  (If that changes, then we should just check for one
# section.)
#
# And by the way: This testpoint will break for PA64, where a.out's
# are ELF files.

# Standard GNU names.
set text_section ".text"
set data_section ".data"

gdb_test_multiple "maint info sections" "" {
    -re -wrap "Exec file: .*${binfile}., file type.*ER_RO.*" {
	# Looks like RealView which uses different section names.
	set text_section ER_RO
	set data_section ER_RW
	pass "maint info sections"
    }
    -re -wrap "Exec file: .*${binfile}., file type.*neardata.*" {
	# c6x doesn't have .data section.  It has .neardata and .fardata section.
	set data_section ".neardata"
	pass "maint info sections"
    }
    -re -wrap "Exec file: .*${binfile}., file type.*" {
	pass "maint info sections"
    }
}

# Test for new option: maint info sections <section name>
# If you don't have a .text section, this will require tweaking.

gdb_test_multiple "maint info sections $text_section" "" {
    -re -wrap " \\.bss .*" {
	fail $gdb_test_name
    }
    -re -wrap " $data_section .*" {
	fail $gdb_test_name
    }
    -re -wrap " $text_section .*" {
	pass $gdb_test_name
    }
}

# Test for new option: CODE section flag
# If your data section is tagged CODE, xfail this test.

gdb_test_multiple "maint info sections CODE" "" {
    -re -wrap " $data_section .*" {
	fail $gdb_test_name
    }
    -re -wrap " $text_section .*" {
	pass $gdb_test_name
    }
}

# Test for new option: DATA section flag
# If your text section is tagged DATA, xfail this test.
#
# The "maint info sections DATA" test is marked for XFAIL on Windows,
# because Windows has text sections marked DATA.
setup_xfail "*-*-*cygwin*"
setup_xfail "*-*-*mingw*"

gdb_test_multiple "maint info sections DATA" "" {
    -re -wrap " $text_section .*" {
	fail $gdb_test_name
    }
    -re -wrap " $data_section .*" {
	pass $gdb_test_name
    }
    -re -wrap " .rodata .*" {
	pass $gdb_test_name
    }
}

check_maint_info_target_sections_output "with executable"

# Restart GDB, but don't load the executable.
clean_restart

# Now load the executable in as a symbol file.
gdb_test "add-symbol-file ${binfile}" ".*" \
    "load the executable as a symbol file" \
    "add symbol table from file \"${binfile}\"\r\n\\(y or n\\) " \
    "y"

# As we have no object file 'maint info sections' will print nothing.
gdb_test_no_output "maint info sections" \
    "no output when no executable is set"

# Check that the executable shows up as an object file when
# -all-objects is used.
set seen_header false
set seen_a_section false
gdb_test_multiple "maint info sections -all-objects" "" {
    -re "Object file: `${binfile}', file type \[^.\]+\.\r\n" {
	set seen_header true
	exp_continue
    }
    -re "^ \\\[\[0-9\]+\\\]\[\t \]+$hex->$hex at $hex: \[^*\r\]+\r\n" {
	set seen_a_section true
	exp_continue
    }
    -re "^$gdb_prompt $" {
	gdb_assert { $seen_header && $seen_a_section } \
	    "ensure header and section seen in -all-objects case"
	pass $gdb_test_name
    }
}

check_maint_info_target_sections_output "with loaded symbol file"

# Test the command line completion on 'maint info sections'.  First
# the command line flag.
test_gdb_complete_unique \
    "maintenance info sections -" \
    "maintenance info sections -all-objects"

# Now check the section flags complete.
test_gdb_complete_multiple "maintenance info sections " "" "" {
    "ALLOC"
    "CODE"
    "COFF_SHARED_LIBRARY"
    "CONSTRUCTOR"
    "DATA"
    "HAS_CONTENTS"
    "IS_COMMON"
    "LOAD"
    "NEVER_LOAD"
    "READONLY"
    "RELOC"
    "ROM"
}
