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).