# Copyright (C) 1993, 1997, 1999, 2000, 2002, 2004, 2005, 2007
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# dejagnu@gnu.org

# Written by the Center for Software Science at the University of Utah
# and by Cygnus Support.

proc do_subspace_align_test {} {
    set testname "ss_align.s: Test subspace alignment (part 2)"
    set x 0

    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
      return 
    }

    if [gas_test_old "ss_align.s" "" "subspace alignment (part 1)"] then {
	objdump_start_no_subdir "a.out" "-h"

    # Check the headers for the correct alignment value for the
    # the $DATA$ subspace (som).
	while 1 {
	    expect  {
		-re "DATA\[^\n\]* 2..6\[^\n\]*\n"	{ set x 1 }
		-re "\[^\n\]*\n"				{ }
		timeout			{ perror "timeout\n"; break }
		eof				{ break }
	    }
	}

	# This was intended to do any cleanup necessary.  It kinda looks like it
	# isn't needed, but just in case, please keep it in for now.
	objdump_finish

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==1] then { pass $testname } else { fail $testname }
    }
}

proc do_local_label_test {} {
    set testname "locallabel.s: Elimination of local labels (part 2)"
    set x 0

    if [gas_test_old "locallabel.s" "" "Elimination of local labels (part1)"] {
	objdump_start_no_subdir "a.out" "-t"

	while 1 {
	    expect {
		-re "^00000000\[^\n\]*Label\[^\n\]*\n"		{ set x 1 }
		-re "^00000000\[^\n\]*L\$01234\[^\n\]*\n"	{ set x 0 }
		-re "\[^\n\]*\n"				{ }
		timeout				{ perror "timeout\n"; break }
		eof				{ break }
	    }
	}

	# This was intended to do any cleanup necessary.  It kinda looks like it
	# isn't needed, but just in case, please keep it in for now.
	objdump_finish

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==1] then { pass $testname } else { fail $testname }
    }
}

proc do_frchain_test {} {
    set testname "fragbug.s: Test bug in frag chaining (part 2)"
    set x 0

    if [gas_test_old "fragbug.s" "" "Test bug in frag chaining (part1)"] {
	objdump_start_no_subdir "a.out" "--prefix-addresses -d"

	while 1 {
	    expect {
		-re "^0x00000000\[^\n\]*nop\[^\n\]*\n"		{ set x 1 }
		-re "^0x00000004\[^\n\]*nop\[^\n\]*\n"		{ set x 0 }
		-re "\[^\n\]*\n"				{ }
		timeout				{ perror "timeout\n"; break }
		eof				{ break }
	    }
	}

	# This was intended to do any cleanup necessary.  It kinda looks like it
	# isn't needed, but just in case, please keep it in for now.
	objdump_finish

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==1] then { pass $testname } else { fail $testname }
    }
}

proc do_align3_test {} {
    set testname "align3.s: Test for alignment bug when switching subspaces (part2)"
    set x 0

    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
      return 
    }

    if [gas_test_old "align3.s" "" "Test for alignment bug when switching subspaces (part1)"] {
	objdump_start_no_subdir "a.out" "--prefix-addresses -d"

	while 1 {
	    expect {
		-re "\[^\n\]* <main> nop\[^\n\]*\n"		{ set x 1 }
		-re "\[^\n\]* <.*end_main> nop\[^\n\]*\n"		{ set x 1 }
		-re "\[^\n\]* <main+.*> nop\[^\n\]*\n"		{ set x 0 }
		-re "\[^\n\]*\n"				{ }
		timeout				{ perror "timeout\n"; break }
		eof				{ break }
	    }
	}

	# This was intended to do any cleanup necessary.  It kinda looks like it
	# isn't needed, but just in case, please keep it in for now.
	objdump_finish

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==1] then { pass $testname } else { fail $testname }
    }
}

proc do_align4_test {} {
    set testname "align4.s: More subspace alignment tests (part2)"
    set x 0

    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
      return 
    }

    if [gas_test_old "align4.s" "" "More subspace alignment tests (part1)"] {
	objdump_start_no_subdir "a.out" "-h"

	while 1 {
	    expect {
		-re "\[^\n\]*MILLICODE\[^\n\]*2..6\[^\n\]*\n"
			{ set x [expr $x+1] }
		-re "\[^\n\]*YABBA\[^\n\]*2..3\[^\n\]*\n"
			{ set x [expr $x+1] }
		timeout				{ perror "timeout\n"; break }
		eof				{ break }
	    }
	}

	# This was intended to do any cleanup necessary.  It kinda looks like it
	# isn't needed, but just in case, please keep it in for now.
	objdump_finish

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==2] then { pass $testname } else { fail $testname }
    }
}

proc do_import_test {} {
    set testname "importbug.s: Test for bug in .import directive (part2)"
    set x 0

    if [gas_test_old "importbug.s" "" "Test for bug in .import directive (part1)"] {
	objdump_start_no_subdir "a.out" "--syms"

	while 1 {
	    expect {
		-re "\[^\n\]*.DATA..foo\[^\n\]*\n"		{ set x 1 }
		-re "\[^\n\]*.data.*foo\[^\n\]*\n"		{ set x 1 }
		-re "\[^\n\]*\n"				{ }
		timeout				{ perror "timeout\n"; break }
		eof				{ break }
	    }
	}

	# This was intended to do any cleanup necessary.  It kinda looks like it
	# isn't needed, but just in case, please keep it in for now.
	objdump_finish

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==1] then { pass $testname } else { fail $testname }
    }
}

proc do_common_test {} {
    # linux has a different .comm syntax
    if [istarget hppa*-*-linux*] then {
	return
    }

    set testname "common.s: Test for bug in .comm handling (part2)"
    set x 0

    if [gas_test_old "common.s" "" "Test for bug in .comm handling (part1)"] {
	objdump_start_no_subdir "a.out" "--syms"

	while 1 {
	    expect {
		-re "\[^\n\]*.COM.*common_symbol\[^\n\]*\n"	{ set x 1 }
		-re "\[^\n\]*\n"				{ }
		timeout				{ perror "timeout\n"; break }
		eof				{ break }
	    }
	}

	# This was intended to do any cleanup necessary.  It kinda looks like it
	# isn't needed, but just in case, please keep it in for now.
	objdump_finish

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==1] then { pass $testname } else { fail $testname }
    }
}

if [istarget hppa*-*-*] then {
    # Make sure subspace alignment requests from the subspace directives
    # are honored
    do_subspace_align_test

    # Make sure the correct labels end up in the symbol table
    do_local_label_test

    # GAS-1.36 choked on this file.
    gas_test "labeldiffs.s" "" "" "Difference of labels"

    # Test a recent bug where frag chaining wasn't working correctly.
    do_frchain_test

    # Test bug where switching between subspaces creates bogus alignments
    do_align3_test

    # Test bug where switching between subspaces creates bogus alignments
    do_align4_test

    # Test a problem where $global$ is defined, then used within the
    # same source file.
    setup_xfail hppa*-*-*
    gas_test "globalbug.s" "" "" "Use \$global\$ in file which defines it"

    # Test that importing a defined symbol doesn't screw up the symbol's
    # space/subspace.
    do_import_test

    # Test for a buglet in the handling of common symbols
    do_common_test

    # Test for an off-by-2 bug in range check for conditional branches
    # The labels in brlenbug.s lack colons and are not linux compatible.
    if {! [istarget *-*-linux*]} then {
	gas_test_error "brlenbug.s" "" "Check for error(s) in branch length"
    }
}
