diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-26 22:48:22 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-26 22:48:22 +0000 |
commit | 0f38374f718559e3942907722db6a589769ff2de (patch) | |
tree | 7419af45ac4c4a2c8a841109d576317d60307e90 /clang/lib/CodeGen/CGExpr.cpp | |
parent | b220a129ca42d3327d799e975b768689445885bd (diff) | |
download | bcm5719-llvm-0f38374f718559e3942907722db6a589769ff2de.tar.gz bcm5719-llvm-0f38374f718559e3942907722db6a589769ff2de.zip |
PR19254: If a thread_local data member of a class is accessed via member access
syntax, don't forget to run its initializer.
llvm-svn: 204869
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 5ba748a88d4..1bdd094873a 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1691,11 +1691,16 @@ EmitBitCastOfLValueToProperType(CodeGenFunction &CGF, static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF, const Expr *E, const VarDecl *VD) { + QualType T = E->getType(); + + // If it's thread_local, emit a call to its wrapper function instead. + if (VD->getTLSKind() == VarDecl::TLS_Dynamic) + return CGF.CGM.getCXXABI().EmitThreadLocalVarDeclLValue(CGF, VD, T); + llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD); llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType()); V = EmitBitCastOfLValueToProperType(CGF, V, RealVarTy); CharUnits Alignment = CGF.getContext().getDeclAlign(VD); - QualType T = E->getType(); LValue LV; if (VD->getType()->isReferenceType()) { llvm::LoadInst *LI = CGF.Builder.CreateLoad(V); @@ -1703,7 +1708,7 @@ static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF, V = LI; LV = CGF.MakeNaturalAlignAddrLValue(V, T); } else { - LV = CGF.MakeAddrLValue(V, E->getType(), Alignment); + LV = CGF.MakeAddrLValue(V, T, Alignment); } setObjCGCLValueClass(CGF.getContext(), E, LV); return LV; @@ -1770,12 +1775,8 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) { // Check if this is a global variable. - if (VD->hasLinkage() || VD->isStaticDataMember()) { - // If it's thread_local, emit a call to its wrapper function instead. - if (VD->getTLSKind() == VarDecl::TLS_Dynamic) - return CGM.getCXXABI().EmitThreadLocalDeclRefExpr(*this, E); + if (VD->hasLinkage() || VD->isStaticDataMember()) return EmitGlobalVarDeclLValue(*this, E, VD); - } bool isBlockVariable = VD->hasAttr<BlocksAttr>(); |