| 1 | # Copyright (C) 2012-2015 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 | # |
| 18 | # elf tests |
| 19 | # |
| 20 | |
| 21 | proc run_elf_list_test { name suffix opts readelf_opts readelf_pipe } { |
| 22 | global READELF |
| 23 | global srcdir subdir |
| 24 | set testname "elf $name list" |
| 25 | set file $srcdir/$subdir/$name |
| 26 | gas_run ${name}.s "$opts -o dump.o" ">&dump.out" |
| 27 | if { ![string match "" $opts] |
| 28 | && [regexp_diff "dump.out" "${file}.l"] } then { |
| 29 | fail $testname |
| 30 | verbose "output is [file_contents "dump.out"]" 2 |
| 31 | return |
| 32 | } |
| 33 | send_log "$READELF $readelf_opts dump.o $readelf_pipe > dump.out\n" |
| 34 | set status [gas_host_run "$READELF $readelf_opts dump.o" ">readelf.out"] |
| 35 | if { [lindex $status 0] != 0 || ![string match "" [lindex $status 1]] } then { |
| 36 | send_log "[lindex $status 1]\n" |
| 37 | fail $testname |
| 38 | return |
| 39 | } |
| 40 | catch "exec cat readelf.out $readelf_pipe > dump.out\n" comp_output |
| 41 | if ![string match "" $comp_output] then { |
| 42 | send_log "$comp_output\n" |
| 43 | fail $testname |
| 44 | return |
| 45 | } |
| 46 | verbose_eval {[file_contents "dump.out"]} 3 |
| 47 | if { [regexp_diff "dump.out" "${file}.e${suffix}"] } then { |
| 48 | fail $testname |
| 49 | verbose "output is [file_contents "dump.out"]" 2 |
| 50 | return |
| 51 | } |
| 52 | pass $testname |
| 53 | } |
| 54 | |
| 55 | # We're testing bits in obj-elf -- don't run on anything else. |
| 56 | if { [is_elf_format] } then { |
| 57 | set target_machine "" |
| 58 | if {[istarget "mips*-*-*"]} then { |
| 59 | set target_machine -mips |
| 60 | } |
| 61 | if {[istarget m32r*-*-*]} then { |
| 62 | set target_machine -m32r |
| 63 | } |
| 64 | if {[istarget "msp430-*-*"]} then { |
| 65 | set target_machine -msp430 |
| 66 | } |
| 67 | if {[istarget "score-*-*"]} then { |
| 68 | set target_machine -score |
| 69 | } |
| 70 | if {[istarget "tic6x-*-*"]} then { |
| 71 | set target_machine -tic6x |
| 72 | } |
| 73 | if {[istarget "xtensa*-*-*"]} then { |
| 74 | set target_machine -xtensa |
| 75 | } |
| 76 | if {[istarget "rx-*-*"]} then { |
| 77 | set target_machine -rx |
| 78 | } |
| 79 | if {[istarget "arm*-*-*"]} { |
| 80 | set target_machine -arm |
| 81 | } |
| 82 | |
| 83 | # The MN10300 and Xtensa ports disable the assembler's call frame |
| 84 | # optimization because it interfers with link-time relaxation of |
| 85 | # function prologues. |
| 86 | if {![istarget "mn10300-*-*"] |
| 87 | && ![istarget "xtensa*-*-*"] |
| 88 | && ![istarget "msp430*-*-*"] |
| 89 | && ![istarget "nds32*-*-*"] |
| 90 | && ![istarget "am3*-*-*"]} then { |
| 91 | run_dump_test "ehopt0" |
| 92 | } |
| 93 | case $target_triplet in { |
| 94 | { m68k-*-* m68[03]??-*-* } { |
| 95 | run_dump_test "file" { { as "--defsym m68k=1" } } |
| 96 | } |
| 97 | { mmix-*-* } { |
| 98 | run_dump_test "file" { { as "--defsym mmix=1" } } |
| 99 | } |
| 100 | { xtensa*-*-* } { |
| 101 | run_dump_test "file" { { as "--rename-section file.s=file.c" } } |
| 102 | } |
| 103 | default { |
| 104 | run_dump_test "file" |
| 105 | } |
| 106 | } |
| 107 | setup_xfail "nds32*-*-*" |
| 108 | run_dump_test "group0a" |
| 109 | run_dump_test "group0b" |
| 110 | run_dump_test "group0c" |
| 111 | run_dump_test "group1a" |
| 112 | run_dump_test "group1b" |
| 113 | run_dump_test "group2" |
| 114 | case $target_triplet in { |
| 115 | { hppa64*-*-hpux* } { } |
| 116 | default { |
| 117 | run_dump_test "groupautoa" |
| 118 | } |
| 119 | } |
| 120 | case $target_triplet in { |
| 121 | { hppa64*-*-hpux* } { } |
| 122 | { xtensa*-*-* } { } |
| 123 | default { |
| 124 | run_dump_test "groupautob" |
| 125 | } |
| 126 | } |
| 127 | case $target_triplet in { |
| 128 | { alpha*-*-* } { } |
| 129 | { cr16*-*-* } { } |
| 130 | { crx*-*-* } { } |
| 131 | { h8300-*-* } { } |
| 132 | { hppa*-*-* } { } |
| 133 | { iq2000*-*-* } { } |
| 134 | { mips*-*-* } { } |
| 135 | { mn10200-*-* } { } |
| 136 | { mn10300-*-* } { } |
| 137 | { msp43*-*-* } { } |
| 138 | { *c54x*-*-* } { } |
| 139 | { rx-*-* } { } |
| 140 | default { |
| 141 | # The next test can fail if the target does not convert fixups |
| 142 | # against ordinary symbols into relocations against section symbols. |
| 143 | # This is usually revealed by the error message: |
| 144 | # symbol `sym' required but not present |
| 145 | setup_xfail "m681*-*-*" "m68hc*-*-*" |
| 146 | run_dump_test redef |
| 147 | run_dump_test equ-reloc |
| 148 | } |
| 149 | } |
| 150 | run_dump_test "pseudo" |
| 151 | run_dump_test "section0" |
| 152 | run_dump_test "section1" |
| 153 | if {! [istarget "h8300-*-*"]} then { |
| 154 | # The h8300 port issues a warning message for |
| 155 | # new sections created without atrributes. |
| 156 | run_elf_list_test "section2" "$target_machine" "-al" "-s" "" |
| 157 | } |
| 158 | run_dump_test "section3" |
| 159 | run_dump_test "section4" |
| 160 | if {! [istarget "h8300-*-*"] && ! [istarget "rx-*-*"]} then { |
| 161 | # The h8300 port issues a warning message for |
| 162 | # new sections created without atrributes. |
| 163 | # The RX port does not complain about changing the attributes of the |
| 164 | # .data and .bss sections since it does not use those names. |
| 165 | run_elf_list_test "section5" "" "-al" "-SW" "| grep \" \\\\.test\\\[0-9\\\]\"" |
| 166 | } |
| 167 | run_dump_test "struct" |
| 168 | if { ![istarget "alpha*-*-*"] } then { |
| 169 | # The alpha port uses .set for state, e.g. nomacro. |
| 170 | run_dump_test "symtab" |
| 171 | } |
| 172 | run_dump_test "symver" |
| 173 | |
| 174 | # No indirect functions on non-GNU targets. |
| 175 | # The Visium and MSP set the ELF header's OSABI field to ELFOSABI_STANDALONE. |
| 176 | # The non-eabi ARM ports sets it to ELFOSABI_ARM. |
| 177 | # So for these targets we cannot include an IFUNC symbol type |
| 178 | # in the symbol type test. |
| 179 | if { [istarget "*-*-hpux*"] |
| 180 | || [istarget "visium-*-*"] |
| 181 | || [istarget "msp*-*-*"] |
| 182 | || [istarget "arm*-*-*"]} then { |
| 183 | # hppa64 has a non-standard common directive |
| 184 | if { ![istarget "hppa64*-*-hpux*"] } then { |
| 185 | run_elf_list_test "type-noifunc" "" "" "-s" "| grep \"1 *\\\[FONTC\\\]\"" |
| 186 | } |
| 187 | } else { |
| 188 | run_dump_test ifunc-1 |
| 189 | run_elf_list_test "type" "" "" "-s" "| grep \"1 *\\\[FIONTCU\\\]\"" |
| 190 | } |
| 191 | |
| 192 | run_dump_test "section6" |
| 193 | run_dump_test "section7" |
| 194 | run_dump_test "section8" |
| 195 | run_dump_test "section9" |
| 196 | run_dump_test "dwarf2-1" |
| 197 | run_dump_test "dwarf2-2" |
| 198 | run_dump_test "dwarf2-3" |
| 199 | run_dump_test "dwarf2-4" |
| 200 | run_dump_test "bad-section-flag" |
| 201 | run_dump_test "bad-size" |
| 202 | run_dump_test "bad-group" |
| 203 | |
| 204 | run_dump_test "syms" |
| 205 | |
| 206 | run_dump_test "common1" |
| 207 | run_dump_test "common2" |
| 208 | |
| 209 | load_lib gas-dg.exp |
| 210 | dg-init |
| 211 | dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/err-*.s $srcdir/$subdir/warn-*.s]] "" "" |
| 212 | dg-finish |
| 213 | |
| 214 | } |