http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58067

--- Comment #5 from Alexandre Oliva <aoliva at gcc dot gnu.org> ---
As Andrew says, the problem with -mtls-dialect=gnu (the default) is lack of TLS
support.  The tls_get_addr calls expanded by tls_global_dynamic_64_<mode> are
not recognized by the corresponding insns because the call address operand (the
__tls_get_addr symbol_ref) doesn't pass the constant_call_address_operand
predicate, configured to always fail in the LARGE code models.  I suppose it's
not appropriate to make an exception for __tls_get_addr, and we'd instead have
to make it an indirect call after loading the address from the GOT.  We'd need
new relocations and relaxation smarts in binutils for this to work.  I guess it
makes more sense to force the GNU2 tls-dialect for LARGE code models, since
that one works, and maybe switch to it by default in other models; we've had it
for long enough already.

As for the non-delegitimized notes we get in both modes, that's fixed with
something along the lines of the following patch:

--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -13827,6 +13827,21 @@ ix86_delegitimize_address (rtx x)
         x = replace_equiv_address_nv (orig_x, x);
       return x;
     }
+      if (GET_CODE (x) == PLUS
+      && ix86_pic_register_p (XEXP (x, 0))
+      && GET_CODE (XEXP (x, 1)) == CONST
+      && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
+      /* These are used in 64-bit CM_LARGE mode.  */
+      && (XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_PLTOFF
+          || XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_GOTOFF))
+    {
+      x = simplify_gen_subreg (GET_MODE (orig_x),
+                   XVECEXP (XEXP (XEXP (x, 1), 0), 0, 0),
+                   GET_MODE (x), 0);
+      if (x == NULL_RTX)
+        return orig_x;
+      return x;
+    }
       if (GET_CODE (x) != CONST
       || GET_CODE (XEXP (x, 0)) != UNSPEC
       || (XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL

Uros (or anyone), please take this as a starting point; it might require
support for addends, even though I haven't needed them for this one testcase. 
Or maybe we don't need them, after all.  I'm not sure, so I'll leave it for
someone else who knows better.

Reply via email to