39#include "llvm/ADT/DenseSet.h"
40#include "llvm/ADT/SmallVector.h"
41#include "llvm/ADT/StringExtras.h"
42#include "llvm/IR/Constants.h"
43#include "llvm/IR/DataLayout.h"
44#include "llvm/IR/DerivedTypes.h"
45#include "llvm/IR/Instructions.h"
46#include "llvm/IR/Intrinsics.h"
47#include "llvm/IR/Metadata.h"
48#include "llvm/IR/Module.h"
49#include "llvm/Support/FileSystem.h"
50#include "llvm/Support/MD5.h"
51#include "llvm/Support/Path.h"
52#include "llvm/Support/SHA1.h"
53#include "llvm/Support/SHA256.h"
54#include "llvm/Support/TimeProfiler.h"
73 : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()),
74 DebugTypeExtRefs(CGM.getCodeGenOpts().DebugTypeExtRefs),
75 DBuilder(CGM.getModule()) {
80 assert(LexicalBlockStack.empty() &&
81 "Region stack mismatch, stack not empty!");
87 init(TemporaryLocation);
94 init(TemporaryLocation, DefaultToEmpty);
98 bool DefaultToEmpty) {
105 OriginalLocation = CGF->
Builder.getCurrentDebugLocation();
107 if (OriginalLocation && !DI->CGM.getExpressionLocationsEnabled())
110 if (TemporaryLocation.
isValid()) {
111 DI->EmitLocation(CGF->
Builder, TemporaryLocation);
115 if (DefaultToEmpty) {
116 CGF->
Builder.SetCurrentDebugLocation(llvm::DebugLoc());
121 assert(!DI->LexicalBlockStack.empty());
122 CGF->
Builder.SetCurrentDebugLocation(
123 llvm::DILocation::get(DI->LexicalBlockStack.back()->getContext(), 0, 0,
124 DI->LexicalBlockStack.back(), DI->getInlinedAt()));
138 OriginalLocation = CGF.
Builder.getCurrentDebugLocation();
140 CGF.
Builder.SetCurrentDebugLocation(std::move(Loc));
147 CGF->
Builder.SetCurrentDebugLocation(std::move(OriginalLocation));
158 SavedLocation = DI.getLocation();
159 assert((DI.getInlinedAt() ==
160 CGF.
Builder.getCurrentDebugLocation()->getInlinedAt()) &&
161 "CGDebugInfo and IRBuilder are out of sync");
163 DI.EmitInlineFunctionStart(CGF.
Builder, InlinedFn);
171 DI.EmitLocation(CGF->
Builder, SavedLocation);
184 if (LexicalBlockStack.empty())
188 auto *
Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
190 if (PCLoc.
isInvalid() ||
Scope->getFile() == getOrCreateFile(CurLoc))
193 if (
auto *LBF = dyn_cast<llvm::DILexicalBlockFile>(
Scope)) {
194 LexicalBlockStack.pop_back();
195 LexicalBlockStack.emplace_back(DBuilder.createLexicalBlockFile(
196 LBF->getScope(), getOrCreateFile(CurLoc)));
197 }
else if (isa<llvm::DILexicalBlock>(
Scope) ||
198 isa<llvm::DISubprogram>(
Scope)) {
199 LexicalBlockStack.pop_back();
200 LexicalBlockStack.emplace_back(
201 DBuilder.createLexicalBlockFile(
Scope, getOrCreateFile(CurLoc)));
205llvm::DIScope *CGDebugInfo::getDeclContextDescriptor(
const Decl *D) {
206 llvm::DIScope *Mod = getParentModuleOrNull(D);
211llvm::DIScope *CGDebugInfo::getContextDescriptor(
const Decl *Context,
216 auto I = RegionMap.find(Context);
217 if (I != RegionMap.end()) {
218 llvm::Metadata *
V = I->second;
219 return dyn_cast_or_null<llvm::DIScope>(
V);
223 if (
const auto *NSDecl = dyn_cast<NamespaceDecl>(Context))
224 return getOrCreateNamespace(NSDecl);
226 if (
const auto *RDecl = dyn_cast<RecordDecl>(Context))
227 if (!RDecl->isDependentType())
261StringRef CGDebugInfo::getFunctionName(
const FunctionDecl *FD) {
262 return internString(GetName(FD));
265StringRef CGDebugInfo::getObjCMethodName(
const ObjCMethodDecl *OMD) {
267 llvm::raw_svector_ostream OS(MethodName);
270 if (
const auto *OID = dyn_cast<ObjCImplementationDecl>(DC)) {
271 OS << OID->getName();
272 }
else if (
const auto *OID = dyn_cast<ObjCInterfaceDecl>(DC)) {
273 OS << OID->getName();
274 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(DC)) {
275 if (OC->IsClassExtension()) {
276 OS << OC->getClassInterface()->getName();
278 OS << OC->getIdentifier()->getNameStart() <<
'('
279 << OC->getIdentifier()->getNameStart() <<
')';
281 }
else if (
const auto *OCD = dyn_cast<ObjCCategoryImplDecl>(DC)) {
282 OS << OCD->getClassInterface()->getName() <<
'(' << OCD->getName() <<
')';
286 return internString(OS.str());
289StringRef CGDebugInfo::getSelectorName(
Selector S) {
290 return internString(S.getAsString());
293StringRef CGDebugInfo::getClassName(
const RecordDecl *RD) {
294 if (isa<ClassTemplateSpecializationDecl>(RD)) {
296 return internString(GetName(RD));
302 return II->getName();
310 "Typedef should not be in another decl context!");
311 assert(D->getDeclName().getAsIdentifierInfo() &&
312 "Typedef was not named!");
313 return D->getDeclName().getAsIdentifierInfo()->getName();
323 Name = DD->getName();
328 Name = TND->getName();
331 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
332 if (CXXRD->isLambda())
340 return internString(UnnamedType);
348std::optional<llvm::DIFile::ChecksumKind>
357 std::optional<llvm::MemoryBufferRef> MemBuffer =
SM.getBufferOrNone(FID);
361 auto Data = llvm::arrayRefFromStringRef(MemBuffer->getBuffer());
364 llvm::toHex(llvm::MD5::hash(
Data),
true, Checksum);
365 return llvm::DIFile::CSK_MD5;
367 llvm::toHex(llvm::SHA1::hash(
Data),
true, Checksum);
368 return llvm::DIFile::CSK_SHA1;
370 llvm::toHex(llvm::SHA256::hash(
Data),
true, Checksum);
371 return llvm::DIFile::CSK_SHA256;
373 llvm_unreachable(
"Unhandled DebugSrcHashKind enum");
376std::optional<StringRef> CGDebugInfo::getSource(
const SourceManager &
SM,
381 bool SourceInvalid =
false;
382 StringRef Source =
SM.getBufferData(FID, &SourceInvalid);
394 std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo;
400 FileName = TheCU->getFile()->getFilename();
401 CSInfo = TheCU->getFile()->getChecksum();
406 if (FileName.empty()) {
407 FileName = TheCU->getFile()->getFilename();
415 auto It = DIFileCache.find(FileName.data());
416 if (It != DIFileCache.end()) {
418 if (llvm::Metadata *
V = It->second)
419 return cast<llvm::DIFile>(
V);
425 std::optional<llvm::DIFile::ChecksumKind> CSKind =
426 computeChecksum(FID, Checksum);
428 CSInfo.emplace(*CSKind, Checksum);
430 return createFile(FileName, CSInfo, getSource(
SM,
SM.getFileID(Loc)));
433llvm::DIFile *CGDebugInfo::createFile(
435 std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo,
436 std::optional<StringRef> Source) {
440 std::string CurDir =
remapDIPath(getCurrentDirname());
443 if (llvm::sys::path::is_absolute(RemappedFile)) {
446 auto FileIt = llvm::sys::path::begin(RemappedFile);
447 auto FileE = llvm::sys::path::end(RemappedFile);
448 auto CurDirIt = llvm::sys::path::begin(CurDir);
449 auto CurDirE = llvm::sys::path::end(CurDir);
450 for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt)
451 llvm::sys::path::append(DirBuf, *CurDirIt);
452 if (llvm::sys::path::root_path(DirBuf) == DirBuf) {
458 for (; FileIt != FileE; ++FileIt)
459 llvm::sys::path::append(FileBuf, *FileIt);
464 if (!llvm::sys::path::is_absolute(FileName))
468 llvm::DIFile *F = DBuilder.createFile(
File, Dir, CSInfo, Source);
469 DIFileCache[FileName.data()].reset(F);
476 if (llvm::sys::path::replace_path_prefix(
P, From, To))
478 return P.str().str();
485 return SM.getPresumedLoc(Loc).getLine();
488unsigned CGDebugInfo::getColumnNumber(
SourceLocation Loc,
bool Force) {
501StringRef CGDebugInfo::getCurrentDirname() {
505 if (!CWDName.empty())
507 llvm::ErrorOr<std::string> CWD =
511 return CWDName = internString(*CWD);
514void CGDebugInfo::CreateCompileUnit() {
516 std::optional<llvm::DIFile::ChecksumKind> CSKind;
517 std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo;
530 std::string MainFileName = CGO.MainFileName;
531 if (MainFileName.empty())
532 MainFileName =
"<stdin>";
538 std::string MainFileDir;
540 SM.getFileEntryRefForID(
SM.getMainFileID())) {
541 MainFileDir = std::string(MainFile->getDir().getName());
542 if (!llvm::sys::path::is_absolute(MainFileName)) {
544 llvm::sys::path::Style Style =
547 ? llvm::sys::path::Style::windows_backslash
548 : llvm::sys::path::Style::posix)
549 : llvm::sys::path::Style::native;
550 llvm::sys::path::append(MainFileDirSS, Style, MainFileName);
551 MainFileName = std::string(
552 llvm::sys::path::remove_leading_dotslash(MainFileDirSS, Style));
558 if (MainFile->getName() == MainFileName &&
560 MainFile->getName().rsplit(
'.').second)
562 MainFileName = CGM.
getModule().getName().str();
564 CSKind = computeChecksum(
SM.getMainFileID(), Checksum);
567 llvm::dwarf::SourceLanguage LangTag;
570 LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus;
571 else if (CGO.DebugStrictDwarf && CGO.DwarfVersion < 5)
572 LangTag = llvm::dwarf::DW_LANG_C_plus_plus;
573 else if (LO.CPlusPlus14)
574 LangTag = llvm::dwarf::DW_LANG_C_plus_plus_14;
575 else if (LO.CPlusPlus11)
576 LangTag = llvm::dwarf::DW_LANG_C_plus_plus_11;
578 LangTag = llvm::dwarf::DW_LANG_C_plus_plus;
579 }
else if (LO.ObjC) {
580 LangTag = llvm::dwarf::DW_LANG_ObjC;
581 }
else if (LO.OpenCL && (!CGM.
getCodeGenOpts().DebugStrictDwarf ||
583 LangTag = llvm::dwarf::DW_LANG_OpenCL;
584 }
else if (LO.RenderScript) {
585 LangTag = llvm::dwarf::DW_LANG_GOOGLE_RenderScript;
586 }
else if (LO.C11 && !(CGO.DebugStrictDwarf && CGO.DwarfVersion < 5)) {
587 LangTag = llvm::dwarf::DW_LANG_C11;
589 LangTag = llvm::dwarf::DW_LANG_C99;
591 LangTag = llvm::dwarf::DW_LANG_C89;
597 unsigned RuntimeVers = 0;
601 llvm::DICompileUnit::DebugEmissionKind EmissionKind;
603 case llvm::codegenoptions::NoDebugInfo:
604 case llvm::codegenoptions::LocTrackingOnly:
605 EmissionKind = llvm::DICompileUnit::NoDebug;
607 case llvm::codegenoptions::DebugLineTablesOnly:
608 EmissionKind = llvm::DICompileUnit::LineTablesOnly;
610 case llvm::codegenoptions::DebugDirectivesOnly:
611 EmissionKind = llvm::DICompileUnit::DebugDirectivesOnly;
613 case llvm::codegenoptions::DebugInfoConstructor:
614 case llvm::codegenoptions::LimitedDebugInfo:
615 case llvm::codegenoptions::FullDebugInfo:
616 case llvm::codegenoptions::UnusedTypeInfo:
617 EmissionKind = llvm::DICompileUnit::FullDebug;
628 CSInfo.emplace(*CSKind, Checksum);
629 llvm::DIFile *CUFile = DBuilder.createFile(
631 getSource(
SM,
SM.getMainFileID()));
633 StringRef Sysroot, SDK;
634 if (CGM.
getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB) {
636 auto B = llvm::sys::path::rbegin(Sysroot);
637 auto E = llvm::sys::path::rend(Sysroot);
638 auto It = std::find_if(B, E, [](
auto SDK) {
return SDK.endswith(
".sdk"); });
643 llvm::DICompileUnit::DebugNameTableKind NameTableKind =
644 static_cast<llvm::DICompileUnit::DebugNameTableKind
>(
645 CGOpts.DebugNameTable);
647 NameTableKind = llvm::DICompileUnit::DebugNameTableKind::None;
649 NameTableKind = llvm::DICompileUnit::DebugNameTableKind::Apple;
652 TheCU = DBuilder.createCompileUnit(
653 LangTag, CUFile, CGOpts.EmitVersionIdentMetadata ? Producer :
"",
654 LO.Optimize || CGOpts.PrepareForLTO || CGOpts.PrepareForThinLTO,
655 CGOpts.DwarfDebugFlags, RuntimeVers, CGOpts.SplitDwarfFile, EmissionKind,
656 DwoId, CGOpts.SplitDwarfInlining, CGOpts.DebugInfoForProfiling,
657 NameTableKind, CGOpts.DebugRangesBaseAddress,
remapDIPath(Sysroot), SDK);
660llvm::DIType *CGDebugInfo::CreateType(
const BuiltinType *BT) {
664#define BUILTIN_TYPE(Id, SingletonId)
665#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
666#include "clang/AST/BuiltinTypes.def"
667 case BuiltinType::Dependent:
668 llvm_unreachable(
"Unexpected builtin type");
669 case BuiltinType::NullPtr:
670 return DBuilder.createNullPtrType();
671 case BuiltinType::Void:
673 case BuiltinType::ObjCClass:
676 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
677 "objc_class", TheCU, TheCU->getFile(), 0);
679 case BuiltinType::ObjCId: {
690 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
691 "objc_class", TheCU, TheCU->getFile(), 0);
695 auto *ISATy = DBuilder.createPointerType(ClassTy, Size);
697 ObjTy = DBuilder.createStructType(TheCU,
"objc_object", TheCU->getFile(), 0,
698 0, 0, llvm::DINode::FlagZero,
nullptr,
699 llvm::DINodeArray());
701 DBuilder.replaceArrays(
702 ObjTy, DBuilder.getOrCreateArray(&*DBuilder.createMemberType(
703 ObjTy,
"isa", TheCU->getFile(), 0, Size, 0, 0,
704 llvm::DINode::FlagZero, ISATy)));
707 case BuiltinType::ObjCSel: {
709 SelTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
710 "objc_selector", TheCU,
711 TheCU->getFile(), 0);
715#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
716 case BuiltinType::Id: \
717 return getOrCreateStructPtrType("opencl_" #ImgType "_" #Suffix "_t", \
719#include "clang/Basic/OpenCLImageTypes.def"
720 case BuiltinType::OCLSampler:
721 return getOrCreateStructPtrType(
"opencl_sampler_t", OCLSamplerDITy);
722 case BuiltinType::OCLEvent:
723 return getOrCreateStructPtrType(
"opencl_event_t", OCLEventDITy);
724 case BuiltinType::OCLClkEvent:
725 return getOrCreateStructPtrType(
"opencl_clk_event_t", OCLClkEventDITy);
726 case BuiltinType::OCLQueue:
727 return getOrCreateStructPtrType(
"opencl_queue_t", OCLQueueDITy);
728 case BuiltinType::OCLReserveID:
729 return getOrCreateStructPtrType(
"opencl_reserve_id_t", OCLReserveIDDITy);
730#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
731 case BuiltinType::Id: \
732 return getOrCreateStructPtrType("opencl_" #ExtType, Id##Ty);
733#include "clang/Basic/OpenCLExtensionTypes.def"
735#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
736#include "clang/Basic/AArch64SVEACLETypes.def"
740 BT->
getKind() == BuiltinType::SveCount
744 : CGM.getContext().getBuiltinVectorTypeInfo(BT);
751 "Unsupported number of vectors for svcount_t");
755 unsigned NumElems = Info.
EC.getKnownMinValue() * Info.
NumVectors;
761 llvm::Metadata *LowerBound, *UpperBound;
762 LowerBound = llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
764 if (Info.
EC.isScalable()) {
765 unsigned NumElemsPerVG = NumElems / 2;
767 {llvm::dwarf::DW_OP_constu, NumElemsPerVG, llvm::dwarf::DW_OP_bregx,
768 46, 0, llvm::dwarf::DW_OP_mul,
769 llvm::dwarf::DW_OP_constu, 1, llvm::dwarf::DW_OP_minus});
770 UpperBound = DBuilder.createExpression(
Expr);
772 UpperBound = llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
775 llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange(
776 nullptr, LowerBound, UpperBound,
nullptr);
777 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
778 llvm::DIType *ElemTy =
779 getOrCreateType(Info.
ElementType, TheCU->getFile());
781 return DBuilder.createVectorType( 0, Align, ElemTy,
786#define PPC_VECTOR_TYPE(Name, Id, size) \
787 case BuiltinType::Id:
788#include "clang/Basic/PPCTypes.def"
791#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
792#include "clang/Basic/RISCVVTypes.def"
797 unsigned ElementCount = Info.
EC.getKnownMinValue();
800 bool Fractional =
false;
802 unsigned FixedSize = ElementCount * SEW;
806 }
else if (FixedSize < 64) {
809 LMUL = 64 / FixedSize;
811 LMUL = FixedSize / 64;
819 {llvm::dwarf::DW_OP_bregx,
822 llvm::dwarf::DW_OP_constu,
824 llvm::dwarf::DW_OP_div, llvm::dwarf::DW_OP_constu, LMUL});
826 Expr.push_back(llvm::dwarf::DW_OP_div);
828 Expr.push_back(llvm::dwarf::DW_OP_mul);
830 Expr.append({llvm::dwarf::DW_OP_constu, 1, llvm::dwarf::DW_OP_minus});
833 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
835 auto *UpperBound = DBuilder.createExpression(
Expr);
836 llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange(
837 nullptr, LowerBound, UpperBound,
nullptr);
838 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
839 llvm::DIType *ElemTy =
840 getOrCreateType(Info.
ElementType, TheCU->getFile());
843 return DBuilder.createVectorType(0, Align, ElemTy,
847#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
848 case BuiltinType::Id: { \
851 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, \
852 MangledName, TheCU, TheCU->getFile(), 0); \
853 return SingletonId; \
855#include "clang/Basic/WebAssemblyReferenceTypes.def"
857 case BuiltinType::UChar:
858 case BuiltinType::Char_U:
859 Encoding = llvm::dwarf::DW_ATE_unsigned_char;
861 case BuiltinType::Char_S:
862 case BuiltinType::SChar:
863 Encoding = llvm::dwarf::DW_ATE_signed_char;
865 case BuiltinType::Char8:
866 case BuiltinType::Char16:
867 case BuiltinType::Char32:
870 case BuiltinType::UShort:
871 case BuiltinType::UInt:
872 case BuiltinType::UInt128:
873 case BuiltinType::ULong:
874 case BuiltinType::WChar_U:
875 case BuiltinType::ULongLong:
876 Encoding = llvm::dwarf::DW_ATE_unsigned;
878 case BuiltinType::Short:
879 case BuiltinType::Int:
880 case BuiltinType::Int128:
881 case BuiltinType::Long:
882 case BuiltinType::WChar_S:
883 case BuiltinType::LongLong:
884 Encoding = llvm::dwarf::DW_ATE_signed;
886 case BuiltinType::Bool:
887 Encoding = llvm::dwarf::DW_ATE_boolean;
889 case BuiltinType::Half:
890 case BuiltinType::Float:
891 case BuiltinType::LongDouble:
892 case BuiltinType::Float16:
893 case BuiltinType::BFloat16:
894 case BuiltinType::Float128:
895 case BuiltinType::Double:
896 case BuiltinType::Ibm128:
902 Encoding = llvm::dwarf::DW_ATE_float;
904 case BuiltinType::ShortAccum:
905 case BuiltinType::Accum:
906 case BuiltinType::LongAccum:
907 case BuiltinType::ShortFract:
908 case BuiltinType::Fract:
909 case BuiltinType::LongFract:
910 case BuiltinType::SatShortFract:
911 case BuiltinType::SatFract:
912 case BuiltinType::SatLongFract:
913 case BuiltinType::SatShortAccum:
914 case BuiltinType::SatAccum:
915 case BuiltinType::SatLongAccum:
916 Encoding = llvm::dwarf::DW_ATE_signed_fixed;
918 case BuiltinType::UShortAccum:
919 case BuiltinType::UAccum:
920 case BuiltinType::ULongAccum:
921 case BuiltinType::UShortFract:
922 case BuiltinType::UFract:
923 case BuiltinType::ULongFract:
924 case BuiltinType::SatUShortAccum:
925 case BuiltinType::SatUAccum:
926 case BuiltinType::SatULongAccum:
927 case BuiltinType::SatUShortFract:
928 case BuiltinType::SatUFract:
929 case BuiltinType::SatULongFract:
930 Encoding = llvm::dwarf::DW_ATE_unsigned_fixed;
937 return DBuilder.createBasicType(BTName, Size, Encoding);
940llvm::DIType *CGDebugInfo::CreateType(
const BitIntType *Ty) {
942 StringRef Name = Ty->
isUnsigned() ?
"unsigned _BitInt" :
"_BitInt";
944 ? llvm::dwarf::DW_ATE_unsigned
945 : llvm::dwarf::DW_ATE_signed;
951llvm::DIType *CGDebugInfo::CreateType(
const ComplexType *Ty) {
953 llvm::dwarf::TypeKind
Encoding = llvm::dwarf::DW_ATE_complex_float;
955 Encoding = llvm::dwarf::DW_ATE_lo_user;
958 return DBuilder.createBasicType(
"complex", Size, Encoding);
972 return llvm::dwarf::DW_TAG_const_type;
976 return llvm::dwarf::DW_TAG_volatile_type;
980 return llvm::dwarf::DW_TAG_restrict_type;
982 return (llvm::dwarf::Tag)0;
985llvm::DIType *CGDebugInfo::CreateQualifiedType(
QualType Ty,
986 llvm::DIFile *Unit) {
996 assert(Qc.
empty() &&
"Unknown type qualifier for debug info");
997 return getOrCreateType(
QualType(T, 0), Unit);
1004 return DBuilder.createQualifiedType(Tag, FromTy);
1008 llvm::DIFile *Unit) {
1017 assert(Q.
empty() &&
"Unknown type qualifier for debug info");
1028 return DBuilder.createQualifiedType(Tag, FromTy);
1032 llvm::DIFile *Unit) {
1040 return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
1044llvm::DIType *CGDebugInfo::CreateType(
const PointerType *Ty,
1045 llvm::DIFile *Unit) {
1046 return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
1052 switch (TheCU->getSourceLanguage()) {
1053 case llvm::dwarf::DW_LANG_C_plus_plus:
1054 case llvm::dwarf::DW_LANG_C_plus_plus_11:
1055 case llvm::dwarf::DW_LANG_C_plus_plus_14:
1057 case llvm::dwarf::DW_LANG_ObjC_plus_plus:
1058 return isa<CXXRecordDecl>(TD) || isa<EnumDecl>(TD);
1086 llvm::DICompileUnit *TheCU) {
1104 llvm::DICompileUnit *TheCU) {
1110 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD))
1112 if (RD->isDynamicClass() &&
1125 llvm::dwarf::Tag Tag;
1127 Tag = llvm::dwarf::DW_TAG_structure_type;
1129 Tag = llvm::dwarf::DW_TAG_union_type;
1134 Tag = llvm::dwarf::DW_TAG_class_type;
1139llvm::DICompositeType *
1140CGDebugInfo::getOrCreateRecordFwdDecl(
const RecordType *Ty,
1141 llvm::DIScope *Ctx) {
1144 return cast<llvm::DICompositeType>(T);
1145 llvm::DIFile *DefUnit = getOrCreateFile(RD->
getLocation());
1146 const unsigned Line =
1148 StringRef RDName = getClassName(RD);
1157 llvm::DINode::DIFlags Flags = llvm::DINode::FlagFwdDecl;
1162 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1163 if (!CXXRD->hasDefinition() ||
1164 (CXXRD->hasDefinition() && !CXXRD->isTrivial()))
1165 Flags |= llvm::DINode::FlagNonTrivial;
1172 llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType(
1173 getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align, Flags,
1176 if (
auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
1177 DBuilder.replaceArrays(RetTy, llvm::DINodeArray(),
1178 CollectCXXTemplateParams(TSpecial, DefUnit));
1179 ReplaceMap.emplace_back(
1180 std::piecewise_construct, std::make_tuple(Ty),
1181 std::make_tuple(
static_cast<llvm::Metadata *
>(RetTy)));
1185llvm::DIType *CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag,
1188 llvm::DIFile *Unit) {
1193 std::optional<unsigned> DWARFAddressSpace =
1198 auto *BTFAttrTy = dyn_cast<BTFTagAttributedType>(PointeeTy);
1200 StringRef Tag = BTFAttrTy->getAttr()->getBTFTypeTag();
1202 llvm::Metadata *Ops[2] = {
1203 llvm::MDString::get(CGM.
getLLVMContext(), StringRef(
"btf_type_tag")),
1205 Annots.insert(Annots.begin(),
1208 BTFAttrTy = dyn_cast<BTFTagAttributedType>(BTFAttrTy->getWrappedType());
1211 llvm::DINodeArray Annotations =
nullptr;
1212 if (Annots.size() > 0)
1213 Annotations = DBuilder.getOrCreateArray(Annots);
1215 if (Tag == llvm::dwarf::DW_TAG_reference_type ||
1216 Tag == llvm::dwarf::DW_TAG_rvalue_reference_type)
1217 return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit),
1218 Size, Align, DWARFAddressSpace);
1220 return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size,
1221 Align, DWARFAddressSpace, StringRef(),
1225llvm::DIType *CGDebugInfo::getOrCreateStructPtrType(StringRef Name,
1226 llvm::DIType *&
Cache) {
1229 Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name,
1230 TheCU, TheCU->getFile(), 0);
1232 Cache = DBuilder.createPointerType(
Cache, Size);
1236uint64_t CGDebugInfo::collectDefaultElementTypesForBlockPointer(
1237 const BlockPointerType *Ty, llvm::DIFile *Unit, llvm::DIDerivedType *DescTy,
1250 EltTys.push_back(CreateMemberType(Unit, FType,
"__size", &FieldOffset));
1251 EltTys.push_back(CreateMemberType(Unit, FType,
"__align", &FieldOffset));
1254 EltTys.push_back(CreateMemberType(Unit, FType,
"__isa", &FieldOffset));
1256 EltTys.push_back(CreateMemberType(Unit, FType,
"__flags", &FieldOffset));
1257 EltTys.push_back(CreateMemberType(Unit, FType,
"__reserved", &FieldOffset));
1259 EltTys.push_back(CreateMemberType(Unit, FType,
"__FuncPtr", &FieldOffset));
1263 EltTys.push_back(DBuilder.createMemberType(
1264 Unit,
"__descriptor",
nullptr, LineNo, FieldSize, FieldAlign,
1265 FieldOffset, llvm::DINode::FlagZero, DescTy));
1266 FieldOffset += FieldSize;
1273 llvm::DIFile *Unit) {
1277 llvm::DINodeArray Elements;
1281 EltTys.push_back(CreateMemberType(Unit, FType,
"reserved", &FieldOffset));
1282 EltTys.push_back(CreateMemberType(Unit, FType,
"Size", &FieldOffset));
1284 Elements = DBuilder.getOrCreateArray(EltTys);
1287 llvm::DINode::DIFlags Flags = llvm::DINode::FlagAppleBlock;
1290 DBuilder.createStructType(Unit,
"__block_descriptor",
nullptr, 0,
1291 FieldOffset, 0, Flags,
nullptr, Elements);
1296 auto *DescTy = DBuilder.createPointerType(EltTy, Size);
1298 FieldOffset = collectDefaultElementTypesForBlockPointer(Ty, Unit, DescTy,
1301 Elements = DBuilder.getOrCreateArray(EltTys);
1307 EltTy = DBuilder.createStructType(Unit,
"",
nullptr, 0, FieldOffset, 0,
1308 Flags,
nullptr, Elements);
1310 return DBuilder.createPointerType(EltTy, Size);
1314 llvm::DIFile *Unit) {
1319 if (isa<BuiltinTemplateDecl>(TD))
1322 const auto *
AliasDecl = cast<TypeAliasTemplateDecl>(TD)->getTemplatedDecl();
1327 llvm::raw_svector_ostream OS(NS);
1329 auto PP = getPrintingPolicy();
1345 return DBuilder.createTypedef(Src, OS.str(), getOrCreateFile(Loc),
1362 return llvm::DINode::FlagZero;
1366 return llvm::DINode::FlagPrivate;
1368 return llvm::DINode::FlagProtected;
1370 return llvm::DINode::FlagPublic;
1372 return llvm::DINode::FlagZero;
1374 llvm_unreachable(
"unexpected access enumerator");
1377llvm::DIType *CGDebugInfo::CreateType(
const TypedefType *Ty,
1378 llvm::DIFile *Unit) {
1379 llvm::DIType *Underlying =
1391 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(Ty->
getDecl());
1393 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1395 if (isa<RecordDecl>(DC))
1398 return DBuilder.createTypedef(Underlying, Ty->
getDecl()->
getName(),
1399 getOrCreateFile(Loc), getLineNumber(Loc),
1400 getDeclContextDescriptor(Ty->
getDecl()), Align,
1401 Flags, Annotations);
1411 return llvm::dwarf::DW_CC_BORLAND_stdcall;
1413 return llvm::dwarf::DW_CC_BORLAND_msfastcall;
1415 return llvm::dwarf::DW_CC_BORLAND_thiscall;
1417 return llvm::dwarf::DW_CC_LLVM_vectorcall;
1419 return llvm::dwarf::DW_CC_BORLAND_pascal;
1421 return llvm::dwarf::DW_CC_LLVM_Win64;
1423 return llvm::dwarf::DW_CC_LLVM_X86_64SysV;
1427 return llvm::dwarf::DW_CC_LLVM_AAPCS;
1429 return llvm::dwarf::DW_CC_LLVM_AAPCS_VFP;
1431 return llvm::dwarf::DW_CC_LLVM_IntelOclBicc;
1433 return llvm::dwarf::DW_CC_LLVM_SpirFunction;
1436 return llvm::dwarf::DW_CC_LLVM_OpenCLKernel;
1438 return llvm::dwarf::DW_CC_LLVM_Swift;
1441 return llvm::dwarf::DW_CC_LLVM_Swift;
1443 return llvm::dwarf::DW_CC_LLVM_PreserveMost;
1445 return llvm::dwarf::DW_CC_LLVM_PreserveAll;
1447 return llvm::dwarf::DW_CC_LLVM_X86RegCall;
1453 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1455 Flags |= llvm::DINode::FlagLValueReference;
1457 Flags |= llvm::DINode::FlagRValueReference;
1461llvm::DIType *CGDebugInfo::CreateType(
const FunctionType *Ty,
1462 llvm::DIFile *Unit) {
1463 const auto *FPT = dyn_cast<FunctionProtoType>(Ty);
1465 if (llvm::DIType *QTy = CreateQualifiedType(FPT, Unit))
1474 EltTys.push_back(getOrCreateType(Ty->
getReturnType(), Unit));
1476 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1480 EltTys.push_back(DBuilder.createUnspecifiedParameter());
1483 for (
const QualType &ParamType : FPT->param_types())
1484 EltTys.push_back(getOrCreateType(ParamType, Unit));
1485 if (FPT->isVariadic())
1486 EltTys.push_back(DBuilder.createUnspecifiedParameter());
1489 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
1490 llvm::DIType *F = DBuilder.createSubroutineType(
1495llvm::DIDerivedType *
1496CGDebugInfo::createBitFieldType(
const FieldDecl *BitFieldDecl,
1497 llvm::DIScope *RecordTy,
const RecordDecl *RD) {
1498 StringRef Name = BitFieldDecl->
getName();
1501 llvm::DIFile *VUnit = getOrCreateFile(Loc);
1502 llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
1505 llvm::DIFile *
File = getOrCreateFile(Loc);
1506 unsigned Line = getLineNumber(Loc);
1511 assert(SizeInBits > 0 &&
"found named 0-width bitfield");
1520 uint64_t OffsetInBits = StorageOffsetInBits + Offset;
1522 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(BitFieldDecl);
1523 return DBuilder.createBitFieldMemberType(
1524 RecordTy, Name,
File, Line, SizeInBits, OffsetInBits, StorageOffsetInBits,
1525 Flags, DebugType, Annotations);
1528llvm::DIDerivedType *CGDebugInfo::createBitFieldSeparatorIfNeeded(
1529 const FieldDecl *BitFieldDecl,
const llvm::DIDerivedType *BitFieldDI,
1557 if (PreviousFieldsDI.empty())
1561 auto *PreviousMDEntry =
1562 PreviousFieldsDI.empty() ? nullptr : PreviousFieldsDI.back();
1563 auto *PreviousMDField =
1564 dyn_cast_or_null<llvm::DIDerivedType>(PreviousMDEntry);
1565 if (!PreviousMDField || !PreviousMDField->isBitField() ||
1566 PreviousMDField->getSizeInBits() == 0)
1570 std::advance(PreviousBitfield, BitFieldDecl->
getFieldIndex() - 1);
1572 assert(PreviousBitfield->isBitField());
1575 if (!PreviousBitfield->isZeroLengthBitField(Context))
1578 QualType Ty = PreviousBitfield->getType();
1580 llvm::DIFile *VUnit = getOrCreateFile(Loc);
1581 llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
1582 llvm::DIScope *RecordTy = BitFieldDI->getScope();
1584 llvm::DIFile *
File = getOrCreateFile(Loc);
1585 unsigned Line = getLineNumber(Loc);
1588 cast<llvm::ConstantInt>(BitFieldDI->getStorageOffsetInBits())
1591 llvm::DINode::DIFlags Flags =
1593 llvm::DINodeArray Annotations =
1594 CollectBTFDeclTagAnnotations(*PreviousBitfield);
1595 return DBuilder.createBitFieldMemberType(
1596 RecordTy,
"",
File, Line, 0, StorageOffsetInBits, StorageOffsetInBits,
1597 Flags, DebugType, Annotations);
1600llvm::DIType *CGDebugInfo::createFieldType(
1602 uint64_t offsetInBits, uint32_t AlignInBits, llvm::DIFile *tunit,
1603 llvm::DIScope *scope,
const RecordDecl *RD, llvm::DINodeArray Annotations) {
1604 llvm::DIType *debugType = getOrCreateType(
type, tunit);
1607 llvm::DIFile *file = getOrCreateFile(loc);
1608 const unsigned line = getLineNumber(loc.
isValid() ? loc : CurLoc);
1611 auto Align = AlignInBits;
1612 if (!
type->isIncompleteArrayType()) {
1614 SizeInBits = TI.
Width;
1620 return DBuilder.createMemberType(scope, name, file, line, SizeInBits, Align,
1621 offsetInBits, flags, debugType, Annotations);
1624void CGDebugInfo::CollectRecordLambdaFields(
1626 llvm::DIType *RecordTy) {
1632 unsigned fieldno = 0;
1635 I != E; ++I, ++Field, ++fieldno) {
1637 if (
C.capturesVariable()) {
1639 assert(!
Field->isBitField() &&
"lambdas don't have bitfield members!");
1641 StringRef VName =
V->getName();
1642 llvm::DIFile *VUnit = getOrCreateFile(Loc);
1644 llvm::DIType *FieldType = createFieldType(
1645 VName,
Field->getType(), Loc,
Field->getAccess(),
1646 layout.
getFieldOffset(fieldno), Align, VUnit, RecordTy, CXXDecl);
1647 elements.push_back(FieldType);
1648 }
else if (
C.capturesThis()) {
1654 llvm::DIFile *VUnit = getOrCreateFile(f->
getLocation());
1656 llvm::DIType *fieldType = createFieldType(
1660 elements.push_back(fieldType);
1665llvm::DIDerivedType *
1666CGDebugInfo::CreateRecordStaticField(
const VarDecl *Var, llvm::DIType *RecordTy,
1671 llvm::DIFile *VUnit = getOrCreateFile(Var->
getLocation());
1672 llvm::DIType *VTy = getOrCreateType(Var->
getType(), VUnit);
1674 unsigned LineNumber = getLineNumber(Var->
getLocation());
1675 StringRef VName = Var->
getName();
1676 llvm::Constant *
C =
nullptr;
1682 if (
Value->isFloat())
1689 llvm::DIDerivedType *GV = DBuilder.createStaticMemberType(
1690 RecordTy, VName, VUnit, LineNumber, VTy, Flags,
C, Align);
1695void CGDebugInfo::CollectRecordNormalField(
1696 const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile *tunit,
1703 if (
name.empty() && !
type->isRecordType())
1706 llvm::DIType *FieldType;
1708 llvm::DIDerivedType *BitFieldType;
1709 FieldType = BitFieldType = createBitFieldType(field, RecordTy, RD);
1710 if (llvm::DIType *Separator =
1711 createBitFieldSeparatorIfNeeded(field, BitFieldType, elements, RD))
1712 elements.push_back(Separator);
1715 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(field);
1718 OffsetInBits, Align, tunit, RecordTy, RD, Annotations);
1721 elements.push_back(FieldType);
1724void CGDebugInfo::CollectRecordNestedType(
1728 if (isa<InjectedClassNameType>(Ty))
1731 llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateFile(Loc));
1732 elements.push_back(nestedType);
1735void CGDebugInfo::CollectRecordFields(
1736 const RecordDecl *record, llvm::DIFile *tunit,
1738 llvm::DICompositeType *RecordTy) {
1739 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(record);
1741 if (CXXDecl && CXXDecl->
isLambda())
1742 CollectRecordLambdaFields(CXXDecl, elements, RecordTy);
1747 unsigned fieldNo = 0;
1751 for (
const auto *I : record->
decls())
1752 if (
const auto *
V = dyn_cast<VarDecl>(I)) {
1753 if (
V->hasAttr<NoDebugAttr>())
1759 isa<VarTemplateSpecializationDecl>(
V))
1762 if (isa<VarTemplatePartialSpecializationDecl>(
V))
1766 auto MI = StaticDataMemberCache.find(
V->getCanonicalDecl());
1767 if (MI != StaticDataMemberCache.end()) {
1768 assert(MI->second &&
1769 "Static data member declaration should still exist");
1770 elements.push_back(MI->second);
1772 auto Field = CreateRecordStaticField(
V, RecordTy, record);
1773 elements.push_back(Field);
1775 }
else if (
const auto *field = dyn_cast<FieldDecl>(I)) {
1776 CollectRecordNormalField(field, layout.
getFieldOffset(fieldNo), tunit,
1777 elements, RecordTy, record);
1784 if (
const auto *nestedType = dyn_cast<TypeDecl>(I)) {
1786 if (isa<RecordDecl>(I) &&
1787 cast<RecordDecl>(I)->isAnonymousStructOrUnion())
1789 if (!nestedType->isImplicit() &&
1790 nestedType->getDeclContext() == record)
1791 CollectRecordNestedType(nestedType, elements);
1797llvm::DISubroutineType *
1798CGDebugInfo::getOrCreateMethodType(
const CXXMethodDecl *Method,
1799 llvm::DIFile *Unit) {
1802 return cast_or_null<llvm::DISubroutineType>(
1803 getOrCreateType(
QualType(Func, 0), Unit));
1804 return getOrCreateInstanceMethodType(Method->
getThisType(), Func, Unit);
1807llvm::DISubroutineType *CGDebugInfo::getOrCreateInstanceMethodType(
1823 const auto *OriginalFunc = cast<llvm::DISubroutineType>(
1827 llvm::DITypeRefArray Args = OriginalFunc->getTypeArray();
1828 assert(Args.size() &&
"Invalid number of arguments!");
1833 Elts.push_back(Args[0]);
1837 if (isa<ClassTemplateSpecializationDecl>(RD)) {
1839 const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr);
1842 llvm::DIType *PointeeType =
1844 llvm::DIType *ThisPtrType =
1845 DBuilder.createPointerType(PointeeType, Size, Align);
1850 ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType);
1851 Elts.push_back(ThisPtrType);
1853 llvm::DIType *ThisPtrType = getOrCreateType(ThisPtr, Unit);
1855 ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType);
1856 Elts.push_back(ThisPtrType);
1860 for (
unsigned i = 1, e = Args.size(); i != e; ++i)
1861 Elts.push_back(Args[i]);
1863 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
1865 return DBuilder.createSubroutineType(EltTypeArray, OriginalFunc->getFlags(),
1872 if (
const auto *NRD = dyn_cast<CXXRecordDecl>(RD->
getDeclContext()))
1879llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
1880 const CXXMethodDecl *Method, llvm::DIFile *Unit, llvm::DIType *RecordTy) {
1882 isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method);
1884 StringRef MethodName = getFunctionName(Method);
1885 llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit);
1889 StringRef MethodLinkageName;
1899 llvm::DIFile *MethodDefUnit =
nullptr;
1900 unsigned MethodLine = 0;
1902 MethodDefUnit = getOrCreateFile(Method->
getLocation());
1903 MethodLine = getLineNumber(Method->
getLocation());
1907 llvm::DIType *ContainingType =
nullptr;
1908 unsigned VIndex = 0;
1909 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1910 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
1915 SPFlags |= llvm::DISubprogram::SPFlagPureVirtual;
1917 SPFlags |= llvm::DISubprogram::SPFlagVirtual;
1922 if (!isa<CXXDestructorDecl>(Method))
1927 const auto *DD = dyn_cast<CXXDestructorDecl>(Method);
1939 Flags |= llvm::DINode::FlagIntroducedVirtual;
1948 ContainingType = RecordTy;
1952 SPFlags |= llvm::DISubprogram::SPFlagDeleted;
1955 Flags |= llvm::DINode::FlagNoReturn;
1958 Flags |= llvm::DINode::FlagStaticMember;
1960 Flags |= llvm::DINode::FlagArtificial;
1962 if (
const auto *CXXC = dyn_cast<CXXConstructorDecl>(Method)) {
1963 if (CXXC->isExplicit())
1964 Flags |= llvm::DINode::FlagExplicit;
1965 }
else if (
const auto *CXXC = dyn_cast<CXXConversionDecl>(Method)) {
1966 if (CXXC->isExplicit())
1967 Flags |= llvm::DINode::FlagExplicit;
1970 Flags |= llvm::DINode::FlagPrototyped;
1972 Flags |= llvm::DINode::FlagLValueReference;
1974 Flags |= llvm::DINode::FlagRValueReference;
1976 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
1978 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
1982 if (DebugKind == llvm::codegenoptions::DebugInfoConstructor)
1986 llvm::DINodeArray TParamsArray = CollectFunctionTemplateParams(Method, Unit);
1987 llvm::DISubprogram *SP = DBuilder.createMethod(
1988 RecordTy, MethodName, MethodLinkageName, MethodDefUnit, MethodLine,
1989 MethodTy, VIndex,
ThisAdjustment, ContainingType, Flags, SPFlags,
1990 TParamsArray.get());
1997void CGDebugInfo::CollectCXXMemberFunctions(
2004 for (
const auto *I : RD->
decls()) {
2005 const auto *Method = dyn_cast<CXXMethodDecl>(I);
2029 EltTys.push_back(MI == SPCache.end()
2030 ? CreateCXXMemberFunction(Method, Unit, RecordTy)
2031 :
static_cast<llvm::Metadata *
>(MI->second));
2035void CGDebugInfo::CollectCXXBases(
const CXXRecordDecl *RD, llvm::DIFile *Unit,
2037 llvm::DIType *RecordTy) {
2039 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->
bases(), SeenTypes,
2040 llvm::DINode::FlagZero);
2045 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->
vbases(), SeenTypes,
2046 llvm::DINode::FlagIndirectVirtualBase);
2050void CGDebugInfo::CollectCXXBasesAux(
2055 llvm::DINode::DIFlags StartingFlags) {
2057 for (
const auto &BI : Bases) {
2060 if (!SeenTypes.insert(
Base).second)
2062 auto *BaseTy = getOrCreateType(BI.getType(), Unit);
2063 llvm::DINode::DIFlags BFlags = StartingFlags;
2065 uint32_t VBPtrOffset = 0;
2067 if (BI.isVirtual()) {
2084 BFlags |= llvm::DINode::FlagVirtual;
2091 llvm::DIType *DTy = DBuilder.createInheritance(RecordTy, BaseTy, BaseOffset,
2092 VBPtrOffset, BFlags);
2093 EltTys.push_back(DTy);
2098CGDebugInfo::CollectTemplateParams(std::optional<TemplateArgs> OArgs,
2099 llvm::DIFile *Unit) {
2101 return llvm::DINodeArray();
2102 TemplateArgs &Args = *OArgs;
2104 for (
unsigned i = 0, e = Args.Args.size(); i != e; ++i) {
2109 Name = Args.TList->getParam(i)->getName();
2113 llvm::DIType *TTy = getOrCreateType(TA.
getAsType(), Unit);
2114 TemplateParams.push_back(DBuilder.createTemplateTypeParameter(
2115 TheCU, Name, TTy, defaultParameter));
2120 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2121 TheCU, Name, TTy, defaultParameter,
2127 llvm::DIType *TTy = getOrCreateType(T, Unit);
2128 llvm::Constant *
V =
nullptr;
2132 !D->
hasAttr<CUDADeviceAttr>()) {
2136 if (
const auto *VD = dyn_cast<VarDecl>(D))
2140 else if ((MD = dyn_cast<CXXMethodDecl>(D)) && MD->
isInstance())
2142 else if (
const auto *FD = dyn_cast<FunctionDecl>(D))
2146 else if (
const auto *MPT =
2147 dyn_cast<MemberPointerType>(T.
getTypePtr())) {
2155 }
else if (
const auto *GD = dyn_cast<MSGuidDecl>(D)) {
2157 }
else if (
const auto *TPO = dyn_cast<TemplateParamObjectDecl>(D)) {
2164 assert(
V &&
"Failed to find template parameter pointer");
2165 V =
V->stripPointerCasts();
2167 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2168 TheCU, Name, TTy, defaultParameter, cast_or_null<llvm::Constant>(
V)));
2172 llvm::DIType *TTy = getOrCreateType(T, Unit);
2173 llvm::Constant *
V =
nullptr;
2176 if (
const auto *MPT = dyn_cast<MemberPointerType>(T.
getTypePtr()))
2182 if (MPT->isMemberDataPointer())
2185 V = llvm::ConstantInt::get(CGM.
Int8Ty, 0);
2186 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2187 TheCU, Name, TTy, defaultParameter,
V));
2190 std::string QualName;
2191 llvm::raw_string_ostream OS(QualName);
2193 OS, getPrintingPolicy());
2194 TemplateParams.push_back(DBuilder.createTemplateTemplateParameter(
2195 TheCU, Name,
nullptr, OS.str(), defaultParameter));
2199 TemplateParams.push_back(DBuilder.createTemplateParameterPack(
2200 TheCU, Name,
nullptr,
2209 assert(
V &&
"Expression in template argument isn't constant");
2210 llvm::DIType *TTy = getOrCreateType(T, Unit);
2211 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2212 TheCU, Name, TTy, defaultParameter,
V->stripPointerCasts()));
2218 "These argument types shouldn't exist in concrete types");
2221 return DBuilder.getOrCreateArray(TemplateParams);
2224std::optional<CGDebugInfo::TemplateArgs>
2225CGDebugInfo::GetTemplateArgs(
const FunctionDecl *FD)
const {
2233 return std::nullopt;
2235std::optional<CGDebugInfo::TemplateArgs>
2236CGDebugInfo::GetTemplateArgs(
const VarDecl *VD)
const {
2240 auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VD);
2242 return std::nullopt;
2245 auto TA = TS->getTemplateArgs().asArray();
2246 return {{TList, TA}};
2248std::optional<CGDebugInfo::TemplateArgs>
2249CGDebugInfo::GetTemplateArgs(
const RecordDecl *RD)
const {
2250 if (
auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
2255 TSpecial->getSpecializedTemplate()->getTemplateParameters();
2257 return {{TPList, TAList.
asArray()}};
2259 return std::nullopt;
2263CGDebugInfo::CollectFunctionTemplateParams(
const FunctionDecl *FD,
2264 llvm::DIFile *Unit) {
2265 return CollectTemplateParams(GetTemplateArgs(FD), Unit);
2268llvm::DINodeArray CGDebugInfo::CollectVarTemplateParams(
const VarDecl *VL,
2269 llvm::DIFile *Unit) {
2270 return CollectTemplateParams(GetTemplateArgs(VL), Unit);
2273llvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams(
const RecordDecl *RD,
2274 llvm::DIFile *Unit) {
2275 return CollectTemplateParams(GetTemplateArgs(RD), Unit);
2278llvm::DINodeArray CGDebugInfo::CollectBTFDeclTagAnnotations(
const Decl *D) {
2279 if (!D->
hasAttr<BTFDeclTagAttr>())
2284 llvm::Metadata *Ops[2] = {
2285 llvm::MDString::get(CGM.
getLLVMContext(), StringRef(
"btf_decl_tag")),
2287 Annotations.push_back(llvm::MDNode::get(CGM.
getLLVMContext(), Ops));
2289 return DBuilder.getOrCreateArray(Annotations);
2292llvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) {
2294 return VTablePtrType;
2299 llvm::Metadata *STy = getOrCreateType(Context.
IntTy, Unit);
2300 llvm::DITypeRefArray SElements = DBuilder.getOrCreateTypeArray(STy);
2301 llvm::DIType *SubTy = DBuilder.createSubroutineType(SElements);
2304 std::optional<unsigned> DWARFAddressSpace =
2307 llvm::DIType *vtbl_ptr_type = DBuilder.createPointerType(
2308 SubTy, Size, 0, DWARFAddressSpace,
"__vtbl_ptr_type");
2309 VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size);
2310 return VTablePtrType;
2313StringRef CGDebugInfo::getVTableName(
const CXXRecordDecl *RD) {
2318StringRef CGDebugInfo::getDynamicInitializerName(
const VarDecl *VD,
2320 llvm::Function *InitFn) {
2325 return InitFn->getName();
2335 llvm::raw_svector_ostream OS(QualifiedGV);
2337 std::tie(Quals, GVName) = OS.str().rsplit(
"::");
2339 std::swap(Quals, GVName);
2343 llvm::raw_svector_ostream OS(InitName);
2345 OS << Quals <<
"::";
2350 llvm_unreachable(
"not an initializer");
2352 OS <<
"`dynamic initializer for '";
2355 OS <<
"`dynamic atexit destructor for '";
2362 if (
const auto *VTpl = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
2364 getPrintingPolicy());
2369 return internString(OS.str());
2372void CGDebugInfo::CollectVTableInfo(
const CXXRecordDecl *RD, llvm::DIFile *Unit,
2389 llvm::DIType *VPtrTy =
nullptr;
2392 if (NeedVTableShape) {
2397 unsigned VSlotCount =
2399 unsigned VTableWidth = PtrWidth * VSlotCount;
2401 std::optional<unsigned> DWARFAddressSpace =
2405 llvm::DIType *VTableType = DBuilder.createPointerType(
2406 nullptr, VTableWidth, 0, DWARFAddressSpace,
"__vtbl_ptr_type");
2407 EltTys.push_back(VTableType);
2410 VPtrTy = DBuilder.createPointerType(VTableType, PtrWidth);
2418 VPtrTy = getOrCreateVTablePtrType(Unit);
2421 llvm::DIType *VPtrMember =
2422 DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 0, Size, 0, 0,
2423 llvm::DINode::FlagArtificial, VPtrTy);
2424 EltTys.push_back(VPtrMember);
2430 llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc));
2442 assert(!D.
isNull() &&
"null type");
2443 llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
2444 assert(T &&
"could not create debug info for type");
2454 llvm::codegenoptions::DebugLineTablesOnly)
2460 node = getOrCreateType(AllocatedTy, getOrCreateFile(Loc));
2462 CI->setMetadata(
"heapallocsite", node);
2466 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
2470 auto I = TypeCache.find(TyPtr);
2471 if (I == TypeCache.end() || !cast<llvm::DIType>(I->second)->isForwardDecl())
2473 llvm::DIType *Res = CreateTypeDefinition(Ty->
castAs<
EnumType>());
2474 assert(!Res->isForwardDecl());
2475 TypeCache[TyPtr].reset(Res);
2479 if (DebugKind > llvm::codegenoptions::LimitedDebugInfo ||
2486 if (RD->
hasAttr<DLLImportAttr>())
2489 if (MD->
hasAttr<DLLImportAttr>())
2502 if (
auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) {
2511 bool Explicit =
false;
2512 if (
auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(CXXDecl))
2513 Explicit = TD->isExplicitInstantiationOrSpecialization();
2527 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2528 if (CXXRD->isDynamicClass() &&
2530 llvm::GlobalValue::AvailableExternallyLinkage &&
2541 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
2545 auto I = TypeCache.find(TyPtr);
2546 if (I != TypeCache.end() && !cast<llvm::DIType>(I->second)->isForwardDecl())
2553 assert(!Res->isForwardDecl());
2554 TypeCache[TyPtr].reset(Res);
2561 if (!Tmpl->isImplicit() && Tmpl->isThisDeclarationADefinition() &&
2585 if (Ctor->isCopyOrMoveConstructor())
2587 if (!Ctor->isDeleted())
2606 if (DebugKind == llvm::codegenoptions::DebugLineTablesOnly)
2609 if (DebugKind > llvm::codegenoptions::LimitedDebugInfo ||
2610 RD->
hasAttr<StandaloneDebugAttr>())
2613 if (!LangOpts.CPlusPlus)
2619 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
2635 if (
const auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
2636 Spec = SD->getSpecializationKind();
2645 if ((DebugKind == llvm::codegenoptions::DebugInfoConstructor) &&
2657 llvm::DIType *T = getTypeOrNull(Ty);
2658 if (T && T->isForwardDecl())
2662llvm::DIType *CGDebugInfo::CreateType(
const RecordType *Ty) {
2664 llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(
QualType(Ty, 0)));
2668 T = getOrCreateRecordFwdDecl(Ty, getDeclContextDescriptor(RD));
2672 auto [Def, Pref] = CreateTypeDefinition(Ty);
2674 return Pref ? Pref : Def;
2677llvm::DIType *CGDebugInfo::GetPreferredNameType(
const CXXRecordDecl *RD,
2678 llvm::DIFile *Unit) {
2682 auto const *PNA = RD->
getAttr<PreferredNameAttr>();
2686 return getOrCreateType(PNA->getTypedefType(), Unit);
2689std::pair<llvm::DIType *, llvm::DIType *>
2690CGDebugInfo::CreateTypeDefinition(
const RecordType *Ty) {
2694 llvm::DIFile *DefUnit = getOrCreateFile(RD->
getLocation());
2702 llvm::DICompositeType *FwdDecl = getOrCreateLimitedType(Ty);
2706 return {FwdDecl,
nullptr};
2708 if (
const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD))
2709 CollectContainingType(CXXDecl, FwdDecl);
2712 LexicalBlockStack.emplace_back(&*FwdDecl);
2713 RegionMap[Ty->
getDecl()].reset(FwdDecl);
2723 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
2725 CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl);
2726 CollectVTableInfo(CXXDecl, DefUnit, EltTys);
2730 CollectRecordFields(RD, DefUnit, EltTys, FwdDecl);
2732 CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl);
2734 LexicalBlockStack.pop_back();
2735 RegionMap.erase(Ty->
getDecl());
2737 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
2738 DBuilder.replaceArrays(FwdDecl, Elements);
2740 if (FwdDecl->isTemporary())
2742 llvm::MDNode::replaceWithPermanent(llvm::TempDICompositeType(FwdDecl));
2744 RegionMap[Ty->
getDecl()].reset(FwdDecl);
2746 if (CGM.
getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB)
2747 if (
auto *PrefDI = GetPreferredNameType(CXXDecl, DefUnit))
2748 return {FwdDecl, PrefDI};
2750 return {FwdDecl,
nullptr};
2754 llvm::DIFile *Unit) {
2760 llvm::DIFile *Unit) {
2765 return DBuilder.createTypedef(
2767 Ty->
getDecl()->
getName(), getOrCreateFile(Loc), getLineNumber(Loc),
2768 getDeclContextDescriptor(Ty->
getDecl()));
2796 llvm::DIFile *Unit) {
2804 if (DebugTypeExtRefs &&
ID->isFromASTFile() &&
ID->getDefinition() &&
2805 !
ID->getImplementation())
2806 return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
2808 getDeclContextDescriptor(ID), Unit, 0);
2811 llvm::DIFile *DefUnit = getOrCreateFile(
ID->getLocation());
2812 unsigned Line = getLineNumber(
ID->getLocation());
2814 static_cast<llvm::dwarf::SourceLanguage
>(TheCU->getSourceLanguage());
2820 llvm::DIScope *Mod = getParentModuleOrNull(ID);
2821 llvm::DIType *FwdDecl = DBuilder.createReplaceableCompositeType(
2822 llvm::dwarf::DW_TAG_structure_type,
ID->getName(), Mod ? Mod : TheCU,
2823 DefUnit, Line, RuntimeLang);
2824 ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit));
2828 return CreateTypeDefinition(Ty, Unit);
2832 bool CreateSkeletonCU) {
2837 auto ModRef = ModuleCache.find(M);
2838 if (ModRef != ModuleCache.end())
2839 return cast<llvm::DIModule>(ModRef->second);
2844 llvm::raw_svector_ostream OS(ConfigMacros);
2848 for (
auto &M : PPOpts.Macros) {
2851 const std::string &
Macro = M.first;
2852 bool Undef = M.second;
2853 OS <<
"\"-" << (Undef ?
'U' :
'D');
2854 for (
char c : Macro)
2869 bool IsRootModule = M ? !M->
Parent :
true;
2873 if (CreateSkeletonCU && IsRootModule && Mod.
getASTFile().empty() && M)
2875 "clang module without ASTFile must be specified by -fmodule-name");
2878 auto RemapPath = [
this](StringRef Path) -> std::string {
2880 StringRef Relative(Remapped);
2881 StringRef CompDir = TheCU->getDirectory();
2882 if (Relative.consume_front(CompDir))
2883 Relative.consume_front(llvm::sys::path::get_separator());
2885 return Relative.str();
2888 if (CreateSkeletonCU && IsRootModule && !Mod.
getASTFile().empty()) {
2895 Signature = ModSig.truncatedValue();
2901 if (!llvm::sys::path::is_absolute(Mod.
getASTFile())) {
2903 PCM = getCurrentDirname();
2907 llvm::sys::path::append(PCM, Mod.
getASTFile());
2908 DIB.createCompileUnit(
2909 TheCU->getSourceLanguage(),
2912 TheCU->getProducer(),
false, StringRef(), 0, RemapPath(PCM),
2913 llvm::DICompileUnit::FullDebug, Signature);
2918 IsRootModule ? nullptr
2921 std::string IncludePath = Mod.
getPath().str();
2922 llvm::DIModule *DIMod =
2924 RemapPath(IncludePath));
2925 ModuleCache[M].reset(DIMod);
2930 llvm::DIFile *Unit) {
2932 llvm::DIFile *DefUnit = getOrCreateFile(
ID->getLocation());
2933 unsigned Line = getLineNumber(
ID->getLocation());
2934 unsigned RuntimeLang = TheCU->getSourceLanguage();
2940 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
2941 if (
ID->getImplementation())
2942 Flags |= llvm::DINode::FlagObjcClassComplete;
2944 llvm::DIScope *Mod = getParentModuleOrNull(ID);
2945 llvm::DICompositeType *RealDecl = DBuilder.createStructType(
2946 Mod ? Mod : Unit,
ID->getName(), DefUnit, Line, Size, Align, Flags,
2947 nullptr, llvm::DINodeArray(), RuntimeLang);
2950 TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl);
2953 LexicalBlockStack.emplace_back(RealDecl);
2954 RegionMap[Ty->
getDecl()].reset(RealDecl);
2961 llvm::DIType *SClassTy =
2966 llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0, 0,
2967 llvm::DINode::FlagZero);
2968 EltTys.push_back(InhTag);
2974 llvm::DIFile *PUnit = getOrCreateFile(Loc);
2975 unsigned PLine = getLineNumber(Loc);
2978 llvm::MDNode *PropertyNode = DBuilder.createObjCProperty(
2979 PD->getName(), PUnit, PLine,
2981 : getSelectorName(PD->getGetterName()),
2983 : getSelectorName(PD->getSetterName()),
2984 PD->getPropertyAttributes(), getOrCreateType(PD->getType(), PUnit));
2985 EltTys.push_back(PropertyNode);
2990 typedef std::pair<char, const IdentifierInfo *> IsClassAndIdent;
2997 return std::make_pair(PD->isClassProperty(), PD->getIdentifier());
3000 for (
auto *PD : ClassExt->properties()) {
3001 PropertySet.insert(GetIsClassAndIdent(PD));
3004 for (
const auto *PD :
ID->properties()) {
3007 if (!PropertySet.insert(GetIsClassAndIdent(PD)).second)
3014 unsigned FieldNo = 0;
3016 Field =
Field->getNextIvar(), ++FieldNo) {
3017 llvm::DIType *FieldTy = getOrCreateType(
Field->getType(), Unit);
3021 StringRef FieldName =
Field->getName();
3024 if (FieldName.empty())
3028 llvm::DIFile *FieldDefUnit = getOrCreateFile(
Field->getLocation());
3029 unsigned FieldLine = getLineNumber(
Field->getLocation());
3032 uint32_t FieldAlign = 0;
3037 FieldSize =
Field->isBitField()
3048 if (
Field->isBitField()) {
3059 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3061 Flags = llvm::DINode::FlagProtected;
3063 Flags = llvm::DINode::FlagPrivate;
3065 Flags = llvm::DINode::FlagPublic;
3067 if (
Field->isBitField())
3068 Flags |= llvm::DINode::FlagBitField;
3070 llvm::MDNode *PropertyNode =
nullptr;
3073 ImpD->FindPropertyImplIvarDecl(
Field->getIdentifier())) {
3076 llvm::DIFile *PUnit = getOrCreateFile(Loc);
3077 unsigned PLine = getLineNumber(Loc);
3080 PropertyNode = DBuilder.createObjCProperty(
3081 PD->getName(), PUnit, PLine,
3084 : getSelectorName(PD->getGetterName()),
3087 : getSelectorName(PD->getSetterName()),
3088 PD->getPropertyAttributes(),
3089 getOrCreateType(PD->getType(), PUnit));
3093 FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, FieldLine,
3094 FieldSize, FieldAlign, FieldOffset, Flags,
3095 FieldTy, PropertyNode);
3096 EltTys.push_back(FieldTy);
3099 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
3100 DBuilder.replaceArrays(RealDecl, Elements);
3102 LexicalBlockStack.pop_back();
3106llvm::DIType *CGDebugInfo::CreateType(
const VectorType *Ty,
3107 llvm::DIFile *Unit) {
3120 QualType CharVecTy = Ctx.getVectorType(Ctx.CharTy, NumVectorBytes,
3125 llvm::DIType *ElementTy = getOrCreateType(Ty->
getElementType(), Unit);
3128 llvm::Metadata *Subscript;
3130 auto SizeExpr = SizeExprCache.find(QTy);
3131 if (SizeExpr != SizeExprCache.end())
3132 Subscript = DBuilder.getOrCreateSubrange(
3133 SizeExpr->getSecond() ,
nullptr ,
3134 nullptr ,
nullptr );
3137 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3138 llvm::Type::getInt64Ty(CGM.
getLLVMContext()), Count ? Count : -1));
3139 Subscript = DBuilder.getOrCreateSubrange(
3140 CountNode ,
nullptr ,
nullptr ,
3143 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
3148 return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray);
3152 llvm::DIFile *Unit) {
3156 llvm::DIType *ElementTy = getOrCreateType(Ty->
getElementType(), Unit);
3162 auto *ColumnCountNode =
3163 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3165 auto *RowCountNode =
3166 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3168 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3169 ColumnCountNode ,
nullptr ,
nullptr ,
3171 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3172 RowCountNode ,
nullptr ,
nullptr ,
3174 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);
3175 return DBuilder.createArrayType(Size, Align, ElementTy, SubscriptArray);
3178llvm::DIType *CGDebugInfo::CreateType(
const ArrayType *Ty, llvm::DIFile *Unit) {
3183 if (
const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
3207 while ((Ty = dyn_cast<ArrayType>(EltTy))) {
3216 if (
const auto *CAT = dyn_cast<ConstantArrayType>(Ty))
3217 Count = CAT->getSize().getZExtValue();
3218 else if (
const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
3219 if (
Expr *Size = VAT->getSizeExpr()) {
3222 Count =
Result.Val.getInt().getExtValue();
3226 auto SizeNode = SizeExprCache.find(EltTy);
3227 if (SizeNode != SizeExprCache.end())
3228 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3229 SizeNode->getSecond() ,
nullptr ,
3230 nullptr ,
nullptr ));
3233 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3235 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3236 CountNode ,
nullptr ,
nullptr ,
3242 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);
3244 return DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit),
3249 llvm::DIFile *Unit) {
3250 return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, Ty,
3255 llvm::DIFile *Unit) {
3256 llvm::dwarf::Tag Tag = llvm::dwarf::DW_TAG_rvalue_reference_type;
3260 Tag = llvm::dwarf::DW_TAG_reference_type;
3262 return CreatePointerLikeType(Tag, Ty, Ty->
getPointeeType(), Unit);
3267 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3277 Flags |= llvm::DINode::FlagSingleInheritance;
3280 Flags |= llvm::DINode::FlagMultipleInheritance;
3283 Flags |= llvm::DINode::FlagVirtualInheritance;
3293 return DBuilder.createMemberPointerType(
3299 return DBuilder.createMemberPointerType(
3300 getOrCreateInstanceMethodType(
3303 ClassType,
Size, 0, Flags);
3306llvm::DIType *CGDebugInfo::CreateType(
const AtomicType *Ty, llvm::DIFile *
U) {
3308 return DBuilder.createQualifiedType(llvm::dwarf::DW_TAG_atomic_type, FromTy);
3311llvm::DIType *CGDebugInfo::CreateType(
const PipeType *Ty, llvm::DIFile *
U) {
3315llvm::DIType *CGDebugInfo::CreateEnumType(
const EnumType *Ty) {
3327 bool isImportedFromModule =
3339 llvm::DIScope *EDContext = getDeclContextDescriptor(ED);
3340 llvm::DIFile *DefUnit = getOrCreateFile(ED->
getLocation());
3341 llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType(
3342 llvm::dwarf::DW_TAG_enumeration_type,
"", TheCU, DefUnit, 0));
3345 StringRef EDName = ED->
getName();
3346 llvm::DIType *RetTy = DBuilder.createReplaceableCompositeType(
3347 llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line,
3348 0, Size, Align, llvm::DINode::FlagFwdDecl,
Identifier);
3350 ReplaceMap.emplace_back(
3351 std::piecewise_construct, std::make_tuple(Ty),
3352 std::make_tuple(
static_cast<llvm::Metadata *
>(RetTy)));
3356 return CreateTypeDefinition(Ty);
3359llvm::DIType *CGDebugInfo::CreateTypeDefinition(
const EnumType *Ty) {
3373 Enumerators.push_back(
3374 DBuilder.createEnumerator(
Enum->getName(),
Enum->getInitVal()));
3378 llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
3380 llvm::DIFile *DefUnit = getOrCreateFile(ED->
getLocation());
3382 llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
3383 llvm::DIType *ClassTy = getOrCreateType(ED->
getIntegerType(), DefUnit);
3384 return DBuilder.createEnumerationType(EnumContext, ED->
getName(), DefUnit,
3385 Line, Size, Align, EltArray, ClassTy,
3391 StringRef Name, StringRef
Value) {
3392 unsigned Line = LineLoc.
isInvalid() ? 0 : getLineNumber(LineLoc);
3393 return DBuilder.createMacro(
Parent, Line, MType, Name,
Value);
3399 llvm::DIFile *FName = getOrCreateFile(FileLoc);
3400 unsigned Line = LineLoc.
isInvalid() ? 0 : getLineNumber(LineLoc);
3401 return DBuilder.createTempMacroFile(
Parent, Line, FName);
3411 Quals += InnerQuals;
3416 case Type::TemplateSpecialization: {
3417 const auto *Spec = cast<TemplateSpecializationType>(T);
3418 if (Spec->isTypeAlias())
3420 T = Spec->desugar();
3423 case Type::TypeOfExpr:
3424 T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType();
3427 T = cast<TypeOfType>(T)->getUnmodifiedType();
3429 case Type::Decltype:
3430 T = cast<DecltypeType>(T)->getUnderlyingType();
3432 case Type::UnaryTransform:
3433 T = cast<UnaryTransformType>(T)->getUnderlyingType();
3435 case Type::Attributed:
3436 T = cast<AttributedType>(T)->getEquivalentType();
3438 case Type::BTFTagAttributed:
3439 T = cast<BTFTagAttributedType>(T)->getWrappedType();
3441 case Type::Elaborated:
3442 T = cast<ElaboratedType>(T)->getNamedType();
3445 T = cast<UsingType>(T)->getUnderlyingType();
3448 T = cast<ParenType>(T)->getInnerType();
3450 case Type::MacroQualified:
3451 T = cast<MacroQualifiedType>(T)->getUnderlyingType();
3453 case Type::SubstTemplateTypeParm:
3454 T = cast<SubstTemplateTypeParmType>(T)->getReplacementType();
3457 case Type::DeducedTemplateSpecialization: {
3458 QualType DT = cast<DeducedType>(T)->getDeducedType();
3459 assert(!DT.
isNull() &&
"Undeduced types shouldn't reach here.");
3463 case Type::Adjusted:
3466 T = cast<AdjustedType>(T)->getAdjustedType();
3470 assert(T != LastT &&
"Type unwrapping failed to unwrap!");
3475llvm::DIType *CGDebugInfo::getTypeOrNull(
QualType Ty) {
3478 if (It != TypeCache.end()) {
3480 if (llvm::Metadata *
V = It->second)
3481 return cast<llvm::DIType>(
V);
3493 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly ||
3503llvm::DIType *CGDebugInfo::getOrCreateType(
QualType Ty, llvm::DIFile *Unit) {
3507 llvm::TimeTraceScope TimeScope(
"DebugType", [&]() {
3509 llvm::raw_string_ostream OS(Name);
3510 Ty.
print(OS, getPrintingPolicy());
3517 if (
auto *T = getTypeOrNull(Ty))
3520 llvm::DIType *Res = CreateTypeNode(Ty, Unit);
3521 void *TyPtr = Ty.getAsOpaquePtr();
3524 TypeCache[TyPtr].reset(Res);
3529llvm::DIModule *CGDebugInfo::getParentModuleOrNull(
const Decl *D) {
3531 if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->
getDefinition())
3537 auto Info = Reader->getSourceDescriptor(Idx);
3539 return getOrCreateModuleRef(*Info,
true);
3540 }
else if (ClangModuleMap) {
3554 return getOrCreateModuleRef(Info,
false);
3557 return getOrCreateModuleRef(PCHDescriptor,
false);
3564llvm::DIType *CGDebugInfo::CreateTypeNode(
QualType Ty, llvm::DIFile *Unit) {
3567 return CreateQualifiedType(Ty, Unit);
3571#define TYPE(Class, Base)
3572#define ABSTRACT_TYPE(Class, Base)
3573#define NON_CANONICAL_TYPE(Class, Base)
3574#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3575#include "clang/AST/TypeNodes.inc"
3576 llvm_unreachable(
"Dependent types cannot show up in debug information");
3578 case Type::ExtVector:
3580 return CreateType(cast<VectorType>(Ty), Unit);
3581 case Type::ConstantMatrix:
3582 return CreateType(cast<ConstantMatrixType>(Ty), Unit);
3583 case Type::ObjCObjectPointer:
3584 return CreateType(cast<ObjCObjectPointerType>(Ty), Unit);
3585 case Type::ObjCObject:
3586 return CreateType(cast<ObjCObjectType>(Ty), Unit);
3587 case Type::ObjCTypeParam:
3588 return CreateType(cast<ObjCTypeParamType>(Ty), Unit);
3589 case Type::ObjCInterface:
3590 return CreateType(cast<ObjCInterfaceType>(Ty), Unit);
3592 return CreateType(cast<BuiltinType>(Ty));
3594 return CreateType(cast<ComplexType>(Ty));
3596 return CreateType(cast<PointerType>(Ty), Unit);
3597 case Type::BlockPointer:
3598 return CreateType(cast<BlockPointerType>(Ty), Unit);
3600 return CreateType(cast<TypedefType>(Ty), Unit);
3602 return CreateType(cast<RecordType>(Ty));
3604 return CreateEnumType(cast<EnumType>(Ty));
3605 case Type::FunctionProto:
3606 case Type::FunctionNoProto:
3607 return CreateType(cast<FunctionType>(Ty), Unit);
3608 case Type::ConstantArray:
3609 case Type::VariableArray:
3610 case Type::IncompleteArray:
3611 return CreateType(cast<ArrayType>(Ty), Unit);
3613 case Type::LValueReference:
3614 return CreateType(cast<LValueReferenceType>(Ty), Unit);
3615 case Type::RValueReference:
3616 return CreateType(cast<RValueReferenceType>(Ty), Unit);
3618 case Type::MemberPointer:
3619 return CreateType(cast<MemberPointerType>(Ty), Unit);
3622 return CreateType(cast<AtomicType>(Ty), Unit);
3625 return CreateType(cast<BitIntType>(Ty));
3627 return CreateType(cast<PipeType>(Ty), Unit);
3629 case Type::TemplateSpecialization:
3630 return CreateType(cast<TemplateSpecializationType>(Ty), Unit);
3633 case Type::Attributed:
3634 case Type::BTFTagAttributed:
3635 case Type::Adjusted:
3637 case Type::DeducedTemplateSpecialization:
3638 case Type::Elaborated:
3641 case Type::MacroQualified:
3642 case Type::SubstTemplateTypeParm:
3643 case Type::TypeOfExpr:
3645 case Type::Decltype:
3646 case Type::UnaryTransform:
3650 llvm_unreachable(
"type should have been unwrapped!");
3653llvm::DICompositeType *
3654CGDebugInfo::getOrCreateLimitedType(
const RecordType *Ty) {
3657 auto *T = cast_or_null<llvm::DICompositeType>(getTypeOrNull(QTy));
3662 if (T && !T->isForwardDecl())
3666 llvm::DICompositeType *Res = CreateLimitedType(Ty);
3671 DBuilder.replaceArrays(Res, T ? T->getElements() : llvm::DINodeArray());
3674 TypeCache[QTy.getAsOpaquePtr()].reset(Res);
3679llvm::DICompositeType *CGDebugInfo::CreateLimitedType(
const RecordType *Ty) {
3683 StringRef RDName = getClassName(RD);
3685 llvm::DIFile *DefUnit =
nullptr;
3688 DefUnit = getOrCreateFile(Loc);
3689 Line = getLineNumber(Loc);
3692 llvm::DIScope *RDContext = getDeclContextDescriptor(RD);
3696 auto *T = cast_or_null<llvm::DICompositeType>(
3705 return getOrCreateRecordFwdDecl(Ty, RDContext);
3718 auto Flags = llvm::DINode::FlagZero;
3719 if (
auto CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3721 Flags |= llvm::DINode::FlagTypePassByReference;
3723 Flags |= llvm::DINode::FlagTypePassByValue;
3726 if (!CXXRD->isTrivial())
3727 Flags |= llvm::DINode::FlagNonTrivial;
3730 if (CXXRD->isAnonymousStructOrUnion())
3731 Flags |= llvm::DINode::FlagExportSymbols;
3734 dyn_cast<CXXRecordDecl>(CXXRD->getDeclContext()));
3737 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
3738 llvm::DICompositeType *RealDecl = DBuilder.createReplaceableCompositeType(
3739 getTagForRecord(RD), RDName, RDContext, DefUnit, Line, 0, Size, Align,
3744 switch (RealDecl->getTag()) {
3746 llvm_unreachable(
"invalid composite type tag");
3748 case llvm::dwarf::DW_TAG_array_type:
3749 case llvm::dwarf::DW_TAG_enumeration_type:
3758 case llvm::dwarf::DW_TAG_structure_type:
3759 case llvm::dwarf::DW_TAG_union_type:
3760 case llvm::dwarf::DW_TAG_class_type:
3763 llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
3767 RegionMap[Ty->
getDecl()].reset(RealDecl);
3770 if (
const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
3771 DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(),
3772 CollectCXXTemplateParams(TSpecial, DefUnit));
3776void CGDebugInfo::CollectContainingType(
const CXXRecordDecl *RD,
3777 llvm::DICompositeType *RealDecl) {
3779 llvm::DIType *ContainingType =
nullptr;
3791 ContainingType = getOrCreateType(
QualType(PBase->getTypeForDecl(), 0),
3794 ContainingType = RealDecl;
3796 DBuilder.replaceVTableHolder(RealDecl, ContainingType);
3799llvm::DIType *CGDebugInfo::CreateMemberType(llvm::DIFile *Unit,
QualType FType,
3800 StringRef Name, uint64_t *Offset) {
3801 llvm::DIType *FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
3805 DBuilder.createMemberType(Unit, Name, Unit, 0, FieldSize, FieldAlign,
3806 *Offset, llvm::DINode::FlagZero, FieldTy);
3807 *Offset += FieldSize;
3811void CGDebugInfo::collectFunctionDeclProps(
GlobalDecl GD, llvm::DIFile *Unit,
3813 StringRef &LinkageName,
3814 llvm::DIScope *&FDContext,
3815 llvm::DINodeArray &TParamsArray,
3816 llvm::DINode::DIFlags &Flags) {
3818 Name = getFunctionName(FD);
3823 Flags |= llvm::DINode::FlagPrototyped;
3827 if (LinkageName == Name ||
3832 DebugKind <= llvm::codegenoptions::DebugLineTablesOnly))
3833 LinkageName = StringRef();
3838 (DebugKind == llvm::codegenoptions::DebugLineTablesOnly &&
3842 FDContext = getOrCreateNamespace(NSDecl);
3845 llvm::DIScope *Mod = getParentModuleOrNull(RDecl);
3846 FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU);
3852 Flags |= llvm::DINode::FlagNoReturn;
3854 TParamsArray = CollectFunctionTemplateParams(FD, Unit);
3858void CGDebugInfo::collectVarDeclProps(
const VarDecl *VD, llvm::DIFile *&Unit,
3860 StringRef &Name, StringRef &LinkageName,
3861 llvm::MDTuple *&TemplateParameters,
3862 llvm::DIScope *&VDContext) {
3871 llvm::APInt ConstVal(32, 1);
3882 if (LinkageName == Name)
3883 LinkageName = StringRef();
3885 if (isa<VarTemplateSpecializationDecl>(VD)) {
3886 llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VD, &*Unit);
3887 TemplateParameters = parameterNodes.get();
3889 TemplateParameters =
nullptr;
3909 llvm::DIScope *Mod = getParentModuleOrNull(VD);
3910 VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU);
3913llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(
GlobalDecl GD,
3915 llvm::DINodeArray TParamsArray;
3916 StringRef Name, LinkageName;
3917 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3918 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
3920 llvm::DIFile *Unit = getOrCreateFile(Loc);
3921 llvm::DIScope *DContext = Unit;
3922 unsigned Line = getLineNumber(Loc);
3923 collectFunctionDeclProps(GD, Unit, Name, LinkageName, DContext, TParamsArray,
3925 auto *FD = cast<FunctionDecl>(GD.
getDecl());
3930 ArgTypes.push_back(Parm->getType());
3936 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
3938 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
3941 Flags |= getCallSiteRelatedAttrs();
3942 SPFlags |= llvm::DISubprogram::SPFlagDefinition;
3943 return DBuilder.createFunction(
3944 DContext, Name, LinkageName, Unit, Line,
3945 getOrCreateFunctionType(GD.
getDecl(), FnType, Unit), 0, Flags, SPFlags,
3946 TParamsArray.get(), getFunctionDeclaration(FD));
3949 llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(
3950 DContext, Name, LinkageName, Unit, Line,
3951 getOrCreateFunctionType(GD.
getDecl(), FnType, Unit), 0, Flags, SPFlags,
3952 TParamsArray.get(), getFunctionDeclaration(FD));
3954 FwdDeclReplaceMap.emplace_back(std::piecewise_construct,
3955 std::make_tuple(CanonDecl),
3956 std::make_tuple(SP));
3960llvm::DISubprogram *CGDebugInfo::getFunctionForwardDeclaration(
GlobalDecl GD) {
3961 return getFunctionFwdDeclOrStub(GD,
false);
3964llvm::DISubprogram *CGDebugInfo::getFunctionStub(
GlobalDecl GD) {
3965 return getFunctionFwdDeclOrStub(GD,
true);
3968llvm::DIGlobalVariable *
3969CGDebugInfo::getGlobalVariableForwardDeclaration(
const VarDecl *VD) {
3971 StringRef Name, LinkageName;
3973 llvm::DIFile *Unit = getOrCreateFile(Loc);
3974 llvm::DIScope *DContext = Unit;
3975 unsigned Line = getLineNumber(Loc);
3976 llvm::MDTuple *TemplateParameters =
nullptr;
3978 collectVarDeclProps(VD, Unit, Line, T, Name, LinkageName, TemplateParameters,
3981 auto *GV = DBuilder.createTempGlobalVariableFwdDecl(
3982 DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit),
3984 FwdDeclReplaceMap.emplace_back(
3985 std::piecewise_construct,
3987 std::make_tuple(
static_cast<llvm::Metadata *
>(GV)));
3991llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(
const Decl *D) {
3996 if (
const auto *TD = dyn_cast<TypeDecl>(D))
4001 if (I != DeclCache.end()) {
4003 if (
auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(N))
4004 return GVE->getVariable();
4005 return cast<llvm::DINode>(N);
4012 if (IE != ImportedDeclCache.end()) {
4013 auto N = IE->second;
4014 if (
auto *GVE = dyn_cast_or_null<llvm::DIImportedEntity>(N))
4015 return cast<llvm::DINode>(GVE);
4016 return dyn_cast_or_null<llvm::DINode>(N);
4021 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
4022 return getFunctionForwardDeclaration(FD);
4023 else if (
const auto *VD = dyn_cast<VarDecl>(D))
4024 return getGlobalVariableForwardDeclaration(VD);
4029llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(
const Decl *D) {
4030 if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
4033 const auto *FD = dyn_cast<FunctionDecl>(D);
4038 auto *S = getDeclContextDescriptor(D);
4041 if (MI == SPCache.end()) {
4043 return CreateCXXMemberFunction(MD, getOrCreateFile(MD->
getLocation()),
4044 cast<llvm::DICompositeType>(S));
4047 if (MI != SPCache.end()) {
4048 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
4049 if (SP && !SP->isDefinition())
4053 for (
auto *NextFD : FD->
redecls()) {
4054 auto MI = SPCache.find(NextFD->getCanonicalDecl());
4055 if (MI != SPCache.end()) {
4056 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
4057 if (SP && !SP->isDefinition())
4064llvm::DISubprogram *CGDebugInfo::getObjCMethodDeclaration(
4065 const Decl *D, llvm::DISubroutineType *FnType,
unsigned LineNo,
4066 llvm::DINode::DIFlags Flags, llvm::DISubprogram::DISPFlags SPFlags) {
4067 if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
4070 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
4078 SPFlags |= llvm::DISubprogram::SPFlagObjCDirect;
4088 auto It = TypeCache.find(QTy.getAsOpaquePtr());
4089 if (It == TypeCache.end())
4091 auto *InterfaceType = cast<llvm::DICompositeType>(It->second);
4092 llvm::DISubprogram *FD = DBuilder.createFunction(
4093 InterfaceType, getObjCMethodName(OMD), StringRef(),
4094 InterfaceType->getFile(), LineNo, FnType, LineNo, Flags, SPFlags);
4095 DBuilder.finalizeSubprogram(FD);
4102llvm::DISubroutineType *CGDebugInfo::getOrCreateFunctionType(
const Decl *D,
4107 if (!D || (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly &&
4111 return DBuilder.createSubroutineType(
4112 DBuilder.getOrCreateTypeArray(std::nullopt));
4114 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D))
4115 return getOrCreateMethodType(Method, F);
4120 if (
const auto *OMethod = dyn_cast<ObjCMethodDecl>(D)) {
4125 QualType ResultTy = OMethod->getReturnType();
4130 QualType(OMethod->getClassInterface()->getTypeForDecl(), 0));
4132 Elts.push_back(getOrCreateType(ResultTy, F));
4135 if (
auto *SelfDecl = OMethod->getSelfDecl())
4136 SelfDeclTy = SelfDecl->getType();
4137 else if (
auto *FPT = dyn_cast<FunctionProtoType>(FnType))
4140 if (!SelfDeclTy.
isNull())
4142 CreateSelfType(SelfDeclTy, getOrCreateType(SelfDeclTy, F)));
4144 Elts.push_back(DBuilder.createArtificialType(
4147 for (
const auto *PI : OMethod->parameters())
4148 Elts.push_back(getOrCreateType(PI->getType(), F));
4150 if (OMethod->isVariadic())
4151 Elts.push_back(DBuilder.createUnspecifiedParameter());
4153 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
4154 return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero,
4160 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
4161 if (FD->isVariadic()) {
4163 EltTys.push_back(getOrCreateType(FD->getReturnType(), F));
4164 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FnType))
4166 EltTys.push_back(getOrCreateType(ParamType, F));
4167 EltTys.push_back(DBuilder.createUnspecifiedParameter());
4168 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
4169 return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero,
4173 return cast<llvm::DISubroutineType>(getOrCreateType(FnType, F));
4182 CC = SrcFnTy->getCallConv();
4184 for (
const VarDecl *VD : Args)
4185 ArgTypes.push_back(VD->
getType());
4192 llvm::Function *Fn,
bool CurFuncIsThunk) {
4194 StringRef LinkageName;
4196 FnBeginRegionCount.push_back(LexicalBlockStack.size());
4199 bool HasDecl = (D !=
nullptr);
4201 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
4202 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
4203 llvm::DIFile *Unit = getOrCreateFile(Loc);
4204 llvm::DIScope *FDContext = Unit;
4205 llvm::DINodeArray TParamsArray;
4208 LinkageName = Fn->getName();
4209 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
4211 auto FI = SPCache.find(FD->getCanonicalDecl());
4212 if (FI != SPCache.end()) {
4213 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
4214 if (SP && SP->isDefinition()) {
4215 LexicalBlockStack.emplace_back(SP);
4216 RegionMap[D].reset(SP);
4220 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
4221 TParamsArray, Flags);
4222 }
else if (
const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
4223 Name = getObjCMethodName(OMD);
4224 Flags |= llvm::DINode::FlagPrototyped;
4225 }
else if (isa<VarDecl>(D) &&
4231 Name = Fn->getName();
4233 if (isa<BlockDecl>(D))
4236 Flags |= llvm::DINode::FlagPrototyped;
4238 if (Name.startswith(
"\01"))
4239 Name = Name.substr(1);
4241 assert((!D || !isa<VarDecl>(D) ||
4243 "Unexpected DynamicInitKind !");
4246 isa<VarDecl>(D) || isa<CapturedDecl>(D)) {
4247 Flags |= llvm::DINode::FlagArtificial;
4253 Flags |= llvm::DINode::FlagThunk;
4255 if (Fn->hasLocalLinkage())
4256 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
4258 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
4260 llvm::DINode::DIFlags FlagsForDef = Flags | getCallSiteRelatedAttrs();
4261 llvm::DISubprogram::DISPFlags SPFlagsForDef =
4262 SPFlags | llvm::DISubprogram::SPFlagDefinition;
4264 const unsigned LineNo = getLineNumber(Loc.
isValid() ? Loc : CurLoc);
4265 unsigned ScopeLine = getLineNumber(ScopeLoc);
4266 llvm::DISubroutineType *DIFnType = getOrCreateFunctionType(D, FnType, Unit);
4267 llvm::DISubprogram *
Decl =
nullptr;
4268 llvm::DINodeArray Annotations =
nullptr;
4270 Decl = isa<ObjCMethodDecl>(D)
4271 ? getObjCMethodDeclaration(D, DIFnType, LineNo, Flags, SPFlags)
4272 : getFunctionDeclaration(D);
4273 Annotations = CollectBTFDeclTagAnnotations(D);
4281 llvm::DISubprogram *SP = DBuilder.createFunction(
4282 FDContext, Name, LinkageName, Unit, LineNo, DIFnType, ScopeLine,
4283 FlagsForDef, SPFlagsForDef, TParamsArray.get(),
Decl,
nullptr,
4285 Fn->setSubprogram(SP);
4289 if (HasDecl && isa<FunctionDecl>(D))
4293 LexicalBlockStack.emplace_back(SP);
4296 RegionMap[D].reset(SP);
4300 QualType FnType, llvm::Function *Fn) {
4302 StringRef LinkageName;
4308 llvm::TimeTraceScope TimeScope(
"DebugFunction", [&]() {
4309 return GetName(D,
true);
4312 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
4313 llvm::DIFile *Unit = getOrCreateFile(Loc);
4314 bool IsDeclForCallSite = Fn ?
true :
false;
4315 llvm::DIScope *FDContext =
4316 IsDeclForCallSite ? Unit : getDeclContextDescriptor(D);
4317 llvm::DINodeArray TParamsArray;
4318 if (isa<FunctionDecl>(D)) {
4320 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
4321 TParamsArray, Flags);
4322 }
else if (
const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
4323 Name = getObjCMethodName(OMD);
4324 Flags |= llvm::DINode::FlagPrototyped;
4326 llvm_unreachable(
"not a function or ObjC method");
4328 if (!Name.empty() && Name[0] ==
'\01')
4329 Name = Name.substr(1);
4332 Flags |= llvm::DINode::FlagArtificial;
4337 unsigned LineNo = getLineNumber(Loc);
4338 unsigned ScopeLine = 0;
4339 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
4341 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
4343 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
4344 llvm::DISubroutineType *STy = getOrCreateFunctionType(D, FnType, Unit);
4345 llvm::DISubprogram *SP = DBuilder.createFunction(
4346 FDContext, Name, LinkageName, Unit, LineNo, STy, ScopeLine, Flags,
4347 SPFlags, TParamsArray.get(),
nullptr,
nullptr, Annotations);
4353 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
4354 llvm::DITypeRefArray ParamTypes = STy->getTypeArray();
4357 llvm::DINodeArray ParamAnnotations = CollectBTFDeclTagAnnotations(PD);
4358 DBuilder.createParameterVariable(
4359 SP, PD->getName(), ArgNo, Unit, LineNo, ParamTypes[ArgNo],
true,
4360 llvm::DINode::FlagZero, ParamAnnotations);
4366 if (IsDeclForCallSite)
4367 Fn->setSubprogram(SP);
4369 DBuilder.finalizeSubprogram(SP);
4377 auto *Func = CallOrInvoke->getCalledFunction();
4380 if (Func->getSubprogram())
4385 if (CalleeDecl->
hasAttr<NoDebugAttr>() ||
4386 getCallSiteRelatedAttrs() == llvm::DINode::FlagZero)
4397 const auto *FD = cast<FunctionDecl>(GD.
getDecl());
4399 auto FI = SPCache.find(FD->getCanonicalDecl());
4400 llvm::DISubprogram *SP =
nullptr;
4401 if (FI != SPCache.end())
4402 SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
4403 if (!SP || !SP->isDefinition())
4404 SP = getFunctionStub(GD);
4405 FnBeginRegionCount.push_back(LexicalBlockStack.size());
4406 LexicalBlockStack.emplace_back(SP);
4412 assert(CurInlinedAt &&
"unbalanced inline scope stack");
4421 if (CurLoc.isInvalid() || CurLoc.isMacroID() || LexicalBlockStack.empty())
4424 llvm::MDNode *
Scope = LexicalBlockStack.back();
4425 Builder.SetCurrentDebugLocation(
4426 llvm::DILocation::get(CGM.
getLLVMContext(), getLineNumber(CurLoc),
4427 getColumnNumber(CurLoc),
Scope, CurInlinedAt));
4431 llvm::MDNode *Back =
nullptr;
4432 if (!LexicalBlockStack.empty())
4433 Back = LexicalBlockStack.back().get();
4434 LexicalBlockStack.emplace_back(DBuilder.createLexicalBlock(
4435 cast<llvm::DIScope>(Back), getOrCreateFile(CurLoc), getLineNumber(CurLoc),
4436 getColumnNumber(CurLoc)));
4439void CGDebugInfo::AppendAddressSpaceXDeref(
4441 std::optional<unsigned> DWARFAddressSpace =
4443 if (!DWARFAddressSpace)
4446 Expr.push_back(llvm::dwarf::DW_OP_constu);
4447 Expr.push_back(*DWARFAddressSpace);
4448 Expr.push_back(llvm::dwarf::DW_OP_swap);
4449 Expr.push_back(llvm::dwarf::DW_OP_xderef);
4458 Builder.SetCurrentDebugLocation(llvm::DILocation::get(
4460 LexicalBlockStack.back(), CurInlinedAt));
4462 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
4466 CreateLexicalBlock(Loc);
4471 assert(!LexicalBlockStack.empty() &&
"Region stack mismatch, stack empty!");
4476 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
4479 LexicalBlockStack.pop_back();
4483 assert(!LexicalBlockStack.empty() &&
"Region stack mismatch, stack empty!");
4484 unsigned RCount = FnBeginRegionCount.back();
4485 assert(RCount <= LexicalBlockStack.size() &&
"Region stack mismatch");
4488 while (LexicalBlockStack.size() != RCount) {
4491 LexicalBlockStack.pop_back();
4493 FnBeginRegionCount.pop_back();
4495 if (Fn && Fn->getSubprogram())
4496 DBuilder.finalizeSubprogram(Fn->getSubprogram());
4499CGDebugInfo::BlockByRefType
4500CGDebugInfo::EmitTypeForVarWithBlocksAttr(
const VarDecl *VD,
4501 uint64_t *XOffset) {
4504 uint64_t FieldSize, FieldOffset;
4505 uint32_t FieldAlign;
4507 llvm::DIFile *Unit = getOrCreateFile(VD->
getLocation());
4512 EltTys.push_back(CreateMemberType(Unit, FType,
"__isa", &FieldOffset));
4513 EltTys.push_back(CreateMemberType(Unit, FType,
"__forwarding", &FieldOffset));
4515 EltTys.push_back(CreateMemberType(Unit, FType,
"__flags", &FieldOffset));
4516 EltTys.push_back(CreateMemberType(Unit, FType,
"__size", &FieldOffset));
4519 if (HasCopyAndDispose) {
4522 CreateMemberType(Unit, FType,
"__copy_helper", &FieldOffset));
4524 CreateMemberType(Unit, FType,
"__destroy_helper", &FieldOffset));
4526 bool HasByrefExtendedLayout;
4529 HasByrefExtendedLayout) &&
4530 HasByrefExtendedLayout) {
4533 CreateMemberType(Unit, FType,
"__byref_variable_layout", &FieldOffset));
4542 CharUnits NumPaddingBytes = AlignedOffsetInBytes - FieldOffsetInBytes;
4545 llvm::APInt pad(32, NumPaddingBytes.
getQuantity());
4548 EltTys.push_back(CreateMemberType(Unit, FType,
"", &FieldOffset));
4553 llvm::DIType *WrappedTy = getOrCreateType(FType, Unit);
4557 *XOffset = FieldOffset;
4558 llvm::DIType *FieldTy = DBuilder.createMemberType(
4559 Unit, VD->
getName(), Unit, 0, FieldSize, FieldAlign, FieldOffset,
4560 llvm::DINode::FlagZero, WrappedTy);
4561 EltTys.push_back(FieldTy);
4562 FieldOffset += FieldSize;
4564 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
4565 return {DBuilder.createStructType(Unit,
"", Unit, 0, FieldOffset, 0,
4566 llvm::DINode::FlagZero,
nullptr, Elements),
4570llvm::DILocalVariable *CGDebugInfo::EmitDeclare(
const VarDecl *VD,
4571 llvm::Value *Storage,
4572 std::optional<unsigned> ArgNo,
4574 const bool UsePointerValue) {
4576 assert(!LexicalBlockStack.empty() &&
"Region stack mismatch, stack empty!");
4577 if (VD->
hasAttr<NoDebugAttr>())
4583 llvm::DIFile *Unit =
nullptr;
4588 if (VD->
hasAttr<BlocksAttr>())
4589 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
4591 Ty = getOrCreateType(VD->
getType(), Unit);
4600 unsigned Column = 0;
4606 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
4608 Flags |= llvm::DINode::FlagArtificial;
4613 AppendAddressSpaceXDeref(AddressSpace,
Expr);
4617 if (
const auto *IPD = dyn_cast<ImplicitParamDecl>(VD)) {
4620 Flags |= llvm::DINode::FlagObjectPointer;
4627 auto *
Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
4628 StringRef Name = VD->
getName();
4629 if (!Name.empty()) {
4635 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4640 Expr.push_back(llvm::dwarf::DW_OP_deref);
4641 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4646 }
else if (
const auto *RT = dyn_cast<RecordType>(VD->
getType())) {
4658 for (
const auto *Field : RD->
fields()) {
4659 llvm::DIType *FieldTy = getOrCreateType(
Field->getType(), Unit);
4660 StringRef FieldName =
Field->getName();
4663 if (FieldName.empty() && !isa<RecordType>(
Field->getType()))
4668 auto *D = DBuilder.createAutoVariable(
4670 Flags | llvm::DINode::FlagArtificial, FieldAlign);
4673 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(
Expr),
4677 Builder.GetInsertBlock());
4685 if (UsePointerValue) {
4686 assert(!llvm::is_contained(
Expr, llvm::dwarf::DW_OP_deref) &&
4687 "Debug info already contains DW_OP_deref.");
4688 Expr.push_back(llvm::dwarf::DW_OP_deref);
4692 llvm::DILocalVariable *D =
nullptr;
4694 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(VD);
4695 D = DBuilder.createParameterVariable(
Scope, Name, *ArgNo, Unit, Line, Ty,
4706 auto RemapCoroArgToLocalVar = [&]() -> llvm::DILocalVariable * {
4709 if (!isa<llvm::DISubprogram>(
Scope) || !
Scope->isDistinct())
4712 auto Iter = llvm::find_if(CoroutineParameterMappings, [&](
auto &Pair) {
4713 Stmt *StmtPtr =
const_cast<Stmt *
>(Pair.second);
4714 if (
DeclStmt *DeclStmtPtr = dyn_cast<DeclStmt>(StmtPtr)) {
4717 if (VD == dyn_cast_or_null<VarDecl>(
Decl))
4723 if (
Iter != CoroutineParameterMappings.end()) {
4725 auto Iter2 = llvm::find_if(ParamDbgMappings, [&](
auto &DbgPair) {
4726 return DbgPair.first == PD && DbgPair.second->getScope() ==
Scope;
4728 if (Iter2 != ParamDbgMappings.end())
4729 return const_cast<llvm::DILocalVariable *
>(Iter2->second);
4735 D = RemapCoroArgToLocalVar();
4738 D = DBuilder.createAutoVariable(
Scope, Name, Unit, Line, Ty,
4742 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(
Expr),
4744 Column,
Scope, CurInlinedAt),
4745 Builder.GetInsertBlock());
4750llvm::DIType *CGDebugInfo::CreateBindingDeclType(
const BindingDecl *BD) {
4751 llvm::DIFile *Unit = getOrCreateFile(BD->
getLocation());
4756 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
4757 if (FD->isBitField()) {
4774 llvm::DIType *Ty = getOrCreateType(FinalTy, Unit);
4781 return getOrCreateType(BD->
getType(), Unit);
4784llvm::DILocalVariable *CGDebugInfo::EmitDeclare(
const BindingDecl *BD,
4785 llvm::Value *Storage,
4786 std::optional<unsigned> ArgNo,
4788 const bool UsePointerValue) {
4790 assert(!LexicalBlockStack.empty() &&
"Region stack mismatch, stack empty!");
4791 if (BD->
hasAttr<NoDebugAttr>())
4798 llvm::DIType *Ty = CreateBindingDeclType(BD);
4809 AppendAddressSpaceXDeref(AddressSpace,
Expr);
4814 if (UsePointerValue) {
4815 assert(!llvm::is_contained(
Expr, llvm::dwarf::DW_OP_deref) &&
4816 "Debug info already contains DW_OP_deref.");
4817 Expr.push_back(llvm::dwarf::DW_OP_deref);
4821 unsigned Column = getColumnNumber(BD->
getLocation());
4822 StringRef Name = BD->
getName();
4823 auto *
Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
4824 llvm::DIFile *Unit = getOrCreateFile(BD->
getLocation());
4826 llvm::DILocalVariable *D = DBuilder.createAutoVariable(
4828 llvm::DINode::FlagZero, Align);
4831 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
4832 const unsigned fieldIndex = FD->getFieldIndex();
4839 if (fieldOffset != 0) {
4845 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4851 dyn_cast<ArraySubscriptExpr>(BD->
getBinding())) {
4852 if (
const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(ASE->getIdx())) {
4853 const uint64_t value = IL->getValue().getZExtValue();
4857 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4866 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(
Expr),
4868 Column,
Scope, CurInlinedAt),
4869 Builder.GetInsertBlock());
4874llvm::DILocalVariable *
4877 const bool UsePointerValue) {
4880 if (
auto *DD = dyn_cast<DecompositionDecl>(VD))
4881 for (
auto *B : DD->bindings()) {
4882 EmitDeclare(B, Storage, std::nullopt, Builder,
4886 return EmitDeclare(VD, Storage, std::nullopt, Builder, UsePointerValue);
4891 assert(!LexicalBlockStack.empty() &&
"Region stack mismatch, stack empty!");
4893 if (D->
hasAttr<NoDebugAttr>())
4896 auto *
Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
4897 llvm::DIFile *Unit = getOrCreateFile(D->
getLocation());
4901 unsigned Column = getColumnNumber(D->
getLocation());
4903 StringRef Name = D->
getName();
4910 DBuilder.insertLabel(L,
4912 Scope, CurInlinedAt),
4913 Builder.GetInsertBlock());
4916llvm::DIType *CGDebugInfo::CreateSelfType(
const QualType &QualTy,
4918 llvm::DIType *CachedTy = getTypeOrNull(QualTy);
4921 return DBuilder.createObjectPointerType(Ty);
4926 const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) {
4928 assert(!LexicalBlockStack.empty() &&
"Region stack mismatch, stack empty!");
4930 if (Builder.GetInsertBlock() ==
nullptr)
4932 if (VD->
hasAttr<NoDebugAttr>())
4935 bool isByRef = VD->
hasAttr<BlocksAttr>();
4937 uint64_t XOffset = 0;
4938 llvm::DIFile *Unit = getOrCreateFile(VD->
getLocation());
4941 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
4943 Ty = getOrCreateType(VD->
getType(), Unit);
4947 if (
const auto *IPD = dyn_cast<ImplicitParamDecl>(VD))
4949 Ty = CreateSelfType(VD->
getType(), Ty);
4952 const unsigned Line =
4954 unsigned Column = getColumnNumber(VD->
getLocation());
4963 addr.push_back(llvm::dwarf::DW_OP_deref);
4964 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4967 addr.push_back(llvm::dwarf::DW_OP_deref);
4968 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4973 addr.push_back(llvm::dwarf::DW_OP_deref);
4974 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4982 auto *D = DBuilder.createAutoVariable(
4983 cast<llvm::DILocalScope>(LexicalBlockStack.back()), VD->
getName(), Unit,
4984 Line, Ty,
false, llvm::DINode::FlagZero, Align);
4987 auto DL = llvm::DILocation::get(CGM.
getLLVMContext(), Line, Column,
4988 LexicalBlockStack.back(), CurInlinedAt);
4989 auto *
Expr = DBuilder.createExpression(addr);
4991 DBuilder.insertDeclare(Storage, D,
Expr, DL, InsertPoint);
4993 DBuilder.insertDeclare(Storage, D,
Expr, DL, Builder.GetInsertBlock());
4996llvm::DILocalVariable *
4999 bool UsePointerValue) {
5001 return EmitDeclare(VD, AI, ArgNo, Builder, UsePointerValue);
5005struct BlockLayoutChunk {
5006 uint64_t OffsetInBits;
5009bool operator<(
const BlockLayoutChunk &l,
const BlockLayoutChunk &r) {
5010 return l.OffsetInBits < r.OffsetInBits;
5014void CGDebugInfo::collectDefaultFieldsForBlockLiteralDeclare(
5016 const llvm::StructLayout &BlockLayout, llvm::DIFile *Unit,
5022 Fields.push_back(createFieldType(
"__size", Context.
IntTy, Loc,
AS_public,
5023 BlockLayout.getElementOffsetInBits(0),
5025 Fields.push_back(createFieldType(
"__align", Context.
IntTy, Loc,
AS_public,
5026 BlockLayout.getElementOffsetInBits(1),
5030 BlockLayout.getElementOffsetInBits(0),
5032 Fields.push_back(createFieldType(
"__flags", Context.
IntTy, Loc,
AS_public,
5033 BlockLayout.getElementOffsetInBits(1),
5037 BlockLayout.getElementOffsetInBits(2), Unit, Unit));
5038 auto *FnTy =
Block.getBlockExpr()->getFunctionType();
5040 Fields.push_back(createFieldType(
"__FuncPtr", FnPtrType, Loc,
AS_public,
5041 BlockLayout.getElementOffsetInBits(3),
5043 Fields.push_back(createFieldType(
5048 Loc,
AS_public, BlockLayout.getElementOffsetInBits(4), Unit, Unit));
5055 llvm::AllocaInst *Alloca,
5063 llvm::DIFile *tunit = getOrCreateFile(loc);
5064 unsigned line = getLineNumber(loc);
5065 unsigned column = getColumnNumber(loc);
5070 const llvm::StructLayout *blockLayout =
5074 collectDefaultFieldsForBlockLiteralDeclare(block,
C, loc, *blockLayout, tunit,
5083 BlockLayoutChunk chunk;
5084 chunk.OffsetInBits =
5085 blockLayout->getElementOffsetInBits(block.
CXXThisIndex);
5086 chunk.Capture =
nullptr;
5087 chunks.push_back(chunk);
5091 for (
const auto &capture :
blockDecl->captures()) {
5092 const VarDecl *variable = capture.getVariable();
5099 BlockLayoutChunk chunk;
5100 chunk.OffsetInBits =
5101 blockLayout->getElementOffsetInBits(captureInfo.
getIndex());
5102 chunk.Capture = &capture;
5103 chunks.push_back(chunk);
5107 llvm::array_pod_sort(chunks.begin(), chunks.end());
5109 for (
const BlockLayoutChunk &Chunk : chunks) {
5110 uint64_t offsetInBits = Chunk.OffsetInBits;
5117 cast_or_null<CXXMethodDecl>(
blockDecl->getNonClosureContext()))
5119 else if (
auto *RDecl = dyn_cast<CXXRecordDecl>(
blockDecl->getParent()))
5122 llvm_unreachable(
"unexpected block declcontext");
5124 fields.push_back(createFieldType(
"this",
type, loc,
AS_public,
5125 offsetInBits, tunit, tunit));
5130 StringRef name = variable->
getName();
5132 llvm::DIType *fieldType;
5134 TypeInfo PtrInfo =
C.getTypeInfo(
C.VoidPtrTy);
5139 EmitTypeForVarWithBlocksAttr(variable, &xoffset).BlockByRefWrapper;
5140 fieldType = DBuilder.createPointerType(fieldType, PtrInfo.
Width);
5141 fieldType = DBuilder.createMemberType(tunit, name, tunit, line,
5142 PtrInfo.
Width, Align, offsetInBits,
5143 llvm::DINode::FlagZero, fieldType);
5147 offsetInBits, Align, tunit, tunit);
5149 fields.push_back(fieldType);
5153 llvm::raw_svector_ostream(typeName)
5156 llvm::DINodeArray fieldsArray = DBuilder.getOrCreateArray(fields);
5158 llvm::DIType *
type =
5159 DBuilder.createStructType(tunit, typeName.str(), tunit, line,
5161 llvm::DINode::FlagZero,
nullptr, fieldsArray);
5165 llvm::DINode::DIFlags flags = llvm::DINode::FlagArtificial;
5166 auto *scope = cast<llvm::DILocalScope>(LexicalBlockStack.back());
5169 auto *debugVar = DBuilder.createParameterVariable(
5170 scope, Name, ArgNo, tunit, line,
type, CGM.
getLangOpts().Optimize, flags);
5173 DBuilder.insertDeclare(Alloca, debugVar, DBuilder.createExpression(),
5175 column, scope, CurInlinedAt),
5176 Builder.GetInsertBlock());
5179llvm::DIDerivedType *
5180CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(
const VarDecl *D) {
5185 if (MI != StaticDataMemberCache.end()) {
5186 assert(MI->second &&
"Static data member declaration should still exist");
5193 auto *Ctxt = cast<llvm::DICompositeType>(getDeclContextDescriptor(D));
5194 return CreateRecordStaticField(D, Ctxt, cast<RecordDecl>(DC));
5197llvm::DIGlobalVariableExpression *CGDebugInfo::CollectAnonRecordDecls(
5198 const RecordDecl *RD, llvm::DIFile *Unit,
unsigned LineNo,
5199 StringRef LinkageName, llvm::GlobalVariable *Var, llvm::DIScope *DContext) {
5200 llvm::DIGlobalVariableExpression *GVE =
nullptr;
5202 for (
const auto *Field : RD->
fields()) {
5203 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
5204 StringRef FieldName = Field->getName();
5207 if (FieldName.empty()) {
5208 if (
const auto *RT = dyn_cast<RecordType>(Field->getType()))
5209 GVE = CollectAnonRecordDecls(RT->getDecl(), Unit, LineNo, LinkageName,
5214 GVE = DBuilder.createGlobalVariableExpression(
5215 DContext, FieldName, LinkageName, Unit, LineNo, FieldTy,
5216 Var->hasLocalLinkage());
5217 Var->addDebugInfo(GVE);
5229 const auto *RD = dyn_cast<CXXRecordDecl>(RT->
getDecl());
5234 auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD);
5242 case TemplateArgument::Pack:
5243 return ReferencesAnonymousEntity(TA.getPackAsArray());
5244 case TemplateArgument::Type: {
5245 struct ReferencesAnonymous
5246 : public RecursiveASTVisitor<ReferencesAnonymous> {
5247 bool RefAnon = false;
5248 bool VisitRecordType(RecordType *RT) {
5249 if (ReferencesAnonymousEntity(RT)) {
5256 ReferencesAnonymous RT;
5257 RT.TraverseType(TA.getAsType());
5270 bool Reconstitutable =
true;
5272 Reconstitutable =
false;
5276 Reconstitutable =
false;
5279 bool VisitType(
Type *T) {
5283 Reconstitutable =
false;
5288 bool TraverseEnumType(
EnumType *ET) {
5291 if (
const auto *ED = dyn_cast<EnumDecl>(ET->
getDecl())) {
5293 Reconstitutable =
false;
5297 Reconstitutable =
false;
5307 return Reconstitutable;
5311 Reconstitutable =
false;
5321 ReconstitutableType T;
5323 return T.Reconstitutable;
5326std::string CGDebugInfo::GetName(
const Decl *D,
bool Qualified)
const {
5328 llvm::raw_string_ostream OS(Name);
5329 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5332 llvm::codegenoptions::DebugTemplateNamesKind TemplateNamesKind =
5336 TemplateNamesKind = llvm::codegenoptions::DebugTemplateNamesKind::Full;
5338 std::optional<TemplateArgs> Args;
5340 bool IsOperatorOverload =
false;
5341 if (
auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
5342 Args = GetTemplateArgs(RD);
5343 }
else if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
5344 Args = GetTemplateArgs(FD);
5346 IsOperatorOverload |=
5349 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
5350 Args = GetTemplateArgs(VD);
5356 case TemplateArgument::Template:
5363 case TemplateArgument::Declaration:
5371 case TemplateArgument::NullPtr:
5375 case TemplateArgument::Pack:
5377 return HasReconstitutableArgs(TA.getPackAsArray());
5378 case TemplateArgument::Integral:
5383 return TA.getAsIntegral().getBitWidth() <= 64 &&
5384 IsReconstitutableType(TA.getIntegralType());
5385 case TemplateArgument::Type:
5386 return IsReconstitutableType(TA.getAsType());
5388 llvm_unreachable(
"Other, unresolved, template arguments should "
5389 "not be seen here");
5414 bool Reconstitutable =
5415 Args && HasReconstitutableArgs(Args->Args) && !IsOperatorOverload;
5419 if (TemplateNamesKind == llvm::codegenoptions::DebugTemplateNamesKind::Full ||
5423 bool Mangled = TemplateNamesKind ==
5424 llvm::codegenoptions::DebugTemplateNamesKind::Mangled;
5430 std::string EncodedOriginalName;
5431 llvm::raw_string_ostream EncodedOriginalNameOS(EncodedOriginalName);