[PATCH, libstdc++ testsuite] Correct path to libatomic

Jonathan Wakely jwakely@redhat.com
Mon Apr 26 11:19:30 GMT 2021


On 23/04/21 20:54 -0400, David Edelsohn via Libstdc++ wrote:
>Some ports require libatomic for atomic operations, at least for some
>data types and widths.  The libstdc++ testsuite previously was updated
>to link against libatomic, but the search path was hard-coded to
>something that is not always correct, and the shared library search
>path was not set.

In libstdc++_init we have:

     # Locate libatomic.
     set v3-libatomic 0
     set libatomicdir [lookfor_file $blddir/../libatomic .libs/libatomic.$shlib_ext]
     if {$libatomicdir != ""} {
	set v3-libatomic 1
	set libatomicdir [file dirname $libatomicdir]
	append ld_library_path_tmp ":${libatomicdir}"
	verbose -log "libatomic support detected"
     }
     v3track libatomicdir 3

Which should have added it to the search path unconditionally, so that
it will be found if a test is linked with -latomic and needs it. I
Don't know why that's not working for AIX, I see it doing the right
thing in the logs for x86_64-linux (and the path is right for the
alternative unix/-m32 multilib tests):

libatomic support detected
libgomp support detected
shared library support detected
LD_LIBRARY_PATH=:/home/jwakely/src/gcc/build/gcc:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libatomic/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libgomp/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/src/.libs:/home/jwakely/src/gcc/build/gcc/32
LD_RUN_PATH=:/home/jwakely/src/gcc/build/gcc:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libatomic/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libgomp/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/src/.libs:/home/jwakely/src/gcc/build/gcc/32
SHLIB_PATH=:/home/jwakely/src/gcc/build/gcc:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libatomic/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libgomp/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/src/.libs:/home/jwakely/src/gcc/build/gcc/32
LD_LIBRARY_PATH_32=:/home/jwakely/src/gcc/build/gcc:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libatomic/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libgomp/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/src/.libs:/home/jwakely/src/gcc/build/gcc/32
LD_LIBRARY_PATH_64=:/home/jwakely/src/gcc/build/gcc:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libatomic/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libgomp/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/src/.libs:/home/jwakely/src/gcc/build/gcc/32
DYLD_LIBRARY_PATH=:/home/jwakely/src/gcc/build/gcc:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libatomic/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libgomp/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/src/.libs:/home/jwakely/src/gcc/build/gcc/32
LD_LIBRARY_PATH = :/home/jwakely/src/gcc/build/gcc:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libatomic/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/../libgomp/.libs:/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/32/libstdc++-v3/src/.libs:/home/jwakely/src/gcc/build/gcc/32

>The search path was hard-coded to the expected location of the
>libatomic build directory relative to the libstdc++ testsuite
>directory, but if one uses parallelism when invoking the libstdc++
>testsuite, the tests are run in the "normalXX" sub-directories, for
>which the hard-coded search path is incorrect.

This has occurred to me previously, and I checked it, and it works
fine for parallel test runs. I must be running the tests differently
from you, as I can't reproruce the problem.

For example, in r11-8285 I added the libatomic options to
30_threads/semaphore/try_acquire_posix.cc because it was failing on
AIX (on gcc119 specifically). With the { dg-add-options libatomic } in
place it no longer fails. That is true for parallel and non-parallel
test runs, and whether I run "make check" in the $target/libstdc++-v3
directory, or $target/libstdc++-v3/testsuite, or run make
check-target-libstdc++-v3 in the top-level build dir.

>The path also is
>incorrect for alternative multilib and tool options.

Is it?  For alternative multilibs we have something like:

./libstdc++/testsuite
./libatomic/.libs
ppc64/libstdc++-v3/testsuite
ppc64/libatomic/.libs
pthread/libstdc++-v3/testsuite
pthread/libatomic/.libs

In each case, the relative path from the v3/testsuite directory to
libatomic.a ia the same, ../../libatomic/.src

The patch seems like an improvement, but I don't see the problem it
was fixing.

>This patch adopts the logic from gcc/testsuite/lib/atomic-dg.exp to
>search for the library and adds the logic to the libstdc++ testsuite
>libatomic seatch path code.  Previously the libstdc++ testsuite atomic
>tests failed depending on the build configuration and if a build of
>libatomic was installed in the default search path.
>
>Bootstrapped on powerpc-ibm-aix7.2.3.0.
>
>Okay to install?
>
>Thanks, David
>
>* testsuite/lib/dg-options.exp (atomic_link_flags): New.
>(add_options_for_libatomic): Use atomic_link_flags.
>
>--- a/libstdc++-v3/testsuite/lib/dg-options.exp
>+++ b/libstdc++-v3/testsuite/lib/dg-options.exp
>@@ -260,13 +260,58 @@ proc add_options_for_net_ts { flags } {
> # Add to FLAGS all the target-specific flags to link to libatomic,
> # if required for atomics on pointers and 64-bit types.
>
>+proc atomic_link_flags { paths } {
>+    global srcdir
>+    global ld_library_path
>+    global shlib_ext
>+
>+    set gccpath ${paths}
>+    set flags ""
>+
>+    set shlib_ext [get_shlib_extension]
>+
>+    if { $gccpath != "" } {
>+      if { [file exists "${gccpath}/libatomic/.libs/libatomic.a"]
>+           || [file exists "${gccpath}/libatomic/.libs/libatomic.${shlib_ext}"]
> } {
>+          append flags " -B${gccpath}/libatomic/ "
>+          append flags " -L${gccpath}/libatomic/.libs"
>+          append ld_library_path ":${gccpath}/libatomic/.libs"
>+      }
>+    } else {
>+      global tool_root_dir
>+
>+      set libatomic [lookfor_file ${tool_root_dir} libatomic]
>+      if { $libatomic != "" } {
>+          append flags "-L${libatomic} "
>+          append ld_library_path ":${libatomic}"
>+      }
>+    }
>+
>+    set_ld_library_path_env_vars
>+
>+    return "$flags"
>+}
>+
> proc add_options_for_libatomic { flags } {
>     if { [istarget hppa*-*-hpux*]
>         || ([istarget powerpc*-*-*] && [check_effective_target_ilp32])
>         || [istarget riscv*-*-*]
>         || ([istarget sparc*-*-linux-gnu] && [check_effective_target_ilp32])
>        } {
>-       return "$flags -L../../libatomic/.libs -latomic"
>+       global TOOL_OPTIONS
>+
>+       set link_flags ""
>+       if ![is_remote host] {
>+           if [info exists TOOL_OPTIONS] {
>+               set link_flags "[atomic_link_flags [get_multilibs
>${TOOL_OPTIONS}]]"
>+           } else {
>+               set link_flags "[atomic_link_flags [get_multilibs]]"
>+           }
>+       }
>+
>+       append link_flags " -latomic "
>+
>+       return "$flags $link_flags"
>     }
>     return $flags
> }
>



More information about the Libstdc++ mailing list