# Copyright 1993, 1996, 1997, 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_ble_relocation_test {} {
    set testname "blebug.s: Test for proper relocation for BLE (part 2)"
    set x 0

    if [gas_test_old "blebug.s" "" "Proper relocation for BLE (part 1)"] then {
	objdump_start_no_subdir "a.out" "-r"

        if {[istarget hppa*64*-*-*]
	    || [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	    # At one time both versions of the assembler would incorrectly use 
	    # a PC-relative relocation for a BLE instruction.
	    while 1 {
		expect {
		    -re "^0+\[^\n\]*DIR21L\[^\n\]*\n"	{ set x 1 }
		    -re "^0+4\[^\n\]*DIR17R\[^\n\]*\n"	{ set x 1 }
		    -re "\[^\n\]*\n"				{ }
		    timeout			{ perror "timeout\n"; break }
		    eof				{ break }
		}
	    }
	} else {
	    # At one time both versions of the assembler would incorrectly use 
	    # a PC-relative relocation for a BLE instruction.
	    while 1 {
		expect {
		    -re "^0+4\[^\n\]*ABS_CALL\[^\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_relocation_reduction_tests {} {
    set testname "reduce.s: Test relocation reductions (part 2)"
    set x 0

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

    if [gas_test_old "reduce.s" "" "Relocation reductions (part1)"] then {
	objdump_start_no_subdir "a.out" "-r"

	# Check to make sure relocations involving procedure labels 
	# are not reduced to a relocation involving some other symbol.
	# Doing so makes generating parameter relocation stubs impossible.
	while 1 {
	    expect {
		-re "^0+4\[^\n\]*PLABEL\[^\n\]*foo\[^\n\]*\n"
		    { set x [expr $x+1] }
		-re "^0+14\[^\n\]*PCREL\[^\n\]*foo\[^\n\]*\n"
		    { set x [expr $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==2] then { pass $testname } else { fail $testname }

    set testname "reduce2.s: More relocation reduction tests (part 2)"
    set x 0

    if [gas_test_old "reduce2.s" "" "More relocation  reductions (part1)"] then {
	objdump_start_no_subdir "a.out" "-r"

	# Check to make sure DLT relative relocs are not reduced to sym+addend
	# Doing so doesn't work as one might expect
	while 1 {
	    expect {
		-re "^0+4\[^\n\]*DLT\[^\n\]*L.C0000\[^\n\]*\n"
		    { set x [expr $x+1] }
		-re "^0+1c\[^\n\]*DLT\[^\n\]*L.C0000\[^\n\]*\n"
		    { set x [expr $x+1] }
		-re "^0+30\[^\n\]*DLT\[^\n\]*L.C0001\[^\n\]*\n"
		    { set x [expr $x+1] }
		-re "^0+48\[^\n\]*DLT\[^\n\]*L.C0001\[^\n\]*\n"
		    { set x [expr $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==2] then { pass $testname } else { fail $testname }

    set testname "reduce3.s: Test even more relocation reductions (part 2)"
    set x 0

    if [gas_test_old "reduce3.s" "" "Even more relocation reductions (part1)"] then {
	objdump_start_no_subdir "a.out" "-r"

	# Check to make sure relocations involving procedure labels 
	# are not reduced to a relocation involving some other symbol.
	# Doing so makes generating parameter relocation stubs impossible.
	while 1 {
	    expect {
		-re "^0+c\[^\n\]*yabba\[^\n\+\]*\n"
		    { set x [expr $x+1] }
		-re "^0+c\[^\n\]*yabba\+\[^\n\]*\n"
		    { set x 0; break }
		-re "^0+10\[^\n\]*yabba\[^\n\+\]*\n"
		    { set x [expr $x+1] }
		-re "^0+10\[^\n\]*yabba\+\[^\n\]*\n"
		    { set x 0; break }
		-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==2] then { pass $testname } else { fail $testname }
}

proc do_ble_mode_selector_test {} {
    set testname "blebug2.s: blebug2"
    set x 0

    gas_start "blebug2.s" "-al"

    # GAS uses too many bits on the BLE instruction.
    while 1 {
	expect {
	    -re "^ +\[0-9\]+ 0000 20202801\[^\n\]*\n"	{ set x [expr $x+1] }
	    -re "^ +\[0-9\]+ 0004 E420E008\[^\n\]*\n"	{ set x [expr $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.
    gas_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_ble_relocation_test {} {
    set testname "blebug3.s: blebug3"
    set x 0

    gas_start "blebug3.s" "-al"

    while 1 {
	expect {
	    -re "^ +\[0-9\]+ 0000 E4002000\[^\n\]*\n"	{ set x [expr $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.
    gas_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_plabel_relocation_test {} {
    set testname "plabelbug.s: Old gas-1.36 plabel bug (part 2)"
    set x 0

    if [gas_test_old "plabelbug.s" "" "Old gas-1.36 plabel bug (part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Check that we make PLABEL relocation entries when they're needed.
	while 1 {
	    expect {
		-re "^0+\[^\n\]*PLABEL\[^\n\]*\n"
		    { set x [expr $x+1] }
		-re "^0+4\[^\n\]*PLABEL\[^\n\]*\n"
		    { set x [expr $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==2] then { pass $testname } else { fail $testname }
    }
}

proc do_selector_scope_test {} {
    set testname "selectorbug.s: Test scope of field selector" 
    set x 0

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

    if [gas_test_old "selectorbug.s" "" "Test scope of field selector (part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Check to make sure the relocation entry after the plabel is correct.
	# If an old field selector was incorrectly "carried" over, then 
	# this test will fail.
        if {[istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	    while 1 {
		expect {
	            -re "^0+14\[^\n\]*DIR32\[^\n\]*\n"
			{ set x 1 }
		    -re "^0+14\[^\n\]*PLABEL\[^\n\]*foo\[^\n\]*\n"
			{ set x 0 }
	            -re "\[^\n\]*\n"		{ }
	            timeout			{ perror "timeout\n"; break }
	            eof				{ break }
		}
            }
	} else {
	    while 1 {
		expect {
	            -re "^0+14\[^\n\]*DATA_ONE\[^\n\]*\n"
			{ set x 1 }
		    -re "^0+14\[^\n\]*PLABEL\[^\n\]*foo\[^\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_local_label_as_operand_test {} {
    set testname "labelopbug.s: Test local label as operand (non-branching)"
    set x 0

    if [gas_test_old "labelopbug.s" "" "Local label as operand (part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Check to make sure we handle difference of local labels as an operand
	# to a non-branching instruction correctly.  On hppa elf targets, the
	# R_PARISC_DIR21 and R_PARISC_DIR14R relocations are done with LR and
	# RR selectors, respectively.  As a result, we can't reduce these to
	# section offsets without risking incorrect rounding.  So, we just
	# check to see if the label hasn't been reduced.
	if {[istarget hppa*64*-*-*]
	    || [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	    while 1 {
		expect {
	            -re "^0+2c\[^\n\]*L.0002\[^\n\]*\n" 
			{ set x [expr $x+1] }
	            -re "^0+30\[^\n\]*L.0002\[^\n\]*\n" 
			{ set x [expr $x+1] }
	            -re "\[^\n\]*\n"		{ }
	            timeout			{ perror "timeout\n"; break }
	            eof				{ break }
		}
	    }
	} else {
	    while 1 {
		expect {
	            -re "^0+2c\[^\n\]*0x0+24\[^\n\]*\n" 
			{ set x [expr $x+1] }
	            -re "^0+30\[^\n\]*0x0+24\[^\n\]*\n" 
			{ set x [expr $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==2] then { pass $testname } else { fail $testname }
    }
}

proc do_exit_relocation_test {} {
    set testname "exitbug.s: Test for bogus R_EXIT relocation (part 2)"
    set x 0

    # Elf (osf) does not use ENTRY/EXIT relocations.
    # I guess we could look at the unwind subspaces it builds...
    # Until then, make sure it still assembles.
    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	gas_test_old "exitbug.s" "" "Test for bogus R_EXIT relocation (part 1)"
	return
    }

    if [gas_test_old "exitbug.s" "" "Test for bogus R_EXIT relocation (part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Note that a match here is really a FAILURE!
	while 1 {
	    expect {
	        -re "^0+\[^\n\]*R_EXIT\[^\n\]*\n" 
		    { set x [expr $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==0] then { pass $testname } else { fail $testname }
    }
}

proc do_cross_space_fixup_test_1 {} {
    set testname "fixupbug.s: Test cross space jump/call fixup bug (part 2)"
    set x 0

    # ELF doesn't really handle extra sections too well...
    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	return
    }

    if [gas_test_old "fixupbug.s" "" "Test cross space jump/call fixup bug (part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Make sure GAS generated a fixup/relocation for the cross-space
	# branch/call
	while 1 {
	    expect {
	        -re "^0+\[^\n\]*PCREL_CALL\[^\n\]*\n" 
		    { set x [expr $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_cross_space_fixup_test_2 {} {
    set testname "fixupbug.s: Test cross space jump/call fixup bug (part 3)"
    set x 0

    # ELF doesn't really handle extra sections too well...
    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	return
    }

    gas_start "fixupbug.s" "-al"

    while 1 {
	expect {
	    -re "^ +\[0-9\]+ 0000 E8000002\[^\n\]*\n"	{ set x [expr $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.
    gas_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_round_mode_test {} {
    set testname "roundmode.s: Test switching of rounding modes (part 2)"
    set x 0

    if [gas_test_old "roundmode.s" "" "Test switch of rounding modes(part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Make sure GAS generated correct relocations to switch rounding modes.
	# Also make sure (for SOM) that redundant rounding mode relocations
	# were eliminated.
	if {[istarget hppa*64*-*-*]
	    || [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	    while 1 {
		expect {
	            -re "^0+\[^\n\]*DIR21L\[^\n\]*\n"
			{ set x [expr $x+1] }
	            -re "^0+4\[^\n\]*DIR14R\[^\n\]*\n" 
			{ set x [expr $x+1] }
	            -re "^0+8\[^\n\]*DIR21L\[^\n\]*\n"
			{ set x [expr $x+1] }
	            -re "^0+c\[^\n\]*DIR14R\[^\n\]*\n" 
			{ set x [expr $x+1] }
	            -re "^0+10\[^\n\]*DIR21L\[^\n\]*\n"
			{ set x [expr $x+1] }
	            -re "^0+14\[^\n\]*DIR14R\[^\n\]*\n" 
			{ set x [expr $x+1] }
	            -re "^0+18\[^\n\]*DIR21L\[^\n\]*\n"
			{ set x [expr $x+1] }
	            -re "^0+1c\[^\n\]*DIR14R\[^\n\]*\n" 
			{ set x [expr $x+1] }
	            -re "\[^\n\]*\n"		{ }
	        timeout				{ perror "timeout\n"; break }
	        eof				{ break }
		}
            }
	} else {
	    while 1 {
		expect {
	            -re "^0+\[^\n\]*R_R_MODE\[^\n\]*\n"
			{ set x [expr $x+1] }
	            -re "^0+4\[^\n\]*R_R_MODE\[^\n\]*\n" 
			{ fail $testname }
	            -re "^0+8\[^\n\]*R_N_MODE\[^\n\]*\n"
			{ set x [expr $x+1] }
	            -re "^0+c\[^\n\]*R_N_MODE\[^\n\]*\n" 
			{ fail $testname }
	            -re "^0+10\[^\n\]*R_R_MODE\[^\n\]*\n"
			{ set x [expr $x+1] }
	            -re "^0+14\[^\n\]*R_R_MODE\[^\n\]*\n" 
			{ fail $testname }
	            -re "^0+1c\[^\n\]*R_R_MODE\[^\n\]*\n" 
			{ fail $testname }
	            -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 {[istarget hppa*64*-*-*]
	    || [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	    if [expr $x==8] then { pass $testname } else { fail $testname }
	} else {
	    if [expr $x==3] then { pass $testname } else { fail $testname }
	}
    }
}

proc do_function_reloc_bug {} {
    set testname "funcrelocbug.s: Test for reloc bug in non-plabel function reference (part 2)"
    set x 0

    if [gas_test_old "funcrelocbug.s" "" "Test for reloc bug in non-plabel function reference (part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Make sure GAS generated a correct relocation for the reference.
	# branch/call
	while 1 {
	    expect {
	        -re "^0+cc\[^\n\]*f2___4\[^\n+\]*\n" 
		    { set x [expr $x+1] }
	        -re "^0+d0\[^\n\]*f2___4\[^\n+\]*\n"  
		    { set x [expr $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==2] then { pass $testname } else { fail $testname }

	set testname "funcrelocbug.s: Test for reloc bug in non-plabel function reference (part3)"
	set x 0

	objdump_start_no_subdir "a.out" "--prefix-addresses -d"
	# Make sure we didn't put anything in the instruction itself!
	while 1 {
	    expect {
	        -re "^0+cc\[^\n\]*ldil L%0,r20\[^\n\]*\n" 
		    { set x [expr $x+1] }
	        -re "^0+d0\[^\n\]*ldo 0\[\(\]+r20\[\)\]+,r19\[^\n\]*\n" 
		    { set x [expr $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==2] then { pass $testname } else { fail $testname }
    }

}

proc do_r_no_reloc {} {
    set testname "r_no_reloc.s: Test for reloc bug in 4-byte R_NO_RELCOATION fixups (part 2)"
    set x 0

    if [gas_test_old "r_no_reloc.s" "" "Test for reloc bug in 4-byte R_NO_RELOCATION fixups (part 1)"] {
	objdump_start_no_subdir "a.out" "-r"

	# Make sure GAS generated a correct relocation for the reference.
	while 1 {
	    expect {
	        -re "^0+c0004\[^\n\]*PLABEL\[^\n]*g\[^\n\]*\n" 
		    { set x [expr $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_pic_relocation_test {} {
    set testname "picreloc.s: Test for proper PIC relocation (part 2)"
    set x 0

    # ELF doesn't really handle extra sections too well...
    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	return
    }

    gas_start "picreloc.s" "-al"

    while 1 {
	expect {
	    -re "^ +\[0-9\]+ 0000 00000004\[^\n\]*\n"	{ set x [expr $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.
    gas_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_apply_test {} {
    set testname "applybug.s: Test for proper fixup application (part 2)"
    set x 0

    # ELF doesn't really handle extra sections too well...
    if {[istarget hppa*64*-*-*]
	|| [istarget hppa*-*-*elf*] || [istarget hppa*-*-linux*]} then {
	return
    }

    gas_start "applybug.s" "-al"

    while 1 {
	expect {
	    -re "^ +\[0-9\]+ 0000 00000044\[^\n\]*\n"	{ set x [expr $x+1] }
	    -re "^ +\[0-9\]+ 0004 00000058\[^\n\]*\n"	{ set x [expr $x+1] }
	    -re "^ +\[0-9\]+ 0008 0000006C\[^\n\]*\n"	{ set x [expr $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.
    gas_finish

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

if [istarget hppa*-*-*] then {
    # Make sure we put the right relocation entry on a BLE instruction.
    do_ble_relocation_test

    # Make sure relocation reductions are not too agressive about
    # adjusting relocations against some symbols.
    do_relocation_reduction_tests

    # Check that mode selectors on a ble instruction actually work.
    do_ble_mode_selector_test

    # Check that we take the -8 adjustment into account when zeroing
    # out the displacement field in a ble instruction with a reloc
    do_ble_relocation_test

    # 1.36 simply didn't generate all the plabels it should have.  Make
    # sure gas-2 does.
    do_plabel_relocation_test

    # Make sure a field selector only effects the current instruction
    # or assembler directive.
    do_selector_scope_test

    # This should really generate a relocation.  It would make life much
    # easier on the optimizing linker.  Until then just make sure the 
    # difference is computed correctly.
    do_local_label_as_operand_test

    # GAS2 incorrectly generated R_EXIT relocations when .exit directives
    # were not in the source code.
    do_exit_relocation_test

    # GAS2 incorrectly thought it could apply a fixup for a pc-relative
    # branch/call which crossed different subspaces.
    # Also check that the assembled instruction is correct
    do_cross_space_fixup_test_1
    do_cross_space_fixup_test_2

    # Make sure we switch rounding modes correctly
    do_round_mode_test

    # Test for a bug found when a function was used in a non-branching
    # instruction *without* a plabel (for portable runtime model)
    do_function_reloc_bug

    # Test for an off-by-one bug in the handling of 4-byte R_NO_RELOCATION
    # fixups.
    do_r_no_reloc

    # Test a relocation problem which shows up when building shared
    # libraries in SOM
    do_pic_relocation_test

    # Test a problem with md_apply_fix that was introduced when fixing
    # the pic relocation test.
    do_apply_test

    # Make sure gas doesn't resolve long-calls which are to be fixed
    # by the linker
    gas_test "longcall.s" "" "" "Avoid resolving long-calls"
}
