r228855 - Fix PR19351. While building up a composite type it is important to use
Adrian Prantl
aprantl at apple.com
Wed Feb 11 10:28:49 PST 2015
> On Feb 11, 2015, at 10:21 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Wed, Feb 11, 2015 at 9:45 AM, Adrian Prantl <aprantl at apple.com <mailto:aprantl at apple.com>> wrote:
> Author: adrian
> Date: Wed Feb 11 11:45:15 2015
> New Revision: 228855
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228855&view=rev <http://llvm.org/viewvc/llvm-project?rev=228855&view=rev>
> Log:
> Fix PR19351. While building up a composite type it is important to use
> a non-uniqueable temporary node that is only turned into a permanent
> unique or distinct node after it is finished.
> Otherwise an intermediate node may get accidentally uniqued with another
> node as illustrated by the testcase.
>
> Awesome - thanks!
>
We should probably rename getOrCreateLimitedType() now, as it has nothing to do with limited debug info any more. Any suggestions?
-- adrian
>
> Paired commit with LLVM.
>
> Added:
> cfe/trunk/test/CodeGen/debug-info-same-line.c
> Modified:
> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=228855&r1=228854&r2=228855&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=228855&r1=228854&r2=228855&view=diff>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Feb 11 11:45:15 2015
> @@ -621,6 +621,21 @@ static SmallString<256> getUniqueTagType
> return FullName;
> }
>
> +static llvm::dwarf::Tag getTagForRecord(const RecordDecl *RD) {
> + llvm::dwarf::Tag Tag;
> + if (RD->isStruct() || RD->isInterface())
> + Tag = llvm::dwarf::DW_TAG_structure_type;
> + else if (RD->isUnion())
> + Tag = llvm::dwarf::DW_TAG_union_type;
> + else {
> + // FIXME: This could be a struct type giving a default visibility different
> + // than C++ class type, but needs llvm metadata changes first.
> + assert(RD->isClass());
> + Tag = llvm::dwarf::DW_TAG_class_type;
> + }
> + return Tag;
> +}
> +
> // Creates a forward declaration for a RecordDecl in the given context.
> llvm::DICompositeType
> CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,
> @@ -632,20 +647,12 @@ CGDebugInfo::getOrCreateRecordFwdDecl(co
> unsigned Line = getLineNumber(RD->getLocation());
> StringRef RDName = getClassName(RD);
>
> - llvm::dwarf::Tag Tag;
> - if (RD->isStruct() || RD->isInterface())
> - Tag = llvm::dwarf::DW_TAG_structure_type;
> - else if (RD->isUnion())
> - Tag = llvm::dwarf::DW_TAG_union_type;
> - else {
> - assert(RD->isClass());
> - Tag = llvm::dwarf::DW_TAG_class_type;
> - }
>
> // Create the type.
> SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU);
> - llvm::DICompositeType RetTy = DBuilder.createReplaceableForwardDecl(
> - Tag, RDName, Ctx, DefUnit, Line, 0, 0, 0, FullName);
> + llvm::DICompositeType RetTy = DBuilder.createReplaceableCompositeType(
> + getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, 0, 0,
> + llvm::DIDescriptor::FlagFwdDecl, FullName);
> ReplaceMap.emplace_back(
> std::piecewise_construct, std::make_tuple(Ty),
> std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
> @@ -1567,7 +1574,8 @@ llvm::DIType CGDebugInfo::CreateTypeDefi
> assert(FwdDecl.isCompositeType() &&
> "The debug type of a RecordType should be a llvm::DICompositeType");
>
> - if (FwdDecl.isForwardDecl())
> + const RecordDecl *D = RD->getDefinition();
> + if (!D || !D->isCompleteDefinition())
> return FwdDecl;
>
> if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD))
> @@ -1602,6 +1610,10 @@ llvm::DIType CGDebugInfo::CreateTypeDefi
> llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys);
> DBuilder.replaceArrays(FwdDecl, Elements);
>
> + if (FwdDecl->isTemporary())
> + FwdDecl = llvm::DICompositeType(llvm::MDNode::replaceWithPermanent(
> + llvm::TempMDNode(FwdDecl.get())));
> +
> RegionMap[Ty->getDecl()].reset(FwdDecl);
> return FwdDecl;
> }
> @@ -1653,7 +1665,7 @@ llvm::DIType CGDebugInfo::CreateType(con
> // debug type since we won't be able to lay out the entire type.
> ObjCInterfaceDecl *Def = ID->getDefinition();
> if (!Def || !Def->getImplementation()) {
> - llvm::DIType FwdDecl = DBuilder.createReplaceableForwardDecl(
> + llvm::DIType FwdDecl = DBuilder.createReplaceableCompositeType(
> llvm::dwarf::DW_TAG_structure_type, ID->getName(), TheCU, DefUnit, Line,
> RuntimeLang);
> ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit));
> @@ -1933,9 +1945,9 @@ llvm::DIType CGDebugInfo::CreateEnumType
> llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation());
> unsigned Line = getLineNumber(ED->getLocation());
> StringRef EDName = ED->getName();
> - llvm::DIType RetTy = DBuilder.createReplaceableForwardDecl(
> + llvm::DIType RetTy = DBuilder.createReplaceableCompositeType(
> llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line,
> - 0, Size, Align, FullName);
> + 0, Size, Align, llvm::DIDescriptor::FlagFwdDecl, FullName);
> ReplaceMap.emplace_back(
> std::piecewise_construct, std::make_tuple(Ty),
> std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
> @@ -2249,19 +2261,8 @@ llvm::DICompositeType CGDebugInfo::Creat
>
> SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU);
>
> - if (RD->isUnion())
> - RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, Size,
> - Align, 0, llvm::DIArray(), 0, FullName);
> - else if (RD->isClass()) {
> - // FIXME: This could be a struct type giving a default visibility different
> - // than C++ class type, but needs llvm metadata changes first.
> - RealDecl = DBuilder.createClassType(
> - RDContext, RDName, DefUnit, Line, Size, Align, 0, 0, llvm::DIType(),
> - llvm::DIArray(), llvm::DIType(), llvm::DIArray(), FullName);
> - } else
> - RealDecl = DBuilder.createStructType(
> - RDContext, RDName, DefUnit, Line, Size, Align, 0, llvm::DIType(),
> - llvm::DIArray(), 0, llvm::DIType(), FullName);
> + RealDecl = DBuilder.createReplaceableCompositeType(getTagForRecord(RD),
> + RDName, RDContext, DefUnit, Line, 0, Size, Align, 0, FullName);
>
> RegionMap[Ty->getDecl()].reset(RealDecl);
> TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
>
> Added: cfe/trunk/test/CodeGen/debug-info-same-line.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-same-line.c?rev=228855&view=auto <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-same-line.c?rev=228855&view=auto>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/debug-info-same-line.c (added)
> +++ cfe/trunk/test/CodeGen/debug-info-same-line.c Wed Feb 11 11:45:15 2015
> @@ -0,0 +1,7 @@
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm %s -g -o - | FileCheck %s
> +// Here two temporary nodes are identical (but should not get uniqued) while
> +// building the full debug type.
> +typedef struct { long x; } foo; typedef struct { foo *x; } bar;
> +// CHECK: [ DW_TAG_structure_type ] [line 4, size 64,
> +// CHECK: [ DW_TAG_structure_type ] [line 4, size 64,
> +bar b;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits <http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150211/f588f3a6/attachment.html>
More information about the cfe-commits
mailing list