#
# 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 "*arm*-*-*"]
	  || [istarget "xscale*-*-*"])
	&& ([istarget "*-*-*eabi"]
	    || [istarget "*-*-symbianelf"])} then {
	set target_machine -armeabi
    }
    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 {
	    run_dump_test redef
	}
    }
    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\\\]\""
}
