#
# elf tests
#

proc run_list_test { name suffix opts readelf_opts readelf_pipe } {
    global READELF
    global srcdir subdir
    set testname "elf $name list"
    set file $srcdir/$subdir/$name
    gas_run ${name}.s "$opts -o dump.o" ">&dump.out"
    if { ![string match "" $opts]
	  && [regexp_diff "dump.out" "${file}.l"] } then {
	fail $testname
	verbose "output is [file_contents "dump.out"]" 2
	return
    }
    send_log "$READELF $readelf_opts dump.o $readelf_pipe > dump.out\n"
    catch "exec $READELF $readelf_opts dump.o $readelf_pipe > dump.out\n" comp_output
    if ![string match "" $comp_output] then {
	send_log "$comp_output\n"
	fail $testname
	return
    }
    verbose_eval {[file_contents "dump.out"]} 3
    if { [regexp_diff "dump.out" "${file}.e${suffix}"] } then {
	fail $testname
	verbose "output is [file_contents "dump.out"]" 2
	return
    }
    pass $testname
}

# We're testing bits in obj-elf -- don't run on anything else.
if { ([istarget "*-*-*elf*"]		
      || [istarget "*-*-linux*"]
      || [istarget "m6811-*"]
      || [istarget "m6812-*"]
      || [istarget "sparc*-*-solaris*"]
      || [istarget "mips*-*-irix6*"]
      || [istarget "arm*-*-eabi"])
     && ![istarget *-*-linux*aout*]
     && ![istarget *-*-linux*coff*]
     && ![istarget *-*-linux*oldld*]
     && ![istarget sh64*-*-linux*]
} then {
    set target_machine ""
    if {[istarget "mips*-*-*"]} then {
	set target_machine -mips
    }
    if {[istarget m32r*-*-*]} then {
	set target_machine -m32r
    }
    if {[istarget "score-*-*"]} then {
	set target_machine -score
    }
    if {[istarget "xtensa-*-*"]} then {
	set target_machine -xtensa
    }
    if { ([istarget "*arm*-*-*"]
	  || [istarget "xscale*-*-*"]) } {
	
	if { ([istarget "*-*-*eabi"]
	      || [istarget "*-*-symbianelf"])} then {
	    set target_machine -armeabi
	} else {
	    set target_machine -armelf
	}
    }
    run_dump_test "ehopt0"
    run_dump_test "group0a" 
    run_dump_test "group0b" 
    run_dump_test "group1a" 
    run_dump_test "group1b" 
    case $target_triplet in {
	{ alpha*-*-* } { }
	{ hppa*-*-* } { }
	{ iq2000*-*-* } { }
	{ mips*-*-* } { }
	{ *c54x*-*-* } { }
	default {
	    # The next test can fail if the target does not convert fixups
	    # against ordinary symbols into relocations against section symbols.
	    # This is usually revealed by the error message:
	    #  symbol `sym' required but not present
	    setup_xfail "h8300-*-*" "mn10300-*-*"
	    run_dump_test redef
	    run_dump_test equ-reloc
	}
    }
    run_dump_test "section0" 
    run_dump_test "section1" 
    run_list_test "section2" "$target_machine" "-al" "-s" ""
    run_dump_test "section3" 
    run_dump_test "section4"
    run_list_test "section5" "" "-al" "-SW" "| grep \" \\\\.test\\\[0-9\\\]\""
    run_dump_test "struct" 
    run_dump_test "symver" 
    run_list_test "type" "" "" "-s" "| grep \"1 \\\[FONT\\\]\""
}
