Home | History | Annotate | Download | only in arch
      1 # Copyright (C) 2004-2016 Free Software Foundation, Inc.
      2 
      3 # This program is free software; you can redistribute it and/or modify
      4 # it under the terms of the GNU General Public License as published by
      5 # the Free Software Foundation; either version 3 of the License, or
      6 # (at your option) any later version.
      7 #
      8 # This program is distributed in the hope that it will be useful,
      9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11 # GNU General Public License for more details.
     12 #
     13 # You should have received a copy of the GNU General Public License
     14 # along with this program; if not, write to the Free Software
     15 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     16 
     17 # Please email any bugs, comments, and/or additions to this file to:
     18 # binutils (at) sources.redhat.com
     19 
     20 # This scripts tests all available SH architectures with all the assembler
     21 # options related to the architecture. It ensures that those combinations
     22 # which should not work do not work, and that those that should work
     23 # produce the correct output architecture.
     24 #
     25 # It looks for files in the same directory as this file named sh*.s .
     26 # Each file must contain all the instructions available within
     27 # that architecture. The architecture name is inferred from the file name.
     28 #
     29 # The sh*.s files should NOT be hand edited. Whenever the script is run
     30 # (e.g. with 'make check') it creates a set of new (usually identical) files
     31 # in the <objdir>/gas/testsuite directory. These are compared against the
     32 # old ones in the testsuite. When the expected results change (or new
     33 # architectures are added) these new files can be used to replace the old
     34 # ones with no modification required.
     35 #
     36 # The script generates the architecture/option permutations automatically,
     37 # but it reads the expected results from the file arch_expected.txt (also
     38 # found in the same directory as this script).
     39 #
     40 # The arch_expected.txt file should NOT be hand edited. Whenever the script
     41 # is run (e.g. with 'make check') it creates a new (usually identical) file
     42 # named arch_results.txt in the <objdir>/gas/testsuite directory. When the
     43 # expected results change (or new architectures are added) this new file
     44 # can be used to replace arch_expected.txt with no modification required.
     45 
     46 if {[istarget sh*-*-*]} then {
     47 
     48 
     49 # This procedure extracts the architecture name from the objdump output.
     50 # If there is no architecture name (or objdump output changes significantly)
     51 # then the behaviour is undefined, but it will most likely return junk.
     52 
     53 proc get_sh_arch { ofile } {
     54     global comp_output
     55 
     56     objdump "-f $ofile"
     57     send_log $comp_output
     58 
     59     set comp_output [string replace $comp_output 0 \
     60 	    [expr [string first "architecture:" $comp_output] + 13] ""]
     61 
     62     return [string range $comp_output 0 [expr [string first "," $comp_output] - 1]]
     63 }
     64 
     65 
     66 # This procedure runs two tests:
     67 #   Test 1: Check the assembler can assemble the given file with
     68 #           given options.
     69 #   Test 2: Check that the resultant architecture is as expected.
     70 # It also writes an entry to the arch_results.txt file.
     71 
     72 proc test_arch { file opt arch resultfile } {
     73     global comp_output
     74 
     75     set name [file tail $file]
     76     set rootname [file rootname $name]
     77 
     78     if [string equal $opt "default-options"] then {
     79 	gas_run $name "-o ${rootname}-#${opt}#.o" ""
     80     } else {
     81 	gas_run $name "$opt -o ${rootname}-#${opt}#.o" ""
     82     }
     83 
     84     if [want_no_output "$rootname file should assemble with $opt"] then {
     85 	set result [get_sh_arch "${rootname}-#${opt}#.o"]
     86 	puts $resultfile [format "%-20s %-25s %s" $file $opt $result]
     87 
     88 	if {$result == $arch} then {
     89 	    pass "$rootname file with $opt should assemble to arch $arch"
     90 	    file delete "${rootname}-#${opt}#.o"
     91 	} else {
     92 	    send_log $comp_output
     93 	    fail "$rootname file with $opt should assemble to arch $arch"
     94 	}
     95     } else {
     96 	puts $resultfile [format "%-20s %-25s ERROR" $file $opt]
     97 	untested "$rootname file with $opt should assemble to arch $arch"
     98     }
     99 
    100 }
    101 
    102 
    103 # This procedure tests that a file that is not suposed to assemble
    104 # with a given option does, in fact, not assemble.
    105 # It also writes an entry to the arch_results.txt file.
    106 
    107 proc test_arch_error { file opt resultfile} {
    108     global comp_output
    109 
    110     set name [file tail $file]
    111     set rootname [file rootname $name]
    112 
    113     if [string equal $opt "default-options"] then {
    114 	gas_run $name "-o ${rootname}-#${opt}#.o" ""
    115     } else {
    116 	gas_run $name "$opt -o ${rootname}-#${opt}#.o" ""
    117     }
    118 
    119     if [string match "" $comp_output] then {
    120 	fail "$rootname file with $opt should not assemble"
    121 	puts $resultfile [format "%-20s %-25s [get_sh_arch ${rootname}-#${opt}#.o]" $file $opt]
    122     } else {
    123 	pass "$rootname file with $opt should not assemble"
    124 	puts $resultfile [format "%-20s %-25s ERROR" $file $opt]
    125     }
    126 }
    127 
    128 # These tests are not suitable for sh-coff because
    129 # coff does not store the architecture information.
    130 
    131 if [istarget sh*-*-elf] then {
    132     global subdir srcdir
    133 
    134     # Find all the architectures and generate the
    135     # list of options we will test.
    136 
    137     set filelist [lsort -ascii [glob "$srcdir/$subdir/sh*.s"]]
    138     set optlist {"default-options" "-dsp" "-isa=any" "-isa=dsp" "-isa=fp"}
    139     foreach file $filelist {
    140 	set arch [file rootname [file tail $file]]
    141 	lappend optlist "-isa=$arch" "-isa=${arch}-up"
    142     }
    143 
    144     # Initialise the results file
    145 
    146     set outfile [open "arch_results.txt" w 0666]
    147     puts $outfile "# Generated file. DO NOT EDIT"
    148     puts $outfile "#"
    149     puts $outfile "# This file is generated by gas/testsuite/gas/sh/arch/arch.exp ."
    150     puts $outfile "# It contains the expected results of the tests."
    151     puts $outfile "# If the tests are failing because the expected results"
    152     puts $outfile "# have changed then run 'make check' and copy the new file"
    153     puts $outfile "# from <objdir>/gas/testsuite/arch_results.txt"
    154     puts $outfile "# to   <srcdir>/gas/testsuite/gas/sh/arch/arch_expected.txt ."
    155     puts $outfile "# Make sure the new expected results are ALL correct."
    156     puts $outfile "#"
    157     puts $outfile [format "# %-18s %-25s %s" "FILE" "OPTION" "OUTPUT"]
    158     puts $outfile [format "# %-18s %-25s %s" "----" "------" "------"]
    159 
    160     # Open the expected results file and skip the header
    161 
    162     set infile [open "$srcdir/$subdir/arch_expected.txt" r]
    163     while {[gets $infile line] >= 0 && [string match {\#*} $line]} {send_log "reading '$line'\n"}
    164 
    165     foreach file $filelist {
    166 	foreach opt $optlist {
    167 	    set name [file tail $file]
    168 	    set rootname [file rootname $name]
    169 
    170 	    # Decode the expected result from the file
    171 
    172 	    scan $line "%s %s %s" exfile exopt exarch
    173 	    send_log "exfile = '$exfile', exopt = '$exopt', exarch = '$exarch'\n"
    174 	    send_log "  name = '$name',   opt = '$opt'\n"
    175 
    176 	    if {[string equal $exfile $name] && [string equal $exopt $opt]} then {
    177 		# The expected result file makes sense and
    178 		# appears up-to-date (the file and options match)
    179 
    180 		if {[string equal $exarch "ERROR"]} then {
    181 		    test_arch_error $name $opt $outfile
    182 		} else {
    183 		    test_arch $name $opt $exarch $outfile
    184 		}
    185 	    } else {
    186 		# The expected result file isn't right somehow
    187 		# so just try any old test. This will cause
    188 		# many failures, but will generate the results file.
    189 
    190 		test_arch $name $opt $rootname $outfile
    191 	    }
    192 
    193 	    # Read the next line from the expected result file.
    194 	    # This is at the end because the process of skipping
    195 	    # the header reads the first real line
    196 
    197 	    if [gets $infile line] then {
    198 		send_log "reading '$line'\n"
    199 	    }
    200 	}
    201     }
    202 
    203     close $infile
    204     close $outfile
    205 }
    206 
    207 } ;# istarget sh*-*-*
    208