Author: rsmith Date: Tue Jun 4 17:04:33 2019 New Revision: 362562 URL: http://llvm.org/viewvc/llvm-project?rev=362562&view=rev Log: PR42111: Use guarded initialization for thread-local variables with unordered initialization and internal linkage.
We'll run their initializers once on each reference, so we need a guard variable even though they only have a single definition. Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp cfe/trunk/test/CodeGenCXX/cxx1y-variable-template.cpp Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=362562&r1=362561&r2=362562&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Tue Jun 4 17:04:33 2019 @@ -630,7 +630,13 @@ void CodeGenFunction::GenerateCXXGlobalV // Use guarded initialization if the global variable is weak. This // occurs for, e.g., instantiated static data members and // definitions explicitly marked weak. - if (Addr->hasWeakLinkage() || Addr->hasLinkOnceLinkage()) { + // + // Also use guarded initialization for a variable with dynamic TLS and + // unordered initialization. (If the initialization is ordered, the ABI + // layer will guard the whole-TU initialization for us.) + if (Addr->hasWeakLinkage() || Addr->hasLinkOnceLinkage() || + (D->getTLSKind() == VarDecl::TLS_Dynamic && + isTemplateInstantiation(D->getTemplateSpecializationKind()))) { EmitCXXGuardedInit(*D, Addr, PerformInit); } else { EmitCXXGlobalVarDeclInit(*D, Addr, PerformInit); Modified: cfe/trunk/test/CodeGenCXX/cxx1y-variable-template.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx1y-variable-template.cpp?rev=362562&r1=362561&r2=362562&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/cxx1y-variable-template.cpp (original) +++ cfe/trunk/test/CodeGenCXX/cxx1y-variable-template.cpp Tue Jun 4 17:04:33 2019 @@ -27,4 +27,21 @@ int *p = &n<0>; // CHECK: @_ZN5OuterIA100_cE5InnerIA20_cE3arrIA3_cEE = linkonce_odr global [123 x i32] zeroinitializer // CHECK: @_ZGVN5OuterIA100_cE5InnerIA20_cE3arrIA3_cEE = linkonce_odr global +// CHECK: @_ZTHN7PR4211112_GLOBAL__N_11nILi0EEE = internal alias {{.*}} @[[PR42111_CTOR:.*]] + // CHECK: call {{.*}}@_Z8init_arrv + +// Ensure that we use guarded initialization for an instantiated thread_local +// variable with internal linkage. +namespace PR42111 { + int f(); + namespace { template <int = 0> thread_local int n = f(); } + // CHECK: define {{.*}}@[[PR42111_CTOR]]( + // CHECK: load {{.*}} @_ZGVN7PR4211112_GLOBAL__N_11nILi0EEE + // CHECK: icmp eq i8 {{.*}}, 0 + // CHECK: br i1 + // CHECK: call i32 @_ZN7PR421111fEv( + // CHECK: store i32 {{.*}}, i32* @_ZN7PR4211112_GLOBAL__N_11nILi0EEE + // CHECK: store i8 1, i8* @_ZGVN7PR4211112_GLOBAL__N_11nILi0EEE + int g() { return n<> + n<>; } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits