summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExpr.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-07-20 20:30:03 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-07-20 20:30:03 +0000
commit217af240b51a3f4deff1763ef44c3583ea696271 (patch)
tree5d06e4cc62607ea34130d74172f6ff1163bddb44 /clang/lib/CodeGen/CGExpr.cpp
parent6c018209003bc584be242e82c002841c64b762e0 (diff)
downloadbcm5719-llvm-217af240b51a3f4deff1763ef44c3583ea696271.tar.gz
bcm5719-llvm-217af240b51a3f4deff1763ef44c3583ea696271.zip
Adopt objc_assign_threadlocal() for __thread variables of GC types.
Implements radar 8203301. llvm-svn: 108917
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index d6a34562e55..b4ec0cadb78 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -836,8 +836,10 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
llvm::Value *BytesBetween = Builder.CreateSub(LHS, RHS, "ivar.offset");
CGM.getObjCRuntime().EmitObjCIvarAssign(*this, src, dst,
BytesBetween);
- } else if (Dst.isGlobalObjCRef())
- CGM.getObjCRuntime().EmitObjCGlobalAssign(*this, src, LvalueDst);
+ } else if (Dst.isGlobalObjCRef()) {
+ CGM.getObjCRuntime().EmitObjCGlobalAssign(*this, src, LvalueDst,
+ Dst.isThreadLocalRef());
+ }
else
CGM.getObjCRuntime().EmitObjCStrongCastAssign(*this, src, LvalueDst);
return;
@@ -1055,8 +1057,10 @@ static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
if (const DeclRefExpr *Exp = dyn_cast<DeclRefExpr>(E)) {
if (const VarDecl *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
if ((VD->isBlockVarDecl() && !VD->hasLocalStorage()) ||
- VD->isFileVarDecl())
+ VD->isFileVarDecl()) {
LV.SetGlobalObjCRef(LV, true);
+ LV.SetThreadLocalRef(LV, VD->isThreadSpecified());
+ }
}
LV.SetObjCArray(LV, E->getType()->isArrayType());
return;
OpenPOWER on IntegriCloud