public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-2914] aix: 64 bit AIX TLS libpthread dependency.
@ 2021-08-15 17:23 David Edelsohn
  0 siblings, 0 replies; only message in thread
From: David Edelsohn @ 2021-08-15 17:23 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:34ce7f7a9a64dd69dd6a77dfd4a77406c3c71014

commit r12-2914-g34ce7f7a9a64dd69dd6a77dfd4a77406c3c71014
Author: Clément Chigot <clement.chigot@atos.net>
Date:   Thu Aug 12 13:17:15 2021 -0400

    aix: 64 bit AIX TLS libpthread dependency.
    
    64bit XCOFF files will generated TLS access, with local-exec or
    global-exec models, by an access to R13. Thus, there isn't
    any reference to a TLS symbol.
    
    The problem is that it allows programs with TLS to be compiled and
    linked even without -pthread. Most of the time, it will result in
    a segfault when trying to access a TLS variable. But sometimes, it
    might create a memory corruption.
    
    This patch forces a reference to __tls_get_addr() to ensure link
    will fail without -pthread.
    
    gcc/ChangeLog:
    2021-08-11  Clément Chigot  <clement.chigot@atos.net>
    
            * config/rs6000/rs6000.c (xcoff_tls_exec_model_detected): New.
            (rs6000_legitimize_tls_address_aix): Use it.
            (rs6000_xcoff_file_end): Add ".ref __tls_get_addr" when
            xcoff_tls_exec_model_detected is true.

Diff:
---
 gcc/config/rs6000/rs6000.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 60f406a4ff6..e073b26b430 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -127,6 +127,9 @@ scalar_int_mode rs6000_pmode;
 bool rs6000_passes_ieee128 = false;
 #endif
 
+/* Track use of r13 in 64bit AIX TLS.  */
+static bool xcoff_tls_exec_model_detected = false;
+
 /* Generate the manged name (i.e. U10__float128) used in GCC 8.1, and not the
    name used in current releases (i.e. u9__ieee128).  */
 static bool ieee128_mangling_gcc_8_1;
@@ -9397,7 +9400,10 @@ rs6000_legitimize_tls_address_aix (rtx addr, enum tls_model model)
       emit_insn (gen_tls_get_tpointer (tlsreg));
     }
   else
-    tlsreg = gen_rtx_REG (DImode, 13);
+    {
+      tlsreg = gen_rtx_REG (DImode, 13);
+      xcoff_tls_exec_model_detected = true;
+    }
 
   /* Load the TOC value into temporary register.  */
   tmpreg = gen_reg_rtx (Pmode);
@@ -21122,6 +21128,12 @@ rs6000_xcoff_file_end (void)
   fputs (TARGET_32BIT
 	 ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
 	 asm_out_file);
+
+  if (xcoff_tls_exec_model_detected)
+    {
+      /* Add a .ref to __tls_get_addr to force libpthread dependency.  */
+      fputs ("\t.extern __tls_get_addr\n\t.ref __tls_get_addr\n", asm_out_file);
+    }
 }
 
 struct declare_alias_data


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-08-15 17:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-15 17:23 [gcc r12-2914] aix: 64 bit AIX TLS libpthread dependency David Edelsohn

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).