# Copyright 1997-1999, 2003, 2007-2012 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 running programs
#

# This test exists solely to exercise the "section" command for
# code-coverage on HP-UX.  (So far as I can tell, the "section"
# command isn't needed on HP-UX, but probably is for embedded
# apps.)
#
if ![istarget "hppa*-*-hpux*"] then {
  return
}

set testfile "sect-cmd"
set srcfile break.c
set srcfile1 break1.c
set binfile ${objdir}/${subdir}/${testfile}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } {
    untested sect-cmd.exp
    return -1
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } {
    untested sect-cmd.exp
    return -1
}

if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } {
    untested sect-cmd.exp
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then { fail "section command tests suppressed" }

# Get the $CODE$ section's starting address.
#
# (Note that this works for PA32 programs, which use the SOM file
# format.  PA64 uses ELF, and when support for that is added, it's
# not clear that there'll be a section named "$CODE$" in such
# programs.)
#

set address1 ""
set address2 ""
send_gdb "info files\n"
gdb_expect {
  -re ".*(0x\[0-9a-fA-F\]*) - (0x\[0-9a-fA-F\]*) is .(CODE|text).*$gdb_prompt $"\
          {pass "info files"
	   set address1 $expect_out(1,string)
	   set address2 $expect_out(2,string)}
  -re "$gdb_prompt $"\
          {fail "info files"}
  timeout {fail "(timeout) info files"}
}

# Reset the section to that same starting address, which should be
# harmless (i.e., we just want to exercise the section command).
#
if [istarget "hppa2.0w-*-*"] then {
  send_gdb "section \.text $address1\n"
  gdb_expect {
    -re ".*$address1 \- $address2 is .text.*$gdb_prompt $"\
            {pass "set section command"}
    -re "$gdb_prompt $"\
            {fail "set section command"}
    timeout {fail "(timeout) set section command"}
  }
} else {
  send_gdb "section \$CODE\$ $address1\n"
  gdb_expect {
    -re ".*$address1 \- $address2 is .CODE..*$gdb_prompt $"\
            {pass "set section command"}
    -re "$gdb_prompt $"\
            {fail "set section command"}
    timeout {fail "(timeout) set section command"}
  }
}

# Verify that GDB responds gracefully to a non-existent section name.
#
send_gdb "section FOOBARBAZ 0x1234\n"
gdb_expect {
  -re "Section FOOBARBAZ not found\r\n$gdb_prompt $"\
          {pass "non-existent section disallowed"}
  -re "$gdb_prompt $"\
          {fail "non-existent section disallowed"}
  timeout {fail "(timeout) non-existent section disallowed"}
}

# We "happen to know" that GDB uses a fixed size character buffer to
# parse the section name into, and the buffer is declared to be 100
# characters in length.  Verify that GDB gracefully handles section
# names longer than that.  (The section is also non-existent.)
#
send_gdb "section A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 0x1234\n"
gdb_expect {
  -re "Section A23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 not found\r\n$gdb_prompt $"\
          {pass "non-existent too-long section disallowed"}
  -re "$gdb_prompt $"\
          {fail "non-existent too-long section disallowed"}
  timeout {fail "(timeout) non-existent too-long section disallowed"}
}

gdb_exit
return 0
