r351457 - TLS: Respect visibility for thread_local variables on Darwin (PR40327)

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 18 01:37:01 PST 2019


Merged to the 8.0 branch in r351533. Please let me know if there are
any further commits for this issue.

Thanks,
Hans

On Thu, Jan 17, 2019 at 6:57 PM Vlad Tsyrklevich via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: vlad.tsyrklevich
> Date: Thu Jan 17 09:53:45 2019
> New Revision: 351457
>
> URL: http://llvm.org/viewvc/llvm-project?rev=351457&view=rev
> Log:
> TLS: Respect visibility for thread_local variables on Darwin (PR40327)
>
> Summary:
> Teach clang to mark thread wrappers for thread_local variables with
> hidden visibility when the original variable is marked with hidden
> visibility. This is necessary on Darwin which exposes the thread wrapper
> instead of the thread variable. The thread wrapper would previously
> always be created with default visibility unless it had
> linkonce*/weak_odr linkage.
>
> Reviewers: rjmccall
>
> Reviewed By: rjmccall
>
> Differential Revision: https://reviews.llvm.org/D56818
>
> Added:
>     cfe/trunk/test/CodeGenCXX/cxx11-thread-local-visibility.cpp
> Modified:
>     cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
>     cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp
>
> Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=351457&r1=351456&r2=351457&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original)
> +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Thu Jan 17 09:53:45 2019
> @@ -2463,10 +2463,12 @@ ItaniumCXXABI::getOrCreateThreadLocalWra
>      CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Wrapper);
>
>    // Always resolve references to the wrapper at link time.
> -  if (!Wrapper->hasLocalLinkage() && !(isThreadWrapperReplaceable(VD, CGM) &&
> -      !llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) &&
> -      !llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage())))
> -    Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
> +  if (!Wrapper->hasLocalLinkage())
> +    if (!isThreadWrapperReplaceable(VD, CGM) ||
> +        llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) ||
> +        llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage()) ||
> +        VD->getVisibility() == HiddenVisibility)
> +      Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
>
>    if (isThreadWrapperReplaceable(VD, CGM)) {
>      Wrapper->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
>
> Added: cfe/trunk/test/CodeGenCXX/cxx11-thread-local-visibility.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx11-thread-local-visibility.cpp?rev=351457&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/cxx11-thread-local-visibility.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/cxx11-thread-local-visibility.cpp Thu Jan 17 09:53:45 2019
> @@ -0,0 +1,17 @@
> +// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck --check-prefix=LINUX %s
> +// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-apple-darwin12 | FileCheck --check-prefix=DARWIN %s
> +
> +// Regression test for PR40327
> +
> +// LINUX: @default_tls = thread_local global i32
> +// LINUX: @hidden_tls = hidden thread_local global i32
> +// LINUX: define weak_odr hidden i32* @_ZTW11default_tls()
> +// LINUX: define weak_odr hidden i32* @_ZTW10hidden_tls()
> +//
> +// DARWIN: @default_tls = internal thread_local global i32
> +// DARWIN: @hidden_tls = internal thread_local global i32
> +// DARWIN: define cxx_fast_tlscc i32* @_ZTW11default_tls()
> +// DARWIN: define hidden cxx_fast_tlscc i32* @_ZTW10hidden_tls()
> +
> +__attribute__((visibility("default"))) thread_local int default_tls;
> +__attribute__((visibility("hidden"))) thread_local int hidden_tls;
>
> Modified: cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp?rev=351457&r1=351456&r2=351457&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp Thu Jan 17 09:53:45 2019
> @@ -318,7 +318,7 @@ void set_anon_i() {
>  // CHECK-NOT: call void @[[V_M_INIT]]()
>
>
> -// LIUNX: define weak_odr hidden i32* @_ZTW1a() {
> +// LINUX: define weak_odr hidden i32* @_ZTW1a()
>  // DARWIN: define cxx_fast_tlscc i32* @_ZTW1a()
>  // LINUX:   call void @_ZTH1a()
>  // DARWIN: call cxx_fast_tlscc void @_ZTH1a()
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list