[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