On Mon, Apr 26, 2021 at 11:50 AM Jonathan Wakely <jwak...@redhat.com> wrote: > > On 26/04/21 09:17 -0400, David Edelsohn via Libstdc++ wrote: > >On Mon, Apr 26, 2021 at 7:19 AM Jonathan Wakely <jwak...@redhat.com> wrote: > >> > >> 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. > > > >The testsuite directory in the build tree would be > > > >./libstdc++-v3/testsuite > > > >and the original libatomic search path support unilaterally would add > > > >../../libatomic/.libs > > > >to the link path. > > > >But if one runs the testsuite with parallelism, the testsuite adds an > >additional level of subdirectories, e.g., > > > >./libstdc++-v3/testsuite/normal1 > >./libstdc++-v3/testsuite/normal2 > >./libstdc++-v3/testsuite/normal3 > > Right, I understand the problem in theory (though I still question > whether it's even theoretically a problem for multilib paths), but my > point is that I don't see a problem in practice. It works fine. So I'm > curious why it works for me and not for you. > > I've never seen this cause a problem on any target, with any level of > parallelism. > > >in which case ../../libatomic is not the correct path and "../.." > >doesn't point into the root of the target libraries directory. > >Depending on whether the testsuite is invoked with or without > >parallelism, one needs an additional ".." in the libatomic path. The > >patch uses the same logic as other parts of the testsuite to determine > >the path relative to the gcc build directory, including the > >TOOL_OPTIONS. > > All you've done is restate the description of the patch. I read it. I > understand it. Please re-read my email. I'm not asking what the patch > does, I'm trying to find out why you need the patch and I don't. > > It turns out that on gcc119 -L wrong-path/libatomic -latomic is > causing the tests to link to /usr/lib/libatomic.a (and ignoring the -L > option). So that answers my question. I wasn't seeing it because some > other libatomic was being found when the -L path was wrong.
Most targets do not need libatomic. libatomic only is added to the link libraries for a few, specific targets (hpux, ppc32, riscv, sparc32). And the testcases work if an older version of libatomic is installed in the search path. If I configure GCC with a prefix where I have libatomic already installed, it works. Thanks, David