DebugInfo: Don't create duplicate forward declaration metadata unnecessarily.

No functionality change, at best a slight (questionable) optimization,
but necessary for correctness of future work.

llvm-svn: 188474
This commit is contained in:
David Blaikie 2013-08-15 18:59:40 +00:00
parent 0b48e7c6bd
commit d816e2d3b0
2 changed files with 11 additions and 7 deletions

View File

@ -602,8 +602,12 @@ llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty,
}
// Creates a forward declaration for a RecordDecl in the given context.
llvm::DIType CGDebugInfo::createRecordFwdDecl(const RecordDecl *RD,
llvm::DIDescriptor Ctx) {
llvm::DICompositeType
CGDebugInfo::getOrCreateRecordFwdDecl(const RecordDecl *RD,
llvm::DIDescriptor Ctx) {
llvm::DICompositeType T(getTypeOrNull(CGM.getContext().getRecordType(RD)));
if (T)
return T;
llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
unsigned Line = getLineNumber(RD->getLocation());
StringRef RDName = getClassName(RD);
@ -1413,7 +1417,7 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, bool Declaration) {
// test/CodeGen/debug-info-records.c .
llvm::DIDescriptor FDContext =
getContextDescriptor(cast<Decl>(RD->getDeclContext()));
llvm::DIType RetTy = createRecordFwdDecl(RD, FDContext);
llvm::DIType RetTy = getOrCreateRecordFwdDecl(RD, FDContext);
TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RetTy;
return RetTy;
}
@ -2175,7 +2179,7 @@ llvm::DIType CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
// If this is just a forward declaration, construct an appropriately
// marked node and just return it.
if (!RD->getDefinition())
return createRecordFwdDecl(RD, RDContext);
return getOrCreateRecordFwdDecl(RD, RDContext);
uint64_t Size = CGM.getContext().getTypeSize(Ty);
uint64_t Align = CGM.getContext().getTypeAlign(Ty);

View File

@ -305,9 +305,9 @@ private:
llvm::DIScope getCurrentContextDescriptor(const Decl *Decl);
/// createRecordFwdDecl - Create a forward decl for a RecordType in a given
/// context.
llvm::DIType createRecordFwdDecl(const RecordDecl *, llvm::DIDescriptor);
/// \brief Create a forward decl for a RecordType in a given context.
llvm::DICompositeType getOrCreateRecordFwdDecl(const RecordDecl *,
llvm::DIDescriptor);
/// createContextChain - Create a set of decls for the context chain.
llvm::DIDescriptor createContextChain(const Decl *Decl);