Patchwork Using GS for TLS on x86-64 for target RDOS

login
register
mail settings
Submitter Uros Bizjak
Date May 15, 2013, 8:37 p.m.
Message ID <CAFULd4a+MyhsNuOM4Ydghg7owyHyt4pR2CPgTamEMcYRRUSDJg@mail.gmail.com>
Download mbox | patch
Permalink /patch/244176/
State New
Headers show

Comments

Uros Bizjak - May 15, 2013, 8:37 p.m.
On Wed, May 15, 2013 at 9:00 PM, Leif Ekblad <leif@rdos.net> wrote:

> I made the suggested changes, and enclose a new patch.

<...>

> It's been tested with target RDOS, but not with target Linux.
>
> Uros, could you commit the patch if it is acceptable?

I have committed attached patch with following ChangeLog:

2013-05-15  Leif Ekblad  <leif@rdos.net>

    * config/i386/i386.c (ix86_decompose_address): Use
    DEFAULT_TLS_SEG_REG to access TLS segment register.
    * config/i386/i386.h (DEFAULT_TLS_SEG_REG): New define.
    * config/i386/rdos.h (DEFAULT_TLS_SEG_REG): Ditto.
    (TARGET_TLS_DIRECT_SEG_REFS_DEFAULT): Ditto.

Patch was also tested on x86_64-pc-linux-gnu {,-m32}.

Uros.

Patch

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 198944)
+++ config/i386/i386.c	(working copy)
@@ -11698,7 +11698,7 @@  ix86_decompose_address (rtx addr, struct ix86_addr
 	      if (XINT (op, 1) == UNSPEC_TP
 	          && TARGET_TLS_DIRECT_SEG_REFS
 	          && seg == SEG_DEFAULT)
-		seg = TARGET_64BIT ? SEG_FS : SEG_GS;
+		seg = DEFAULT_TLS_SEG_REG;
 	      else
 		return 0;
 	      break;
@@ -13650,7 +13650,7 @@  ix86_delegitimize_tls_address (rtx orig_x)
   if (GET_CODE (x) != PLUS || GET_MODE (x) != Pmode)
     return orig_x;
   if (ix86_decompose_address (x, &addr) == 0
-      || addr.seg != (TARGET_64BIT ? SEG_FS : SEG_GS)
+      || addr.seg != DEFAULT_TLS_SEG_REG
       || addr.disp == NULL_RTX
       || GET_CODE (addr.disp) != CONST)
     return orig_x;
Index: config/i386/i386.h
===================================================================
--- config/i386/i386.h	(revision 198944)
+++ config/i386/i386.h	(working copy)
@@ -543,6 +543,9 @@  extern tree x86_mfence;
 /* The default abi used by target.  */
 #define DEFAULT_ABI SYSV_ABI
 
+/* The default TLS segment register used by target.  */
+#define DEFAULT_TLS_SEG_REG (TARGET_64BIT ? SEG_FS : SEG_GS)
+
 /* Subtargets may reset this to 1 in order to enable 96-bit long double
    with the rounding mode forced to 53 bits.  */
 #define TARGET_96_ROUND_53_LONG_DOUBLE 0
Index: config/i386/rdos.h
===================================================================
--- config/i386/rdos.h	(revision 198944)
+++ config/i386/rdos.h	(working copy)
@@ -21,6 +21,12 @@  along with GCC; see the file COPYING3.  If not see
 #undef TARGET_EXECUTABLE_SUFFIX
 #define TARGET_EXECUTABLE_SUFFIX ".exe"
 
+#undef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT
+#define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT MASK_TLS_DIRECT_SEG_REFS
+
+#undef DEFAULT_TLS_SEG_REG
+#define DEFAULT_TLS_SEG_REG SEG_GS 
+
 #undef TARGET_RDOS
 #define TARGET_RDOS 1