#
# 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-*-*" "sparc*-*-*" "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 "m68hc*-*-*" "rx-*-*" "vax*-*-*" "z8k-*-*"
	run_dump_test redef2
	setup_xfail "m68hc*-*-*" "rx-*-*" "vax*-*-*" "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
