Handle forward declarations properly in debug info.

Patch by Alexander Kabaev.
PR 7595.

llvm-svn: 107900
This commit is contained in:
Devang Patel 2010-07-08 19:56:29 +00:00
parent 63a622b768
commit 8f3f76f991
1 changed files with 14 additions and 6 deletions

View File

@ -758,22 +758,30 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty,
// its members. Finally, we create a descriptor for the complete type (which
// may refer to the forward decl if the struct is recursive) and replace all
// uses of the forward declaration with the final definition.
llvm::DIDescriptor FDContext =
getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
// If this is just a forward declaration, construct an appropriately
// marked node and just return it.
if (!RD->getDefinition()) {
llvm::DICompositeType FwdDecl =
DebugFactory.CreateCompositeType(Tag, FDContext, RD->getName(),
DefUnit, Line, 0, 0, 0,
llvm::DIType::FlagFwdDecl,
llvm::DIType(), llvm::DIArray());
return FwdDecl;
}
// A RD->getName() is not unique. However, the debug info descriptors
// are uniqued so use type name to ensure uniquness.
llvm::SmallString<128> FwdDeclName;
llvm::raw_svector_ostream(FwdDeclName) << "fwd.type." << FwdDeclCount++;
llvm::DIDescriptor FDContext =
getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
llvm::DICompositeType FwdDecl =
DebugFactory.CreateCompositeType(Tag, FDContext, FwdDeclName,
DefUnit, Line, 0, 0, 0, 0,
llvm::DIType(), llvm::DIArray());
// If this is just a forward declaration, return it.
if (!RD->getDefinition())
return FwdDecl;
llvm::MDNode *MN = FwdDecl;
llvm::TrackingVH<llvm::MDNode> FwdDeclNode = MN;
// Otherwise, insert it into the TypeCache so that recursive uses will find