From: Fariborz Jahanian Date: Sun, 8 Jan 2012 19:13:23 +0000 (+0000) Subject: objc++: more atomic property api code for X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1bed413c896fc2dcd63749d91957cf5b1c5f2bae;p=platform%2Fupstream%2Fllvm.git objc++: more atomic property api code for c++ object properties. wip. llvm-svn: 147750 --- diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 1b3eba4..b772361 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -2549,18 +2549,22 @@ CodeGenFunction::GenerateObjCAtomicCopyHelperFunction( if ((!(PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_atomic)) || /* temporary */ true) return 0; + llvm::Constant * HelperFn = 0; if (forSetter) { if (hasTrivialSetExpr(PID)) return 0; + assert(PID->getSetterCXXAssignment() && "SetterCXXAssignment - null"); + if ((HelperFn = CGM.getAtomicSetterHelperFnMap(Ty))) + return HelperFn; } - else + else { if (hasTrivialGetExpr(PID)) return 0; - llvm::Constant * HelperFn = CGM.getAtomicHelperFnMap(Ty); - if (HelperFn) - return HelperFn; + assert(PID->getGetterCXXConstructor() && "getGetterCXXConstructor - null"); + if ((HelperFn = CGM.getAtomicGetterHelperFnMap(Ty))) + return HelperFn; + } - assert(PID->getSetterCXXAssignment() && "SetterCXXAssignment - null"); ASTContext &C = getContext(); IdentifierInfo *II @@ -2615,7 +2619,8 @@ CodeGenFunction::GenerateObjCAtomicCopyHelperFunction( VK_LValue, OK_Ordinary, SourceLocation()); Expr *Args[2] = { DST, SRC }; - CallExpr *CalleeExp = cast(PID->getSetterCXXAssignment()); + CallExpr *CalleeExp = forSetter ? cast(PID->getSetterCXXAssignment()) + : cast(PID->getGetterCXXConstructor()); CXXOperatorCallExpr *TheCall = new (C) CXXOperatorCallExpr(C, OO_Equal, CalleeExp->getCallee(), Args, 2, DestTy->getPointeeType(), @@ -2625,7 +2630,10 @@ CodeGenFunction::GenerateObjCAtomicCopyHelperFunction( FinishFunction(); HelperFn = llvm::ConstantExpr::getBitCast(Fn, VoidPtrTy); - CGM.setAtomicHelperFnMap(Ty, HelperFn); + if (forSetter) + CGM.setAtomicSetterHelperFnMap(Ty, HelperFn); + else + CGM.setAtomicGetterHelperFnMap(Ty, HelperFn); return HelperFn; } diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index e78089b..4c839d1 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -277,7 +277,8 @@ class CodeGenModule : public CodeGenTypeCache { llvm::StringMap ConstantStringMap; llvm::DenseMap StaticLocalDeclMap; - llvm::DenseMap AtomicHelperFnMap; + llvm::DenseMap AtomicSetterHelperFnMap; + llvm::DenseMap AtomicGetterHelperFnMap; /// CXXGlobalInits - Global variables with initializers that need to run /// before main. @@ -400,12 +401,20 @@ public: StaticLocalDeclMap[D] = GV; } - llvm::Constant *getAtomicHelperFnMap(QualType Ty) { - return AtomicHelperFnMap[Ty]; + llvm::Constant *getAtomicSetterHelperFnMap(QualType Ty) { + return AtomicSetterHelperFnMap[Ty]; } - void setAtomicHelperFnMap(QualType Ty, + void setAtomicSetterHelperFnMap(QualType Ty, llvm::Constant *Fn) { - AtomicHelperFnMap[Ty] = Fn; + AtomicSetterHelperFnMap[Ty] = Fn; + } + + llvm::Constant *getAtomicGetterHelperFnMap(QualType Ty) { + return AtomicGetterHelperFnMap[Ty]; + } + void setAtomicGetterHelperFnMap(QualType Ty, + llvm::Constant *Fn) { + AtomicGetterHelperFnMap[Ty] = Fn; } CGDebugInfo *getModuleDebugInfo() { return DebugInfo; }