On Fri, Mar 29, 2013 at 12:20 PM, Adrian Prantl <[email protected]> wrote: > Author: adrian > Date: Fri Mar 29 14:20:29 2013 > New Revision: 178360 > > URL: http://llvm.org/viewvc/llvm-project?rev=178360&view=rev > Log: > Improvement on r177086. > * Let DIType for block-captured self to point to the completed cached > interface type. > rdar://problem/12767564 > > Modified: > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/lib/CodeGen/CGDebugInfo.h
Test case? > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=178360&r1=178359&r2=178360&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Mar 29 14:20:29 2013 > @@ -2148,8 +2148,9 @@ llvm::DIType CGDebugInfo::getOrCreateFun > // First element is always return type. For 'void' functions it is NULL. > Elts.push_back(getOrCreateType(OMethod->getResultType(), F)); > // "self" pointer is always first argument. > - llvm::DIType SelfTy = getOrCreateType(OMethod->getSelfDecl()->getType(), > F); > - Elts.push_back(DBuilder.createObjectPointerType(SelfTy)); > + QualType SelfDeclTy = OMethod->getSelfDecl()->getType(); > + llvm::DIType SelfTy = getOrCreateType(SelfDeclTy, F); > + Elts.push_back(CreateSelfType(SelfDeclTy, SelfTy)); > // "_cmd" pointer is always second argument. > llvm::DIType CmdTy = getOrCreateType(OMethod->getCmdDecl()->getType(), > F); > Elts.push_back(DBuilder.createArtificialType(CmdTy)); > @@ -2581,6 +2582,19 @@ void CGDebugInfo::EmitDeclareOfAutoVaria > EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, 0, Builder); > } > > +/// Look up the completed type for a self pointer in the TypeCache and > +/// create a copy of it with the ObjectPointer and Artificial flags > +/// set. If the type is not cached, a new one is created. This should > +/// never happen though, since creating a type for the implicit self > +/// argument implies that we already parsed the interface definition > +/// and the ivar declarations in the implementation. > +llvm::DIType CGDebugInfo::CreateSelfType(const QualType &QualTy, > llvm::DIType Ty) { > + llvm::DIType CachedTy = getTypeOrNull(QualTy); > + if (CachedTy.Verify()) Ty = CachedTy; > + else DEBUG(llvm::dbgs() << "No cached type for self."); > + return DBuilder.createObjectPointerType(Ty); > +} > + > void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD, > llvm::Value *Storage, > CGBuilderTy &Builder, > @@ -2604,7 +2618,7 @@ void CGDebugInfo::EmitDeclareOfBlockDecl > // Self is passed along as an implicit non-arg variable in a > // block. Mark it as the object pointer. > if (isa<ImplicitParamDecl>(VD) && VD->getName() == "self") > - Ty = DBuilder.createObjectPointerType(Ty); > + Ty = CreateSelfType(VD->getType(), Ty); > > // Get location information. > unsigned Line = getLineNumber(VD->getLocation()); > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=178360&r1=178359&r2=178360&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Fri Mar 29 14:20:29 2013 > @@ -119,6 +119,7 @@ class CGDebugInfo { > llvm::DIType CreateType(const MemberPointerType *Ty, llvm::DIFile F); > llvm::DIType CreateType(const AtomicType *Ty, llvm::DIFile F); > llvm::DIType CreateEnumType(const EnumDecl *ED); > + llvm::DIType CreateSelfType(const QualType &QualTy, llvm::DIType Ty); > llvm::DIType getTypeOrNull(const QualType); > llvm::DIType getCompletedTypeOrNull(const QualType); > llvm::DIType getOrCreateMethodType(const CXXMethodDecl *Method, > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
