[AArch64][TLSLE][1/3] Add the option "-mtls-size"
authorJiong Wang <jiong.wang@arm.com>
Wed, 26 Aug 2015 12:58:52 +0000 (12:58 +0000)
committerJiong Wang <jiwang@gcc.gnu.org>
Wed, 26 Aug 2015 12:58:52 +0000 (12:58 +0000)
2015-08-26  Jiong Wang  <jiong.wang@arm.com>

gcc/
  * config/aarch64/aarch64.opt (mtls-size): New entry.
  * config/aarch64/aarch64.c (initialize_aarch64_tls_size): New function.
  (aarch64_override_options_internal): Call initialize_aarch64_tls_size.
  * doc/invoke.texi (AArch64 Options): Document -mtls-size.

From-SVN: r227212

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.opt
gcc/doc/invoke.texi

index 670924932d7f5c110636ae52d9d04dd521044454..609646b8f2374a726b5e172ecb6d5e7e02fb322e 100644 (file)
@@ -1,3 +1,10 @@
+2015-08-26  Jiong Wang  <jiong.wang@arm.com>
+
+       * config/aarch64/aarch64.opt (mtls-size): New entry.
+       * config/aarch64/aarch64.c (initialize_aarch64_tls_size): New function.
+       (aarch64_override_options_internal): Call initialize_aarch64_tls_size.
+       * doc/invoke.texi (AArch64 Options): Document -mtls-size.
+
 2015-08-26  Matthew Wahab  <matthew.wahab@arm.com>
 
        * gcc/config/arm/arm-cores.def: Add FL_FOR_ARCH flag for each
index 87bbf6e7988e4ef796c09075ee584822483cbbce..1df1e8c25df233db85d5ebeb48812ca44cf42f32 100644 (file)
@@ -7492,6 +7492,40 @@ aarch64_parse_one_override_token (const char* token,
   return;
 }
 
+/* A checking mechanism for the implementation of the tls size.  */
+
+static void
+initialize_aarch64_tls_size (struct gcc_options *opts)
+{
+  if (aarch64_tls_size == 0)
+    aarch64_tls_size = 24;
+
+  switch (opts->x_aarch64_cmodel_var)
+    {
+    case AARCH64_CMODEL_TINY:
+      /* Both the default and maximum TLS size allowed under tiny is 1M which
+        needs two instructions to address, so we clamp the size to 24.  */
+      if (aarch64_tls_size > 24)
+       aarch64_tls_size = 24;
+      break;
+    case AARCH64_CMODEL_SMALL:
+      /* The maximum TLS size allowed under small is 4G.  */
+      if (aarch64_tls_size > 32)
+       aarch64_tls_size = 32;
+      break;
+    case AARCH64_CMODEL_LARGE:
+      /* The maximum TLS size allowed under large is 16E.
+        FIXME: 16E should be 64bit, we only support 48bit offset now.  */
+      if (aarch64_tls_size > 48)
+       aarch64_tls_size = 48;
+      break;
+    default:
+      gcc_unreachable ();
+    }
+
+  return;
+}
+
 /* Parse STRING looking for options in the format:
      string    :: option:string
      option    :: name=substring
@@ -7584,6 +7618,7 @@ aarch64_override_options_internal (struct gcc_options *opts)
     }
 
   initialize_aarch64_code_model (opts);
+  initialize_aarch64_tls_size (opts);
 
   aarch64_override_options_after_change_1 (opts);
 }
index 37c2c509fe2d38cd489e290c053cd32ad84270db..8642bdb74f33f7aaa6a1025530384a53d7b9f461 100644 (file)
@@ -96,6 +96,25 @@ mtls-dialect=
 Target RejectNegative Joined Enum(tls_type) Var(aarch64_tls_dialect) Init(TLS_DESCRIPTORS) Save
 Specify TLS dialect
 
+mtls-size=
+Target RejectNegative Joined Var(aarch64_tls_size) Enum(aarch64_tls_size)
+Specifies bit size of immediate TLS offsets.  Valid values are 12, 24, 32, 48.
+
+Enum
+Name(aarch64_tls_size) Type(int)
+
+EnumValue
+Enum(aarch64_tls_size) String(12) Value(12)
+
+EnumValue
+Enum(aarch64_tls_size) String(24) Value(24)
+
+EnumValue
+Enum(aarch64_tls_size) String(32) Value(32)
+
+EnumValue
+Enum(aarch64_tls_size) String(48) Value(48)
+
 march=
 Target RejectNegative ToLower Joined Var(aarch64_arch_string)
 -march=ARCH    Use features of architecture ARCH
index 27be317d7634aea9bb4b0d5cf85ca1c5f16185bc..f990befd55762637e0610df192ca3ec701edfa92 100644 (file)
@@ -514,6 +514,7 @@ Objective-C and Objective-C++ Dialects}.
 -mstrict-align @gol
 -momit-leaf-frame-pointer  -mno-omit-leaf-frame-pointer @gol
 -mtls-dialect=desc  -mtls-dialect=traditional @gol
+-mtls-size=@var{size} @gol
 -mfix-cortex-a53-835769  -mno-fix-cortex-a53-835769 @gol
 -mfix-cortex-a53-843419  -mno-fix-cortex-a53-843419 @gol
 -march=@var{name}  -mcpu=@var{name}  -mtune=@var{name}}
@@ -12409,6 +12410,11 @@ of TLS variables.  This is the default.
 Use traditional TLS as the thread-local storage mechanism for dynamic accesses
 of TLS variables.
 
+@item -mtls-size=@var{size}
+@opindex mtls-size
+Specify bit size of immediate TLS offsets.  Valid values are 12, 24, 32, 48.
+This option depends on binutils higher than 2.25.
+
 @item -mfix-cortex-a53-835769
 @itemx -mno-fix-cortex-a53-835769
 @opindex mfix-cortex-a53-835769