[PATCH v2] ld/testsuite: add support for remote testing in ld-cdtest
Clément Chigot
chigot@adacore.com
Thu Jun 18 08:04:43 GMT 2026
On Thu, Jun 18, 2026 at 9:58 AM Clément Chigot <chigot@adacore.com> wrote:
>
> This converts the existing to code to use "remote_load" allowing
> execution on both native and remote targets.
>
> The "diff" between the output and the expected result has been
> transformed to the usual regexp_diff. The previous could have been
> transformed into `remote_exec build diff` but tends to be fickled with
> new lines.
Arf got Maciej's Redhat email rejected. Trying with macro@orcam.me.uk.
> ---
> ld/testsuite/ld-cdtest/cdtest-nrv.dat | 26 ++++----
> ld/testsuite/ld-cdtest/cdtest.dat | 30 ++++-----
> ld/testsuite/ld-cdtest/cdtest.exp | 95 +++++++++++++--------------
> 3 files changed, 73 insertions(+), 78 deletions(-)
>
> diff --git a/ld/testsuite/ld-cdtest/cdtest-nrv.dat b/ld/testsuite/ld-cdtest/cdtest-nrv.dat
> index d3f871ff108..76fcbaa03d4 100644
> --- a/ld/testsuite/ld-cdtest/cdtest-nrv.dat
> +++ b/ld/testsuite/ld-cdtest/cdtest-nrv.dat
> @@ -1,13 +1,13 @@
> -Constructing Foo(1) "static_foo"
> -Constructing Foo(2) "static_foo"
> -Constructing Foo(3) "automatic_foo"
> -Constructing Foo(4) "default-foo"
> -Constructing Foo(5) "other_foo1"
> -Constructing Foo(6) "other_foo2"
> -Copying Foo(5) "other_foo1" to Foo(6)
> -Destructing Foo(6) "other_foo1" (remaining foos: 5)
> -Destructing Foo(5) "other_foo1" (remaining foos: 4)
> -Destructing Foo(4) "default-foo" (remaining foos: 3)
> -Destructing Foo(3) "automatic_foo" (remaining foos: 2)
> -Destructing Foo(2) "static_foo" (remaining foos: 1)
> -Destructing Foo(1) "static_foo" (remaining foos: 0)
> +Constructing Foo\(1\) "static_foo"
> +Constructing Foo\(2\) "static_foo"
> +Constructing Foo\(3\) "automatic_foo"
> +Constructing Foo\(4\) "default-foo"
> +Constructing Foo\(5\) "other_foo1"
> +Constructing Foo\(6\) "other_foo2"
> +Copying Foo\(5\) "other_foo1" to Foo\(6\)
> +Destructing Foo\(6\) "other_foo1" \(remaining foos: 5\)
> +Destructing Foo\(5\) "other_foo1" \(remaining foos: 4\)
> +Destructing Foo\(4\) "default-foo" \(remaining foos: 3\)
> +Destructing Foo\(3\) "automatic_foo" \(remaining foos: 2\)
> +Destructing Foo\(2\) "static_foo" \(remaining foos: 1\)
> +Destructing Foo\(1\) "static_foo" \(remaining foos: 0\)
> diff --git a/ld/testsuite/ld-cdtest/cdtest.dat b/ld/testsuite/ld-cdtest/cdtest.dat
> index 39be0dbc2c7..c0bdffb3c26 100644
> --- a/ld/testsuite/ld-cdtest/cdtest.dat
> +++ b/ld/testsuite/ld-cdtest/cdtest.dat
> @@ -1,15 +1,15 @@
> -Constructing Foo(1) "static_foo"
> -Constructing Foo(2) "static_foo"
> -Constructing Foo(3) "automatic_foo"
> -Constructing Foo(4) "default-foo"
> -Initializing Foo(5) "default-foo" with Foo(4)
> -Destructing Foo(4) "default-foo" (remaining foos: 4)
> -Constructing Foo(5) "other_foo1"
> -Constructing Foo(6) "other_foo2"
> -Copying Foo(5) "other_foo1" to Foo(6)
> -Destructing Foo(6) "other_foo1" (remaining foos: 5)
> -Destructing Foo(5) "other_foo1" (remaining foos: 4)
> -Destructing Foo(5) "default-foo" (remaining foos: 3)
> -Destructing Foo(3) "automatic_foo" (remaining foos: 2)
> -Destructing Foo(2) "static_foo" (remaining foos: 1)
> -Destructing Foo(1) "static_foo" (remaining foos: 0)
> +Constructing Foo\(1\) "static_foo"
> +Constructing Foo\(2\) "static_foo"
> +Constructing Foo\(3\) "automatic_foo"
> +Constructing Foo\(4\) "default-foo"
> +Initializing Foo\(5\) "default-foo" with Foo\(4\)
> +Destructing Foo\(4\) "default-foo" \(remaining foos: 4\)
> +Constructing Foo\(5\) "other_foo1"
> +Constructing Foo\(6\) "other_foo2"
> +Copying Foo\(5\) "other_foo1" to Foo\(6\)
> +Destructing Foo\(6\) "other_foo1" \(remaining foos: 5\)
> +Destructing Foo\(5\) "other_foo1" \(remaining foos: 4\)
> +Destructing Foo\(5\) "default-foo" \(remaining foos: 3\)
> +Destructing Foo\(3\) "automatic_foo" \(remaining foos: 2\)
> +Destructing Foo\(2\) "static_foo" \(remaining foos: 1\)
> +Destructing Foo\(1\) "static_foo" \(remaining foos: 0\)
> diff --git a/ld/testsuite/ld-cdtest/cdtest.exp b/ld/testsuite/ld-cdtest/cdtest.exp
> index 89fdd581abb..81547af3c9e 100644
> --- a/ld/testsuite/ld-cdtest/cdtest.exp
> +++ b/ld/testsuite/ld-cdtest/cdtest.exp
> @@ -28,11 +28,7 @@ set test1 "cdtest"
> set test2 "cdtest with -Ur"
>
> # This test requires running the executable generated by ld.
> -if ![isnative] {
> - return
> -}
> -
> -if { [which $CXX_FOR_TARGET] == 0 } {
> +if { [which $CXX_FOR_TARGET] == 0 || ![check_execution_available] } {
> untested $test1
> untested $test2
> return
> @@ -51,44 +47,39 @@ set expected_output "$srcdir/$subdir/cdtest.dat"
> if ![ld_link $CC_FOR_TARGET tmpdir/cdtest "$CFLAGS_FOR_TARGET tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o"] {
> fail $test1
> } else {
> - send_log "tmpdir/cdtest >tmpdir/cdtest.out\n"
> - verbose "tmpdir/cdtest >tmpdir/cdtest.out"
> - catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output
> + set failed 0
>
> - if ![string match "" $exec_output] then {
> + send_log "Running: tmpdir/cdtest\n"
> + verbose "Running: tmpdir/cdtest"
> + set state [remote_load target tmpdir/cdtest]
> + set status [lindex $state 0]
> + set exec_output [lindex $state 1]
> +
> + if { $status != "pass" } {
> send_log "$exec_output\n"
> verbose "$exec_output" 1
> -
> - fail $test1
> + set failed 1
> } else {
> - send_log "diff tmpdir/cdtest.out $expected_output\n"
> - verbose "diff tmpdir/cdtest.out $expected_output"
> - catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
> - set exec_output [prune_warnings $exec_output]
> -
> - if ![string match "" $exec_output] then {
> - send_log "$exec_output\n"
> - verbose "$exec_output" 1
> + set output_filename "tmpdir/cdtest.out"
> + set_file_contents $output_filename $exec_output
>
> + send_log [file_contents $output_filename]
> + verbose [file_contents $output_filename] 2
> + if [regexp_diff $output_filename $expected_output] {
> send_log "Checking against Named Return Value optimization\n"
> verbose "Checking against Named Return Value optimization" 1
>
> set expected_output "$srcdir/$subdir/cdtest-nrv.dat"
> -
> - send_log "diff tmpdir/cdtest.out $expected_output\n"
> - verbose "diff tmpdir/cdtest.out $expected_output"
> - catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
> - set exec_output [prune_warnings $exec_output]
> + if [regexp_diff $output_filename $expected_output] {
> + set failed 1
> + }
> }
> + }
>
> - if [string match "" $exec_output] then {
> - pass $test1
> - } else {
> - send_log "$exec_output\n"
> - verbose "$exec_output" 1
> -
> - fail $test1
> - }
> + if { $failed != 0 } {
> + fail $test1
> + } else {
> + pass $test1
> }
> }
>
> @@ -103,29 +94,33 @@ if ![ld_relocate $ld tmpdir/cdtest.o {-Ur tmpdir/cdtest-foo.o tmpdir/cdtest-bar.
> if ![ld_link $CC_FOR_TARGET tmpdir/cdtest "$CFLAGS_FOR_TARGET tmpdir/cdtest.o"] {
> fail $test2
> } else {
> - send_log "tmpdir/cdtest >tmpdir/cdtest.out\n"
> - verbose "tmpdir/cdtest >tmpdir/cdtest.out"
> - catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output
> + set failed 0
> +
> + send_log "Running: tmpdir/cdtest\n"
> + verbose "Running: tmpdir/cdtest"
> + set state [remote_load target tmpdir/cdtest]
> + set status [lindex $state 0]
> + set exec_output [lindex $state 1]
>
> - if ![string match "" $exec_output] then {
> + if { $status != "pass" } {
> send_log "$exec_output\n"
> - verbose "$exec_output" 1
> + verbose "$exec_output" 1
> + set failed 1
> + } else {
> + set output_filename "tmpdir/cdtest.out"
> + set_file_contents $output_filename $exec_output
>
> + send_log [file_contents $output_filename]
> + verbose [file_contents $output_filename] 2
> + if [regexp_diff $output_filename $expected_output] {
> + set failed 1
> + }
> + }
> +
> + if { $failed != 0 } {
> fail $test2
> } else {
> - send_log "diff tmpdir/cdtest.out $expected_output\n"
> - verbose "diff tmpdir/cdtest.out $expected_output"
> - catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
> - set exec_output [prune_warnings $exec_output]
> -
> - if [string match "" $exec_output] then {
> - pass $test2
> - } else {
> - send_log "$exec_output\n"
> - verbose "$exec_output" 1
> -
> - fail $test2
> - }
> + pass $test2
> }
> }
> }
> --
> 2.43.0
>
On Thu, Jun 18, 2026 at 9:58 AM Clément Chigot <chigot@adacore.com> wrote:
>
> This converts the existing to code to use "remote_load" allowing
> execution on both native and remote targets.
>
> The "diff" between the output and the expected result has been
> transformed to the usual regexp_diff. The previous could have been
> transformed into `remote_exec build diff` but tends to be fickled with
> new lines.
> ---
> ld/testsuite/ld-cdtest/cdtest-nrv.dat | 26 ++++----
> ld/testsuite/ld-cdtest/cdtest.dat | 30 ++++-----
> ld/testsuite/ld-cdtest/cdtest.exp | 95 +++++++++++++--------------
> 3 files changed, 73 insertions(+), 78 deletions(-)
>
> diff --git a/ld/testsuite/ld-cdtest/cdtest-nrv.dat b/ld/testsuite/ld-cdtest/cdtest-nrv.dat
> index d3f871ff108..76fcbaa03d4 100644
> --- a/ld/testsuite/ld-cdtest/cdtest-nrv.dat
> +++ b/ld/testsuite/ld-cdtest/cdtest-nrv.dat
> @@ -1,13 +1,13 @@
> -Constructing Foo(1) "static_foo"
> -Constructing Foo(2) "static_foo"
> -Constructing Foo(3) "automatic_foo"
> -Constructing Foo(4) "default-foo"
> -Constructing Foo(5) "other_foo1"
> -Constructing Foo(6) "other_foo2"
> -Copying Foo(5) "other_foo1" to Foo(6)
> -Destructing Foo(6) "other_foo1" (remaining foos: 5)
> -Destructing Foo(5) "other_foo1" (remaining foos: 4)
> -Destructing Foo(4) "default-foo" (remaining foos: 3)
> -Destructing Foo(3) "automatic_foo" (remaining foos: 2)
> -Destructing Foo(2) "static_foo" (remaining foos: 1)
> -Destructing Foo(1) "static_foo" (remaining foos: 0)
> +Constructing Foo\(1\) "static_foo"
> +Constructing Foo\(2\) "static_foo"
> +Constructing Foo\(3\) "automatic_foo"
> +Constructing Foo\(4\) "default-foo"
> +Constructing Foo\(5\) "other_foo1"
> +Constructing Foo\(6\) "other_foo2"
> +Copying Foo\(5\) "other_foo1" to Foo\(6\)
> +Destructing Foo\(6\) "other_foo1" \(remaining foos: 5\)
> +Destructing Foo\(5\) "other_foo1" \(remaining foos: 4\)
> +Destructing Foo\(4\) "default-foo" \(remaining foos: 3\)
> +Destructing Foo\(3\) "automatic_foo" \(remaining foos: 2\)
> +Destructing Foo\(2\) "static_foo" \(remaining foos: 1\)
> +Destructing Foo\(1\) "static_foo" \(remaining foos: 0\)
> diff --git a/ld/testsuite/ld-cdtest/cdtest.dat b/ld/testsuite/ld-cdtest/cdtest.dat
> index 39be0dbc2c7..c0bdffb3c26 100644
> --- a/ld/testsuite/ld-cdtest/cdtest.dat
> +++ b/ld/testsuite/ld-cdtest/cdtest.dat
> @@ -1,15 +1,15 @@
> -Constructing Foo(1) "static_foo"
> -Constructing Foo(2) "static_foo"
> -Constructing Foo(3) "automatic_foo"
> -Constructing Foo(4) "default-foo"
> -Initializing Foo(5) "default-foo" with Foo(4)
> -Destructing Foo(4) "default-foo" (remaining foos: 4)
> -Constructing Foo(5) "other_foo1"
> -Constructing Foo(6) "other_foo2"
> -Copying Foo(5) "other_foo1" to Foo(6)
> -Destructing Foo(6) "other_foo1" (remaining foos: 5)
> -Destructing Foo(5) "other_foo1" (remaining foos: 4)
> -Destructing Foo(5) "default-foo" (remaining foos: 3)
> -Destructing Foo(3) "automatic_foo" (remaining foos: 2)
> -Destructing Foo(2) "static_foo" (remaining foos: 1)
> -Destructing Foo(1) "static_foo" (remaining foos: 0)
> +Constructing Foo\(1\) "static_foo"
> +Constructing Foo\(2\) "static_foo"
> +Constructing Foo\(3\) "automatic_foo"
> +Constructing Foo\(4\) "default-foo"
> +Initializing Foo\(5\) "default-foo" with Foo\(4\)
> +Destructing Foo\(4\) "default-foo" \(remaining foos: 4\)
> +Constructing Foo\(5\) "other_foo1"
> +Constructing Foo\(6\) "other_foo2"
> +Copying Foo\(5\) "other_foo1" to Foo\(6\)
> +Destructing Foo\(6\) "other_foo1" \(remaining foos: 5\)
> +Destructing Foo\(5\) "other_foo1" \(remaining foos: 4\)
> +Destructing Foo\(5\) "default-foo" \(remaining foos: 3\)
> +Destructing Foo\(3\) "automatic_foo" \(remaining foos: 2\)
> +Destructing Foo\(2\) "static_foo" \(remaining foos: 1\)
> +Destructing Foo\(1\) "static_foo" \(remaining foos: 0\)
> diff --git a/ld/testsuite/ld-cdtest/cdtest.exp b/ld/testsuite/ld-cdtest/cdtest.exp
> index 89fdd581abb..81547af3c9e 100644
> --- a/ld/testsuite/ld-cdtest/cdtest.exp
> +++ b/ld/testsuite/ld-cdtest/cdtest.exp
> @@ -28,11 +28,7 @@ set test1 "cdtest"
> set test2 "cdtest with -Ur"
>
> # This test requires running the executable generated by ld.
> -if ![isnative] {
> - return
> -}
> -
> -if { [which $CXX_FOR_TARGET] == 0 } {
> +if { [which $CXX_FOR_TARGET] == 0 || ![check_execution_available] } {
> untested $test1
> untested $test2
> return
> @@ -51,44 +47,39 @@ set expected_output "$srcdir/$subdir/cdtest.dat"
> if ![ld_link $CC_FOR_TARGET tmpdir/cdtest "$CFLAGS_FOR_TARGET tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o"] {
> fail $test1
> } else {
> - send_log "tmpdir/cdtest >tmpdir/cdtest.out\n"
> - verbose "tmpdir/cdtest >tmpdir/cdtest.out"
> - catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output
> + set failed 0
>
> - if ![string match "" $exec_output] then {
> + send_log "Running: tmpdir/cdtest\n"
> + verbose "Running: tmpdir/cdtest"
> + set state [remote_load target tmpdir/cdtest]
> + set status [lindex $state 0]
> + set exec_output [lindex $state 1]
> +
> + if { $status != "pass" } {
> send_log "$exec_output\n"
> verbose "$exec_output" 1
> -
> - fail $test1
> + set failed 1
> } else {
> - send_log "diff tmpdir/cdtest.out $expected_output\n"
> - verbose "diff tmpdir/cdtest.out $expected_output"
> - catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
> - set exec_output [prune_warnings $exec_output]
> -
> - if ![string match "" $exec_output] then {
> - send_log "$exec_output\n"
> - verbose "$exec_output" 1
> + set output_filename "tmpdir/cdtest.out"
> + set_file_contents $output_filename $exec_output
>
> + send_log [file_contents $output_filename]
> + verbose [file_contents $output_filename] 2
> + if [regexp_diff $output_filename $expected_output] {
> send_log "Checking against Named Return Value optimization\n"
> verbose "Checking against Named Return Value optimization" 1
>
> set expected_output "$srcdir/$subdir/cdtest-nrv.dat"
> -
> - send_log "diff tmpdir/cdtest.out $expected_output\n"
> - verbose "diff tmpdir/cdtest.out $expected_output"
> - catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
> - set exec_output [prune_warnings $exec_output]
> + if [regexp_diff $output_filename $expected_output] {
> + set failed 1
> + }
> }
> + }
>
> - if [string match "" $exec_output] then {
> - pass $test1
> - } else {
> - send_log "$exec_output\n"
> - verbose "$exec_output" 1
> -
> - fail $test1
> - }
> + if { $failed != 0 } {
> + fail $test1
> + } else {
> + pass $test1
> }
> }
>
> @@ -103,29 +94,33 @@ if ![ld_relocate $ld tmpdir/cdtest.o {-Ur tmpdir/cdtest-foo.o tmpdir/cdtest-bar.
> if ![ld_link $CC_FOR_TARGET tmpdir/cdtest "$CFLAGS_FOR_TARGET tmpdir/cdtest.o"] {
> fail $test2
> } else {
> - send_log "tmpdir/cdtest >tmpdir/cdtest.out\n"
> - verbose "tmpdir/cdtest >tmpdir/cdtest.out"
> - catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output
> + set failed 0
> +
> + send_log "Running: tmpdir/cdtest\n"
> + verbose "Running: tmpdir/cdtest"
> + set state [remote_load target tmpdir/cdtest]
> + set status [lindex $state 0]
> + set exec_output [lindex $state 1]
>
> - if ![string match "" $exec_output] then {
> + if { $status != "pass" } {
> send_log "$exec_output\n"
> - verbose "$exec_output" 1
> + verbose "$exec_output" 1
> + set failed 1
> + } else {
> + set output_filename "tmpdir/cdtest.out"
> + set_file_contents $output_filename $exec_output
>
> + send_log [file_contents $output_filename]
> + verbose [file_contents $output_filename] 2
> + if [regexp_diff $output_filename $expected_output] {
> + set failed 1
> + }
> + }
> +
> + if { $failed != 0 } {
> fail $test2
> } else {
> - send_log "diff tmpdir/cdtest.out $expected_output\n"
> - verbose "diff tmpdir/cdtest.out $expected_output"
> - catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
> - set exec_output [prune_warnings $exec_output]
> -
> - if [string match "" $exec_output] then {
> - pass $test2
> - } else {
> - send_log "$exec_output\n"
> - verbose "$exec_output" 1
> -
> - fail $test2
> - }
> + pass $test2
> }
> }
> }
> --
> 2.43.0
>
More information about the Binutils
mailing list