From: amodra Date: Tue, 31 Mar 2009 03:11:34 +0000 (+0000) Subject: * doc/invoke.texi (RS/6000 and PowerPC Options):Document mtls-markers. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d46ea8788345afc238324a5129b615ac5193d84c;p=thirdparty%2Fgcc.git * doc/invoke.texi (RS/6000 and PowerPC Options):Document mtls-markers. * configure.ac (HAVE_AS_TLS_MARKERS): New gas feature check. * configure: Regenerate. * config.in: Regenerate. * config/rs6000/rs6000.opt (mtls-markers): Add. * config/rs6000/rs6000.h (TARGET_TLS_MARKERS): Define. * config/rs6000/rs6000.md (tls_gd_aix, tls_gd_sysv): Add splitter. (tls_ld_aix, tls_ld_sysv): Likewise. (tls_gd, tls_gd_call_aix, tls_gd_call_sysv): New insns. (tls_ld, tls_ld_call_aix, tls_ld_call_sysv): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145330 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ad93ab2ba92c..3cad793ab19e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2009-03-31 Alan Modra + + * doc/invoke.texi (RS/6000 and PowerPC Options):Document mtls-markers. + * configure.ac (HAVE_AS_TLS_MARKERS): New gas feature check. + * configure: Regenerate. + * config.in: Regenerate. + * config/rs6000/rs6000.opt (mtls-markers): Add. + * config/rs6000/rs6000.h (TARGET_TLS_MARKERS): Define. + * config/rs6000/rs6000.md (tls_gd_aix, tls_gd_sysv): Add splitter. + (tls_ld_aix, tls_ld_sysv): Likewise. + (tls_gd, tls_gd_call_aix, tls_gd_call_sysv): New insns. + (tls_ld, tls_ld_call_aix, tls_ld_call_sysv): Likewise. + 2009-03-31 Alan Modra * config/spu/spu.c (spu_expand_prologue): Delete redundant code. diff --git a/gcc/config.in b/gcc/config.in index 7c34eed32829..ecc85b040fed 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -371,6 +371,12 @@ #endif +/* Define if your assembler supports arg info for __tls_get_addr. */ +#ifndef USED_FOR_TARGET +#undef HAVE_AS_TLS_MARKERS +#endif + + /* Define if your assembler supports VSX instructions. */ #ifndef USED_FOR_TARGET #undef HAVE_AS_VSX diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 3109e958cd6b..8a6fe6846953 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -240,6 +240,15 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); #define TARGET_DFP 0 #endif +/* Define TARGET_TLS_MARKERS if the target assembler does not support + arg markers for __tls_get_addr calls. */ +#ifndef HAVE_AS_TLS_MARKERS +#undef TARGET_TLS_MARKERS +#define TARGET_TLS_MARKERS 0 +#else +#define TARGET_TLS_MARKERS tls_markers +#endif + #ifndef TARGET_SECURE_PLT #define TARGET_SECURE_PLT 0 #endif diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index e7daff15bab6..88322fd66dca 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -10412,7 +10412,7 @@ (define_mode_attr tls_sysv_suffix [(SI "si") (DI "di")]) (define_mode_attr tls_insn_suffix [(SI "wz") (DI "d")]) -(define_insn "tls_gd_aix" +(define_insn_and_split "tls_gd_aix" [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") (call (mem:TLSmode (match_operand:TLSmode 3 "symbol_ref_operand" "s")) (match_operand 4 "" "g"))) @@ -10422,10 +10422,21 @@ (clobber (reg:SI LR_REGNO))] "HAVE_AS_TLS && DEFAULT_ABI == ABI_AIX" "addi %0,%1,%2@got@tlsgd\;bl %z3\;%." + "&& TARGET_TLS_MARKERS" + [(set (match_dup 0) + (unspec:TLSmode [(match_dup 1) + (match_dup 2)] + UNSPEC_TLSGD)) + (parallel [(set (match_dup 0) + (call (mem:TLSmode (match_dup 3)) + (match_dup 4))) + (unspec:TLSmode [(match_dup 2)] UNSPEC_TLSGD) + (clobber (reg:SI LR_REGNO))])] + "" [(set_attr "type" "two") (set_attr "length" "12")]) -(define_insn "tls_gd_sysv" +(define_insn_and_split "tls_gd_sysv" [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") (call (mem:TLSmode (match_operand:TLSmode 3 "symbol_ref_operand" "s")) (match_operand 4 "" "g"))) @@ -10445,10 +10456,62 @@ else return "addi %0,%1,%2@got@tlsgd\;bl %z3"; } + "&& TARGET_TLS_MARKERS" + [(set (match_dup 0) + (unspec:TLSmode [(match_dup 1) + (match_dup 2)] + UNSPEC_TLSGD)) + (parallel [(set (match_dup 0) + (call (mem:TLSmode (match_dup 3)) + (match_dup 4))) + (unspec:TLSmode [(match_dup 2)] UNSPEC_TLSGD) + (clobber (reg:SI LR_REGNO))])] + "" [(set_attr "type" "two") (set_attr "length" "8")]) -(define_insn "tls_ld_aix" +(define_insn "*tls_gd" + [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") + (unspec:TLSmode [(match_operand:TLSmode 1 "gpc_reg_operand" "b") + (match_operand:TLSmode 2 "rs6000_tls_symbol_ref" "")] + UNSPEC_TLSGD))] + "HAVE_AS_TLS && TARGET_TLS_MARKERS" + "addi %0,%1,%2@got@tlsgd" + [(set_attr "length" "4")]) + +(define_insn "*tls_gd_call_aix" + [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") + (call (mem:TLSmode (match_operand:TLSmode 1 "symbol_ref_operand" "s")) + (match_operand 2 "" "g"))) + (unspec:TLSmode [(match_operand:TLSmode 3 "rs6000_tls_symbol_ref" "")] + UNSPEC_TLSGD) + (clobber (reg:SI LR_REGNO))] + "HAVE_AS_TLS && DEFAULT_ABI == ABI_AIX && TARGET_TLS_MARKERS" + "bl %z1(%3@tlsgd)\;%." + [(set_attr "type" "branch") + (set_attr "length" "8")]) + +(define_insn "*tls_gd_call_sysv" + [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") + (call (mem:TLSmode (match_operand:TLSmode 1 "symbol_ref_operand" "s")) + (match_operand 2 "" "g"))) + (unspec:TLSmode [(match_operand:TLSmode 3 "rs6000_tls_symbol_ref" "")] + UNSPEC_TLSGD) + (clobber (reg:SI LR_REGNO))] + "HAVE_AS_TLS && DEFAULT_ABI == ABI_V4 && TARGET_TLS_MARKERS" +{ + if (flag_pic) + { + if (TARGET_SECURE_PLT && flag_pic == 2) + return "bl %z1+32768(%3@tlsgd)@plt"; + return "bl %z1(%3@tlsgd)@plt"; + } + return "bl %z1(%3@tlsgd)"; +} + [(set_attr "type" "branch") + (set_attr "length" "4")]) + +(define_insn_and_split "tls_ld_aix" [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") (call (mem:TLSmode (match_operand:TLSmode 2 "symbol_ref_operand" "s")) (match_operand 3 "" "g"))) @@ -10457,9 +10520,19 @@ (clobber (reg:SI LR_REGNO))] "HAVE_AS_TLS && DEFAULT_ABI == ABI_AIX" "addi %0,%1,%&@got@tlsld\;bl %z2\;%." + "&& TARGET_TLS_MARKERS" + [(set (match_dup 0) + (unspec:TLSmode [(match_dup 1)] + UNSPEC_TLSLD)) + (parallel [(set (match_dup 0) + (call (mem:TLSmode (match_dup 2)) + (match_dup 3))) + (unspec:TLSmode [(const_int 0)] UNSPEC_TLSLD) + (clobber (reg:SI LR_REGNO))])] + "" [(set_attr "length" "12")]) -(define_insn "tls_ld_sysv" +(define_insn_and_split "tls_ld_sysv" [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") (call (mem:TLSmode (match_operand:TLSmode 2 "symbol_ref_operand" "s")) (match_operand 3 "" "g"))) @@ -10478,8 +10551,56 @@ else return "addi %0,%1,%&@got@tlsld\;bl %z2"; } + "&& TARGET_TLS_MARKERS" + [(set (match_dup 0) + (unspec:TLSmode [(match_dup 1)] + UNSPEC_TLSLD)) + (parallel [(set (match_dup 0) + (call (mem:TLSmode (match_dup 2)) + (match_dup 3))) + (unspec:TLSmode [(const_int 0)] UNSPEC_TLSLD) + (clobber (reg:SI LR_REGNO))])] + "" [(set_attr "length" "8")]) +(define_insn "*tls_ld" + [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") + (unspec:TLSmode [(match_operand:TLSmode 1 "gpc_reg_operand" "b")] + UNSPEC_TLSLD))] + "HAVE_AS_TLS && TARGET_TLS_MARKERS" + "addi %0,%1,%&@got@tlsld" + [(set_attr "length" "4")]) + +(define_insn "*tls_ld_call_aix" + [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") + (call (mem:TLSmode (match_operand:TLSmode 1 "symbol_ref_operand" "s")) + (match_operand 2 "" "g"))) + (unspec:TLSmode [(const_int 0)] UNSPEC_TLSLD) + (clobber (reg:SI LR_REGNO))] + "HAVE_AS_TLS && DEFAULT_ABI == ABI_AIX && TARGET_TLS_MARKERS" + "bl %z1(%&@tlsld)\;%." + [(set_attr "type" "branch") + (set_attr "length" "8")]) + +(define_insn "*tls_ld_call_sysv" + [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=b") + (call (mem:TLSmode (match_operand:TLSmode 1 "symbol_ref_operand" "s")) + (match_operand 2 "" "g"))) + (unspec:TLSmode [(const_int 0)] UNSPEC_TLSLD) + (clobber (reg:SI LR_REGNO))] + "HAVE_AS_TLS && DEFAULT_ABI == ABI_V4 && TARGET_TLS_MARKERS" +{ + if (flag_pic) + { + if (TARGET_SECURE_PLT && flag_pic == 2) + return "bl %z1+32768(%&@tlsld)@plt"; + return "bl %z1(%&@tlsld)@plt"; + } + return "bl %z1(%&@tlsld)"; +} + [(set_attr "type" "branch") + (set_attr "length" "4")]) + (define_insn "tls_dtprel_" [(set (match_operand:TLSmode 0 "gpc_reg_operand" "=r") (unspec:TLSmode [(match_operand:TLSmode 1 "gpc_reg_operand" "b") diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt index 8a623527891d..3030c59b4d21 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -131,6 +131,10 @@ mfused-madd Target Report RejectNegative InverseMask(NO_FUSED_MADD, FUSED_MADD) Generate fused multiply/add instructions +mtls-markers +Target Report Var(tls_markers) Init(1) +Mark __tls_get_addr calls with argument info + msched-prolog Target Report Var(TARGET_SCHED_PROLOG) Init(1) Schedule the start and end of the procedure diff --git a/gcc/configure b/gcc/configure index e74fdf822baa..914919717ea5 100755 --- a/gcc/configure +++ b/gcc/configure @@ -23328,6 +23328,43 @@ cat >>confdefs.h <<\_ACEOF #define HAVE_AS_GNU_ATTRIBUTE 1 _ACEOF +fi + + echo "$as_me:$LINENO: checking assembler for tls marker support" >&5 +echo $ECHO_N "checking assembler for tls marker support... $ECHO_C" >&6 +if test "${gcc_cv_as_powerpc_tls_markers+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + gcc_cv_as_powerpc_tls_markers=no + if test $in_tree_gas = yes; then + if test $gcc_cv_gas_vers -ge `expr \( \( 9 \* 1000 \) + 99 \) \* 1000 + 0` + then gcc_cv_as_powerpc_tls_markers=yes +fi + elif test x$gcc_cv_as != x; then + echo ' bl __tls_get_addr(x@tlsgd)' > conftest.s + if { ac_try='$gcc_cv_as -o conftest.o conftest.s >&5' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } + then + gcc_cv_as_powerpc_tls_markers=yes + else + echo "configure: failed program was" >&5 + cat conftest.s >&5 + fi + rm -f conftest.o conftest.s + fi +fi +echo "$as_me:$LINENO: result: $gcc_cv_as_powerpc_tls_markers" >&5 +echo "${ECHO_T}$gcc_cv_as_powerpc_tls_markers" >&6 +if test $gcc_cv_as_powerpc_tls_markers = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_AS_TLS_MARKERS 1 +_ACEOF + fi ;; diff --git a/gcc/configure.ac b/gcc/configure.ac index 99605a147dcd..6a6a7d3f326d 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3128,6 +3128,12 @@ LCF0: [.gnu_attribute 4,1],, [AC_DEFINE(HAVE_AS_GNU_ATTRIBUTE, 1, [Define if your assembler supports .gnu_attribute.])]) + + gcc_GAS_CHECK_FEATURE([tls marker support], + gcc_cv_as_powerpc_tls_markers, [2,20,0],, + [ bl __tls_get_addr(x@tlsgd)],, + [AC_DEFINE(HAVE_AS_TLS_MARKERS, 1, + [Define if your assembler supports arg info for __tls_get_addr.])]) ;; mips*-*-*) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index ebf14d2081a0..980810451f5f 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -14407,6 +14407,16 @@ to use or discard it. In the future, we may cause GCC to ignore all longcall specifications when the linker is known to generate glue. +@item -mtls-markers +@itemx -mno-tls-markers +@opindex mtls-markers +@opindex mno-tls-markers +Mark (do not mark) calls to @code{__tls_get_addr} with a relocation +specifying the function argument. The relocation allows ld to +reliably associate function call with argument setup instructions for +TLS optimization, which in turn allows gcc to better schedule the +sequence. + @item -pthread @opindex pthread Adds support for multithreading with the @dfn{pthreads} library.