diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-09-11 01:27:29 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-09-11 01:27:29 +0000 |
commit | 933c6723a43f26ff55cfa582a5826fc3c798bc7f (patch) | |
tree | 2b4590dd012f9e2d4dcee5150ee78ca233648c41 /clang/lib/CodeGen/CGObjCMac.cpp | |
parent | 8f22a243b743efee5cf94f5afc8461f70ce00fd2 (diff) | |
download | bcm5719-llvm-933c6723a43f26ff55cfa582a5826fc3c798bc7f.tar.gz bcm5719-llvm-933c6723a43f26ff55cfa582a5826fc3c798bc7f.zip |
Fixes an obscure bug in importd block variable layout
information when imported variable is used
more than once. Originally though to be a bug in importing
block varibles. Fixes radar 8417746.
llvm-svn: 113675
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 82541356863..73074b6bbe5 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -1000,7 +1000,7 @@ public: /// definition is seen. The return value has type ProtocolPtrTy. virtual llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD)=0; virtual llvm::Constant *GCBlockLayout(CodeGen::CodeGenFunction &CGF, - const llvm::SmallVectorImpl<const BlockDeclRefExpr *> &); + const llvm::SmallVectorImpl<const Expr *> &); }; @@ -1663,11 +1663,11 @@ static Qualifiers::GC GetGCAttrTypeForType(ASTContext &Ctx, QualType FQT) { } llvm::Constant *CGObjCCommonMac::GCBlockLayout(CodeGen::CodeGenFunction &CGF, - const llvm::SmallVectorImpl<const BlockDeclRefExpr *> &DeclRefs) { + const llvm::SmallVectorImpl<const Expr *> &BlockLayout) { llvm::Constant *NullPtr = llvm::Constant::getNullValue(llvm::Type::getInt8PtrTy(VMContext)); if ((CGM.getLangOptions().getGCMode() == LangOptions::NonGC) || - DeclRefs.empty()) + BlockLayout.empty()) return NullPtr; bool hasUnion = false; SkipIvars.clear(); @@ -1678,8 +1678,11 @@ llvm::Constant *CGObjCCommonMac::GCBlockLayout(CodeGen::CodeGenFunction &CGF, // __isa is the first field in block descriptor and must assume by runtime's // convention that it is GC'able. IvarsInfo.push_back(GC_IVAR(0, 1)); - for (size_t i = 0; i < DeclRefs.size(); ++i) { - const BlockDeclRefExpr *BDRE = DeclRefs[i]; + for (size_t i = 0; i < BlockLayout.size(); ++i) { + const Expr *E = BlockLayout[i]; + const BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(E); + if (!BDRE) + continue; const ValueDecl *VD = BDRE->getDecl(); CharUnits Offset = CGF.BlockDecls[VD]; uint64_t FieldOffset = Offset.getQuantity(); |