diff options
Diffstat (limited to 'libctf/testsuite/libctf-regression')
4 files changed, 139 insertions, 0 deletions
diff --git a/libctf/testsuite/libctf-regression/libctf-repeat-cu-lib.c b/libctf/testsuite/libctf-regression/libctf-repeat-cu-lib.c new file mode 100644 index 0000000..7ebdb09 --- /dev/null +++ b/libctf/testsuite/libctf-regression/libctf-repeat-cu-lib.c @@ -0,0 +1,9 @@ +#ifdef INT +typedef int ret_t; +#elif CHAR +typedef char *ret_t; +#else +typedef short *ret_t; +#endif + +ret_t FUN (void) { return 0; } diff --git a/libctf/testsuite/libctf-regression/libctf-repeat-cu-main.c b/libctf/testsuite/libctf-regression/libctf-repeat-cu-main.c new file mode 100644 index 0000000..bfbaf0c --- /dev/null +++ b/libctf/testsuite/libctf-regression/libctf-repeat-cu-main.c @@ -0,0 +1,5 @@ +typedef short ret_t; +int a (void); +int b (void); +int c (void); +int blah (void) { a(); b(); c(); } diff --git a/libctf/testsuite/libctf-regression/libctf-repeat-cu.d b/libctf/testsuite/libctf-regression/libctf-repeat-cu.d new file mode 100644 index 0000000..81df804 --- /dev/null +++ b/libctf/testsuite/libctf-regression/libctf-repeat-cu.d @@ -0,0 +1,7 @@ +#... +CTF archive member: .*/libctf-repeat-cu-lib.c: +#... +CTF archive member: .*/libctf-repeat-cu-lib.c#0: +#... +CTF archive member: .*/libctf-repeat-cu-lib.c#1: +#... diff --git a/libctf/testsuite/libctf-regression/libctf-repeat-cu.exp b/libctf/testsuite/libctf-regression/libctf-repeat-cu.exp new file mode 100644 index 0000000..becee95 --- /dev/null +++ b/libctf/testsuite/libctf-regression/libctf-repeat-cu.exp @@ -0,0 +1,118 @@ +# Copyright (C) 2021-2022 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. +# + +load_file $srcdir/../../ld/testsuite/lib/ld-lib.exp + +global srcdir subdir OBJDUMP +global testname +global subsrcdir + +set subsrcdir "$srcdir/$subdir/" +set testname "$dir/libctf-repeat-cu.exp" + +if ![is_elf_format] { + unsupported "CTF needs bfd changes to be emitted on non-ELF" + return 0 +} + +if {![check_ctf_available]} { + unsupported "no CTF format support in the compiler" + return 0 +} + +if {[info exists env(LC_ALL)]} { + set old_lc_all $env(LC_ALL) +} +set env(LC_ALL) "C" + +# Compile one SRC to OBJ and put it into ARCHIVE. +proc one_lib_compile { src flags obj archive } { + global CC_FOR_TARGET CFLAGS_FOR_TARGET AR subsrcdir + + if [is_remote host] { + set src [remote_download host [file join $subsrcdir $src]] + } else { + set src [file join $subsrcdir $src] + } + + set comp_output [run_host_cmd "$CC_FOR_TARGET" "$CFLAGS_FOR_TARGET $flags -gctf -fPIC -c -o $obj $src"] + if { $comp_output != "" } { + return $comp_output + } + + set ar_output [run_host_cmd "$AR" "rc $archive $obj"] + return $comp_output +} + +# Compile one SRC to OBJ and put it into ARCHIVE: error-check the result. +proc one_lib_compile_check { src flags obj archive } { + global testname + + set comp_output [one_lib_compile $src $flags $obj $archive] + + if { $comp_output != ""} { + send_log "compilation of $src with $flags failed with <$comp_output>" + perror "compilation of $src with $flags failed" + fail $testname + return 0 + } + return 1 +} + +if { ! [one_lib_compile_check libctf-repeat-cu-lib.c "-DINT -DFUN=a" tmpdir/libctf-repeat-cu-lib.o tmpdir/a.a] } { + return 0 +} + +if { ! [one_lib_compile_check libctf-repeat-cu-lib.c "-DCHAR -DFUN=b" tmpdir/libctf-repeat-cu-lib.o tmpdir/b.a] } { + return 0 +} + +if { ! [one_lib_compile_check libctf-repeat-cu-lib.c "-DFUN=c" tmpdir/libctf-repeat-cu-lib.o tmpdir/c.a] } { + return 0 +} + +if [is_remote host] { + set src [remote_download host [file join $subsrcdir libctf-repeat-cu-main.c]] +} else { + set src [file join $subsrcdir libctf-repeat-cu-main.c] +} + +set comp_output [run_host_cmd "$CC_FOR_TARGET" "$CFLAGS_FOR_TARGET -gctf -fPIC -shared -o tmpdir/libctf-repeat-cu-main.so $src tmpdir/a.a tmpdir/b.a tmpdir/c.a"] +if { $comp_output != "" } { + send_log "compilation of tmpdir/libctf-repeat-cu-main.so failed" + perror "compilation of tmpdir/libctf-repeat-cu-main.so failed" + fail $testname + return $comp_output +} + +set comp_output [run_host_cmd "$OBJDUMP" "--ctf tmpdir/libctf-repeat-cu-main.so > tmpdir/dump.out"] + +if { [regexp_diff "tmpdir/dump.out" [file join $subsrcdir libctf-repeat-cu.d] ] } { + fail $testname + if { $verbose == 2 } then { verbose "output is [file_contents tmpdir/dump.out]" 2 } +} + +pass $testname + +if {[info exists old_lc_all]} { + set env(LC_ALL) $old_lc_all +} else { + unset env(LC_ALL) +} |