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 }