diff options
Diffstat (limited to 'libctf/testsuite/lib/ctf-lib.exp')
-rw-r--r-- | libctf/testsuite/lib/ctf-lib.exp | 88 |
1 files changed, 79 insertions, 9 deletions
diff --git a/libctf/testsuite/lib/ctf-lib.exp b/libctf/testsuite/lib/ctf-lib.exp index 64d2a40..7175e14 100644 --- a/libctf/testsuite/lib/ctf-lib.exp +++ b/libctf/testsuite/lib/ctf-lib.exp @@ -20,6 +20,51 @@ load_file $srcdir/../../ld/testsuite/lib/ld-lib.exp +# Returns true if the target linker deduplicates CTF. +proc check_ctf_linker_dedup { } { + global ctf_linker_dedup_saved + + if {![info exists ctf_linker_dedup_saved]} { + set ctf_linker_dedup_saved 0 + + if ([check_ctf_available]) { + global objdump srcdir + + set basename "tmpdir/ctf_linker_dedups[pid]" + compile_one_cc $srcdir/libctf-lookup/ambiguous-struct-A.c ${basename}-A.o "-gctf -fPIC -c" + compile_one_cc $srcdir/libctf-lookup/ambiguous-struct-B.c ${basename}-B.o "-gctf -fPIC -c" + compile_one_cc "${basename}-A.o ${basename}-B.o" $basename.so "-gctf -fPIC -shared" + if {! [remote_file host exists $basename.so] } { + return 0 + } + + # Don't use run_host_cmd: it dumps the entire output into the log, + # even on success. + set cmdret [remote_exec host [concat sh -c [list "$objdump --ctf $basename.so >dump.out 2>dump.err"]] "" "/dev/null"] + set cmdret [lindex $cmdret 0] + remote_upload host "dump.out" + remote_upload host "dump.err" + set dump_out [prune_warnings [file_contents "dump.out"]] + set dump_err [prune_warnings [file_contents "dump.err"]] + remote_file host delete "dump.out" "dump.err" + remote_file build delete "dump.out" "dump.err" + + if {$cmdret != 0} { + verbose -log "failed with $cmdret: stderr: $dump_err" + verbose -log "output: $dump_out" + return 0; + } + + remote_file host delete $basename.so ${basename}-A.o ${basename}-B.o + if [regexp {CTF archive member: } $dump_out] { + set ctf_linker_dedup_saved 1 + } + } + } + return $ctf_linker_dedup_saved +} + + proc run_native_host_cmd { command } { global link_output global ld @@ -96,6 +141,8 @@ proc compile_link_one_host_cc { src output additional_args } { # # link: # If set, link the SOURCE together even if only one file is specified. +# If "objects", keep the input object files and pass them as additional +# arguments to LOOKUP. # # link_flags: # If set, extra flags to pass to the linker. @@ -220,11 +267,14 @@ proc run_lookup_test { name } { # Compile the inputs and posibly link them together. set lookup_output "" + set objs {} if { [llength $opts(source)] > 0 } { set lookup_flags "" + set ld_flags "" if { $run_ld } { set lookup_output "tmpdir/out.so" - set lookup_flags "-gctf -fPIC $shared $opts(link_flags)" + set lookup_flags "-gctf -fPIC" + set ld_flags "$shared $opts(link_flags)" } else { set lookup_output "tmpdir/out.o" set lookup_flags "-gctf -fPIC -c" @@ -235,19 +285,38 @@ proc run_lookup_test { name } { if [board_info [target_info name] exists ldflags] { append lookup_flags " [board_info [target_info name] ldflags]" } - set src {} + set objsrcs {} + set local_srcs {} foreach sfile $opts(source) { + set local_src [file join [file dirname $file] $sfile] + lappend local_srcs $local_src + if [is_remote host] { - lappend src [remote_download host [file join [file dirname $file] $sfile]] + set src [remote_download host [file join [file dirname $file] $sfile]] + } else { + set src [file join [file dirname $file] $sfile] + } + + if { $opts(link) == "objects" } { + set obj "[file rootname $src].o" + set comp_output [prune_warnings [run_host_cmd "$CC_FOR_TARGET" "$CFLAGS_FOR_TARGET $lookup_flags $src -c -o $obj"]] + + if { $comp_output != ""} { + send_log "compilation of CTF program $local_src failed with <$comp_output>" + fail $testname + return 0 + } + lappend objsrcs $obj + lappend objs $obj } else { - lappend src [file join [file dirname $file] $sfile] + lappend objsrcs $src } } - set comp_output [prune_warnings [run_host_cmd "$CC_FOR_TARGET" "$CFLAGS_FOR_TARGET $lookup_flags [concat $src] -o $lookup_output"]] + set comp_output [prune_warnings [run_host_cmd "$CC_FOR_TARGET" "$CFLAGS_FOR_TARGET $lookup_flags $ld_flags [concat $objsrcs] -o $lookup_output"]] if { $comp_output != ""} { - send_log "compilation of CTF program [concat $src] failed with <$comp_output>" + send_log "compilation of CTF program [concat $local_srcs] failed with <$comp_output>" fail $testname return 0 } @@ -261,12 +330,13 @@ proc run_lookup_test { name } { } } - # Invoke the lookup program on the outputs, possibly through the wrapper. + # Invoke the lookup program on the outputs, possibly through the wrapper, including all + # the object file names if they were filled out. if { [llength $opts(wrapper)] == 0 } { - set results [run_host_cmd tmpdir/lookup $lookup_output] + set results [run_host_cmd tmpdir/lookup "$lookup_output $objs"] } else { - set results [run_host_cmd "$opts(wrapper) tmpdir/lookup" $lookup_output] + set results [run_host_cmd "$opts(wrapper) tmpdir/lookup" "$lookup_output $objs"] } if { [regexp {^UNSUPPORTED: (.*)$} $results -> reason] } { |