From cb8ba767abe007863f388bd66e0bd2e777a1d0b2 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Thu, 10 May 2018 07:36:38 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@260106 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c-family/ChangeLog | 5 +++++ gcc/c-family/c-attribs.c | 5 ++--- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/decl2.c | 16 ++++++++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/tls/pr85400.C | 24 ++++++++++++++++++++++++ 6 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tls/pr85400.C diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 087379f1a15..6ea5eaf1fdf 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2018-05-10 Eric Botcazou + + PR c++/85400 + * c-attribs.c (handle_visibility_attribute): Do not set no_add_attrs. + 2018-05-07 Nathan Sidwell * c.opt (ffor-scope): Remove functionality, issue warning. diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index e0630885cca..9bddc1aad4f 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -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); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 98249e9696f..a2de8f68125 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-05-10 Eric Botcazou + + 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 PR c++/85713 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 9aae34a814c..6f3ad4c5150 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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); } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 45327ac3ad7..5bbcd708d65 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-05-10 Eric Botcazou + + * g++.dg/tls/pr85400.C: New test. + 2018-05-09 Paolo Carlini 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 index 00000000000..f8d1bceaca5 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/pr85400.C @@ -0,0 +1,24 @@ +// PR c++/85400 +// Testcase by Brian Vandenberg + +// { 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); +} -- 2.11.4.GIT