r178360 - Improvement on r177086.

David Blaikie dblaikie at gmail.com
Mon Apr 15 19:56:19 PDT 2013


On Fri, Mar 29, 2013 at 12:20 PM, Adrian Prantl <aprantl at apple.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list