aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2024-01-26 15:23:19 +0000
committerIain Sandoe <iain@sandoe.co.uk>2024-02-02 15:46:08 +0000
commitae061a1757b2c76ddf4cc2c84b433fe1cd6dd7f7 (patch)
treee04f6d53106beb0195d224c2614614d5577b0b38 /gcc
parenta6afa0d06b0559b22be829ff197495d5c8653b96 (diff)
downloadgcc-ae061a1757b2c76ddf4cc2c84b433fe1cd6dd7f7.zip
gcc-ae061a1757b2c76ddf4cc2c84b433fe1cd6dd7f7.tar.gz
gcc-ae061a1757b2c76ddf4cc2c84b433fe1cd6dd7f7.tar.bz2
testsuite, ubsan: Add libstdc++ deps where required.
We use the ubsan tests from both C, C++, D and Fortran. thee sanitizer libraries link to libstdc++. When we are using the C/gdc/gfortran driver, and the target might require a path to the libstdc++ (e.g. for handing -static-xxxx or for embedded runpaths), we need to add a suitable option (or we get fails at execution time because of the missing paths). Conversely, we do not want to add multiple instances of these paths (since that leads to failures on tools that report warnings for duplicate runpaths). This patch modifies the _init function to allow a sigle parameter that determines whether the *asan_init should add a path for libstdc++ (yes for C driver, no for C++ driver). gcc/testsuite/ChangeLog: * g++.dg/ubsan/ubsan.exp:Add a parameter to init to say that we expect the C++ driver to provide paths for libstdc++. * gcc.dg/ubsan/ubsan.exp: Add a parameter to init to say that we need a path added for libstdc++. * gdc.dg/ubsan/ubsan.exp: Likewise. * gfortran.dg/ubsan/ubsan.exp: Likewise. * lib/ubsan-dg.exp: Handle a single parameter to init that requests addition of a path to libstdc++ to link flags.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/g++.dg/ubsan/ubsan.exp3
-rw-r--r--gcc/testsuite/gcc.dg/ubsan/ubsan.exp3
-rw-r--r--gcc/testsuite/gdc.dg/ubsan/ubsan.exp3
-rw-r--r--gcc/testsuite/gfortran.dg/ubsan/ubsan.exp4
-rw-r--r--gcc/testsuite/lib/ubsan-dg.exp20
5 files changed, 23 insertions, 10 deletions
diff --git a/gcc/testsuite/g++.dg/ubsan/ubsan.exp b/gcc/testsuite/g++.dg/ubsan/ubsan.exp
index d719707..4bab1b8 100644
--- a/gcc/testsuite/g++.dg/ubsan/ubsan.exp
+++ b/gcc/testsuite/g++.dg/ubsan/ubsan.exp
@@ -22,7 +22,8 @@ load_lib ubsan-dg.exp
# Initialize `dg'.
dg-init
-ubsan_init
+# libubsan uses libstdc++ but we assume that's added by the g++ impl.
+ubsan_init 0
# Main loop.
if [check_effective_target_fsanitize_undefined] {
diff --git a/gcc/testsuite/gcc.dg/ubsan/ubsan.exp b/gcc/testsuite/gcc.dg/ubsan/ubsan.exp
index 8417049..560e584 100644
--- a/gcc/testsuite/gcc.dg/ubsan/ubsan.exp
+++ b/gcc/testsuite/gcc.dg/ubsan/ubsan.exp
@@ -24,7 +24,8 @@ load_lib ubsan-dg.exp
# Initialize `dg'.
dg-init
-ubsan_init
+# libubsan uses libstdc++ so make sure we provide paths for it.
+ubsan_init 1
# Main loop.
if [check_effective_target_fsanitize_undefined] {
diff --git a/gcc/testsuite/gdc.dg/ubsan/ubsan.exp b/gcc/testsuite/gdc.dg/ubsan/ubsan.exp
index 6ad665a..7613a3b 100644
--- a/gcc/testsuite/gdc.dg/ubsan/ubsan.exp
+++ b/gcc/testsuite/gdc.dg/ubsan/ubsan.exp
@@ -20,7 +20,8 @@ load_lib ubsan-dg.exp
# Initialize `dg'.
dg-init
-ubsan_init
+# libubsan uses libstdc++ so make sure we provide paths for it.
+ubsan_init 1
# Main loop.
if [check_effective_target_fsanitize_undefined] {
diff --git a/gcc/testsuite/gfortran.dg/ubsan/ubsan.exp b/gcc/testsuite/gfortran.dg/ubsan/ubsan.exp
index 0c61153..b236078 100644
--- a/gcc/testsuite/gfortran.dg/ubsan/ubsan.exp
+++ b/gcc/testsuite/gfortran.dg/ubsan/ubsan.exp
@@ -22,10 +22,10 @@
load_lib gfortran-dg.exp
load_lib ubsan-dg.exp
-
# Initialize `dg'.
dg-init
-ubsan_init
+# libubsan uses libstdc++ so make sure we provide paths for it.
+ubsan_init 1
# Main loop.
if [check_effective_target_fsanitize_undefined] {
diff --git a/gcc/testsuite/lib/ubsan-dg.exp b/gcc/testsuite/lib/ubsan-dg.exp
index 108b998..860e78f 100644
--- a/gcc/testsuite/lib/ubsan-dg.exp
+++ b/gcc/testsuite/lib/ubsan-dg.exp
@@ -31,7 +31,7 @@ proc check_effective_target_fsanitize_undefined {} {
# (originally from g++.exp)
#
-proc ubsan_link_flags { paths } {
+proc ubsan_link_flags { paths needs_cxx } {
global srcdir
global ld_library_path
global shlib_ext
@@ -43,15 +43,24 @@ proc ubsan_link_flags { paths } {
set shlib_ext [get_shlib_extension]
set ubsan_saved_library_path $ld_library_path
+ # Providing -B instead of -L means that it works for targets that use
+ # spec substitution for handling -static-xxxxx, it also works for targets
+ # the use the startfile paths to provide a runpath for uninstalled test.
+ # Each -B option will produce a -L on the link line (for paths that exist).
if { $gccpath != "" } {
if { [file exists "${gccpath}/libsanitizer/ubsan/.libs/libubsan.a"]
|| [file exists "${gccpath}/libsanitizer/ubsan/.libs/libubsan.${shlib_ext}"] } {
append flags " -B${gccpath}/libsanitizer/ "
append flags " -B${gccpath}/libsanitizer/ubsan/ "
- append flags " -L${gccpath}/libsanitizer/ubsan/.libs"
+ append flags " -B${gccpath}/libsanitizer/ubsan/.libs"
append ld_library_path ":${gccpath}/libsanitizer/ubsan/.libs"
- append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
}
+ # libasan links to libstdc++, so we must include it for C testcases.
+ if { $needs_cxx && ( [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"]
+ || [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] ) } {
+ append flags " -B${gccpath}/libstdc++-v3/src/.libs "
+ append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
+ }
} else {
global tool_root_dir
@@ -79,6 +88,7 @@ proc ubsan_init { args } {
global ubsan_saved_ALWAYS_CXXFLAGS
global orig_ubsan_options_saved
global orig_ubsan_options
+ set needs_cxx [lindex $args 0]
if { $orig_ubsan_options_saved == 0 } {
# Save the original environment.
@@ -92,9 +102,9 @@ proc ubsan_init { args } {
set link_flags ""
if ![is_remote host] {
if [info exists TOOL_OPTIONS] {
- set link_flags "[ubsan_link_flags [get_multilibs ${TOOL_OPTIONS}]]"
+ set link_flags "[ubsan_link_flags [get_multilibs ${TOOL_OPTIONS}] $needs_cxx]"
} else {
- set link_flags "[ubsan_link_flags [get_multilibs]]"
+ set link_flags "[ubsan_link_flags [get_multilibs] $needs_cxx]"
}
}