================ @@ -3901,6 +3903,57 @@ CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty) { return Res; } +llvm::DIScope *CGDebugInfo::PickCompositeTypeScope(llvm::DIScope *S, + StringRef Identifier) { + using llvm::DISubprogram; + + // Only adjust the scope for composite types placed into functions. + if (!isa<DISubprogram>(S)) + return S; + + // We must adjust the scope if the ODR-name of the type is set. + if (Identifier.empty()) + return S; + + // This type has an ODR-name, and might be de-duplicated during LTO. It needs + // to be placed in the unique declaration of the function, not a (potentially + // duplicated) definition. + DISubprogram *SP = cast<DISubprogram>(S); + if (DISubprogram *Decl = SP->getDeclaration()) + return Decl; + + // There is no declaration -- we must produce one and retrofit it to the + // existing definition. Assume that we can just harvest the existing + // information, clear the definition flag and set as decl. + DISubprogram::DISPFlags SPFlags = SP->getSPFlags(); + SPFlags &= ~DISubprogram::SPFlagDefinition; + + llvm::DINode::DIFlags Flags = SP->getFlags(); + Flags &= ~llvm::DINode::FlagAllCallsDescribed; + +#ifdef EXPENSIVE_CHECKS + // If we're looking to be really rigorous and avoid a hard-to-debug mishap, + // make sure that there aren't any function definitions in the scope chain. + llvm::DIScope *ToCheck = SP->getScope(); + do { + // We should terminate at a DIFile rather than a DICompileUnit -- we're + // not fully unique across LTO otherwise. + assert(!isa<llvm::DICompileUnit>(ToCheck)); + if (auto *DISP = dyn_cast<DISubprogram>(ToCheck)) + assert(!(DISP->getSPFlags() & DISubprogram::SPFlagDefinition)); + ToCheck = ToCheck->getScope(); + } while (ToCheck); +#endif + + DISubprogram *DeclSP = DBuilder.createFunction( + SP->getScope(), SP->getName(), SP->getLinkageName(), SP->getFile(), + SP->getLine(), SP->getType(), SP->getScopeLine(), Flags, SPFlags, + SP->getTemplateParams(), nullptr, nullptr, SP->getAnnotations()); ---------------- dzhidzhoev wrote:
I've noticed that in the LLVM IR output of clang/test/CodeGenCXX/debug-info-local-types.cpp, `!DICompositeType(tag: DW_TAG_class_type, name: "bar"` is not attached to the retainedNodes of its scope (abstract DISubprogram for "foo"). Is it the desired behavior for us? The reason is that DIBuilder::finalizeSubprogram() is never called for DeclSP. We could track it and finalize it in CGDebugInfo::finalize, or we could try something like this https://github.com/llvm/llvm-project/pull/139914. https://github.com/llvm/llvm-project/pull/119001 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits