# Copyright 1993, 1996, 1997, 2002, 2004 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., 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"
}
