re PR c++/85400 (invalid Local Dynamic TLS relaxation for symbol defined in method)
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 10 May 2018 07:36:38 +0000 (07:36 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 10 May 2018 07:36:38 +0000 (07:36 +0000)
PR c++/85400
cp/
* decl2.c (adjust_var_decl_tls_model): New static function.
(comdat_linkage): Call it on a variable.
(maybe_make_one_only): Likewise.
c-family/
* c-attribs.c (handle_visibility_attribute): Do not set no_add_attrs.

From-SVN: r260106

gcc/c-family/ChangeLog
gcc/c-family/c-attribs.c
gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tls/pr85400.C [new file with mode: 0644]

index 087379f1a1517a1f7d120c8c36f859c3460b30c1..6ea5eaf1fdf0a829b1d82698cc66aee92a50045c 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR c++/85400
+       * c-attribs.c (handle_visibility_attribute): Do not set no_add_attrs.
+
 2018-05-07  Nathan Sidwell  <nathan@acm.org>
 
        * c.opt (ffor-scope): Remove functionality, issue warning.
index e0630885cca3610d6cc5453819355425c175e9e1..9bddc1aad4f11d59dd0f85e1dff04a8890d988fa 100644 (file)
@@ -2299,14 +2299,13 @@ handle_visibility_attribute (tree *node, tree name, tree args,
 
 static tree
 handle_tls_model_attribute (tree *node, tree name, tree args,
-                           int ARG_UNUSED (flags), bool *no_add_attrs)
+                           int ARG_UNUSED (flags),
+                           bool *ARG_UNUSED (no_add_attrs))
 {
   tree id;
   tree decl = *node;
   enum tls_model kind;
 
-  *no_add_attrs = true;
-
   if (!VAR_P (decl) || !DECL_THREAD_LOCAL_P (decl))
     {
       warning (OPT_Wattributes, "%qE attribute ignored", name);
index 98249e9696fa44bad01efbbbba9b8be4c2e7db60..a2de8f6812563d59b87ce641887fcc4a9de997d9 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR c++/85400
+       * decl2.c (adjust_var_decl_tls_model): New static function.
+       (comdat_linkage): Call it on a variable.
+       (maybe_make_one_only): Likewise.
+
 2018-05-09  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/85713
index 9aae34a814ce14752f4f62f1a107eab47213881a..6f3ad4c515041a70765a6224f0538c95a64d83bd 100644 (file)
@@ -1838,6 +1838,17 @@ mark_vtable_entries (tree decl)
     }
 }
 
+/* Adjust the TLS model on variable DECL if need be, typically after
+   the linkage of DECL has been modified.  */
+
+static void
+adjust_var_decl_tls_model (tree decl)
+{
+  if (CP_DECL_THREAD_LOCAL_P (decl)
+      && !lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl)))
+    set_decl_tls_model (decl, decl_default_tls_model (decl));
+}
+
 /* Set DECL up to have the closest approximation of "initialized common"
    linkage available.  */
 
@@ -1888,6 +1899,9 @@ comdat_linkage (tree decl)
 
   if (TREE_PUBLIC (decl))
     DECL_COMDAT (decl) = 1;
+
+  if (VAR_P (decl))
+    adjust_var_decl_tls_model (decl);
 }
 
 /* For win32 we also want to put explicit instantiations in
@@ -1926,6 +1940,8 @@ maybe_make_one_only (tree decl)
          /* Mark it needed so we don't forget to emit it.  */
           node->forced_by_abi = true;
          TREE_USED (decl) = 1;
+
+         adjust_var_decl_tls_model (decl);
        }
     }
 }
index 45327ac3ad72c0cd087e37cc4fbf5acf4ac307e0..5bbcd708d656c17969601002b0eae3afbd4ce62a 100644 (file)
@@ -1,3 +1,7 @@
+2018-05-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * g++.dg/tls/pr85400.C: New test.
+
 2018-05-09  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/85713
diff --git a/gcc/testsuite/g++.dg/tls/pr85400.C b/gcc/testsuite/g++.dg/tls/pr85400.C
new file mode 100644 (file)
index 0000000..f8d1bce
--- /dev/null
@@ -0,0 +1,24 @@
+// PR c++/85400
+// Testcase by Brian Vandenberg <phantall@gmail.com>
+
+// { dg-do link { target c++11 } }
+// { dg-require-effective-target fpic }
+// { dg-require-effective-target shared }
+// { dg-require-effective-target tls }
+// { dg-options "-shared -fPIC -O" }
+// { dg-add-options tls }
+
+struct Test
+{
+  int blah (int y)
+  {
+    thread_local int mything = 3;
+    mything = y > 0 ? y : mything;
+    return mything;
+  }
+};
+
+int stuff (Test& test, int y)
+{
+  return test.blah(y);
+}