# Copyright 1997, 1998, 1999, 2003 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# 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 additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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
