diff options
author | iains <iains@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-08-18 09:01:22 +0000 |
---|---|---|
committer | iains <iains@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-08-18 09:01:22 +0000 |
commit | fe8b92c29c4983d06289237fa033e7f178126517 (patch) | |
tree | 0f30579d079c3ee0ca03023cc8b962620ff7e8bd | |
parent | d947fb63a6626f195d815d4360937718dedb6ac6 (diff) | |
download | gcc-fe8b92c29c4983d06289237fa033e7f178126517.tar.gz |
test cse for emulated TLS targets.
* lib/target-supports.exp (check_effective_target_tls_emulated): New.
* gcc.dg/tls/thr-cse-1.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163330 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tls/thr-cse-1.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/lib/target-supports.exp | 17 |
3 files changed, 43 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5b5fb1f5ca6..10a8aff7a0d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-08-18 Iain Sandoe <iains@gcc.gnu.org> + * lib/target-supports.exp (check_effective_target_tls_emulated): New. + * gcc.dg/tls/thr-cse-1.c: New. + +2010-08-18 Iain Sandoe <iains@gcc.gnu.org> + PR debug/42487 * lib/target-supports.exp (check_effective_target_function_sections): New. diff --git a/gcc/testsuite/gcc.dg/tls/thr-cse-1.c b/gcc/testsuite/gcc.dg/tls/thr-cse-1.c new file mode 100644 index 00000000000..26f7ef8eacc --- /dev/null +++ b/gcc/testsuite/gcc.dg/tls/thr-cse-1.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ +/* { dg-require-effective-target tls_emulated } */ + +/* Test that we only get one call to emutls_get_address when CSE is + active. Note that the var _must_ be initialized for the scan asm + to work, since otherwise there will be an initializer which will, + correctly, call emutls_get_address. */ +int foo (int b, int c, int d) +{ + static __thread int a=1; + a += b; + a -= c; + a += d; + return a; +} + +/* { dg-final { scan-assembler-not "emutls_get_address.*emutls_get_address.*" { target { { ! "*-wrs-vxworks" } && { ! "*-*-darwin8" } } } } } */ +/* { dg-final { scan-assembler-not "call\tL___emutls_get_address.stub.*call\tL___emutls_get_address.stub.*" { target "*-*-darwin8" } } } */ +/* { dg-final { scan-assembler-not "tls_lookup.*tls_lookup.*" { target *-wrs-vxworks } } } */ + diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 9cc9b6077b7..1682d582bc5 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -614,6 +614,23 @@ proc check_effective_target_tls_native {} { }] } +# Return 1 if *emulated* thread local storage (TLS) is supported, 0 otherwise. + +proc check_effective_target_tls_emulated {} { + # VxWorks uses emulated TLS machinery, but with non-standard helper + # functions, so we fail to automatically detect it. + global target_triplet + if { [regexp ".*-.*-vxworks.*" $target_triplet] } { + return 1 + } + + return [check_no_messages_and_pattern tls_emulated "emutls" assembly { + __thread int i; + int f (void) { return i; } + void g (int j) { i = j; } + }] +} + # Return 1 if TLS executables can run correctly, 0 otherwise. proc check_effective_target_tls_runtime {} { |