diff options
author | Renlin Li <Renlin.Li@arm.com> | 2015-05-07 12:54:52 +0000 |
---|---|---|
committer | Renlin Li <Renlin.Li@arm.com> | 2015-05-07 12:54:52 +0000 |
commit | c4c88133145c3565e5589d65a2bd2fa9526e6ebe (patch) | |
tree | c4c0ac94572db7c0c9e644be38fa5a856d947800 | |
parent | e4a8392c93859e441dd352e66fd0b89e9a4e2e6c (diff) |
[PATCH][libstc++v3]Add new dg-require-thread-fence directive.
libstdc++-v3/
2015-05-07 Renlin Li <renlin.li@arm.com>
Backported from mainline
2015-04-22 Renlin Li <renlin.li@arm.com>
* testsuite/lib/dg-options.exp (dg-require-thread-fence): New.
* testsuite/lib/libstdc++.exp (check_v3_target_thread_fence): New.
* testsuite/29_atomics/atomic_flag/clear/1.cc: Use it.
* testsuite/29_atomics/atomic_flag/test_and_set/explicit.cc: Likewise.
* testsuite/29_atomics/atomic_flag/test_and_set/implicit.cc: Likewise.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@222876 138bc75d-0d04-0410-961f-82ee72b054a4
6 files changed, 79 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index be9060d682f..b42c6e74dda 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2015-05-07 Renlin Li <renlin.li@arm.com> + + Backported from mainline + 2015-04-22 Renlin Li <renlin.li@arm.com> + + * testsuite/lib/dg-options.exp (dg-require-thread-fence): New. + * testsuite/lib/libstdc++.exp (check_v3_target_thread_fence): New. + * testsuite/29_atomics/atomic_flag/clear/1.cc: Use it. + * testsuite/29_atomics/atomic_flag/test_and_set/explicit.cc: Likewise. + * testsuite/29_atomics/atomic_flag/test_and_set/implicit.cc: Likewise. + 2015-04-11 Jonathan Wakely <jwakely@redhat.com> * testsuite/30_threads/shared_lock/cons/5.cc: Remove diff --git a/libstdc++-v3/testsuite/29_atomics/atomic_flag/clear/1.cc b/libstdc++-v3/testsuite/29_atomics/atomic_flag/clear/1.cc index 7c03a3c33d0..14bd6062b35 100644 --- a/libstdc++-v3/testsuite/29_atomics/atomic_flag/clear/1.cc +++ b/libstdc++-v3/testsuite/29_atomics/atomic_flag/clear/1.cc @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-thread-fence "" } // Copyright (C) 2009-2014 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit.cc b/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit.cc index 580309e3b8f..09394ebcdb6 100644 --- a/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit.cc +++ b/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit.cc @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-thread-fence "" } // Copyright (C) 2008-2014 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/implicit.cc b/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/implicit.cc index c5dbd16b016..02d0ae57e50 100644 --- a/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/implicit.cc +++ b/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/implicit.cc @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-require-thread-fence "" } // Copyright (C) 2008-2014 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp index d01bb9116dd..5cdc7f368a8 100644 --- a/libstdc++-v3/testsuite/lib/dg-options.exp +++ b/libstdc++-v3/testsuite/lib/dg-options.exp @@ -115,6 +115,15 @@ proc dg-require-cmath { args } { 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 diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index 95954d8dbac..eb2e8a85352 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -1200,6 +1200,62 @@ proc check_v3_target_cmath { } { return $et_c99_math } +proc check_v3_target_thread_fence { } { + global cxxflags + global DEFAULT_CXXFLAGS + global et_thread_fence + + global tool + + if { ![info exists et_thread_fence_target_name] } { + set et_thread_fence_target_name "" + } + + # If the target has changed since we set the cached value, clear it. + set current_target [current_target_name] + if { $current_target != $et_thread_fence_target_name } { + verbose "check_v3_target_thread_fence: `$et_thread_fence_target_name'" 2 + set et_thread_fence_target_name $current_target + if [info exists et_thread_fence] { + verbose "check_v3_target_thread_fence: removing cached result" 2 + unset et_thread_fence + } + } + + if [info exists et_thread_fence] { + verbose "check_v3_target_thread_fence: using cached result" 2 + } else { + set et_thread_fence 0 + + # Set up and preprocess a C++11 test program that depends + # on the thread fence to be available. + set src thread_fence[pid].cc + + set f [open $src "w"] + puts $f "int main() {" + puts $f "__atomic_thread_fence (__ATOMIC_SEQ_CST);" + puts $f "return 0;" + puts $f "}" + close $f + + set cxxflags_saved $cxxflags + set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror -std=gnu++11" + + set lines [v3_target_compile $src /dev/null executable ""] + set cxxflags $cxxflags_saved + file delete $src + + if [string match "" $lines] { + # No error message, linking succeeded. + set et_thread_fence 1 + } else { + verbose "check_v3_target_thread_fence: compilation failed" 2 + } + } + verbose "check_v3_target_thread_fence: $et_thread_fence" 2 + return $et_thread_fence +} + proc check_v3_target_atomic_builtins { } { global cxxflags global DEFAULT_CXXFLAGS |