#
# These tests should be valid on all targets.
#

# I think currently all targets fail this one when listings are enabled.
gas_test "p2425.s" ""   "" "pcrel values in assignment"

# p1480.s uses a ".space" directive which for most assemblers means
# "allocate some space".  On the PA it means "switch into this space".
#
# Therefore this test (as it is currently written) is completely bogus
# for any PA target.  Do not bother trying to run it and just claim
# it fails.
#
# The C54x uses ".space" to allocate bits, and requires absolute expressions;
# The ".space" directive is taken care of in the C54x-specific tests, so fail
#  here 
#
# The test also doesn't work on mep targets, since they use RELC, and it
# will avoid simplifying the expression since it conservatively assumes
# ugly expressions can be saved until link-time.
if { [istarget hppa*-*-*] || [istarget *c54x*-*-*] || [istarget mep*-*-*]} then {
    setup_xfail *-*-*
    fail "simplifiable double subtraction"
} else {
    gas_test "p1480.s" "" "-a>" "simplifiable double subtraction"
}

# No floating point support in assembly code for CRIS and Z80.
if { ![istarget cris-*-*] && ![istarget crisv32-*-*] 
     && ![istarget z80-*-*] } then {
    gas_test "float.s" ""   "" "simple FP constants"
}

# This test is meaningless for the PA; the difference of two undefined
# symbols is something that is (and must be) supported on the PA.
# The same is true for alpha-vms
#
# The MN10300 port supports link time relaxation which in turn allows
# for link time resolution of the differneces of two symbols which are
# undefined at assembly time.  Hence this test will not pass for the
# MN10300.  The same thing is true for the RX port as well.
if { ![istarget hppa*-*-*]
     && ![istarget alpha*-*-*vms*]
     && ![istarget rx-*-*]
     && ![istarget mn10300-*-*]
     && ![istarget am3*-*-*] } then {
    gas_test_error "diff1.s" "" "difference of two undefined symbols"
}

gas_test_error "equiv1.s" "" ".equiv for symbol already set to another one"
gas_test_error "equiv2.s" "" ".equiv for symbol already set to an expression"

# .equ works differently on some targets.
case $target_triplet in {
    { hppa*-*-* } { }
    { *c54x*-*-* } { }
    default {
	gas_test "equ-ok.s" "" "" ".equ for symbol already set"
	gas_test_error "equ-bad.s" "" ".equ for symbol already set through .eqv"
    }
}

gas_test "eqv-ok.s" "" "" ".eqv support"
gas_test_error "eqv-bad.s" "" ".eqv for symbol already set"

if { ![istarget "bfin-*-*"] } then {
    gas_test "assign-ok.s" "" "" "== assignment support"
}
gas_test_error "assign-bad.s" "" "== assignment for symbol already set"

# .equ works differently on some targets.
# linkrelax-ing prevents most forward references from working.
case $target_triplet in {
    { *c54x*-*-* } { }
    { cr16*-*-* } { }
    { crx*-*-* } { }
    { h8300*-*-* } { }
    { hppa*-*-* } { }
    { mep-*-* } { }
    { mn10\[23\]00*-*-* } { }
    default {
	# Some targets don't manage to resolve BFD_RELOC_8 for constants.
	setup_xfail "alpha*-*-*" "*c30*-*-*" "*c4x*-*-*" \
	    "d\[13\]0v*-*-*" "i860-*-*" "mips*-*-*" "msp430-*-*" \
	    "pdp11-*-*" "xtensa*-*-*"
	run_dump_test forward
    }
}

# aout relocs are often weird, so is mep and mips-ecoff. don't bother testing
# som doesn't use a .text section
# mmix doesn't like .L1:
# ti addresses aren't octets.
if { ![is_aout_format] } {
    case $target_triplet in {
	{ hppa*64*-*-* } {
	    run_dump_test fwdexp
	}
	{ hppa*-*-hpux* } { }
	{ mep-*-* } { }
	{ mips*-*-ecoff* } { }
	{ mmix-*-* } { }
	{ tic30*-*-* } { }
	{ tic4x*-*-* } { }
	{ tic54x*-*-* } { }
	default {
	    run_dump_test fwdexp
	}
    }
}

# .set works differently on some targets.
# most of the tests won't work on targets that set linkrelax.
# 4 octet bytes confuse address matching on ti targets.
# pdp11 gets unexpected reloc types.
case $target_triplet in {
    { alpha*-*-* } { }
    { cr16*-*-* } { }
    { crx*-*-* } { }
    { h8300-*-* } { }
    { mips*-*-* } { }
    { mn10200-*-* } { }
    { mn10300-*-* } { }
    { pdp11-*-* } { }
    { tic30*-*-* } { }
    { tic4x*-*-* } { }
    { tic54x*-*-* } { }
    { xtensa*-*-* } { }
    { z80-*-* } { }
    default {
	run_dump_test redef
	# These targets fail redef2 because they disallow redefined
	# symbols on relocs.
	setup_xfail "m68hc1*-*-*" "m6811-*-*" "m6812-*-*"
	setup_xfail "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*"
	run_dump_test redef2
	setup_xfail "m68hc1*-*-*" "m6811-*-*" "m6812-*-*"
	setup_xfail "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*"
	# rs6000-aix disallows redefinition via .comm.
	setup_xfail "*-*-aix*"
	# SOM uses a different syntax for .comm
	setup_xfail "hppa*-*-hpux*"
	# These targets fail redef3 because section contents for the
	# word referencing the .comm sym is not zero and/or its reloc
	# has a non-zero addend.  Relaxing the test would hide real
	# failures such as or32-elf.
	setup_xfail "bfin-*-*" "i\[3-7\]86-*-*coff" \
	    "i\[3-7\]86-*-*pe" "i\[3-7\]86-*-go32*" \
	    "i\[3-7\]86-*-cygwin*" "i\[3-7\]86-*-mingw*" "x86_64-*-mingw*"
	run_dump_test redef3
	gas_test_error "redef4.s" "" ".set for symbol already used as label"
	gas_test_error "redef5.s" "" ".set for symbol already defined through .comm"
    }
}

proc do_comment {} {
    set testname "comment.s: comments in listings"
    set x1 0
    set x2 0
    set x3 0
    set white {[ \t]*}
    gas_start "comment.s" "-al"
    while 1 {
# Apparently CRLF is received when using ptys for subprocesses; hence the
# \r\n for line 3.
	expect {
	    -re "^ +1\[ \t\]+# This\[^\n\]*\n"		{ set x1 1 }
	    -re "^ +2\[ \t\]+# correctly\[^\n\]*\n"	{ set x2 1 }
	    -re "^ +3\[ \t\]+/. C comments too. ./\r?\r?\n" { set x3 1 }
	    -re "\[^\n\]*\n"				{ }
	    timeout				{ perror "timeout\n"; break }
	    eof					{ break }
	}
    }
    gas_finish
    if [all_ones $x1 $x2 $x3] then { pass $testname } else { fail $testname }
}

# m32c pads out sections, even empty ones.
case $target_triplet in {
    { m32c-*-* } { }
    default {
	do_comment
    }
}

# This test checks the output of the -ag switch. It must detect at least
# the name of the input file, output file, and options passed.
proc general_info_section {} {
    set testname "general info section in listings"
    set x1 0
    set x2 0
    set x3 0
    set white {[ \t]*}
    gas_start "comment.s" "-agn"
    while 1 {
	expect {
	    -re "^ \[^\n\]*\t: .*\-agn\[^\n\]*\n"                { set x1 1 }
	    -re "^ \[^\n\]*\t: \[^\n\]*comment\.s\[^\n\]*\n"   { set x2 1 }
	    -re "^ \[^\n\]*\t: a\.out\[^\n\]*\n"               { set x3 1 }
	    -re "\[^\n\]*\n"     { }
	    timeout              { perror "timeout\n"; break }
	    eof                  { break }
	}
    }
    gas_finish
    if [all_ones $x1 $x2 $x3] then { pass $testname } else { fail $testname }
}

general_info_section

#
# Test x930509a -- correct assembly of differences involving forward
# references.
#

proc do_930509a {} {
    set testname "difference between forward references"
    set x 0
    gas_start "x930509.s" "-al"
    while 1 {
# We need to accomodate both byte orders here.
# If ".long" means an 8-byte value on some target someday, this test will have
# to be fixed.
	expect {
	    -re "^ +1 .... 00 ?00 ?00 ?00" { fail $testname; set x 1 }
	    -re "^ +1 .... 04 ?00 ?00 ?00" { pass $testname; set x 1 }
	    -re "^ +1 .... 00 ?00 ?00 ?04" { pass $testname; set x 1 }
	    -re "\[^\n\]*\n" { }
	    timeout { perror "timeout\n"; break }
	    eof { break }
	}
    }
    gas_finish
    if !$x then { fail $testname }
}

# This test is meaningless for the PA and CR16/CRX: the difference of two
# symbols cannot be resolved by the assembler.
# C54x assembler (for compatibility) does not allow differences between
# forward references.
# C30 counts a four byte offset as a difference of one.
if { ![istarget hppa*-*-*] &&
     ![istarget cr16*-*-*] &&
     ![istarget  crx*-*-*] &&
     ![istarget *c30*-*-*] &&
     ![istarget *c4x*-*-*] &&
     ![istarget *c54x*-*-*] } then {
    # the vax fails because VMS can apparently actually handle this
    # case in relocs, so gas doesn't handle it itself.
    # mn10300 emits two relocs to handle the difference of two symbols.
    setup_xfail "mn10300*-*-*" "vax*-*-vms*"
    do_930509a
}

# ".struct" and ".align" have different meanings on c54x
# These directives are done in the c54x-specific tests instead
case $target_triplet in {
    { hppa*-*-* } { }
    { *c4x*-*-* } { }
    { *c54x*-*-* } { }
    default {
	run_dump_test struct
	run_dump_test align
	run_dump_test align2
    }
}

# '<' and '>' appear to have special meanings on the excluded targets
case $target_triplet in {
    { frv-*-* } { }
    { hppa*-*-* } { }
    { m32r-*-* } { }
    { mmix-*-* } { }
    { *c4x*-*-* } { }
    { *c54x*-*-* } { }
    { bfin-*-* } { }
    default {
	run_dump_test altmacro
	# The second test is valid only when '!' is not a comment
	# character (it is allowed to be a line comment character).
	if [string match "" [lindex [gas_run excl.s "-o /dev/null" ""] 0]] {
	    run_dump_test altmac2
	    # Similarly this test does not work when ! is a line seperator.
	    run_dump_test eval
	}
    }
}

# This test is for any COFF target.
# We omit the ARM toolchains because they define locals to
#  start with '.', which eliminates .eos, .text etc from the output.
# Omit c54x, since .tag and .def mean something different on that target
if {   ([istarget *-*-coff*] && ![istarget arm*-*-coff] && ![istarget *c4x*-*-coff] && ![istarget *c54x*-*-coff]) \
     ||([istarget *-*-pe*] && ![istarget arm*-*-pe*]) \
     || [istarget i*86-*-aix*] \
     || [istarget i*86-*-sco*] \
     || [istarget i*86-*-isc*] \
     || [istarget i*86-*-go32*] \
     || [istarget i*86-*-cygwin*] \
     || [istarget x86_64-*-mingw*] \
     || [istarget i*86-*-*nt] \
     || [istarget i*86-*-interix*] \
     || ([istarget i960-*-vxworks5.*] && ![istarget i960-*-vxworks5.0*]) } {
    run_dump_test cofftag
}

# Test omitting conditionals from listings.
proc test_cond {} {
    global comp_output
    global srcdir
    global subdir

    set testname "conditional listings"
    gas_run cond.s "-alc" ">dump.out"
    if ![string match "" $comp_output] {
	send_log "$comp_output\n"
	fail $testname
    } else {
	if { [regexp_diff dump.out $srcdir/$subdir/cond.l] } {
	    fail $testname
	} else {
	    pass $testname
	}
    }
}

# This test is not suitable for the PA for various reasons
# not limited to the fact that it depends on specific section
# names appearing in the output file.
# again, p2align doesn't work on c54x target
case $target_triplet in {
    { hppa*-*-* } { }
    { *c4x*-*-* } { }
    { *c54x*-*-* } { }
    { rx-*-* } { }
    default {
        test_cond
	remote_download host "$srcdir/$subdir/incbin.dat"
        run_dump_test incbin
    }
}

if {  ([istarget "i*86-*-*pe*"] && ![istarget "i*86-*-openbsd*"]) \
    || [istarget "i*86-*-cygwin*"] \
    || [istarget "i*86-*-mingw32*"] } {
  gas_test "fastcall.s" ""   "" "fastcall labels"
}

if { ![istarget "bfin-*-*"] } then {
    run_dump_test assign
}
run_dump_test sleb128

# .byte is 32 bits on tic4x, and .p2align isn't supported on tic54x
# .space is different on hppa*-hpux.
# MeP put bytes into packets.
if { ![istarget "tic4x*-*-*"] && ![istarget "tic54x*-*-*"] && ![istarget "hppa*-*-hpux*"] && ![istarget "mep*-*-*"] } {
    run_dump_test relax
}

# powerpc and s390 allow a string argument to .byte
if { ![istarget "powerpc*-*-*"] && ![istarget "rs6000*-*-*"] && ![istarget "s390*-*-*"] } {
    run_dump_test byte
}

# .quad is 16 bytes on i960.
if { ![istarget "i960-*-*"] } {
    run_dump_test quad
}

# som doesn't use .data section.
case $target_triplet in {
    { hppa*64*-*-* } {
	run_dump_test octa
    }
    { hppa*-*-hpux* } { }
    default {
	run_dump_test octa
    }
}

# .set works differently on some targets.
case $target_triplet in {
    { alpha*-*-* } { }
    { mips*-*-* } { }
    { *c54x*-*-* } { }
    { z80-*-* } { }
    default {
	run_dump_test weakref1
	run_dump_test weakref1g
	run_dump_test weakref1l
	run_dump_test weakref1u
	run_dump_test weakref1w
    }
}
gas_test_error "weakref2.s" "" "e: would close weakref loop: e => a => b => c => d => e"
gas_test_error "weakref3.s" "" "a: would close weakref loop: a => b => c => d => e => a"
gas_test_error "weakref4.s" "" "is already defined"

run_dump_test string

load_lib gas-dg.exp
dg-init
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/err-*.s $srcdir/$subdir/warn-*.s]] "" ""
dg-finish
