Fix implementation of MIPS TLS for !TARGET_ABICALLS

Richard Sandiford richard@codesourcery.com
Sun Oct 8 15:32:00 GMT 2006


On MIPS, !TARGET_ABICALLS code can only be used to create static
executables, and such code should not use a GOT.  All TLS models
reduce to local exec in this situation.

(I think it _is_ worth allowing local-exec TLS for !TARGET_ABICALLS.
I can imagine an OS using a *-elf-like toolchain but having enough
thread support to handle this simple case.  In fact, I don't see
any reason why a stock *-elf toolchain couldn't be used in this
situation.)

This patch fixes the tls/alias-1.c on mipsisa64-elf.  The test
previously failed to link because we were trying to use a GOT,
and the idt64.ld script doesn't have a GOT section (quite
rightly IMO).

Tested on mipsisa64-elf and applied.  Thanks to Dan for blessing
the idea as being at least vaguely sensisible, though of course
all errors are my own.

Richard


gcc/
	* config/mips/mips.c (mips_legitimize_tls_address): Implement
	all TLS models in the same way as local exec if !TARGET_ABICALLS.
	Remove stray newline.

Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c	(revision 117553)
+++ gcc/config/mips/mips.c	(working copy)
@@ -2036,6 +2036,11 @@ mips_legitimize_tls_address (rtx loc)
   v1 = gen_rtx_REG (Pmode, GP_RETURN + 1);
 
   model = SYMBOL_REF_TLS_MODEL (loc);
+  /* Only TARGET_ABICALLS code can have more than one module; other
+     code must be be static and should not use a GOT.  All TLS models
+     reduce to local exec in this situation.  */
+  if (!TARGET_ABICALLS)
+    model = TLS_MODEL_LOCAL_EXEC;
 
   switch (model)
     {
@@ -2078,7 +2083,6 @@ mips_legitimize_tls_address (rtx loc)
       break;
 
     case TLS_MODEL_LOCAL_EXEC:
-
       if (Pmode == DImode)
 	emit_insn (gen_tls_get_tp_di (v1));
       else



More information about the Gcc-patches mailing list