fb6b24c66e
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. 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. The path also is incorrect for alternative multilib and tool options. 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. libstdc++-v3/ChangeLog: * testsuite/lib/dg-options.exp (atomic_link_flags): New. (add_options_for_libatomic): Use atomic_link_flags.
340 lines
8.4 KiB
Plaintext
340 lines
8.4 KiB
Plaintext
# Handlers for additional dg-xxx keywords in tests.
|
|
|
|
# Copyright (C) 2004-2021 Free Software Foundation, Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; see the file COPYING3. If not see
|
|
# <http://www.gnu.org/licenses/>.
|
|
|
|
proc dg-require-c-std { args } {
|
|
if { ![ check_v3_target_c_std ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-debug-mode { args } {
|
|
if { ![ check_v3_target_debug_mode ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-profile-mode { args } {
|
|
if { ![ check_v3_target_profile_mode ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-normal-mode { args } {
|
|
if { ![ check_v3_target_normal_mode ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-normal-namespace { args } {
|
|
if { ![ check_v3_target_normal_namespace ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-parallel-mode { args } {
|
|
if { ![ check_v3_target_parallel_mode ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-fileio { args } {
|
|
if { ![ check_v3_target_fileio ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-namedlocale { args } {
|
|
if { ![ check_v3_target_namedlocale [lindex $args 1] ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-sharedlib { args } {
|
|
if { ![ check_v3_target_sharedlib ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-time { args } {
|
|
if { ![ check_v3_target_time ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-cstdint { args } {
|
|
if { ![ check_v3_target_cstdint ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-cmath { args } {
|
|
if { ![ check_v3_target_cmath ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-thread-fence { args } {
|
|
if { ![ check_v3_target_thread_fence ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-atomic-builtins { args } {
|
|
if { ![ check_v3_target_atomic_builtins ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-gthreads { args } {
|
|
if { ![ check_v3_target_gthreads ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-gthreads-timed { args } {
|
|
if { ![ check_v3_target_gthreads_timed ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-sleep { args } {
|
|
if { ![ check_v3_target_sleep ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-sched-yield { args } {
|
|
if { ![ check_v3_target_sched_yield ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-string-conversions { args } {
|
|
if { ![ check_v3_target_string_conversions ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-swprintf { args } {
|
|
if { ![ check_v3_target_swprintf ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-binary-io { args } {
|
|
if { ![ check_v3_target_binary_io ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-nprocs { args } {
|
|
if { ![ check_v3_target_nprocs ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-static-libstdcxx { args } {
|
|
if { ![ check_v3_target_static_libstdcxx ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-little-endian { args } {
|
|
if { ![ check_v3_target_little_endian ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc dg-require-filesystem-ts { args } {
|
|
if { ![ check_v3_target_filesystem_ts ] } {
|
|
upvar dg-do-what dg-do-what
|
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
proc add_options_for_no_pch { flags } {
|
|
# This forces any generated and possibly included PCH to be invalid.
|
|
return "-D__GLIBCXX__=99999999"
|
|
}
|
|
|
|
# Add to FLAGS all the target-specific flags needed for networking.
|
|
|
|
proc add_options_for_net_ts { flags } {
|
|
# Before they were integrated into libc in Solaris 11.4, Solaris needs
|
|
# libsocket and libnsl for networking applications.
|
|
if { [istarget *-*-solaris2*] } {
|
|
return "$flags -lsocket -lnsl"
|
|
}
|
|
return $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])
|
|
} {
|
|
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
|
|
}
|
|
|
|
# Like dg-options, but adds to the default options rather than replacing them.
|
|
|
|
proc dg-additional-options { args } {
|
|
upvar dg-extra-tool-flags extra-tool-flags
|
|
|
|
if { [llength $args] > 3 } {
|
|
error "[lindex $args 0]: too many arguments"
|
|
return
|
|
}
|
|
|
|
if { [llength $args] >= 3 } {
|
|
switch [dg-process-target [lindex $args 2]] {
|
|
"S" { eval lappend extra-tool-flags [lindex $args 1] }
|
|
"N" { }
|
|
"F" { error "[lindex $args 0]: `xfail' not allowed here" }
|
|
"P" { error "[lindex $args 0]: `xfail' not allowed here" }
|
|
}
|
|
} else {
|
|
eval lappend extra-tool-flags [lindex $args 1]
|
|
}
|
|
}
|