# Copyright 1997, 1998, 1999, 2003, 2007, 2008 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/>.  */

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

if $tracelevel then {
	strace $tracelevel
	}

global usestubs

#
# test running programs
#
set prms_id 0
set bug_id 0

# 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 "break"
set srcfile ${testfile}.c
set srcfile1 ${testfile}1.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
