1 # Copyright (C) 1993-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 # bug-dejagnu (at) prep.ai.mit.edu 19 20 # This file was written by Rob Savoye <rob (at) cygnus.com> 21 # and rewritten by Ian Lance Taylor <ian (at) cygnus.com> 22 23 if ![is_remote host] { 24 if {[which $NM] == 0} then { 25 perror "$NM does not exist" 26 return 27 } 28 } 29 30 send_user "Version [binutil_version $NM]" 31 32 33 if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then { 34 return 35 } 36 37 if [is_remote host] { 38 set tempfile [remote_download host tmpdir/bintest.o] 39 } else { 40 set tempfile tmpdir/bintest.o 41 } 42 43 # Test nm with no arguments. 44 45 # This test does not work correctly on ECOFF targets, because ECOFF 46 # stores most symbols twice, which messes up the nm output. 47 setup_xfail "alpha*-*-osf*" "alpha*-*-netware*" 48 setup_xfail "mips*-*-ultrix*" "mips*-*-ecoff*" "mips*-*-irix4*" 49 setup_xfail "mips*-*-riscos*" "mips*-*-sysv3*" "mips*-sony-bsd*" 50 51 # This test does not work correctly on XCOFF targets, because XCOFF 52 # does not enter static symbols in the symbol table. 53 setup_xfail "*-*-aix*" 54 55 set got [binutils_run $NM "$NMFLAGS $tempfile"] 56 57 if [info exists vars] then { unset vars } 58 while {[regexp "(\[a-zA-Z\]) (\[a-z_\]*_symbol)(.*)" $got all type symbol rest]} { 59 set vars($symbol) $type 60 set got $rest 61 } 62 63 if {![info exists vars(text_symbol)] \ 64 || $vars(text_symbol) != "T" \ 65 || ![info exists vars(data_symbol)] \ 66 || $vars(data_symbol) != "D" \ 67 || ![info exists vars(common_symbol)] \ 68 || $vars(common_symbol) != "C" \ 69 || ![info exists vars(external_symbol)] \ 70 || $vars(external_symbol) != "U" \ 71 || ![info exists vars(static_text_symbol)] \ 72 || $vars(static_text_symbol) != "t" \ 73 || ![info exists vars(static_data_symbol)] \ 74 || $vars(static_data_symbol) != "d"} { 75 fail "nm (no arguments)" 76 } else { 77 pass "nm (no arguments)" 78 } 79 80 # Test nm -g 81 82 set got [binutils_run $NM "$NMFLAGS -g $tempfile"] 83 84 if [info exists vars] then { unset vars } 85 while {[regexp "(\[a-z_\]*_symbol)(.*)" $got all symbol rest]} { 86 set vars($symbol) 1 87 set got $rest 88 } 89 90 if {![info exists vars(text_symbol)] \ 91 || ![info exists vars(data_symbol)] \ 92 || ![info exists vars(common_symbol)] \ 93 || ![info exists vars(external_symbol)] \ 94 || [info exists vars(static_text_symbol)] \ 95 || [info exists vars(static_data_symbol)]} { 96 fail "nm -g" 97 } else { 98 pass "nm -g" 99 } 100 101 if [is_elf_format] { 102 # PR binutils/12753 103 # Test nm -g on a unique global symbol. 104 105 # Only some targets support unique symbols. 106 if {([istarget "i?86-*-*"] 107 || [istarget "x86_64-*-*"] 108 || [istarget "arm-*-*"] 109 || [istarget "powerpc*-*-*"] 110 || [istarget "sparc*-*-*"])} then { 111 112 if {![binutils_assemble $srcdir/$subdir/unique.s tmpdir/unique.o]} then { 113 fail "nm -g on unique symbols (assembling)" 114 } else { 115 if [is_remote host] { 116 set tmpfile [remote_download host tmpdir/unique.o] 117 } else { 118 set tmpfile tmpdir/unique.o 119 } 120 121 set got [binutils_run $NM "$NMFLAGS -g $tmpfile"] 122 123 if [regexp "u foo" $got] then { 124 pass "nm -g on unique symbols" 125 } else { 126 fail "nm -g on unique symbols" 127 } 128 129 if { $verbose < 1 } { 130 remote_file host delete "tmpdir/unique.o" 131 } 132 } 133 } 134 } 135 136 # Test nm -P 137 138 # This test does not work correctly on ECOFF targets, because ECOFF 139 # stores most symbols twice, which messes up the nm output. 140 setup_xfail "alpha*-*-osf*" "alpha*-*-netware*" 141 setup_xfail "mips*-*-ultrix*" "mips*-*-ecoff*" "mips*-*-irix4*" 142 setup_xfail "mips*-*-riscos*" "mips*-*-sysv3*" "mips*-sony-bsd*" 143 144 # This test does not work correctly on XCOFF targets, because XCOFF 145 # does not enter static symbols in the symbol table. 146 setup_xfail "*-*-aix*" 147 148 set got [binutils_run $NM "$NMFLAGS -P $tempfile"] 149 150 set want "common_symbol C \[0\]*4.*data_symbol D \[0-9a-fA-F\]*.*external_symbol U.*static_data_symbol d \[0-9a-fA-F\]*.*static_text_symbol t \[0-9a-fA-F\]*.*text_symbol T \[0-9a-fA-F\]*" 151 152 if [regexp $want $got] then { 153 pass "nm -P" 154 } else { 155 fail "nm -P" 156 } 157 158 # Test nm --size-sort 159 160 # The target exceptions here are intended for targets that have ELF as 161 # an intermediate format or otherwise require the ELF-variant syntax 162 # for proper size annotation. It would be nice if is_elf_format found 163 # all the ELF variants, but adding the patterns here to that proc then 164 # introduces a whole slew of new regressions in the GAS and LD testsuites. 165 if { [is_elf_format] 166 || [istarget *-*-beos] 167 || [istarget *-*-dragonfly*] 168 || [istarget *-*-*elf] 169 || [istarget *-*-freebsd*] 170 || [istarget *-*-lynxos*] 171 || [istarget "mmix-knuth-mmixware"] 172 || [istarget *-*-netware*] 173 || [istarget *-*-nto*] 174 || [istarget *-*-rdos*] 175 || [istarget *-*-tpf*] 176 || [istarget *-*-uclinux*] 177 || [istarget ia64-*-*vms*] 178 || [istarget *-*-vxworks*] } { 179 set nm_1_src "nm-elf-1.s" 180 } else { 181 set nm_1_src "nm-1.s" 182 } 183 184 if {![binutils_assemble $srcdir/$subdir/$nm_1_src tmpdir/nm-1.o]} then { 185 return 186 } 187 188 if [is_remote host] { 189 set tempfile [remote_download host tmpdir/nm-1.o] 190 } else { 191 set tempfile tmpdir/nm-1.o 192 } 193 194 # This test does not work correctly on ECOFF targets, because ECOFF 195 # stores most symbols twice, which messes up the nm output. 196 setup_xfail "alpha*-*-osf*" "alpha*-*-netware*" 197 setup_xfail "mips*-*-ultrix*" "mips*-*-ecoff*" "mips*-*-irix4*" 198 setup_xfail "mips*-*-riscos*" "mips*-*-sysv3*" "mips*-sony-bsd*" 199 200 set got [binutils_run $NM "$NMFLAGS --size-sort $tempfile"] 201 202 set want "0*4 T text_symbol3.*0*8 T text_symbol2.*0*c T text_symbol1" 203 204 if [regexp $want $got] then { 205 pass "nm --size-sort" 206 } else { 207 fail "nm --size-sort" 208 } 209 210 # There are certainly other tests that could be run. 211