diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 1d3bad9f6dd1..8eb89871c559 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -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(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); diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index 68cc690216b6..3a0d07f2a8c4 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/lib/CodeGen/CGDebugInfo.h @@ -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);