[PATCH] ld/testsuite: add support for remote testing in ld-cdtest

Clément Chigot chigot@adacore.com
Tue Jun 16 14:12:06 GMT 2026


On Fri, May 29, 2026 at 3:52 PM 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     | 96 +++++++++++++--------------
>  3 files changed, 73 insertions(+), 79 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..ccfcbaf226a 100644
> --- a/ld/testsuite/ld-cdtest/cdtest.exp
> +++ b/ld/testsuite/ld-cdtest/cdtest.exp
> @@ -27,11 +27,6 @@
>  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 } {
>      untested $test1
>      untested $test2
> @@ -51,44 +46,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 +93,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

There is a minor mistake here, it should be "set failed 1". Otherwise,
we get a duplicate FAIL.
@Alan Modra  still ok for master ?

>      } 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 "$exec_output\n"
> -           verbose  "$exec_output" 1
> +       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]
>
> -           fail $test2
> +       if { $status != "pass" } {
> +           send_log "$exec_output\n"
> +           verbose "$exec_output" 1
> +           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 {
> -               pass $test2
> -           } else {
> -               send_log "$exec_output\n"
> -               verbose  "$exec_output" 1
> -
> -               fail $test2
> +           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 {
> +       pass $test2
> +    }
>  }
> --
> 2.43.0
>


More information about the Binutils mailing list