Backport fix for PR c++/85400

Message ID 5377246.XNt1c5Qdm6@polaris
State New
Headers show
Series
  • Backport fix for PR c++/85400
Related show

Commit Message

Eric Botcazou May 22, 2019, 7:43 a.m.
Jakub asked me to backport the fix for PR c++/85400 initially intended for 
SPARC/Solaris but which also helps on x86-64/Linux apparently.

Tested on the latter platform, applied on the 8 branch.


2019-05-22  Eric Botcazou  <ebotcazou@adacore.com>

c-family/
	Backport from mainline
	2018-05-10  Eric Botcazou  <ebotcazou@adacore.com>

	PR c++/85400
	* c-attribs.c (handle_visibility_attribute): Do not set no_add_attrs.


2019-05-22  Eric Botcazou  <ebotcazou@adacore.com>

cp/
	Backport from mainline
	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.


2019-05-22  Eric Botcazou  <ebotcazou@adacore.com>

	* g++.dg/tls/pr85400.C: New test.

-- 
Eric Botcazou

Comments

Richard Biener May 22, 2019, 9:11 a.m. | #1
On Wed, May 22, 2019 at 9:43 AM Eric Botcazou <ebotcazou@adacore.com> wrote:
>

> Jakub asked me to backport the fix for PR c++/85400 initially intended for

> SPARC/Solaris but which also helps on x86-64/Linux apparently.

>

> Tested on the latter platform, applied on the 8 branch.


Probably also required for GCC 7 then?

Richard.

>

> 2019-05-22  Eric Botcazou  <ebotcazou@adacore.com>

>

> c-family/

>         Backport from mainline

>         2018-05-10  Eric Botcazou  <ebotcazou@adacore.com>

>

>         PR c++/85400

>         * c-attribs.c (handle_visibility_attribute): Do not set no_add_attrs.

>

>

> 2019-05-22  Eric Botcazou  <ebotcazou@adacore.com>

>

> cp/

>         Backport from mainline

>         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.

>

>

> 2019-05-22  Eric Botcazou  <ebotcazou@adacore.com>

>

>         * g++.dg/tls/pr85400.C: New test.

>

> --

> Eric Botcazou
Eric Botcazou May 22, 2019, 10:32 p.m. | #2
> Probably also required for GCC 7 then?


The problem is (probably) present there too, but that's not my call.

-- 
Eric Botcazou

Patch

Index: c-family/c-attribs.c
===================================================================
--- c-family/c-attribs.c	(revision 270883)
+++ c-family/c-attribs.c	(working copy)
@@ -2310,14 +2310,13 @@  handle_visibility_attribute (tree *node,
 
 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: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 270883)
+++ cp/decl2.c	(working copy)
@@ -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);
 	}
     }
 }