[PATCH v2] ld/testsuite: add support for remote testing in ld-cdtest
Clément Chigot
chigot@adacore.com
Tue Jun 30 07:55:10 GMT 2026
On Thu, Jun 18, 2026 at 10:04 AM Clément Chigot <chigot@adacore.com> wrote:
>
> 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.
Gentle ping to Maciej.
Otherwise, Alan ok to merge in a few days if he doesn't answer ?
> > ---
> > 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