diff options
author | Maxim Kuvyrkov <maxim@codesourcery.com> | 2009-05-18 07:54:44 +0000 |
---|---|---|
committer | Maxim Kuvyrkov <mkuvyrkov@gcc.gnu.org> | 2009-05-18 07:54:44 +0000 |
commit | 75df395f15f2641bfcae7f1179d3ef963771379c (patch) | |
tree | e8ce029d9db8c2877121f38cd2a486004490e1d2 /gcc/testsuite/gcc.target/m68k | |
parent | 676fd528c9990a4f1046b51d40059893c3a71490 (diff) |
M68K TLS support.
* configure.ac (m68k-*-*): Check if binutils support TLS.
* configure: Regenerate.
* config/m68k/predicates.md (symbolic_operand): Extend comment.
* config/m68k/constraints.md (Cu): New constraint.
* config/m68k/m68k.md (UNSPEC_GOTOFF): Remove.
(UNSPEC_RELOC16, UNSPEC_RELOC32): New constants.
(movsi): Handle TLS symbols.
(addsi3_5200): Handle XTLS symbols, indent.
* config/m68k/m68k-protos.h (m68k_legitimize_tls_address): Declare.
(m68k_tls_reference_p): Declare.
(m68k_legitimize_address): Declare.
(m68k_unwrap_symbol): Declare.
* config/m68k/m68k.opt (mxtls): New option.
* config/m68k/m68k.c (ggc.h): Include.
(m68k_output_dwarf_dtprel): Implement hook.
(TARGET_HAVE_TLS, TARGET_ASM_OUTPUT_DWARF_DTPREL): Define.
(m68k_expand_prologue): Load GOT pointer when function needs it.
(m68k_illegitimate_symbolic_constant_p): Handle TLS symbols.
(m68k_legitimate_constant_address_p): Same.
(m68k_decompose_address): Handle TLS references.
(m68k_get_gp): New static function.
(enum m68k_reloc): New contants.
(TLS_RELOC_P): New macro.
(m68k_wrap_symbol): New static function.
(m68k_unwrap_symbol): New function.
(m68k_final_prescan_insn_1): New static function.
(m68k_final_prescan_insn): New function.
(m68k_move_to_reg, m68k_wrap_symbol_into_got_ref): New static
functions.
(legitimize_pic_address): Handle TLS references..
(m68k_tls_get_addr, m68k_get_tls_get_addr)
(m68k_libcall_value_in_a0_p)
(m68k_call_tls_get_addr, m68k_read_tp, m68k_get_m68k_read_tp)
(m68k_call_m68k_read_tp): Helper variables and functions for ...
(m68k_legitimize_tls_address): Handle TLS references.
(m68k_tls_symbol_p, m68k_tls_reference_p_1, m68k_tls_reference_p):
New functions.
(m68k_legitimize_address): Handle TLS symbols.
(m68k_get_reloc_decoration): New static function.
(m68k_output_addr_const_extra): Handle UNSPEC_RELOC16 and
UNSPEC_RELOC32.
(m68k_output_dwarf_dtprel): Implement hook.
(print_operand_address): Handle UNSPEC_RELOC16 adn UNSPEC_RELOC32.
(m68k_libcall_value): Return result in A0 instead of D0 when asked by
m68k_call_* routines.
(sched_attr_op_type): Handle TLS symbols.
(gt-m68k.h): Include.
* config/m68k/m68k.h (FINAL_PRESCAN_INSN): Define.
(LEGITIMATE_PIC_OPERAND_P): Support TLS.
* gcc.target/m68k/tls-ie.c: New test.
* gcc.target/m68k/tls-le.c: New test.
* gcc.target/m68k/tls-gd.c: New test.
* gcc.target/m68k/tls-ld.c: New test.
* gcc.target/m68k/tls-ie-xgot.c: New test.
* gcc.target/m68k/tls-le-xtls.c: New test.
* gcc.target/m68k/tls-gd-xgot.c: New test.
* gcc.target/m68k/tls-ld-xgot.c: New test.
* gcc.target/m68k/tls-ld-xtls.c: New test.
* gcc.target/m68k/tls-ld-xgot-xtls.c: New test.
From-SVN: r147654
Diffstat (limited to 'gcc/testsuite/gcc.target/m68k')
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-gd.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-ie.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-ld.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-le-xtls.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/m68k/tls-le.c | 13 |
10 files changed, 134 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c b/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c new file mode 100644 index 00000000000..2a4900b5a08 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -fpic -mxgot" } */ +/* { dg-final { scan-assembler "#foo@TLSGD,\%\[ad\]\[0-7\]" } } */ +/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */ + +extern int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-gd.c b/gcc/testsuite/gcc.target/m68k/tls-gd.c new file mode 100644 index 00000000000..2b69fbdc1b4 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-gd.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -fpic" } */ +/* { dg-final { scan-assembler "foo@TLSGD\\(\%a5\\)" } } */ +/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */ + +extern int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c b/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c new file mode 100644 index 00000000000..d3fbfdaa4b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -mxgot" } */ +/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */ +/* { dg-final { scan-assembler "#foo@TLSIE,\%\[ad\]\[0-7\]" } } */ + +extern int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-ie.c b/gcc/testsuite/gcc.target/m68k/tls-ie.c new file mode 100644 index 00000000000..2661f9fc053 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-ie.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */ +/* { dg-final { scan-assembler "foo@TLSIE\\(\%a5\\)" } } */ + +extern int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c new file mode 100644 index 00000000000..4817de01d44 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -fpic -mxgot -mxtls" } */ +/* { dg-final { scan-assembler "#foo@TLSLDM,\%\[ad\]\[0-7\]" } } */ +/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */ +/* { dg-final { scan-assembler "#foo@TLSLDO,\%\[ad\]\[0-7\]" } } */ + +static int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c new file mode 100644 index 00000000000..f95f7192855 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -fpic -mxgot" } */ +/* { dg-final { scan-assembler "#foo@TLSLDM,\%\[ad\]\[0-7\]" } } */ +/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */ +/* { dg-final { scan-assembler "lea \\(foo@TLSLDO,\%a0\\)" } } */ + +static int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c b/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c new file mode 100644 index 00000000000..1bc3eaf7de5 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -fpic -mxtls" } */ +/* { dg-final { scan-assembler "foo@TLSLDM\\(\%a5\\)" } } */ +/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */ +/* { dg-final { scan-assembler "#foo@TLSLDO,\%\[ad\]\[0-7\]" } } */ + +static int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-ld.c b/gcc/testsuite/gcc.target/m68k/tls-ld.c new file mode 100644 index 00000000000..556a11718ca --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-ld.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -fpic" } */ +/* { dg-final { scan-assembler "foo@TLSLDM\\(\%a5\\)" } } */ +/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */ +/* { dg-final { scan-assembler "lea \\(foo@TLSLDO,\%a0\\)" } } */ + +static int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c b/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c new file mode 100644 index 00000000000..90061153f89 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2 -mxtls" } */ +/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */ +/* { dg-final { scan-assembler "#foo@TLSLE,\%\[ad\]\[0-7\]" } } */ + +static int __thread foo; + +int * +bar (void) +{ + return &foo; +} diff --git a/gcc/testsuite/gcc.target/m68k/tls-le.c b/gcc/testsuite/gcc.target/m68k/tls-le.c new file mode 100644 index 00000000000..1c0eab23886 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/tls-le.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */ +/* { dg-final { scan-assembler "lea \\(foo@TLSLE,\%a0\\)" } } */ + +static int __thread foo; + +int * +bar (void) +{ + return &foo; +} |