xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/CGDebugInfo.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===--- CGDebugInfo.cpp - Emit Debug Information for a Module ------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This coordinates the debug information generation while generating code.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "CGDebugInfo.h"
140b57cec5SDimitry Andric #include "CGBlocks.h"
150b57cec5SDimitry Andric #include "CGCXXABI.h"
160b57cec5SDimitry Andric #include "CGObjCRuntime.h"
170b57cec5SDimitry Andric #include "CGRecordLayout.h"
180b57cec5SDimitry Andric #include "CodeGenFunction.h"
190b57cec5SDimitry Andric #include "CodeGenModule.h"
200b57cec5SDimitry Andric #include "ConstantEmitter.h"
2106c3fb27SDimitry Andric #include "TargetInfo.h"
220b57cec5SDimitry Andric #include "clang/AST/ASTContext.h"
23480093f4SDimitry Andric #include "clang/AST/Attr.h"
240b57cec5SDimitry Andric #include "clang/AST/DeclFriend.h"
250b57cec5SDimitry Andric #include "clang/AST/DeclObjC.h"
260b57cec5SDimitry Andric #include "clang/AST/DeclTemplate.h"
270b57cec5SDimitry Andric #include "clang/AST/Expr.h"
280b57cec5SDimitry Andric #include "clang/AST/RecordLayout.h"
29349cc55cSDimitry Andric #include "clang/AST/RecursiveASTVisitor.h"
30bdd1243dSDimitry Andric #include "clang/AST/VTableBuilder.h"
310b57cec5SDimitry Andric #include "clang/Basic/CodeGenOptions.h"
320b57cec5SDimitry Andric #include "clang/Basic/FileManager.h"
330b57cec5SDimitry Andric #include "clang/Basic/SourceManager.h"
340b57cec5SDimitry Andric #include "clang/Basic/Version.h"
35*0fca6ea1SDimitry Andric #include "clang/CodeGen/ModuleBuilder.h"
360b57cec5SDimitry Andric #include "clang/Frontend/FrontendOptions.h"
370b57cec5SDimitry Andric #include "clang/Lex/HeaderSearchOptions.h"
380b57cec5SDimitry Andric #include "clang/Lex/ModuleMap.h"
390b57cec5SDimitry Andric #include "clang/Lex/PreprocessorOptions.h"
400b57cec5SDimitry Andric #include "llvm/ADT/DenseSet.h"
410b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
420b57cec5SDimitry Andric #include "llvm/ADT/StringExtras.h"
430b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
440b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
450b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h"
460b57cec5SDimitry Andric #include "llvm/IR/Instructions.h"
470b57cec5SDimitry Andric #include "llvm/IR/Intrinsics.h"
480b57cec5SDimitry Andric #include "llvm/IR/Metadata.h"
490b57cec5SDimitry Andric #include "llvm/IR/Module.h"
500b57cec5SDimitry Andric #include "llvm/Support/FileSystem.h"
510b57cec5SDimitry Andric #include "llvm/Support/MD5.h"
520b57cec5SDimitry Andric #include "llvm/Support/Path.h"
53bdd1243dSDimitry Andric #include "llvm/Support/SHA1.h"
54bdd1243dSDimitry Andric #include "llvm/Support/SHA256.h"
55480093f4SDimitry Andric #include "llvm/Support/TimeProfiler.h"
56bdd1243dSDimitry Andric #include <optional>
570b57cec5SDimitry Andric using namespace clang;
580b57cec5SDimitry Andric using namespace clang::CodeGen;
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric static uint32_t getTypeAlignIfRequired(const Type *Ty, const ASTContext &Ctx) {
610b57cec5SDimitry Andric   auto TI = Ctx.getTypeInfo(Ty);
62*0fca6ea1SDimitry Andric   if (TI.isAlignRequired())
63*0fca6ea1SDimitry Andric     return TI.Align;
64*0fca6ea1SDimitry Andric 
65*0fca6ea1SDimitry Andric   // MaxFieldAlignmentAttr is the attribute added to types
66*0fca6ea1SDimitry Andric   // declared after #pragma pack(n).
67*0fca6ea1SDimitry Andric   if (auto *Decl = Ty->getAsRecordDecl())
68*0fca6ea1SDimitry Andric     if (Decl->hasAttr<MaxFieldAlignmentAttr>())
69*0fca6ea1SDimitry Andric       return TI.Align;
70*0fca6ea1SDimitry Andric 
71*0fca6ea1SDimitry Andric   return 0;
720b57cec5SDimitry Andric }
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric static uint32_t getTypeAlignIfRequired(QualType Ty, const ASTContext &Ctx) {
750b57cec5SDimitry Andric   return getTypeAlignIfRequired(Ty.getTypePtr(), Ctx);
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric static uint32_t getDeclAlignIfRequired(const Decl *D, const ASTContext &Ctx) {
790b57cec5SDimitry Andric   return D->hasAttr<AlignedAttr>() ? D->getMaxAlignment() : 0;
800b57cec5SDimitry Andric }
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric CGDebugInfo::CGDebugInfo(CodeGenModule &CGM)
830b57cec5SDimitry Andric     : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()),
840b57cec5SDimitry Andric       DebugTypeExtRefs(CGM.getCodeGenOpts().DebugTypeExtRefs),
850b57cec5SDimitry Andric       DBuilder(CGM.getModule()) {
860b57cec5SDimitry Andric   CreateCompileUnit();
870b57cec5SDimitry Andric }
880b57cec5SDimitry Andric 
890b57cec5SDimitry Andric CGDebugInfo::~CGDebugInfo() {
900b57cec5SDimitry Andric   assert(LexicalBlockStack.empty() &&
910b57cec5SDimitry Andric          "Region stack mismatch, stack not empty!");
920b57cec5SDimitry Andric }
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
950b57cec5SDimitry Andric                                        SourceLocation TemporaryLocation)
960b57cec5SDimitry Andric     : CGF(&CGF) {
970b57cec5SDimitry Andric   init(TemporaryLocation);
980b57cec5SDimitry Andric }
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
1010b57cec5SDimitry Andric                                        bool DefaultToEmpty,
1020b57cec5SDimitry Andric                                        SourceLocation TemporaryLocation)
1030b57cec5SDimitry Andric     : CGF(&CGF) {
1040b57cec5SDimitry Andric   init(TemporaryLocation, DefaultToEmpty);
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric void ApplyDebugLocation::init(SourceLocation TemporaryLocation,
1080b57cec5SDimitry Andric                               bool DefaultToEmpty) {
1090b57cec5SDimitry Andric   auto *DI = CGF->getDebugInfo();
1100b57cec5SDimitry Andric   if (!DI) {
1110b57cec5SDimitry Andric     CGF = nullptr;
1120b57cec5SDimitry Andric     return;
1130b57cec5SDimitry Andric   }
1140b57cec5SDimitry Andric 
1150b57cec5SDimitry Andric   OriginalLocation = CGF->Builder.getCurrentDebugLocation();
1160b57cec5SDimitry Andric 
1170b57cec5SDimitry Andric   if (OriginalLocation && !DI->CGM.getExpressionLocationsEnabled())
1180b57cec5SDimitry Andric     return;
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric   if (TemporaryLocation.isValid()) {
1210b57cec5SDimitry Andric     DI->EmitLocation(CGF->Builder, TemporaryLocation);
1220b57cec5SDimitry Andric     return;
1230b57cec5SDimitry Andric   }
1240b57cec5SDimitry Andric 
1250b57cec5SDimitry Andric   if (DefaultToEmpty) {
1260b57cec5SDimitry Andric     CGF->Builder.SetCurrentDebugLocation(llvm::DebugLoc());
1270b57cec5SDimitry Andric     return;
1280b57cec5SDimitry Andric   }
1290b57cec5SDimitry Andric 
1300b57cec5SDimitry Andric   // Construct a location that has a valid scope, but no line info.
1310b57cec5SDimitry Andric   assert(!DI->LexicalBlockStack.empty());
132e8d8bef9SDimitry Andric   CGF->Builder.SetCurrentDebugLocation(
133e8d8bef9SDimitry Andric       llvm::DILocation::get(DI->LexicalBlockStack.back()->getContext(), 0, 0,
134e8d8bef9SDimitry Andric                             DI->LexicalBlockStack.back(), DI->getInlinedAt()));
1350b57cec5SDimitry Andric }
1360b57cec5SDimitry Andric 
1370b57cec5SDimitry Andric ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E)
1380b57cec5SDimitry Andric     : CGF(&CGF) {
1390b57cec5SDimitry Andric   init(E->getExprLoc());
1400b57cec5SDimitry Andric }
1410b57cec5SDimitry Andric 
1420b57cec5SDimitry Andric ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc)
1430b57cec5SDimitry Andric     : CGF(&CGF) {
1440b57cec5SDimitry Andric   if (!CGF.getDebugInfo()) {
1450b57cec5SDimitry Andric     this->CGF = nullptr;
1460b57cec5SDimitry Andric     return;
1470b57cec5SDimitry Andric   }
1480b57cec5SDimitry Andric   OriginalLocation = CGF.Builder.getCurrentDebugLocation();
1490b57cec5SDimitry Andric   if (Loc)
1500b57cec5SDimitry Andric     CGF.Builder.SetCurrentDebugLocation(std::move(Loc));
1510b57cec5SDimitry Andric }
1520b57cec5SDimitry Andric 
1530b57cec5SDimitry Andric ApplyDebugLocation::~ApplyDebugLocation() {
1540b57cec5SDimitry Andric   // Query CGF so the location isn't overwritten when location updates are
1550b57cec5SDimitry Andric   // temporarily disabled (for C++ default function arguments)
1560b57cec5SDimitry Andric   if (CGF)
1570b57cec5SDimitry Andric     CGF->Builder.SetCurrentDebugLocation(std::move(OriginalLocation));
1580b57cec5SDimitry Andric }
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric ApplyInlineDebugLocation::ApplyInlineDebugLocation(CodeGenFunction &CGF,
1610b57cec5SDimitry Andric                                                    GlobalDecl InlinedFn)
1620b57cec5SDimitry Andric     : CGF(&CGF) {
1630b57cec5SDimitry Andric   if (!CGF.getDebugInfo()) {
1640b57cec5SDimitry Andric     this->CGF = nullptr;
1650b57cec5SDimitry Andric     return;
1660b57cec5SDimitry Andric   }
1670b57cec5SDimitry Andric   auto &DI = *CGF.getDebugInfo();
1680b57cec5SDimitry Andric   SavedLocation = DI.getLocation();
1690b57cec5SDimitry Andric   assert((DI.getInlinedAt() ==
1700b57cec5SDimitry Andric           CGF.Builder.getCurrentDebugLocation()->getInlinedAt()) &&
1710b57cec5SDimitry Andric          "CGDebugInfo and IRBuilder are out of sync");
1720b57cec5SDimitry Andric 
1730b57cec5SDimitry Andric   DI.EmitInlineFunctionStart(CGF.Builder, InlinedFn);
1740b57cec5SDimitry Andric }
1750b57cec5SDimitry Andric 
1760b57cec5SDimitry Andric ApplyInlineDebugLocation::~ApplyInlineDebugLocation() {
1770b57cec5SDimitry Andric   if (!CGF)
1780b57cec5SDimitry Andric     return;
1790b57cec5SDimitry Andric   auto &DI = *CGF->getDebugInfo();
1800b57cec5SDimitry Andric   DI.EmitInlineFunctionEnd(CGF->Builder);
1810b57cec5SDimitry Andric   DI.EmitLocation(CGF->Builder, SavedLocation);
1820b57cec5SDimitry Andric }
1830b57cec5SDimitry Andric 
1840b57cec5SDimitry Andric void CGDebugInfo::setLocation(SourceLocation Loc) {
1850b57cec5SDimitry Andric   // If the new location isn't valid return.
1860b57cec5SDimitry Andric   if (Loc.isInvalid())
1870b57cec5SDimitry Andric     return;
1880b57cec5SDimitry Andric 
1890b57cec5SDimitry Andric   CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc);
1900b57cec5SDimitry Andric 
1910b57cec5SDimitry Andric   // If we've changed files in the middle of a lexical scope go ahead
1920b57cec5SDimitry Andric   // and create a new lexical scope with file node if it's different
1930b57cec5SDimitry Andric   // from the one in the scope.
1940b57cec5SDimitry Andric   if (LexicalBlockStack.empty())
1950b57cec5SDimitry Andric     return;
1960b57cec5SDimitry Andric 
1970b57cec5SDimitry Andric   SourceManager &SM = CGM.getContext().getSourceManager();
1980b57cec5SDimitry Andric   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
1990b57cec5SDimitry Andric   PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc);
2000b57cec5SDimitry Andric   if (PCLoc.isInvalid() || Scope->getFile() == getOrCreateFile(CurLoc))
2010b57cec5SDimitry Andric     return;
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric   if (auto *LBF = dyn_cast<llvm::DILexicalBlockFile>(Scope)) {
2040b57cec5SDimitry Andric     LexicalBlockStack.pop_back();
2050b57cec5SDimitry Andric     LexicalBlockStack.emplace_back(DBuilder.createLexicalBlockFile(
2060b57cec5SDimitry Andric         LBF->getScope(), getOrCreateFile(CurLoc)));
2070b57cec5SDimitry Andric   } else if (isa<llvm::DILexicalBlock>(Scope) ||
2080b57cec5SDimitry Andric              isa<llvm::DISubprogram>(Scope)) {
2090b57cec5SDimitry Andric     LexicalBlockStack.pop_back();
2100b57cec5SDimitry Andric     LexicalBlockStack.emplace_back(
2110b57cec5SDimitry Andric         DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc)));
2120b57cec5SDimitry Andric   }
2130b57cec5SDimitry Andric }
2140b57cec5SDimitry Andric 
2150b57cec5SDimitry Andric llvm::DIScope *CGDebugInfo::getDeclContextDescriptor(const Decl *D) {
2160b57cec5SDimitry Andric   llvm::DIScope *Mod = getParentModuleOrNull(D);
2170b57cec5SDimitry Andric   return getContextDescriptor(cast<Decl>(D->getDeclContext()),
2180b57cec5SDimitry Andric                               Mod ? Mod : TheCU);
2190b57cec5SDimitry Andric }
2200b57cec5SDimitry Andric 
2210b57cec5SDimitry Andric llvm::DIScope *CGDebugInfo::getContextDescriptor(const Decl *Context,
2220b57cec5SDimitry Andric                                                  llvm::DIScope *Default) {
2230b57cec5SDimitry Andric   if (!Context)
2240b57cec5SDimitry Andric     return Default;
2250b57cec5SDimitry Andric 
2260b57cec5SDimitry Andric   auto I = RegionMap.find(Context);
2270b57cec5SDimitry Andric   if (I != RegionMap.end()) {
2280b57cec5SDimitry Andric     llvm::Metadata *V = I->second;
2290b57cec5SDimitry Andric     return dyn_cast_or_null<llvm::DIScope>(V);
2300b57cec5SDimitry Andric   }
2310b57cec5SDimitry Andric 
2320b57cec5SDimitry Andric   // Check namespace.
2330b57cec5SDimitry Andric   if (const auto *NSDecl = dyn_cast<NamespaceDecl>(Context))
2340b57cec5SDimitry Andric     return getOrCreateNamespace(NSDecl);
2350b57cec5SDimitry Andric 
2360b57cec5SDimitry Andric   if (const auto *RDecl = dyn_cast<RecordDecl>(Context))
2370b57cec5SDimitry Andric     if (!RDecl->isDependentType())
2380b57cec5SDimitry Andric       return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl),
2390b57cec5SDimitry Andric                              TheCU->getFile());
2400b57cec5SDimitry Andric   return Default;
2410b57cec5SDimitry Andric }
2420b57cec5SDimitry Andric 
2430b57cec5SDimitry Andric PrintingPolicy CGDebugInfo::getPrintingPolicy() const {
2440b57cec5SDimitry Andric   PrintingPolicy PP = CGM.getContext().getPrintingPolicy();
2450b57cec5SDimitry Andric 
2460b57cec5SDimitry Andric   // If we're emitting codeview, it's important to try to match MSVC's naming so
2470b57cec5SDimitry Andric   // that visualizers written for MSVC will trigger for our class names. In
2480b57cec5SDimitry Andric   // particular, we can't have spaces between arguments of standard templates
2495ffd83dbSDimitry Andric   // like basic_string and vector, but we must have spaces between consecutive
2505ffd83dbSDimitry Andric   // angle brackets that close nested template argument lists.
2515ffd83dbSDimitry Andric   if (CGM.getCodeGenOpts().EmitCodeView) {
2520b57cec5SDimitry Andric     PP.MSVCFormatting = true;
2535ffd83dbSDimitry Andric     PP.SplitTemplateClosers = true;
2545ffd83dbSDimitry Andric   } else {
2555ffd83dbSDimitry Andric     // For DWARF, printing rules are underspecified.
2565ffd83dbSDimitry Andric     // SplitTemplateClosers yields better interop with GCC and GDB (PR46052).
2575ffd83dbSDimitry Andric     PP.SplitTemplateClosers = true;
2585ffd83dbSDimitry Andric   }
2590b57cec5SDimitry Andric 
260349cc55cSDimitry Andric   PP.SuppressInlineNamespace = false;
261349cc55cSDimitry Andric   PP.PrintCanonicalTypes = true;
262349cc55cSDimitry Andric   PP.UsePreferredNames = false;
263349cc55cSDimitry Andric   PP.AlwaysIncludeTypeForTemplateArgument = true;
26481ad6265SDimitry Andric   PP.UseEnumerators = false;
265349cc55cSDimitry Andric 
2660b57cec5SDimitry Andric   // Apply -fdebug-prefix-map.
267480093f4SDimitry Andric   PP.Callbacks = &PrintCB;
2680b57cec5SDimitry Andric   return PP;
2690b57cec5SDimitry Andric }
2700b57cec5SDimitry Andric 
2710b57cec5SDimitry Andric StringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) {
272fe6060f1SDimitry Andric   return internString(GetName(FD));
2730b57cec5SDimitry Andric }
2740b57cec5SDimitry Andric 
2750b57cec5SDimitry Andric StringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) {
2760b57cec5SDimitry Andric   SmallString<256> MethodName;
2770b57cec5SDimitry Andric   llvm::raw_svector_ostream OS(MethodName);
2780b57cec5SDimitry Andric   OS << (OMD->isInstanceMethod() ? '-' : '+') << '[';
2790b57cec5SDimitry Andric   const DeclContext *DC = OMD->getDeclContext();
2800b57cec5SDimitry Andric   if (const auto *OID = dyn_cast<ObjCImplementationDecl>(DC)) {
2810b57cec5SDimitry Andric     OS << OID->getName();
2820b57cec5SDimitry Andric   } else if (const auto *OID = dyn_cast<ObjCInterfaceDecl>(DC)) {
2830b57cec5SDimitry Andric     OS << OID->getName();
2840b57cec5SDimitry Andric   } else if (const auto *OC = dyn_cast<ObjCCategoryDecl>(DC)) {
2850b57cec5SDimitry Andric     if (OC->IsClassExtension()) {
2860b57cec5SDimitry Andric       OS << OC->getClassInterface()->getName();
2870b57cec5SDimitry Andric     } else {
2880b57cec5SDimitry Andric       OS << OC->getIdentifier()->getNameStart() << '('
2890b57cec5SDimitry Andric          << OC->getIdentifier()->getNameStart() << ')';
2900b57cec5SDimitry Andric     }
2910b57cec5SDimitry Andric   } else if (const auto *OCD = dyn_cast<ObjCCategoryImplDecl>(DC)) {
2920b57cec5SDimitry Andric     OS << OCD->getClassInterface()->getName() << '(' << OCD->getName() << ')';
2930b57cec5SDimitry Andric   }
2940b57cec5SDimitry Andric   OS << ' ' << OMD->getSelector().getAsString() << ']';
2950b57cec5SDimitry Andric 
2960b57cec5SDimitry Andric   return internString(OS.str());
2970b57cec5SDimitry Andric }
2980b57cec5SDimitry Andric 
2990b57cec5SDimitry Andric StringRef CGDebugInfo::getSelectorName(Selector S) {
3000b57cec5SDimitry Andric   return internString(S.getAsString());
3010b57cec5SDimitry Andric }
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric StringRef CGDebugInfo::getClassName(const RecordDecl *RD) {
3040b57cec5SDimitry Andric   if (isa<ClassTemplateSpecializationDecl>(RD)) {
3050b57cec5SDimitry Andric     // Copy this name on the side and use its reference.
306fe6060f1SDimitry Andric     return internString(GetName(RD));
3070b57cec5SDimitry Andric   }
3080b57cec5SDimitry Andric 
3090b57cec5SDimitry Andric   // quick optimization to avoid having to intern strings that are already
3100b57cec5SDimitry Andric   // stored reliably elsewhere
3110b57cec5SDimitry Andric   if (const IdentifierInfo *II = RD->getIdentifier())
3120b57cec5SDimitry Andric     return II->getName();
3130b57cec5SDimitry Andric 
314fe6060f1SDimitry Andric   // The CodeView printer in LLVM wants to see the names of unnamed types
315fe6060f1SDimitry Andric   // because they need to have a unique identifier.
316fe6060f1SDimitry Andric   // These names are used to reconstruct the fully qualified type names.
3170b57cec5SDimitry Andric   if (CGM.getCodeGenOpts().EmitCodeView) {
3180b57cec5SDimitry Andric     if (const TypedefNameDecl *D = RD->getTypedefNameForAnonDecl()) {
3190b57cec5SDimitry Andric       assert(RD->getDeclContext() == D->getDeclContext() &&
3200b57cec5SDimitry Andric              "Typedef should not be in another decl context!");
3210b57cec5SDimitry Andric       assert(D->getDeclName().getAsIdentifierInfo() &&
3220b57cec5SDimitry Andric              "Typedef was not named!");
3230b57cec5SDimitry Andric       return D->getDeclName().getAsIdentifierInfo()->getName();
3240b57cec5SDimitry Andric     }
3250b57cec5SDimitry Andric 
3260b57cec5SDimitry Andric     if (CGM.getLangOpts().CPlusPlus) {
3270b57cec5SDimitry Andric       StringRef Name;
3280b57cec5SDimitry Andric 
3290b57cec5SDimitry Andric       ASTContext &Context = CGM.getContext();
3300b57cec5SDimitry Andric       if (const DeclaratorDecl *DD = Context.getDeclaratorForUnnamedTagDecl(RD))
3310b57cec5SDimitry Andric         // Anonymous types without a name for linkage purposes have their
3320b57cec5SDimitry Andric         // declarator mangled in if they have one.
3330b57cec5SDimitry Andric         Name = DD->getName();
3340b57cec5SDimitry Andric       else if (const TypedefNameDecl *TND =
3350b57cec5SDimitry Andric                    Context.getTypedefNameForUnnamedTagDecl(RD))
3360b57cec5SDimitry Andric         // Anonymous types without a name for linkage purposes have their
3370b57cec5SDimitry Andric         // associate typedef mangled in if they have one.
3380b57cec5SDimitry Andric         Name = TND->getName();
3390b57cec5SDimitry Andric 
340fe6060f1SDimitry Andric       // Give lambdas a display name based on their name mangling.
341fe6060f1SDimitry Andric       if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
342fe6060f1SDimitry Andric         if (CXXRD->isLambda())
343fe6060f1SDimitry Andric           return internString(
344fe6060f1SDimitry Andric               CGM.getCXXABI().getMangleContext().getLambdaString(CXXRD));
345fe6060f1SDimitry Andric 
3460b57cec5SDimitry Andric       if (!Name.empty()) {
3470b57cec5SDimitry Andric         SmallString<256> UnnamedType("<unnamed-type-");
3480b57cec5SDimitry Andric         UnnamedType += Name;
3490b57cec5SDimitry Andric         UnnamedType += '>';
3500b57cec5SDimitry Andric         return internString(UnnamedType);
3510b57cec5SDimitry Andric       }
3520b57cec5SDimitry Andric     }
3530b57cec5SDimitry Andric   }
3540b57cec5SDimitry Andric 
3550b57cec5SDimitry Andric   return StringRef();
3560b57cec5SDimitry Andric }
3570b57cec5SDimitry Andric 
358bdd1243dSDimitry Andric std::optional<llvm::DIFile::ChecksumKind>
359bdd1243dSDimitry Andric CGDebugInfo::computeChecksum(FileID FID, SmallString<64> &Checksum) const {
3600b57cec5SDimitry Andric   Checksum.clear();
3610b57cec5SDimitry Andric 
3620b57cec5SDimitry Andric   if (!CGM.getCodeGenOpts().EmitCodeView &&
3630b57cec5SDimitry Andric       CGM.getCodeGenOpts().DwarfVersion < 5)
364bdd1243dSDimitry Andric     return std::nullopt;
3650b57cec5SDimitry Andric 
3660b57cec5SDimitry Andric   SourceManager &SM = CGM.getContext().getSourceManager();
367bdd1243dSDimitry Andric   std::optional<llvm::MemoryBufferRef> MemBuffer = SM.getBufferOrNone(FID);
368e8d8bef9SDimitry Andric   if (!MemBuffer)
369bdd1243dSDimitry Andric     return std::nullopt;
3700b57cec5SDimitry Andric 
371bdd1243dSDimitry Andric   auto Data = llvm::arrayRefFromStringRef(MemBuffer->getBuffer());
372bdd1243dSDimitry Andric   switch (CGM.getCodeGenOpts().getDebugSrcHash()) {
373bdd1243dSDimitry Andric   case clang::CodeGenOptions::DSH_MD5:
374bdd1243dSDimitry Andric     llvm::toHex(llvm::MD5::hash(Data), /*LowerCase=*/true, Checksum);
3750b57cec5SDimitry Andric     return llvm::DIFile::CSK_MD5;
376bdd1243dSDimitry Andric   case clang::CodeGenOptions::DSH_SHA1:
377bdd1243dSDimitry Andric     llvm::toHex(llvm::SHA1::hash(Data), /*LowerCase=*/true, Checksum);
378bdd1243dSDimitry Andric     return llvm::DIFile::CSK_SHA1;
379bdd1243dSDimitry Andric   case clang::CodeGenOptions::DSH_SHA256:
380bdd1243dSDimitry Andric     llvm::toHex(llvm::SHA256::hash(Data), /*LowerCase=*/true, Checksum);
381bdd1243dSDimitry Andric     return llvm::DIFile::CSK_SHA256;
382bdd1243dSDimitry Andric   }
383bdd1243dSDimitry Andric   llvm_unreachable("Unhandled DebugSrcHashKind enum");
3840b57cec5SDimitry Andric }
3850b57cec5SDimitry Andric 
386bdd1243dSDimitry Andric std::optional<StringRef> CGDebugInfo::getSource(const SourceManager &SM,
3870b57cec5SDimitry Andric                                                 FileID FID) {
3880b57cec5SDimitry Andric   if (!CGM.getCodeGenOpts().EmbedSource)
389bdd1243dSDimitry Andric     return std::nullopt;
3900b57cec5SDimitry Andric 
3910b57cec5SDimitry Andric   bool SourceInvalid = false;
3920b57cec5SDimitry Andric   StringRef Source = SM.getBufferData(FID, &SourceInvalid);
3930b57cec5SDimitry Andric 
3940b57cec5SDimitry Andric   if (SourceInvalid)
395bdd1243dSDimitry Andric     return std::nullopt;
3960b57cec5SDimitry Andric 
3970b57cec5SDimitry Andric   return Source;
3980b57cec5SDimitry Andric }
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
4010b57cec5SDimitry Andric   SourceManager &SM = CGM.getContext().getSourceManager();
402e8d8bef9SDimitry Andric   StringRef FileName;
403e8d8bef9SDimitry Andric   FileID FID;
4048a4dda33SDimitry Andric   std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo;
4050b57cec5SDimitry Andric 
406e8d8bef9SDimitry Andric   if (Loc.isInvalid()) {
407e8d8bef9SDimitry Andric     // The DIFile used by the CU is distinct from the main source file. Call
408e8d8bef9SDimitry Andric     // createFile() below for canonicalization if the source file was specified
409e8d8bef9SDimitry Andric     // with an absolute path.
410e8d8bef9SDimitry Andric     FileName = TheCU->getFile()->getFilename();
4118a4dda33SDimitry Andric     CSInfo = TheCU->getFile()->getChecksum();
412e8d8bef9SDimitry Andric   } else {
413e8d8bef9SDimitry Andric     PresumedLoc PLoc = SM.getPresumedLoc(Loc);
414e8d8bef9SDimitry Andric     FileName = PLoc.getFilename();
415e8d8bef9SDimitry Andric 
416e8d8bef9SDimitry Andric     if (FileName.empty()) {
417e8d8bef9SDimitry Andric       FileName = TheCU->getFile()->getFilename();
418e8d8bef9SDimitry Andric     } else {
419e8d8bef9SDimitry Andric       FileName = PLoc.getFilename();
420e8d8bef9SDimitry Andric     }
421e8d8bef9SDimitry Andric     FID = PLoc.getFileID();
422e8d8bef9SDimitry Andric   }
4230b57cec5SDimitry Andric 
4240b57cec5SDimitry Andric   // Cache the results.
4250b57cec5SDimitry Andric   auto It = DIFileCache.find(FileName.data());
4260b57cec5SDimitry Andric   if (It != DIFileCache.end()) {
4270b57cec5SDimitry Andric     // Verify that the information still exists.
4280b57cec5SDimitry Andric     if (llvm::Metadata *V = It->second)
4290b57cec5SDimitry Andric       return cast<llvm::DIFile>(V);
4300b57cec5SDimitry Andric   }
4310b57cec5SDimitry Andric 
4328a4dda33SDimitry Andric   // Put Checksum at a scope where it will persist past the createFile call.
433bdd1243dSDimitry Andric   SmallString<64> Checksum;
4348a4dda33SDimitry Andric   if (!CSInfo) {
435bdd1243dSDimitry Andric     std::optional<llvm::DIFile::ChecksumKind> CSKind =
436bdd1243dSDimitry Andric       computeChecksum(FID, Checksum);
4370b57cec5SDimitry Andric     if (CSKind)
4380b57cec5SDimitry Andric       CSInfo.emplace(*CSKind, Checksum);
4398a4dda33SDimitry Andric   }
4400b57cec5SDimitry Andric   return createFile(FileName, CSInfo, getSource(SM, SM.getFileID(Loc)));
4410b57cec5SDimitry Andric }
4420b57cec5SDimitry Andric 
443bdd1243dSDimitry Andric llvm::DIFile *CGDebugInfo::createFile(
444bdd1243dSDimitry Andric     StringRef FileName,
445bdd1243dSDimitry Andric     std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo,
446bdd1243dSDimitry Andric     std::optional<StringRef> Source) {
4470b57cec5SDimitry Andric   StringRef Dir;
4480b57cec5SDimitry Andric   StringRef File;
4490b57cec5SDimitry Andric   std::string RemappedFile = remapDIPath(FileName);
4500b57cec5SDimitry Andric   std::string CurDir = remapDIPath(getCurrentDirname());
4510b57cec5SDimitry Andric   SmallString<128> DirBuf;
4520b57cec5SDimitry Andric   SmallString<128> FileBuf;
4530b57cec5SDimitry Andric   if (llvm::sys::path::is_absolute(RemappedFile)) {
45481ad6265SDimitry Andric     // Strip the common prefix (if it is more than just "/" or "C:\") from
45581ad6265SDimitry Andric     // current directory and FileName for a more space-efficient encoding.
4560b57cec5SDimitry Andric     auto FileIt = llvm::sys::path::begin(RemappedFile);
4570b57cec5SDimitry Andric     auto FileE = llvm::sys::path::end(RemappedFile);
4580b57cec5SDimitry Andric     auto CurDirIt = llvm::sys::path::begin(CurDir);
4590b57cec5SDimitry Andric     auto CurDirE = llvm::sys::path::end(CurDir);
4600b57cec5SDimitry Andric     for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt)
4610b57cec5SDimitry Andric       llvm::sys::path::append(DirBuf, *CurDirIt);
46281ad6265SDimitry Andric     if (llvm::sys::path::root_path(DirBuf) == DirBuf) {
46381ad6265SDimitry Andric       // Don't strip the common prefix if it is only the root ("/" or "C:\")
4640b57cec5SDimitry Andric       // since that would make LLVM diagnostic locations confusing.
4650b57cec5SDimitry Andric       Dir = {};
4660b57cec5SDimitry Andric       File = RemappedFile;
4670b57cec5SDimitry Andric     } else {
4680b57cec5SDimitry Andric       for (; FileIt != FileE; ++FileIt)
4690b57cec5SDimitry Andric         llvm::sys::path::append(FileBuf, *FileIt);
4700b57cec5SDimitry Andric       Dir = DirBuf;
4710b57cec5SDimitry Andric       File = FileBuf;
4720b57cec5SDimitry Andric     }
4730b57cec5SDimitry Andric   } else {
47481ad6265SDimitry Andric     if (!llvm::sys::path::is_absolute(FileName))
4750b57cec5SDimitry Andric       Dir = CurDir;
4760b57cec5SDimitry Andric     File = RemappedFile;
4770b57cec5SDimitry Andric   }
4780b57cec5SDimitry Andric   llvm::DIFile *F = DBuilder.createFile(File, Dir, CSInfo, Source);
4790b57cec5SDimitry Andric   DIFileCache[FileName.data()].reset(F);
4800b57cec5SDimitry Andric   return F;
4810b57cec5SDimitry Andric }
4820b57cec5SDimitry Andric 
4830b57cec5SDimitry Andric std::string CGDebugInfo::remapDIPath(StringRef Path) const {
4845ffd83dbSDimitry Andric   SmallString<256> P = Path;
48506c3fb27SDimitry Andric   for (auto &[From, To] : llvm::reverse(CGM.getCodeGenOpts().DebugPrefixMap))
48606c3fb27SDimitry Andric     if (llvm::sys::path::replace_path_prefix(P, From, To))
4875ffd83dbSDimitry Andric       break;
4885ffd83dbSDimitry Andric   return P.str().str();
4890b57cec5SDimitry Andric }
4900b57cec5SDimitry Andric 
4910b57cec5SDimitry Andric unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {
492e8d8bef9SDimitry Andric   if (Loc.isInvalid())
4930b57cec5SDimitry Andric     return 0;
4940b57cec5SDimitry Andric   SourceManager &SM = CGM.getContext().getSourceManager();
495e8d8bef9SDimitry Andric   return SM.getPresumedLoc(Loc).getLine();
4960b57cec5SDimitry Andric }
4970b57cec5SDimitry Andric 
4980b57cec5SDimitry Andric unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
4990b57cec5SDimitry Andric   // We may not want column information at all.
5000b57cec5SDimitry Andric   if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo)
5010b57cec5SDimitry Andric     return 0;
5020b57cec5SDimitry Andric 
5030b57cec5SDimitry Andric   // If the location is invalid then use the current column.
5040b57cec5SDimitry Andric   if (Loc.isInvalid() && CurLoc.isInvalid())
5050b57cec5SDimitry Andric     return 0;
5060b57cec5SDimitry Andric   SourceManager &SM = CGM.getContext().getSourceManager();
5070b57cec5SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
5080b57cec5SDimitry Andric   return PLoc.isValid() ? PLoc.getColumn() : 0;
5090b57cec5SDimitry Andric }
5100b57cec5SDimitry Andric 
5110b57cec5SDimitry Andric StringRef CGDebugInfo::getCurrentDirname() {
5120b57cec5SDimitry Andric   if (!CGM.getCodeGenOpts().DebugCompilationDir.empty())
5130b57cec5SDimitry Andric     return CGM.getCodeGenOpts().DebugCompilationDir;
5140b57cec5SDimitry Andric 
5150b57cec5SDimitry Andric   if (!CWDName.empty())
5160b57cec5SDimitry Andric     return CWDName;
517972a253aSDimitry Andric   llvm::ErrorOr<std::string> CWD =
518972a253aSDimitry Andric       CGM.getFileSystem()->getCurrentWorkingDirectory();
519972a253aSDimitry Andric   if (!CWD)
520972a253aSDimitry Andric     return StringRef();
521972a253aSDimitry Andric   return CWDName = internString(*CWD);
5220b57cec5SDimitry Andric }
5230b57cec5SDimitry Andric 
5240b57cec5SDimitry Andric void CGDebugInfo::CreateCompileUnit() {
525bdd1243dSDimitry Andric   SmallString<64> Checksum;
526bdd1243dSDimitry Andric   std::optional<llvm::DIFile::ChecksumKind> CSKind;
527bdd1243dSDimitry Andric   std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo;
5280b57cec5SDimitry Andric 
5290b57cec5SDimitry Andric   // Should we be asking the SourceManager for the main file name, instead of
5300b57cec5SDimitry Andric   // accepting it as an argument? This just causes the main file name to
5310b57cec5SDimitry Andric   // mismatch with source locations and create extra lexical scopes or
5320b57cec5SDimitry Andric   // mismatched debug info (a CU with a DW_AT_file of "-", because that's what
5330b57cec5SDimitry Andric   // the driver passed, but functions/other things have DW_AT_file of "<stdin>"
5340b57cec5SDimitry Andric   // because that's what the SourceManager says)
5350b57cec5SDimitry Andric 
5360b57cec5SDimitry Andric   // Get absolute path name.
5370b57cec5SDimitry Andric   SourceManager &SM = CGM.getContext().getSourceManager();
538bdd1243dSDimitry Andric   auto &CGO = CGM.getCodeGenOpts();
53906c3fb27SDimitry Andric   const LangOptions &LO = CGM.getLangOpts();
540bdd1243dSDimitry Andric   std::string MainFileName = CGO.MainFileName;
5410b57cec5SDimitry Andric   if (MainFileName.empty())
5420b57cec5SDimitry Andric     MainFileName = "<stdin>";
5430b57cec5SDimitry Andric 
5440b57cec5SDimitry Andric   // The main file name provided via the "-main-file-name" option contains just
5450b57cec5SDimitry Andric   // the file name itself with no path information. This file name may have had
5460b57cec5SDimitry Andric   // a relative path, so we look into the actual file entry for the main
5470b57cec5SDimitry Andric   // file to determine the real absolute path for the file.
5480b57cec5SDimitry Andric   std::string MainFileDir;
549bdd1243dSDimitry Andric   if (OptionalFileEntryRef MainFile =
55081ad6265SDimitry Andric           SM.getFileEntryRefForID(SM.getMainFileID())) {
55181ad6265SDimitry Andric     MainFileDir = std::string(MainFile->getDir().getName());
552a7dea167SDimitry Andric     if (!llvm::sys::path::is_absolute(MainFileName)) {
5530b57cec5SDimitry Andric       llvm::SmallString<1024> MainFileDirSS(MainFileDir);
55406c3fb27SDimitry Andric       llvm::sys::path::Style Style =
55506c3fb27SDimitry Andric           LO.UseTargetPathSeparator
55606c3fb27SDimitry Andric               ? (CGM.getTarget().getTriple().isOSWindows()
55706c3fb27SDimitry Andric                      ? llvm::sys::path::Style::windows_backslash
55806c3fb27SDimitry Andric                      : llvm::sys::path::Style::posix)
55906c3fb27SDimitry Andric               : llvm::sys::path::Style::native;
56006c3fb27SDimitry Andric       llvm::sys::path::append(MainFileDirSS, Style, MainFileName);
56106c3fb27SDimitry Andric       MainFileName = std::string(
56206c3fb27SDimitry Andric           llvm::sys::path::remove_leading_dotslash(MainFileDirSS, Style));
5630b57cec5SDimitry Andric     }
5640b57cec5SDimitry Andric     // If the main file name provided is identical to the input file name, and
5650b57cec5SDimitry Andric     // if the input file is a preprocessed source, use the module name for
5660b57cec5SDimitry Andric     // debug info. The module name comes from the name specified in the first
5675f757f3fSDimitry Andric     // linemarker if the input is a preprocessed source. In this case we don't
5685f757f3fSDimitry Andric     // know the content to compute a checksum.
5690b57cec5SDimitry Andric     if (MainFile->getName() == MainFileName &&
5700b57cec5SDimitry Andric         FrontendOptions::getInputKindForExtension(
5710b57cec5SDimitry Andric             MainFile->getName().rsplit('.').second)
5725f757f3fSDimitry Andric             .isPreprocessed()) {
5730b57cec5SDimitry Andric       MainFileName = CGM.getModule().getName().str();
5745f757f3fSDimitry Andric     } else {
5750b57cec5SDimitry Andric       CSKind = computeChecksum(SM.getMainFileID(), Checksum);
5760b57cec5SDimitry Andric     }
5775f757f3fSDimitry Andric   }
5780b57cec5SDimitry Andric 
5790b57cec5SDimitry Andric   llvm::dwarf::SourceLanguage LangTag;
5800b57cec5SDimitry Andric   if (LO.CPlusPlus) {
5810b57cec5SDimitry Andric     if (LO.ObjC)
5820b57cec5SDimitry Andric       LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus;
583bdd1243dSDimitry Andric     else if (CGO.DebugStrictDwarf && CGO.DwarfVersion < 5)
584bdd1243dSDimitry Andric       LangTag = llvm::dwarf::DW_LANG_C_plus_plus;
585bdd1243dSDimitry Andric     else if (LO.CPlusPlus14)
586a7dea167SDimitry Andric       LangTag = llvm::dwarf::DW_LANG_C_plus_plus_14;
587bdd1243dSDimitry Andric     else if (LO.CPlusPlus11)
588a7dea167SDimitry Andric       LangTag = llvm::dwarf::DW_LANG_C_plus_plus_11;
5890b57cec5SDimitry Andric     else
5900b57cec5SDimitry Andric       LangTag = llvm::dwarf::DW_LANG_C_plus_plus;
5910b57cec5SDimitry Andric   } else if (LO.ObjC) {
5920b57cec5SDimitry Andric     LangTag = llvm::dwarf::DW_LANG_ObjC;
593fe6060f1SDimitry Andric   } else if (LO.OpenCL && (!CGM.getCodeGenOpts().DebugStrictDwarf ||
594fe6060f1SDimitry Andric                            CGM.getCodeGenOpts().DwarfVersion >= 5)) {
595fe6060f1SDimitry Andric     LangTag = llvm::dwarf::DW_LANG_OpenCL;
5960b57cec5SDimitry Andric   } else if (LO.RenderScript) {
5970b57cec5SDimitry Andric     LangTag = llvm::dwarf::DW_LANG_GOOGLE_RenderScript;
598bdd1243dSDimitry Andric   } else if (LO.C11 && !(CGO.DebugStrictDwarf && CGO.DwarfVersion < 5)) {
599bdd1243dSDimitry Andric       LangTag = llvm::dwarf::DW_LANG_C11;
6000b57cec5SDimitry Andric   } else if (LO.C99) {
6010b57cec5SDimitry Andric     LangTag = llvm::dwarf::DW_LANG_C99;
6020b57cec5SDimitry Andric   } else {
6030b57cec5SDimitry Andric     LangTag = llvm::dwarf::DW_LANG_C89;
6040b57cec5SDimitry Andric   }
6050b57cec5SDimitry Andric 
6060b57cec5SDimitry Andric   std::string Producer = getClangFullVersion();
6070b57cec5SDimitry Andric 
6080b57cec5SDimitry Andric   // Figure out which version of the ObjC runtime we have.
6090b57cec5SDimitry Andric   unsigned RuntimeVers = 0;
6100b57cec5SDimitry Andric   if (LO.ObjC)
6110b57cec5SDimitry Andric     RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1;
6120b57cec5SDimitry Andric 
6130b57cec5SDimitry Andric   llvm::DICompileUnit::DebugEmissionKind EmissionKind;
6140b57cec5SDimitry Andric   switch (DebugKind) {
61506c3fb27SDimitry Andric   case llvm::codegenoptions::NoDebugInfo:
61606c3fb27SDimitry Andric   case llvm::codegenoptions::LocTrackingOnly:
6170b57cec5SDimitry Andric     EmissionKind = llvm::DICompileUnit::NoDebug;
6180b57cec5SDimitry Andric     break;
61906c3fb27SDimitry Andric   case llvm::codegenoptions::DebugLineTablesOnly:
6200b57cec5SDimitry Andric     EmissionKind = llvm::DICompileUnit::LineTablesOnly;
6210b57cec5SDimitry Andric     break;
62206c3fb27SDimitry Andric   case llvm::codegenoptions::DebugDirectivesOnly:
6230b57cec5SDimitry Andric     EmissionKind = llvm::DICompileUnit::DebugDirectivesOnly;
6240b57cec5SDimitry Andric     break;
62506c3fb27SDimitry Andric   case llvm::codegenoptions::DebugInfoConstructor:
62606c3fb27SDimitry Andric   case llvm::codegenoptions::LimitedDebugInfo:
62706c3fb27SDimitry Andric   case llvm::codegenoptions::FullDebugInfo:
62806c3fb27SDimitry Andric   case llvm::codegenoptions::UnusedTypeInfo:
6290b57cec5SDimitry Andric     EmissionKind = llvm::DICompileUnit::FullDebug;
6300b57cec5SDimitry Andric     break;
6310b57cec5SDimitry Andric   }
6320b57cec5SDimitry Andric 
6330b57cec5SDimitry Andric   uint64_t DwoId = 0;
6340b57cec5SDimitry Andric   auto &CGOpts = CGM.getCodeGenOpts();
6350b57cec5SDimitry Andric   // The DIFile used by the CU is distinct from the main source
6360b57cec5SDimitry Andric   // file. Its directory part specifies what becomes the
6370b57cec5SDimitry Andric   // DW_AT_comp_dir (the compilation directory), even if the source
6380b57cec5SDimitry Andric   // file was specified with an absolute path.
6390b57cec5SDimitry Andric   if (CSKind)
6400b57cec5SDimitry Andric     CSInfo.emplace(*CSKind, Checksum);
6410b57cec5SDimitry Andric   llvm::DIFile *CUFile = DBuilder.createFile(
6420b57cec5SDimitry Andric       remapDIPath(MainFileName), remapDIPath(getCurrentDirname()), CSInfo,
6430b57cec5SDimitry Andric       getSource(SM, SM.getMainFileID()));
6440b57cec5SDimitry Andric 
6455ffd83dbSDimitry Andric   StringRef Sysroot, SDK;
6465ffd83dbSDimitry Andric   if (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB) {
6475ffd83dbSDimitry Andric     Sysroot = CGM.getHeaderSearchOpts().Sysroot;
6485ffd83dbSDimitry Andric     auto B = llvm::sys::path::rbegin(Sysroot);
6495ffd83dbSDimitry Andric     auto E = llvm::sys::path::rend(Sysroot);
6505f757f3fSDimitry Andric     auto It =
6515f757f3fSDimitry Andric         std::find_if(B, E, [](auto SDK) { return SDK.ends_with(".sdk"); });
6525ffd83dbSDimitry Andric     if (It != E)
6535ffd83dbSDimitry Andric       SDK = *It;
6545ffd83dbSDimitry Andric   }
6555ffd83dbSDimitry Andric 
65606c3fb27SDimitry Andric   llvm::DICompileUnit::DebugNameTableKind NameTableKind =
65706c3fb27SDimitry Andric       static_cast<llvm::DICompileUnit::DebugNameTableKind>(
65806c3fb27SDimitry Andric           CGOpts.DebugNameTable);
65906c3fb27SDimitry Andric   if (CGM.getTarget().getTriple().isNVPTX())
66006c3fb27SDimitry Andric     NameTableKind = llvm::DICompileUnit::DebugNameTableKind::None;
66106c3fb27SDimitry Andric   else if (CGM.getTarget().getTriple().getVendor() == llvm::Triple::Apple)
66206c3fb27SDimitry Andric     NameTableKind = llvm::DICompileUnit::DebugNameTableKind::Apple;
66306c3fb27SDimitry Andric 
6640b57cec5SDimitry Andric   // Create new compile unit.
6650b57cec5SDimitry Andric   TheCU = DBuilder.createCompileUnit(
6660b57cec5SDimitry Andric       LangTag, CUFile, CGOpts.EmitVersionIdentMetadata ? Producer : "",
6670b57cec5SDimitry Andric       LO.Optimize || CGOpts.PrepareForLTO || CGOpts.PrepareForThinLTO,
6680b57cec5SDimitry Andric       CGOpts.DwarfDebugFlags, RuntimeVers, CGOpts.SplitDwarfFile, EmissionKind,
6690b57cec5SDimitry Andric       DwoId, CGOpts.SplitDwarfInlining, CGOpts.DebugInfoForProfiling,
67006c3fb27SDimitry Andric       NameTableKind, CGOpts.DebugRangesBaseAddress, remapDIPath(Sysroot), SDK);
6710b57cec5SDimitry Andric }
6720b57cec5SDimitry Andric 
6730b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
6740b57cec5SDimitry Andric   llvm::dwarf::TypeKind Encoding;
6750b57cec5SDimitry Andric   StringRef BTName;
6760b57cec5SDimitry Andric   switch (BT->getKind()) {
6770b57cec5SDimitry Andric #define BUILTIN_TYPE(Id, SingletonId)
6780b57cec5SDimitry Andric #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
6790b57cec5SDimitry Andric #include "clang/AST/BuiltinTypes.def"
6800b57cec5SDimitry Andric   case BuiltinType::Dependent:
6810b57cec5SDimitry Andric     llvm_unreachable("Unexpected builtin type");
6820b57cec5SDimitry Andric   case BuiltinType::NullPtr:
6830b57cec5SDimitry Andric     return DBuilder.createNullPtrType();
6840b57cec5SDimitry Andric   case BuiltinType::Void:
6850b57cec5SDimitry Andric     return nullptr;
6860b57cec5SDimitry Andric   case BuiltinType::ObjCClass:
6870b57cec5SDimitry Andric     if (!ClassTy)
6880b57cec5SDimitry Andric       ClassTy =
6890b57cec5SDimitry Andric           DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
6900b57cec5SDimitry Andric                                      "objc_class", TheCU, TheCU->getFile(), 0);
6910b57cec5SDimitry Andric     return ClassTy;
6920b57cec5SDimitry Andric   case BuiltinType::ObjCId: {
6930b57cec5SDimitry Andric     // typedef struct objc_class *Class;
6940b57cec5SDimitry Andric     // typedef struct objc_object {
6950b57cec5SDimitry Andric     //  Class isa;
6960b57cec5SDimitry Andric     // } *id;
6970b57cec5SDimitry Andric 
6980b57cec5SDimitry Andric     if (ObjTy)
6990b57cec5SDimitry Andric       return ObjTy;
7000b57cec5SDimitry Andric 
7010b57cec5SDimitry Andric     if (!ClassTy)
7020b57cec5SDimitry Andric       ClassTy =
7030b57cec5SDimitry Andric           DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
7040b57cec5SDimitry Andric                                      "objc_class", TheCU, TheCU->getFile(), 0);
7050b57cec5SDimitry Andric 
7060b57cec5SDimitry Andric     unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
7070b57cec5SDimitry Andric 
7080b57cec5SDimitry Andric     auto *ISATy = DBuilder.createPointerType(ClassTy, Size);
7090b57cec5SDimitry Andric 
7100b57cec5SDimitry Andric     ObjTy = DBuilder.createStructType(TheCU, "objc_object", TheCU->getFile(), 0,
7110b57cec5SDimitry Andric                                       0, 0, llvm::DINode::FlagZero, nullptr,
7120b57cec5SDimitry Andric                                       llvm::DINodeArray());
7130b57cec5SDimitry Andric 
7140b57cec5SDimitry Andric     DBuilder.replaceArrays(
7150b57cec5SDimitry Andric         ObjTy, DBuilder.getOrCreateArray(&*DBuilder.createMemberType(
7160b57cec5SDimitry Andric                    ObjTy, "isa", TheCU->getFile(), 0, Size, 0, 0,
7170b57cec5SDimitry Andric                    llvm::DINode::FlagZero, ISATy)));
7180b57cec5SDimitry Andric     return ObjTy;
7190b57cec5SDimitry Andric   }
7200b57cec5SDimitry Andric   case BuiltinType::ObjCSel: {
7210b57cec5SDimitry Andric     if (!SelTy)
7220b57cec5SDimitry Andric       SelTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
7230b57cec5SDimitry Andric                                          "objc_selector", TheCU,
7240b57cec5SDimitry Andric                                          TheCU->getFile(), 0);
7250b57cec5SDimitry Andric     return SelTy;
7260b57cec5SDimitry Andric   }
7270b57cec5SDimitry Andric 
7280b57cec5SDimitry Andric #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)                   \
7290b57cec5SDimitry Andric   case BuiltinType::Id:                                                        \
7300b57cec5SDimitry Andric     return getOrCreateStructPtrType("opencl_" #ImgType "_" #Suffix "_t",       \
7310b57cec5SDimitry Andric                                     SingletonId);
7320b57cec5SDimitry Andric #include "clang/Basic/OpenCLImageTypes.def"
7330b57cec5SDimitry Andric   case BuiltinType::OCLSampler:
7340b57cec5SDimitry Andric     return getOrCreateStructPtrType("opencl_sampler_t", OCLSamplerDITy);
7350b57cec5SDimitry Andric   case BuiltinType::OCLEvent:
7360b57cec5SDimitry Andric     return getOrCreateStructPtrType("opencl_event_t", OCLEventDITy);
7370b57cec5SDimitry Andric   case BuiltinType::OCLClkEvent:
7380b57cec5SDimitry Andric     return getOrCreateStructPtrType("opencl_clk_event_t", OCLClkEventDITy);
7390b57cec5SDimitry Andric   case BuiltinType::OCLQueue:
7400b57cec5SDimitry Andric     return getOrCreateStructPtrType("opencl_queue_t", OCLQueueDITy);
7410b57cec5SDimitry Andric   case BuiltinType::OCLReserveID:
7420b57cec5SDimitry Andric     return getOrCreateStructPtrType("opencl_reserve_id_t", OCLReserveIDDITy);
7430b57cec5SDimitry Andric #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7440b57cec5SDimitry Andric   case BuiltinType::Id: \
7450b57cec5SDimitry Andric     return getOrCreateStructPtrType("opencl_" #ExtType, Id##Ty);
7460b57cec5SDimitry Andric #include "clang/Basic/OpenCLExtensionTypes.def"
74716d6b3b3SDimitry Andric 
74816d6b3b3SDimitry Andric #define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
749a7dea167SDimitry Andric #include "clang/Basic/AArch64SVEACLETypes.def"
750a7dea167SDimitry Andric     {
75116d6b3b3SDimitry Andric       ASTContext::BuiltinVectorTypeInfo Info =
75206c3fb27SDimitry Andric           // For svcount_t, only the lower 2 bytes are relevant.
75306c3fb27SDimitry Andric           BT->getKind() == BuiltinType::SveCount
75406c3fb27SDimitry Andric               ? ASTContext::BuiltinVectorTypeInfo(
75506c3fb27SDimitry Andric                     CGM.getContext().BoolTy, llvm::ElementCount::getFixed(16),
75606c3fb27SDimitry Andric                     1)
75706c3fb27SDimitry Andric               : CGM.getContext().getBuiltinVectorTypeInfo(BT);
75806c3fb27SDimitry Andric 
75906c3fb27SDimitry Andric       // A single vector of bytes may not suffice as the representation of
76006c3fb27SDimitry Andric       // svcount_t tuples because of the gap between the active 16bits of
76106c3fb27SDimitry Andric       // successive tuple members. Currently no such tuples are defined for
76206c3fb27SDimitry Andric       // svcount_t, so assert that NumVectors is 1.
76306c3fb27SDimitry Andric       assert((BT->getKind() != BuiltinType::SveCount || Info.NumVectors == 1) &&
76406c3fb27SDimitry Andric              "Unsupported number of vectors for svcount_t");
76516d6b3b3SDimitry Andric 
76616d6b3b3SDimitry Andric       // Debuggers can't extract 1bit from a vector, so will display a
76706c3fb27SDimitry Andric       // bitpattern for predicates instead.
76806c3fb27SDimitry Andric       unsigned NumElems = Info.EC.getKnownMinValue() * Info.NumVectors;
76916d6b3b3SDimitry Andric       if (Info.ElementType == CGM.getContext().BoolTy) {
77006c3fb27SDimitry Andric         NumElems /= 8;
77116d6b3b3SDimitry Andric         Info.ElementType = CGM.getContext().UnsignedCharTy;
772a7dea167SDimitry Andric       }
7730b57cec5SDimitry Andric 
77406c3fb27SDimitry Andric       llvm::Metadata *LowerBound, *UpperBound;
77506c3fb27SDimitry Andric       LowerBound = llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
77616d6b3b3SDimitry Andric           llvm::Type::getInt64Ty(CGM.getLLVMContext()), 0));
77706c3fb27SDimitry Andric       if (Info.EC.isScalable()) {
77806c3fb27SDimitry Andric         unsigned NumElemsPerVG = NumElems / 2;
77904eeddc0SDimitry Andric         SmallVector<uint64_t, 9> Expr(
78016d6b3b3SDimitry Andric             {llvm::dwarf::DW_OP_constu, NumElemsPerVG, llvm::dwarf::DW_OP_bregx,
78116d6b3b3SDimitry Andric              /* AArch64::VG */ 46, 0, llvm::dwarf::DW_OP_mul,
78216d6b3b3SDimitry Andric              llvm::dwarf::DW_OP_constu, 1, llvm::dwarf::DW_OP_minus});
78306c3fb27SDimitry Andric         UpperBound = DBuilder.createExpression(Expr);
78406c3fb27SDimitry Andric       } else
78506c3fb27SDimitry Andric         UpperBound = llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
78606c3fb27SDimitry Andric             llvm::Type::getInt64Ty(CGM.getLLVMContext()), NumElems - 1));
78716d6b3b3SDimitry Andric 
78816d6b3b3SDimitry Andric       llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange(
78916d6b3b3SDimitry Andric           /*count*/ nullptr, LowerBound, UpperBound, /*stride*/ nullptr);
79016d6b3b3SDimitry Andric       llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
79116d6b3b3SDimitry Andric       llvm::DIType *ElemTy =
79216d6b3b3SDimitry Andric           getOrCreateType(Info.ElementType, TheCU->getFile());
79316d6b3b3SDimitry Andric       auto Align = getTypeAlignIfRequired(BT, CGM.getContext());
79416d6b3b3SDimitry Andric       return DBuilder.createVectorType(/*Size*/ 0, Align, ElemTy,
79516d6b3b3SDimitry Andric                                        SubscriptArray);
79616d6b3b3SDimitry Andric     }
797e8d8bef9SDimitry Andric   // It doesn't make sense to generate debug info for PowerPC MMA vector types.
798e8d8bef9SDimitry Andric   // So we return a safe type here to avoid generating an error.
799e8d8bef9SDimitry Andric #define PPC_VECTOR_TYPE(Name, Id, size) \
800e8d8bef9SDimitry Andric   case BuiltinType::Id:
801e8d8bef9SDimitry Andric #include "clang/Basic/PPCTypes.def"
802e8d8bef9SDimitry Andric     return CreateType(cast<const BuiltinType>(CGM.getContext().IntTy));
803e8d8bef9SDimitry Andric 
804fe6060f1SDimitry Andric #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
805fe6060f1SDimitry Andric #include "clang/Basic/RISCVVTypes.def"
806fe6060f1SDimitry Andric     {
807fe6060f1SDimitry Andric       ASTContext::BuiltinVectorTypeInfo Info =
808fe6060f1SDimitry Andric           CGM.getContext().getBuiltinVectorTypeInfo(BT);
809fe6060f1SDimitry Andric 
810fe6060f1SDimitry Andric       unsigned ElementCount = Info.EC.getKnownMinValue();
811fe6060f1SDimitry Andric       unsigned SEW = CGM.getContext().getTypeSize(Info.ElementType);
812fe6060f1SDimitry Andric 
813fe6060f1SDimitry Andric       bool Fractional = false;
814fe6060f1SDimitry Andric       unsigned LMUL;
815fe6060f1SDimitry Andric       unsigned FixedSize = ElementCount * SEW;
816fe6060f1SDimitry Andric       if (Info.ElementType == CGM.getContext().BoolTy) {
817fe6060f1SDimitry Andric         // Mask type only occupies one vector register.
818fe6060f1SDimitry Andric         LMUL = 1;
819fe6060f1SDimitry Andric       } else if (FixedSize < 64) {
820fe6060f1SDimitry Andric         // In RVV scalable vector types, we encode 64 bits in the fixed part.
821fe6060f1SDimitry Andric         Fractional = true;
822fe6060f1SDimitry Andric         LMUL = 64 / FixedSize;
823fe6060f1SDimitry Andric       } else {
824fe6060f1SDimitry Andric         LMUL = FixedSize / 64;
825fe6060f1SDimitry Andric       }
826fe6060f1SDimitry Andric 
827fe6060f1SDimitry Andric       // Element count = (VLENB / SEW) x LMUL
82804eeddc0SDimitry Andric       SmallVector<uint64_t, 12> Expr(
829fe6060f1SDimitry Andric           // The DW_OP_bregx operation has two operands: a register which is
830fe6060f1SDimitry Andric           // specified by an unsigned LEB128 number, followed by a signed LEB128
831fe6060f1SDimitry Andric           // offset.
832fe6060f1SDimitry Andric           {llvm::dwarf::DW_OP_bregx, // Read the contents of a register.
833fe6060f1SDimitry Andric            4096 + 0xC22,             // RISC-V VLENB CSR register.
834fe6060f1SDimitry Andric            0, // Offset for DW_OP_bregx. It is dummy here.
835fe6060f1SDimitry Andric            llvm::dwarf::DW_OP_constu,
836fe6060f1SDimitry Andric            SEW / 8, // SEW is in bits.
837fe6060f1SDimitry Andric            llvm::dwarf::DW_OP_div, llvm::dwarf::DW_OP_constu, LMUL});
838fe6060f1SDimitry Andric       if (Fractional)
839fe6060f1SDimitry Andric         Expr.push_back(llvm::dwarf::DW_OP_div);
840fe6060f1SDimitry Andric       else
841fe6060f1SDimitry Andric         Expr.push_back(llvm::dwarf::DW_OP_mul);
8420eae32dcSDimitry Andric       // Element max index = count - 1
8430eae32dcSDimitry Andric       Expr.append({llvm::dwarf::DW_OP_constu, 1, llvm::dwarf::DW_OP_minus});
844fe6060f1SDimitry Andric 
845fe6060f1SDimitry Andric       auto *LowerBound =
846fe6060f1SDimitry Andric           llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
847fe6060f1SDimitry Andric               llvm::Type::getInt64Ty(CGM.getLLVMContext()), 0));
848fe6060f1SDimitry Andric       auto *UpperBound = DBuilder.createExpression(Expr);
849fe6060f1SDimitry Andric       llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange(
850fe6060f1SDimitry Andric           /*count*/ nullptr, LowerBound, UpperBound, /*stride*/ nullptr);
851fe6060f1SDimitry Andric       llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
852fe6060f1SDimitry Andric       llvm::DIType *ElemTy =
853fe6060f1SDimitry Andric           getOrCreateType(Info.ElementType, TheCU->getFile());
854fe6060f1SDimitry Andric 
855fe6060f1SDimitry Andric       auto Align = getTypeAlignIfRequired(BT, CGM.getContext());
856fe6060f1SDimitry Andric       return DBuilder.createVectorType(/*Size=*/0, Align, ElemTy,
857fe6060f1SDimitry Andric                                        SubscriptArray);
858fe6060f1SDimitry Andric     }
85906c3fb27SDimitry Andric 
86006c3fb27SDimitry Andric #define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS)                  \
86106c3fb27SDimitry Andric   case BuiltinType::Id: {                                                      \
86206c3fb27SDimitry Andric     if (!SingletonId)                                                          \
86306c3fb27SDimitry Andric       SingletonId =                                                            \
86406c3fb27SDimitry Andric           DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,       \
86506c3fb27SDimitry Andric                                      MangledName, TheCU, TheCU->getFile(), 0); \
86606c3fb27SDimitry Andric     return SingletonId;                                                        \
86706c3fb27SDimitry Andric   }
86806c3fb27SDimitry Andric #include "clang/Basic/WebAssemblyReferenceTypes.def"
869*0fca6ea1SDimitry Andric #define AMDGPU_OPAQUE_PTR_TYPE(Name, MangledName, AS, Width, Align, Id,        \
870*0fca6ea1SDimitry Andric                                SingletonId)                                    \
871*0fca6ea1SDimitry Andric   case BuiltinType::Id: {                                                      \
872*0fca6ea1SDimitry Andric     if (!SingletonId)                                                          \
873*0fca6ea1SDimitry Andric       SingletonId =                                                            \
874*0fca6ea1SDimitry Andric           DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,       \
875*0fca6ea1SDimitry Andric                                      MangledName, TheCU, TheCU->getFile(), 0); \
876*0fca6ea1SDimitry Andric     return SingletonId;                                                        \
877*0fca6ea1SDimitry Andric   }
878*0fca6ea1SDimitry Andric #include "clang/Basic/AMDGPUTypes.def"
8790b57cec5SDimitry Andric   case BuiltinType::UChar:
8800b57cec5SDimitry Andric   case BuiltinType::Char_U:
8810b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_unsigned_char;
8820b57cec5SDimitry Andric     break;
8830b57cec5SDimitry Andric   case BuiltinType::Char_S:
8840b57cec5SDimitry Andric   case BuiltinType::SChar:
8850b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_signed_char;
8860b57cec5SDimitry Andric     break;
8870b57cec5SDimitry Andric   case BuiltinType::Char8:
8880b57cec5SDimitry Andric   case BuiltinType::Char16:
8890b57cec5SDimitry Andric   case BuiltinType::Char32:
8900b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_UTF;
8910b57cec5SDimitry Andric     break;
8920b57cec5SDimitry Andric   case BuiltinType::UShort:
8930b57cec5SDimitry Andric   case BuiltinType::UInt:
8940b57cec5SDimitry Andric   case BuiltinType::UInt128:
8950b57cec5SDimitry Andric   case BuiltinType::ULong:
8960b57cec5SDimitry Andric   case BuiltinType::WChar_U:
8970b57cec5SDimitry Andric   case BuiltinType::ULongLong:
8980b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_unsigned;
8990b57cec5SDimitry Andric     break;
9000b57cec5SDimitry Andric   case BuiltinType::Short:
9010b57cec5SDimitry Andric   case BuiltinType::Int:
9020b57cec5SDimitry Andric   case BuiltinType::Int128:
9030b57cec5SDimitry Andric   case BuiltinType::Long:
9040b57cec5SDimitry Andric   case BuiltinType::WChar_S:
9050b57cec5SDimitry Andric   case BuiltinType::LongLong:
9060b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_signed;
9070b57cec5SDimitry Andric     break;
9080b57cec5SDimitry Andric   case BuiltinType::Bool:
9090b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_boolean;
9100b57cec5SDimitry Andric     break;
9110b57cec5SDimitry Andric   case BuiltinType::Half:
9120b57cec5SDimitry Andric   case BuiltinType::Float:
9130b57cec5SDimitry Andric   case BuiltinType::LongDouble:
9140b57cec5SDimitry Andric   case BuiltinType::Float16:
9155ffd83dbSDimitry Andric   case BuiltinType::BFloat16:
9160b57cec5SDimitry Andric   case BuiltinType::Float128:
9170b57cec5SDimitry Andric   case BuiltinType::Double:
918349cc55cSDimitry Andric   case BuiltinType::Ibm128:
919349cc55cSDimitry Andric     // FIXME: For targets where long double, __ibm128 and __float128 have the
920349cc55cSDimitry Andric     // same size, they are currently indistinguishable in the debugger without
921349cc55cSDimitry Andric     // some special treatment. However, there is currently no consensus on
922349cc55cSDimitry Andric     // encoding and this should be updated once a DWARF encoding exists for
923349cc55cSDimitry Andric     // distinct floating point types of the same size.
9240b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_float;
9250b57cec5SDimitry Andric     break;
9260b57cec5SDimitry Andric   case BuiltinType::ShortAccum:
9270b57cec5SDimitry Andric   case BuiltinType::Accum:
9280b57cec5SDimitry Andric   case BuiltinType::LongAccum:
9290b57cec5SDimitry Andric   case BuiltinType::ShortFract:
9300b57cec5SDimitry Andric   case BuiltinType::Fract:
9310b57cec5SDimitry Andric   case BuiltinType::LongFract:
9320b57cec5SDimitry Andric   case BuiltinType::SatShortFract:
9330b57cec5SDimitry Andric   case BuiltinType::SatFract:
9340b57cec5SDimitry Andric   case BuiltinType::SatLongFract:
9350b57cec5SDimitry Andric   case BuiltinType::SatShortAccum:
9360b57cec5SDimitry Andric   case BuiltinType::SatAccum:
9370b57cec5SDimitry Andric   case BuiltinType::SatLongAccum:
9380b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_signed_fixed;
9390b57cec5SDimitry Andric     break;
9400b57cec5SDimitry Andric   case BuiltinType::UShortAccum:
9410b57cec5SDimitry Andric   case BuiltinType::UAccum:
9420b57cec5SDimitry Andric   case BuiltinType::ULongAccum:
9430b57cec5SDimitry Andric   case BuiltinType::UShortFract:
9440b57cec5SDimitry Andric   case BuiltinType::UFract:
9450b57cec5SDimitry Andric   case BuiltinType::ULongFract:
9460b57cec5SDimitry Andric   case BuiltinType::SatUShortAccum:
9470b57cec5SDimitry Andric   case BuiltinType::SatUAccum:
9480b57cec5SDimitry Andric   case BuiltinType::SatULongAccum:
9490b57cec5SDimitry Andric   case BuiltinType::SatUShortFract:
9500b57cec5SDimitry Andric   case BuiltinType::SatUFract:
9510b57cec5SDimitry Andric   case BuiltinType::SatULongFract:
9520b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_unsigned_fixed;
9530b57cec5SDimitry Andric     break;
9540b57cec5SDimitry Andric   }
9550b57cec5SDimitry Andric 
9560b57cec5SDimitry Andric   BTName = BT->getName(CGM.getLangOpts());
9570b57cec5SDimitry Andric   // Bit size and offset of the type.
9580b57cec5SDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(BT);
9590b57cec5SDimitry Andric   return DBuilder.createBasicType(BTName, Size, Encoding);
9600b57cec5SDimitry Andric }
9610b57cec5SDimitry Andric 
9620eae32dcSDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const BitIntType *Ty) {
9635ffd83dbSDimitry Andric 
9640eae32dcSDimitry Andric   StringRef Name = Ty->isUnsigned() ? "unsigned _BitInt" : "_BitInt";
9655ffd83dbSDimitry Andric   llvm::dwarf::TypeKind Encoding = Ty->isUnsigned()
9665ffd83dbSDimitry Andric                                        ? llvm::dwarf::DW_ATE_unsigned
9675ffd83dbSDimitry Andric                                        : llvm::dwarf::DW_ATE_signed;
9685ffd83dbSDimitry Andric 
9695ffd83dbSDimitry Andric   return DBuilder.createBasicType(Name, CGM.getContext().getTypeSize(Ty),
9705ffd83dbSDimitry Andric                                   Encoding);
9715ffd83dbSDimitry Andric }
9725ffd83dbSDimitry Andric 
9730b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const ComplexType *Ty) {
9740b57cec5SDimitry Andric   // Bit size and offset of the type.
9750b57cec5SDimitry Andric   llvm::dwarf::TypeKind Encoding = llvm::dwarf::DW_ATE_complex_float;
9760b57cec5SDimitry Andric   if (Ty->isComplexIntegerType())
9770b57cec5SDimitry Andric     Encoding = llvm::dwarf::DW_ATE_lo_user;
9780b57cec5SDimitry Andric 
9790b57cec5SDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(Ty);
9800b57cec5SDimitry Andric   return DBuilder.createBasicType("complex", Size, Encoding);
9810b57cec5SDimitry Andric }
9820b57cec5SDimitry Andric 
983349cc55cSDimitry Andric static void stripUnusedQualifiers(Qualifiers &Q) {
984349cc55cSDimitry Andric   // Ignore these qualifiers for now.
985349cc55cSDimitry Andric   Q.removeObjCGCAttr();
986349cc55cSDimitry Andric   Q.removeAddressSpace();
987349cc55cSDimitry Andric   Q.removeObjCLifetime();
988349cc55cSDimitry Andric   Q.removeUnaligned();
989349cc55cSDimitry Andric }
990349cc55cSDimitry Andric 
991349cc55cSDimitry Andric static llvm::dwarf::Tag getNextQualifier(Qualifiers &Q) {
992349cc55cSDimitry Andric   if (Q.hasConst()) {
993349cc55cSDimitry Andric     Q.removeConst();
994349cc55cSDimitry Andric     return llvm::dwarf::DW_TAG_const_type;
995349cc55cSDimitry Andric   }
996349cc55cSDimitry Andric   if (Q.hasVolatile()) {
997349cc55cSDimitry Andric     Q.removeVolatile();
998349cc55cSDimitry Andric     return llvm::dwarf::DW_TAG_volatile_type;
999349cc55cSDimitry Andric   }
1000349cc55cSDimitry Andric   if (Q.hasRestrict()) {
1001349cc55cSDimitry Andric     Q.removeRestrict();
1002349cc55cSDimitry Andric     return llvm::dwarf::DW_TAG_restrict_type;
1003349cc55cSDimitry Andric   }
1004349cc55cSDimitry Andric   return (llvm::dwarf::Tag)0;
1005349cc55cSDimitry Andric }
1006349cc55cSDimitry Andric 
100781ad6265SDimitry Andric llvm::DIType *CGDebugInfo::CreateQualifiedType(QualType Ty,
100881ad6265SDimitry Andric                                                llvm::DIFile *Unit) {
10090b57cec5SDimitry Andric   QualifierCollector Qc;
10100b57cec5SDimitry Andric   const Type *T = Qc.strip(Ty);
10110b57cec5SDimitry Andric 
1012349cc55cSDimitry Andric   stripUnusedQualifiers(Qc);
10130b57cec5SDimitry Andric 
10140b57cec5SDimitry Andric   // We will create one Derived type for one qualifier and recurse to handle any
10150b57cec5SDimitry Andric   // additional ones.
1016349cc55cSDimitry Andric   llvm::dwarf::Tag Tag = getNextQualifier(Qc);
1017349cc55cSDimitry Andric   if (!Tag) {
10180b57cec5SDimitry Andric     assert(Qc.empty() && "Unknown type qualifier for debug info");
10190b57cec5SDimitry Andric     return getOrCreateType(QualType(T, 0), Unit);
10200b57cec5SDimitry Andric   }
10210b57cec5SDimitry Andric 
102281ad6265SDimitry Andric   auto *FromTy = getOrCreateType(Qc.apply(CGM.getContext(), T), Unit);
1023349cc55cSDimitry Andric 
1024349cc55cSDimitry Andric   // No need to fill in the Name, Line, Size, Alignment, Offset in case of
1025349cc55cSDimitry Andric   // CVR derived types.
1026349cc55cSDimitry Andric   return DBuilder.createQualifiedType(Tag, FromTy);
1027349cc55cSDimitry Andric }
1028349cc55cSDimitry Andric 
1029349cc55cSDimitry Andric llvm::DIType *CGDebugInfo::CreateQualifiedType(const FunctionProtoType *F,
1030349cc55cSDimitry Andric                                                llvm::DIFile *Unit) {
1031349cc55cSDimitry Andric   FunctionProtoType::ExtProtoInfo EPI = F->getExtProtoInfo();
1032349cc55cSDimitry Andric   Qualifiers &Q = EPI.TypeQuals;
1033349cc55cSDimitry Andric   stripUnusedQualifiers(Q);
1034349cc55cSDimitry Andric 
1035349cc55cSDimitry Andric   // We will create one Derived type for one qualifier and recurse to handle any
1036349cc55cSDimitry Andric   // additional ones.
1037349cc55cSDimitry Andric   llvm::dwarf::Tag Tag = getNextQualifier(Q);
1038349cc55cSDimitry Andric   if (!Tag) {
1039349cc55cSDimitry Andric     assert(Q.empty() && "Unknown type qualifier for debug info");
1040349cc55cSDimitry Andric     return nullptr;
1041349cc55cSDimitry Andric   }
1042349cc55cSDimitry Andric 
1043349cc55cSDimitry Andric   auto *FromTy =
1044349cc55cSDimitry Andric       getOrCreateType(CGM.getContext().getFunctionType(F->getReturnType(),
1045349cc55cSDimitry Andric                                                        F->getParamTypes(), EPI),
1046349cc55cSDimitry Andric                       Unit);
10470b57cec5SDimitry Andric 
10480b57cec5SDimitry Andric   // No need to fill in the Name, Line, Size, Alignment, Offset in case of
10490b57cec5SDimitry Andric   // CVR derived types.
10500b57cec5SDimitry Andric   return DBuilder.createQualifiedType(Tag, FromTy);
10510b57cec5SDimitry Andric }
10520b57cec5SDimitry Andric 
10530b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty,
10540b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
10550b57cec5SDimitry Andric 
10560b57cec5SDimitry Andric   // The frontend treats 'id' as a typedef to an ObjCObjectType,
10570b57cec5SDimitry Andric   // whereas 'id<protocol>' is treated as an ObjCPointerType. For the
10580b57cec5SDimitry Andric   // debug info, we want to emit 'id' in both cases.
10590b57cec5SDimitry Andric   if (Ty->isObjCQualifiedIdType())
10600b57cec5SDimitry Andric     return getOrCreateType(CGM.getContext().getObjCIdType(), Unit);
10610b57cec5SDimitry Andric 
10620b57cec5SDimitry Andric   return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
10630b57cec5SDimitry Andric                                Ty->getPointeeType(), Unit);
10640b57cec5SDimitry Andric }
10650b57cec5SDimitry Andric 
106681ad6265SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const PointerType *Ty,
106781ad6265SDimitry Andric                                       llvm::DIFile *Unit) {
10680b57cec5SDimitry Andric   return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
106981ad6265SDimitry Andric                                Ty->getPointeeType(), Unit);
10700b57cec5SDimitry Andric }
10710b57cec5SDimitry Andric 
10720b57cec5SDimitry Andric /// \return whether a C++ mangling exists for the type defined by TD.
10730b57cec5SDimitry Andric static bool hasCXXMangling(const TagDecl *TD, llvm::DICompileUnit *TheCU) {
10740b57cec5SDimitry Andric   switch (TheCU->getSourceLanguage()) {
10750b57cec5SDimitry Andric   case llvm::dwarf::DW_LANG_C_plus_plus:
1076a7dea167SDimitry Andric   case llvm::dwarf::DW_LANG_C_plus_plus_11:
1077a7dea167SDimitry Andric   case llvm::dwarf::DW_LANG_C_plus_plus_14:
10780b57cec5SDimitry Andric     return true;
10790b57cec5SDimitry Andric   case llvm::dwarf::DW_LANG_ObjC_plus_plus:
10800b57cec5SDimitry Andric     return isa<CXXRecordDecl>(TD) || isa<EnumDecl>(TD);
10810b57cec5SDimitry Andric   default:
10820b57cec5SDimitry Andric     return false;
10830b57cec5SDimitry Andric   }
10840b57cec5SDimitry Andric }
10850b57cec5SDimitry Andric 
10860b57cec5SDimitry Andric // Determines if the debug info for this tag declaration needs a type
10870b57cec5SDimitry Andric // identifier. The purpose of the unique identifier is to deduplicate type
10880b57cec5SDimitry Andric // information for identical types across TUs. Because of the C++ one definition
10890b57cec5SDimitry Andric // rule (ODR), it is valid to assume that the type is defined the same way in
10900b57cec5SDimitry Andric // every TU and its debug info is equivalent.
10910b57cec5SDimitry Andric //
10920b57cec5SDimitry Andric // C does not have the ODR, and it is common for codebases to contain multiple
10930b57cec5SDimitry Andric // different definitions of a struct with the same name in different TUs.
10940b57cec5SDimitry Andric // Therefore, if the type doesn't have a C++ mangling, don't give it an
10950b57cec5SDimitry Andric // identifer. Type information in C is smaller and simpler than C++ type
10960b57cec5SDimitry Andric // information, so the increase in debug info size is negligible.
10970b57cec5SDimitry Andric //
10980b57cec5SDimitry Andric // If the type is not externally visible, it should be unique to the current TU,
10990b57cec5SDimitry Andric // and should not need an identifier to participate in type deduplication.
11000b57cec5SDimitry Andric // However, when emitting CodeView, the format internally uses these
11010b57cec5SDimitry Andric // unique type name identifers for references between debug info. For example,
11020b57cec5SDimitry Andric // the method of a class in an anonymous namespace uses the identifer to refer
11030b57cec5SDimitry Andric // to its parent class. The Microsoft C++ ABI attempts to provide unique names
11040b57cec5SDimitry Andric // for such types, so when emitting CodeView, always use identifiers for C++
11050b57cec5SDimitry Andric // types. This may create problems when attempting to emit CodeView when the MS
11060b57cec5SDimitry Andric // C++ ABI is not in use.
11070b57cec5SDimitry Andric static bool needsTypeIdentifier(const TagDecl *TD, CodeGenModule &CGM,
11080b57cec5SDimitry Andric                                 llvm::DICompileUnit *TheCU) {
11090b57cec5SDimitry Andric   // We only add a type identifier for types with C++ name mangling.
11100b57cec5SDimitry Andric   if (!hasCXXMangling(TD, TheCU))
11110b57cec5SDimitry Andric     return false;
11120b57cec5SDimitry Andric 
11130b57cec5SDimitry Andric   // Externally visible types with C++ mangling need a type identifier.
11140b57cec5SDimitry Andric   if (TD->isExternallyVisible())
11150b57cec5SDimitry Andric     return true;
11160b57cec5SDimitry Andric 
11170b57cec5SDimitry Andric   // CodeView types with C++ mangling need a type identifier.
11180b57cec5SDimitry Andric   if (CGM.getCodeGenOpts().EmitCodeView)
11190b57cec5SDimitry Andric     return true;
11200b57cec5SDimitry Andric 
11210b57cec5SDimitry Andric   return false;
11220b57cec5SDimitry Andric }
11230b57cec5SDimitry Andric 
11240b57cec5SDimitry Andric // Returns a unique type identifier string if one exists, or an empty string.
11250b57cec5SDimitry Andric static SmallString<256> getTypeIdentifier(const TagType *Ty, CodeGenModule &CGM,
11260b57cec5SDimitry Andric                                           llvm::DICompileUnit *TheCU) {
11270b57cec5SDimitry Andric   SmallString<256> Identifier;
11280b57cec5SDimitry Andric   const TagDecl *TD = Ty->getDecl();
11290b57cec5SDimitry Andric 
11300b57cec5SDimitry Andric   if (!needsTypeIdentifier(TD, CGM, TheCU))
11310b57cec5SDimitry Andric     return Identifier;
11320b57cec5SDimitry Andric   if (const auto *RD = dyn_cast<CXXRecordDecl>(TD))
11330b57cec5SDimitry Andric     if (RD->getDefinition())
11340b57cec5SDimitry Andric       if (RD->isDynamicClass() &&
11350b57cec5SDimitry Andric           CGM.getVTableLinkage(RD) == llvm::GlobalValue::ExternalLinkage)
11360b57cec5SDimitry Andric         return Identifier;
11370b57cec5SDimitry Andric 
11380b57cec5SDimitry Andric   // TODO: This is using the RTTI name. Is there a better way to get
11390b57cec5SDimitry Andric   // a unique string for a type?
11400b57cec5SDimitry Andric   llvm::raw_svector_ostream Out(Identifier);
11410b57cec5SDimitry Andric   CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(QualType(Ty, 0), Out);
11420b57cec5SDimitry Andric   return Identifier;
11430b57cec5SDimitry Andric }
11440b57cec5SDimitry Andric 
11450b57cec5SDimitry Andric /// \return the appropriate DWARF tag for a composite type.
11460b57cec5SDimitry Andric static llvm::dwarf::Tag getTagForRecord(const RecordDecl *RD) {
11470b57cec5SDimitry Andric   llvm::dwarf::Tag Tag;
11480b57cec5SDimitry Andric   if (RD->isStruct() || RD->isInterface())
11490b57cec5SDimitry Andric     Tag = llvm::dwarf::DW_TAG_structure_type;
11500b57cec5SDimitry Andric   else if (RD->isUnion())
11510b57cec5SDimitry Andric     Tag = llvm::dwarf::DW_TAG_union_type;
11520b57cec5SDimitry Andric   else {
11530b57cec5SDimitry Andric     // FIXME: This could be a struct type giving a default visibility different
11540b57cec5SDimitry Andric     // than C++ class type, but needs llvm metadata changes first.
11550b57cec5SDimitry Andric     assert(RD->isClass());
11560b57cec5SDimitry Andric     Tag = llvm::dwarf::DW_TAG_class_type;
11570b57cec5SDimitry Andric   }
11580b57cec5SDimitry Andric   return Tag;
11590b57cec5SDimitry Andric }
11600b57cec5SDimitry Andric 
11610b57cec5SDimitry Andric llvm::DICompositeType *
11620b57cec5SDimitry Andric CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,
11630b57cec5SDimitry Andric                                       llvm::DIScope *Ctx) {
11640b57cec5SDimitry Andric   const RecordDecl *RD = Ty->getDecl();
11650b57cec5SDimitry Andric   if (llvm::DIType *T = getTypeOrNull(CGM.getContext().getRecordType(RD)))
11660b57cec5SDimitry Andric     return cast<llvm::DICompositeType>(T);
11670b57cec5SDimitry Andric   llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
1168e8d8bef9SDimitry Andric   const unsigned Line =
1169e8d8bef9SDimitry Andric       getLineNumber(RD->getLocation().isValid() ? RD->getLocation() : CurLoc);
11700b57cec5SDimitry Andric   StringRef RDName = getClassName(RD);
11710b57cec5SDimitry Andric 
11720b57cec5SDimitry Andric   uint64_t Size = 0;
11730b57cec5SDimitry Andric   uint32_t Align = 0;
11740b57cec5SDimitry Andric 
1175e8d8bef9SDimitry Andric   const RecordDecl *D = RD->getDefinition();
1176e8d8bef9SDimitry Andric   if (D && D->isCompleteDefinition())
1177e8d8bef9SDimitry Andric     Size = CGM.getContext().getTypeSize(Ty);
1178e8d8bef9SDimitry Andric 
11795ffd83dbSDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagFwdDecl;
11805ffd83dbSDimitry Andric 
11815ffd83dbSDimitry Andric   // Add flag to nontrivial forward declarations. To be consistent with MSVC,
11825ffd83dbSDimitry Andric   // add the flag if a record has no definition because we don't know whether
11835ffd83dbSDimitry Andric   // it will be trivial or not.
11845ffd83dbSDimitry Andric   if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
11855ffd83dbSDimitry Andric     if (!CXXRD->hasDefinition() ||
11865ffd83dbSDimitry Andric         (CXXRD->hasDefinition() && !CXXRD->isTrivial()))
11875ffd83dbSDimitry Andric       Flags |= llvm::DINode::FlagNonTrivial;
11885ffd83dbSDimitry Andric 
11890b57cec5SDimitry Andric   // Create the type.
1190e8d8bef9SDimitry Andric   SmallString<256> Identifier;
1191e8d8bef9SDimitry Andric   // Don't include a linkage name in line tables only.
1192e8d8bef9SDimitry Andric   if (CGM.getCodeGenOpts().hasReducedDebugInfo())
1193e8d8bef9SDimitry Andric     Identifier = getTypeIdentifier(Ty, CGM, TheCU);
11940b57cec5SDimitry Andric   llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType(
11955ffd83dbSDimitry Andric       getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align, Flags,
11965ffd83dbSDimitry Andric       Identifier);
11970b57cec5SDimitry Andric   if (CGM.getCodeGenOpts().DebugFwdTemplateParams)
11980b57cec5SDimitry Andric     if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
11990b57cec5SDimitry Andric       DBuilder.replaceArrays(RetTy, llvm::DINodeArray(),
12000b57cec5SDimitry Andric                              CollectCXXTemplateParams(TSpecial, DefUnit));
12010b57cec5SDimitry Andric   ReplaceMap.emplace_back(
12020b57cec5SDimitry Andric       std::piecewise_construct, std::make_tuple(Ty),
12030b57cec5SDimitry Andric       std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
12040b57cec5SDimitry Andric   return RetTy;
12050b57cec5SDimitry Andric }
12060b57cec5SDimitry Andric 
12070b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag,
12080b57cec5SDimitry Andric                                                  const Type *Ty,
12090b57cec5SDimitry Andric                                                  QualType PointeeTy,
121081ad6265SDimitry Andric                                                  llvm::DIFile *Unit) {
12110b57cec5SDimitry Andric   // Bit size, align and offset of the type.
1212bdd1243dSDimitry Andric   // Size is always the size of a pointer.
1213bdd1243dSDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(Ty);
12140b57cec5SDimitry Andric   auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
1215bdd1243dSDimitry Andric   std::optional<unsigned> DWARFAddressSpace =
1216bdd1243dSDimitry Andric       CGM.getTarget().getDWARFAddressSpace(
1217bdd1243dSDimitry Andric           CGM.getTypes().getTargetAddressSpace(PointeeTy));
12180b57cec5SDimitry Andric 
1219349cc55cSDimitry Andric   SmallVector<llvm::Metadata *, 4> Annots;
122081ad6265SDimitry Andric   auto *BTFAttrTy = dyn_cast<BTFTagAttributedType>(PointeeTy);
122181ad6265SDimitry Andric   while (BTFAttrTy) {
122281ad6265SDimitry Andric     StringRef Tag = BTFAttrTy->getAttr()->getBTFTypeTag();
122381ad6265SDimitry Andric     if (!Tag.empty()) {
1224349cc55cSDimitry Andric       llvm::Metadata *Ops[2] = {
122581ad6265SDimitry Andric           llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_type_tag")),
122681ad6265SDimitry Andric           llvm::MDString::get(CGM.getLLVMContext(), Tag)};
1227349cc55cSDimitry Andric       Annots.insert(Annots.begin(),
1228349cc55cSDimitry Andric                     llvm::MDNode::get(CGM.getLLVMContext(), Ops));
1229349cc55cSDimitry Andric     }
123081ad6265SDimitry Andric     BTFAttrTy = dyn_cast<BTFTagAttributedType>(BTFAttrTy->getWrappedType());
1231349cc55cSDimitry Andric   }
1232349cc55cSDimitry Andric 
123381ad6265SDimitry Andric   llvm::DINodeArray Annotations = nullptr;
1234349cc55cSDimitry Andric   if (Annots.size() > 0)
1235349cc55cSDimitry Andric     Annotations = DBuilder.getOrCreateArray(Annots);
1236349cc55cSDimitry Andric 
12370b57cec5SDimitry Andric   if (Tag == llvm::dwarf::DW_TAG_reference_type ||
12380b57cec5SDimitry Andric       Tag == llvm::dwarf::DW_TAG_rvalue_reference_type)
12390b57cec5SDimitry Andric     return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit),
12400b57cec5SDimitry Andric                                         Size, Align, DWARFAddressSpace);
12410b57cec5SDimitry Andric   else
124281ad6265SDimitry Andric     return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size,
124381ad6265SDimitry Andric                                       Align, DWARFAddressSpace, StringRef(),
124481ad6265SDimitry Andric                                       Annotations);
12450b57cec5SDimitry Andric }
12460b57cec5SDimitry Andric 
12470b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::getOrCreateStructPtrType(StringRef Name,
12480b57cec5SDimitry Andric                                                     llvm::DIType *&Cache) {
12490b57cec5SDimitry Andric   if (Cache)
12500b57cec5SDimitry Andric     return Cache;
12510b57cec5SDimitry Andric   Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name,
12520b57cec5SDimitry Andric                                      TheCU, TheCU->getFile(), 0);
12530b57cec5SDimitry Andric   unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
12540b57cec5SDimitry Andric   Cache = DBuilder.createPointerType(Cache, Size);
12550b57cec5SDimitry Andric   return Cache;
12560b57cec5SDimitry Andric }
12570b57cec5SDimitry Andric 
12580b57cec5SDimitry Andric uint64_t CGDebugInfo::collectDefaultElementTypesForBlockPointer(
12590b57cec5SDimitry Andric     const BlockPointerType *Ty, llvm::DIFile *Unit, llvm::DIDerivedType *DescTy,
12600b57cec5SDimitry Andric     unsigned LineNo, SmallVectorImpl<llvm::Metadata *> &EltTys) {
12610b57cec5SDimitry Andric   QualType FType;
12620b57cec5SDimitry Andric 
12630b57cec5SDimitry Andric   // Advanced by calls to CreateMemberType in increments of FType, then
12640b57cec5SDimitry Andric   // returned as the overall size of the default elements.
12650b57cec5SDimitry Andric   uint64_t FieldOffset = 0;
12660b57cec5SDimitry Andric 
12670b57cec5SDimitry Andric   // Blocks in OpenCL have unique constraints which make the standard fields
12680b57cec5SDimitry Andric   // redundant while requiring size and align fields for enqueue_kernel. See
12690b57cec5SDimitry Andric   // initializeForBlockHeader in CGBlocks.cpp
12700b57cec5SDimitry Andric   if (CGM.getLangOpts().OpenCL) {
12710b57cec5SDimitry Andric     FType = CGM.getContext().IntTy;
12720b57cec5SDimitry Andric     EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset));
12730b57cec5SDimitry Andric     EltTys.push_back(CreateMemberType(Unit, FType, "__align", &FieldOffset));
12740b57cec5SDimitry Andric   } else {
12750b57cec5SDimitry Andric     FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
12760b57cec5SDimitry Andric     EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset));
12770b57cec5SDimitry Andric     FType = CGM.getContext().IntTy;
12780b57cec5SDimitry Andric     EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset));
12790b57cec5SDimitry Andric     EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset));
12800b57cec5SDimitry Andric     FType = CGM.getContext().getPointerType(Ty->getPointeeType());
12810b57cec5SDimitry Andric     EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset));
12820b57cec5SDimitry Andric     FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
12830b57cec5SDimitry Andric     uint64_t FieldSize = CGM.getContext().getTypeSize(Ty);
12840b57cec5SDimitry Andric     uint32_t FieldAlign = CGM.getContext().getTypeAlign(Ty);
12850b57cec5SDimitry Andric     EltTys.push_back(DBuilder.createMemberType(
12860b57cec5SDimitry Andric         Unit, "__descriptor", nullptr, LineNo, FieldSize, FieldAlign,
12870b57cec5SDimitry Andric         FieldOffset, llvm::DINode::FlagZero, DescTy));
12880b57cec5SDimitry Andric     FieldOffset += FieldSize;
12890b57cec5SDimitry Andric   }
12900b57cec5SDimitry Andric 
12910b57cec5SDimitry Andric   return FieldOffset;
12920b57cec5SDimitry Andric }
12930b57cec5SDimitry Andric 
12940b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,
12950b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
12960b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 8> EltTys;
12970b57cec5SDimitry Andric   QualType FType;
12980b57cec5SDimitry Andric   uint64_t FieldOffset;
12990b57cec5SDimitry Andric   llvm::DINodeArray Elements;
13000b57cec5SDimitry Andric 
13010b57cec5SDimitry Andric   FieldOffset = 0;
13020b57cec5SDimitry Andric   FType = CGM.getContext().UnsignedLongTy;
13030b57cec5SDimitry Andric   EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset));
13040b57cec5SDimitry Andric   EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset));
13050b57cec5SDimitry Andric 
13060b57cec5SDimitry Andric   Elements = DBuilder.getOrCreateArray(EltTys);
13070b57cec5SDimitry Andric   EltTys.clear();
13080b57cec5SDimitry Andric 
13090b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagAppleBlock;
13100b57cec5SDimitry Andric 
13110b57cec5SDimitry Andric   auto *EltTy =
13120b57cec5SDimitry Andric       DBuilder.createStructType(Unit, "__block_descriptor", nullptr, 0,
13130b57cec5SDimitry Andric                                 FieldOffset, 0, Flags, nullptr, Elements);
13140b57cec5SDimitry Andric 
13150b57cec5SDimitry Andric   // Bit size, align and offset of the type.
13160b57cec5SDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(Ty);
13170b57cec5SDimitry Andric 
13180b57cec5SDimitry Andric   auto *DescTy = DBuilder.createPointerType(EltTy, Size);
13190b57cec5SDimitry Andric 
13200b57cec5SDimitry Andric   FieldOffset = collectDefaultElementTypesForBlockPointer(Ty, Unit, DescTy,
13210b57cec5SDimitry Andric                                                           0, EltTys);
13220b57cec5SDimitry Andric 
13230b57cec5SDimitry Andric   Elements = DBuilder.getOrCreateArray(EltTys);
13240b57cec5SDimitry Andric 
13250b57cec5SDimitry Andric   // The __block_literal_generic structs are marked with a special
13260b57cec5SDimitry Andric   // DW_AT_APPLE_BLOCK attribute and are an implementation detail only
13270b57cec5SDimitry Andric   // the debugger needs to know about. To allow type uniquing, emit
13280b57cec5SDimitry Andric   // them without a name or a location.
13290b57cec5SDimitry Andric   EltTy = DBuilder.createStructType(Unit, "", nullptr, 0, FieldOffset, 0,
13300b57cec5SDimitry Andric                                     Flags, nullptr, Elements);
13310b57cec5SDimitry Andric 
13320b57cec5SDimitry Andric   return DBuilder.createPointerType(EltTy, Size);
13330b57cec5SDimitry Andric }
13340b57cec5SDimitry Andric 
1335*0fca6ea1SDimitry Andric static llvm::SmallVector<TemplateArgument>
1336*0fca6ea1SDimitry Andric GetTemplateArgs(const TemplateDecl *TD, const TemplateSpecializationType *Ty) {
1337*0fca6ea1SDimitry Andric   assert(Ty->isTypeAlias());
1338*0fca6ea1SDimitry Andric   // TemplateSpecializationType doesn't know if its template args are
1339*0fca6ea1SDimitry Andric   // being substituted into a parameter pack. We can find out if that's
1340*0fca6ea1SDimitry Andric   // the case now by inspecting the TypeAliasTemplateDecl template
1341*0fca6ea1SDimitry Andric   // parameters. Insert Ty's template args into SpecArgs, bundling args
1342*0fca6ea1SDimitry Andric   // passed to a parameter pack into a TemplateArgument::Pack. It also
1343*0fca6ea1SDimitry Andric   // doesn't know the value of any defaulted args, so collect those now
1344*0fca6ea1SDimitry Andric   // too.
1345*0fca6ea1SDimitry Andric   SmallVector<TemplateArgument> SpecArgs;
1346*0fca6ea1SDimitry Andric   ArrayRef SubstArgs = Ty->template_arguments();
1347*0fca6ea1SDimitry Andric   for (const NamedDecl *Param : TD->getTemplateParameters()->asArray()) {
1348*0fca6ea1SDimitry Andric     // If Param is a parameter pack, pack the remaining arguments.
1349*0fca6ea1SDimitry Andric     if (Param->isParameterPack()) {
1350*0fca6ea1SDimitry Andric       SpecArgs.push_back(TemplateArgument(SubstArgs));
1351*0fca6ea1SDimitry Andric       break;
1352*0fca6ea1SDimitry Andric     }
1353*0fca6ea1SDimitry Andric 
1354*0fca6ea1SDimitry Andric     // Skip defaulted args.
1355*0fca6ea1SDimitry Andric     // FIXME: Ideally, we wouldn't do this. We can read the default values
1356*0fca6ea1SDimitry Andric     // for each parameter. However, defaulted arguments which are dependent
1357*0fca6ea1SDimitry Andric     // values or dependent types can't (easily?) be resolved here.
1358*0fca6ea1SDimitry Andric     if (SubstArgs.empty()) {
1359*0fca6ea1SDimitry Andric       // If SubstArgs is now empty (we're taking from it each iteration) and
1360*0fca6ea1SDimitry Andric       // this template parameter isn't a pack, then that should mean we're
1361*0fca6ea1SDimitry Andric       // using default values for the remaining template parameters (after
1362*0fca6ea1SDimitry Andric       // which there may be an empty pack too which we will ignore).
1363*0fca6ea1SDimitry Andric       break;
1364*0fca6ea1SDimitry Andric     }
1365*0fca6ea1SDimitry Andric 
1366*0fca6ea1SDimitry Andric     // Take the next argument.
1367*0fca6ea1SDimitry Andric     SpecArgs.push_back(SubstArgs.front());
1368*0fca6ea1SDimitry Andric     SubstArgs = SubstArgs.drop_front();
1369*0fca6ea1SDimitry Andric   }
1370*0fca6ea1SDimitry Andric   return SpecArgs;
1371*0fca6ea1SDimitry Andric }
1372*0fca6ea1SDimitry Andric 
13730b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,
13740b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
13750b57cec5SDimitry Andric   assert(Ty->isTypeAlias());
13760b57cec5SDimitry Andric   llvm::DIType *Src = getOrCreateType(Ty->getAliasedType(), Unit);
13770b57cec5SDimitry Andric 
1378bdd1243dSDimitry Andric   const TemplateDecl *TD = Ty->getTemplateName().getAsTemplateDecl();
1379bdd1243dSDimitry Andric   if (isa<BuiltinTemplateDecl>(TD))
1380bdd1243dSDimitry Andric     return Src;
13810b57cec5SDimitry Andric 
1382bdd1243dSDimitry Andric   const auto *AliasDecl = cast<TypeAliasTemplateDecl>(TD)->getTemplatedDecl();
13830b57cec5SDimitry Andric   if (AliasDecl->hasAttr<NoDebugAttr>())
13840b57cec5SDimitry Andric     return Src;
13850b57cec5SDimitry Andric 
13860b57cec5SDimitry Andric   SmallString<128> NS;
13870b57cec5SDimitry Andric   llvm::raw_svector_ostream OS(NS);
1388bdd1243dSDimitry Andric 
1389bdd1243dSDimitry Andric   auto PP = getPrintingPolicy();
1390bdd1243dSDimitry Andric   Ty->getTemplateName().print(OS, PP, TemplateName::Qualified::None);
1391bdd1243dSDimitry Andric 
1392*0fca6ea1SDimitry Andric   SourceLocation Loc = AliasDecl->getLocation();
1393*0fca6ea1SDimitry Andric 
1394*0fca6ea1SDimitry Andric   if (CGM.getCodeGenOpts().DebugTemplateAlias &&
1395*0fca6ea1SDimitry Andric       // FIXME: This is a workaround for the issue
1396*0fca6ea1SDimitry Andric       //        https://github.com/llvm/llvm-project/issues/89774
1397*0fca6ea1SDimitry Andric       // The TemplateSpecializationType doesn't contain any instantiation
1398*0fca6ea1SDimitry Andric       // information; dependent template arguments can't be resolved. For now,
1399*0fca6ea1SDimitry Andric       // fall back to DW_TAG_typedefs for template aliases that are
1400*0fca6ea1SDimitry Andric       // instantiation dependent, e.g.:
1401*0fca6ea1SDimitry Andric       // ```
1402*0fca6ea1SDimitry Andric       // template <int>
1403*0fca6ea1SDimitry Andric       // using A = int;
1404*0fca6ea1SDimitry Andric       //
1405*0fca6ea1SDimitry Andric       // template<int I>
1406*0fca6ea1SDimitry Andric       // struct S {
1407*0fca6ea1SDimitry Andric       //   using AA = A<I>; // Instantiation dependent.
1408*0fca6ea1SDimitry Andric       //   AA aa;
1409*0fca6ea1SDimitry Andric       // };
1410*0fca6ea1SDimitry Andric       //
1411*0fca6ea1SDimitry Andric       // S<0> s;
1412*0fca6ea1SDimitry Andric       // ```
1413*0fca6ea1SDimitry Andric       // S::AA's underlying type A<I> is dependent on I so will be emitted as a
1414*0fca6ea1SDimitry Andric       // DW_TAG_typedef.
1415*0fca6ea1SDimitry Andric       !Ty->isInstantiationDependentType()) {
1416*0fca6ea1SDimitry Andric     auto ArgVector = ::GetTemplateArgs(TD, Ty);
1417*0fca6ea1SDimitry Andric     TemplateArgs Args = {TD->getTemplateParameters(), ArgVector};
1418*0fca6ea1SDimitry Andric 
1419*0fca6ea1SDimitry Andric     // FIXME: Respect DebugTemplateNameKind::Mangled, e.g. by using GetName.
1420*0fca6ea1SDimitry Andric     // Note we can't use GetName without additional work: TypeAliasTemplateDecl
1421*0fca6ea1SDimitry Andric     // doesn't have instantiation information, so
1422*0fca6ea1SDimitry Andric     // TypeAliasTemplateDecl::getNameForDiagnostic wouldn't have access to the
1423*0fca6ea1SDimitry Andric     // template args.
1424*0fca6ea1SDimitry Andric     std::string Name;
1425*0fca6ea1SDimitry Andric     llvm::raw_string_ostream OS(Name);
1426*0fca6ea1SDimitry Andric     TD->getNameForDiagnostic(OS, PP, /*Qualified=*/false);
1427*0fca6ea1SDimitry Andric     if (CGM.getCodeGenOpts().getDebugSimpleTemplateNames() !=
1428*0fca6ea1SDimitry Andric             llvm::codegenoptions::DebugTemplateNamesKind::Simple ||
1429*0fca6ea1SDimitry Andric         !HasReconstitutableArgs(Args.Args))
1430*0fca6ea1SDimitry Andric       printTemplateArgumentList(OS, Args.Args, PP);
1431*0fca6ea1SDimitry Andric 
1432*0fca6ea1SDimitry Andric     llvm::DIDerivedType *AliasTy = DBuilder.createTemplateAlias(
1433*0fca6ea1SDimitry Andric         Src, Name, getOrCreateFile(Loc), getLineNumber(Loc),
1434*0fca6ea1SDimitry Andric         getDeclContextDescriptor(AliasDecl), CollectTemplateParams(Args, Unit));
1435*0fca6ea1SDimitry Andric     return AliasTy;
1436*0fca6ea1SDimitry Andric   }
1437*0fca6ea1SDimitry Andric 
1438bdd1243dSDimitry Andric   // Disable PrintCanonicalTypes here because we want
1439bdd1243dSDimitry Andric   // the DW_AT_name to benefit from the TypePrinter's ability
1440bdd1243dSDimitry Andric   // to skip defaulted template arguments.
1441bdd1243dSDimitry Andric   //
1442bdd1243dSDimitry Andric   // FIXME: Once -gsimple-template-names is enabled by default
1443bdd1243dSDimitry Andric   // and we attach template parameters to alias template DIEs
1444bdd1243dSDimitry Andric   // we don't need to worry about customizing the PrintingPolicy
1445bdd1243dSDimitry Andric   // here anymore.
1446bdd1243dSDimitry Andric   PP.PrintCanonicalTypes = false;
1447bdd1243dSDimitry Andric   printTemplateArgumentList(OS, Ty->template_arguments(), PP,
1448bdd1243dSDimitry Andric                             TD->getTemplateParameters());
14490b57cec5SDimitry Andric   return DBuilder.createTypedef(Src, OS.str(), getOrCreateFile(Loc),
14500b57cec5SDimitry Andric                                 getLineNumber(Loc),
14510b57cec5SDimitry Andric                                 getDeclContextDescriptor(AliasDecl));
14520b57cec5SDimitry Andric }
14530b57cec5SDimitry Andric 
1454bdd1243dSDimitry Andric /// Convert an AccessSpecifier into the corresponding DINode flag.
1455bdd1243dSDimitry Andric /// As an optimization, return 0 if the access specifier equals the
1456bdd1243dSDimitry Andric /// default for the containing type.
1457bdd1243dSDimitry Andric static llvm::DINode::DIFlags getAccessFlag(AccessSpecifier Access,
1458bdd1243dSDimitry Andric                                            const RecordDecl *RD) {
1459bdd1243dSDimitry Andric   AccessSpecifier Default = clang::AS_none;
1460bdd1243dSDimitry Andric   if (RD && RD->isClass())
1461bdd1243dSDimitry Andric     Default = clang::AS_private;
1462bdd1243dSDimitry Andric   else if (RD && (RD->isStruct() || RD->isUnion()))
1463bdd1243dSDimitry Andric     Default = clang::AS_public;
1464bdd1243dSDimitry Andric 
1465bdd1243dSDimitry Andric   if (Access == Default)
1466bdd1243dSDimitry Andric     return llvm::DINode::FlagZero;
1467bdd1243dSDimitry Andric 
1468bdd1243dSDimitry Andric   switch (Access) {
1469bdd1243dSDimitry Andric   case clang::AS_private:
1470bdd1243dSDimitry Andric     return llvm::DINode::FlagPrivate;
1471bdd1243dSDimitry Andric   case clang::AS_protected:
1472bdd1243dSDimitry Andric     return llvm::DINode::FlagProtected;
1473bdd1243dSDimitry Andric   case clang::AS_public:
1474bdd1243dSDimitry Andric     return llvm::DINode::FlagPublic;
1475bdd1243dSDimitry Andric   case clang::AS_none:
1476bdd1243dSDimitry Andric     return llvm::DINode::FlagZero;
1477bdd1243dSDimitry Andric   }
1478bdd1243dSDimitry Andric   llvm_unreachable("unexpected access enumerator");
1479bdd1243dSDimitry Andric }
1480bdd1243dSDimitry Andric 
14810b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty,
14820b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
14830b57cec5SDimitry Andric   llvm::DIType *Underlying =
148481ad6265SDimitry Andric       getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit);
14850b57cec5SDimitry Andric 
14860b57cec5SDimitry Andric   if (Ty->getDecl()->hasAttr<NoDebugAttr>())
14870b57cec5SDimitry Andric     return Underlying;
14880b57cec5SDimitry Andric 
14890b57cec5SDimitry Andric   // We don't set size information, but do specify where the typedef was
14900b57cec5SDimitry Andric   // declared.
14910b57cec5SDimitry Andric   SourceLocation Loc = Ty->getDecl()->getLocation();
14920b57cec5SDimitry Andric 
1493480093f4SDimitry Andric   uint32_t Align = getDeclAlignIfRequired(Ty->getDecl(), CGM.getContext());
14940b57cec5SDimitry Andric   // Typedefs are derived from some other type.
1495349cc55cSDimitry Andric   llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(Ty->getDecl());
1496bdd1243dSDimitry Andric 
1497bdd1243dSDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1498bdd1243dSDimitry Andric   const DeclContext *DC = Ty->getDecl()->getDeclContext();
1499bdd1243dSDimitry Andric   if (isa<RecordDecl>(DC))
1500bdd1243dSDimitry Andric     Flags = getAccessFlag(Ty->getDecl()->getAccess(), cast<RecordDecl>(DC));
1501bdd1243dSDimitry Andric 
15020b57cec5SDimitry Andric   return DBuilder.createTypedef(Underlying, Ty->getDecl()->getName(),
15030b57cec5SDimitry Andric                                 getOrCreateFile(Loc), getLineNumber(Loc),
1504349cc55cSDimitry Andric                                 getDeclContextDescriptor(Ty->getDecl()), Align,
1505bdd1243dSDimitry Andric                                 Flags, Annotations);
15060b57cec5SDimitry Andric }
15070b57cec5SDimitry Andric 
15080b57cec5SDimitry Andric static unsigned getDwarfCC(CallingConv CC) {
15090b57cec5SDimitry Andric   switch (CC) {
15100b57cec5SDimitry Andric   case CC_C:
15110b57cec5SDimitry Andric     // Avoid emitting DW_AT_calling_convention if the C convention was used.
15120b57cec5SDimitry Andric     return 0;
15130b57cec5SDimitry Andric 
15140b57cec5SDimitry Andric   case CC_X86StdCall:
15150b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_BORLAND_stdcall;
15160b57cec5SDimitry Andric   case CC_X86FastCall:
15170b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_BORLAND_msfastcall;
15180b57cec5SDimitry Andric   case CC_X86ThisCall:
15190b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_BORLAND_thiscall;
15200b57cec5SDimitry Andric   case CC_X86VectorCall:
15210b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_vectorcall;
15220b57cec5SDimitry Andric   case CC_X86Pascal:
15230b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_BORLAND_pascal;
15240b57cec5SDimitry Andric   case CC_Win64:
15250b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_Win64;
15260b57cec5SDimitry Andric   case CC_X86_64SysV:
15270b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_X86_64SysV;
15280b57cec5SDimitry Andric   case CC_AAPCS:
15290b57cec5SDimitry Andric   case CC_AArch64VectorCall:
153081ad6265SDimitry Andric   case CC_AArch64SVEPCS:
15310b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_AAPCS;
15320b57cec5SDimitry Andric   case CC_AAPCS_VFP:
15330b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_AAPCS_VFP;
15340b57cec5SDimitry Andric   case CC_IntelOclBicc:
15350b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_IntelOclBicc;
15360b57cec5SDimitry Andric   case CC_SpirFunction:
15370b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_SpirFunction;
15380b57cec5SDimitry Andric   case CC_OpenCLKernel:
153981ad6265SDimitry Andric   case CC_AMDGPUKernelCall:
15400b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_OpenCLKernel;
15410b57cec5SDimitry Andric   case CC_Swift:
15420b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_Swift;
1543fe6060f1SDimitry Andric   case CC_SwiftAsync:
1544*0fca6ea1SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_SwiftTail;
15450b57cec5SDimitry Andric   case CC_PreserveMost:
15460b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_PreserveMost;
15470b57cec5SDimitry Andric   case CC_PreserveAll:
15480b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_PreserveAll;
15490b57cec5SDimitry Andric   case CC_X86RegCall:
15500b57cec5SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_X86RegCall;
15515f757f3fSDimitry Andric   case CC_M68kRTD:
15525f757f3fSDimitry Andric     return llvm::dwarf::DW_CC_LLVM_M68kRTD;
1553*0fca6ea1SDimitry Andric   case CC_PreserveNone:
1554*0fca6ea1SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_PreserveNone;
1555*0fca6ea1SDimitry Andric   case CC_RISCVVectorCall:
1556*0fca6ea1SDimitry Andric     return llvm::dwarf::DW_CC_LLVM_RISCVVectorCall;
15570b57cec5SDimitry Andric   }
15580b57cec5SDimitry Andric   return 0;
15590b57cec5SDimitry Andric }
15600b57cec5SDimitry Andric 
1561349cc55cSDimitry Andric static llvm::DINode::DIFlags getRefFlags(const FunctionProtoType *Func) {
1562349cc55cSDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1563349cc55cSDimitry Andric   if (Func->getExtProtoInfo().RefQualifier == RQ_LValue)
1564349cc55cSDimitry Andric     Flags |= llvm::DINode::FlagLValueReference;
1565349cc55cSDimitry Andric   if (Func->getExtProtoInfo().RefQualifier == RQ_RValue)
1566349cc55cSDimitry Andric     Flags |= llvm::DINode::FlagRValueReference;
1567349cc55cSDimitry Andric   return Flags;
1568349cc55cSDimitry Andric }
1569349cc55cSDimitry Andric 
15700b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty,
157181ad6265SDimitry Andric                                       llvm::DIFile *Unit) {
1572349cc55cSDimitry Andric   const auto *FPT = dyn_cast<FunctionProtoType>(Ty);
1573349cc55cSDimitry Andric   if (FPT) {
1574349cc55cSDimitry Andric     if (llvm::DIType *QTy = CreateQualifiedType(FPT, Unit))
1575349cc55cSDimitry Andric       return QTy;
1576349cc55cSDimitry Andric   }
1577349cc55cSDimitry Andric 
1578349cc55cSDimitry Andric   // Create the type without any qualifiers
1579349cc55cSDimitry Andric 
15800b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 16> EltTys;
15810b57cec5SDimitry Andric 
15820b57cec5SDimitry Andric   // Add the result type at least.
158381ad6265SDimitry Andric   EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit));
15840b57cec5SDimitry Andric 
1585349cc55cSDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
15860b57cec5SDimitry Andric   // Set up remainder of arguments if there is a prototype.
15870b57cec5SDimitry Andric   // otherwise emit it as a variadic function.
1588349cc55cSDimitry Andric   if (!FPT) {
15890b57cec5SDimitry Andric     EltTys.push_back(DBuilder.createUnspecifiedParameter());
1590349cc55cSDimitry Andric   } else {
1591349cc55cSDimitry Andric     Flags = getRefFlags(FPT);
15920b57cec5SDimitry Andric     for (const QualType &ParamType : FPT->param_types())
15930b57cec5SDimitry Andric       EltTys.push_back(getOrCreateType(ParamType, Unit));
15940b57cec5SDimitry Andric     if (FPT->isVariadic())
15950b57cec5SDimitry Andric       EltTys.push_back(DBuilder.createUnspecifiedParameter());
15960b57cec5SDimitry Andric   }
15970b57cec5SDimitry Andric 
15980b57cec5SDimitry Andric   llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
1599349cc55cSDimitry Andric   llvm::DIType *F = DBuilder.createSubroutineType(
1600349cc55cSDimitry Andric       EltTypeArray, Flags, getDwarfCC(Ty->getCallConv()));
1601349cc55cSDimitry Andric   return F;
16020b57cec5SDimitry Andric }
16030b57cec5SDimitry Andric 
160406c3fb27SDimitry Andric llvm::DIDerivedType *
160506c3fb27SDimitry Andric CGDebugInfo::createBitFieldType(const FieldDecl *BitFieldDecl,
160606c3fb27SDimitry Andric                                 llvm::DIScope *RecordTy, const RecordDecl *RD) {
16070b57cec5SDimitry Andric   StringRef Name = BitFieldDecl->getName();
16080b57cec5SDimitry Andric   QualType Ty = BitFieldDecl->getType();
16095f757f3fSDimitry Andric   if (BitFieldDecl->hasAttr<PreferredTypeAttr>())
16105f757f3fSDimitry Andric     Ty = BitFieldDecl->getAttr<PreferredTypeAttr>()->getType();
16110b57cec5SDimitry Andric   SourceLocation Loc = BitFieldDecl->getLocation();
16120b57cec5SDimitry Andric   llvm::DIFile *VUnit = getOrCreateFile(Loc);
16130b57cec5SDimitry Andric   llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
16140b57cec5SDimitry Andric 
16150b57cec5SDimitry Andric   // Get the location for the field.
16160b57cec5SDimitry Andric   llvm::DIFile *File = getOrCreateFile(Loc);
16170b57cec5SDimitry Andric   unsigned Line = getLineNumber(Loc);
16180b57cec5SDimitry Andric 
16190b57cec5SDimitry Andric   const CGBitFieldInfo &BitFieldInfo =
16200b57cec5SDimitry Andric       CGM.getTypes().getCGRecordLayout(RD).getBitFieldInfo(BitFieldDecl);
16210b57cec5SDimitry Andric   uint64_t SizeInBits = BitFieldInfo.Size;
16220b57cec5SDimitry Andric   assert(SizeInBits > 0 && "found named 0-width bitfield");
16230b57cec5SDimitry Andric   uint64_t StorageOffsetInBits =
16240b57cec5SDimitry Andric       CGM.getContext().toBits(BitFieldInfo.StorageOffset);
16250b57cec5SDimitry Andric   uint64_t Offset = BitFieldInfo.Offset;
16260b57cec5SDimitry Andric   // The bit offsets for big endian machines are reversed for big
16270b57cec5SDimitry Andric   // endian target, compensate for that as the DIDerivedType requires
16280b57cec5SDimitry Andric   // un-reversed offsets.
16290b57cec5SDimitry Andric   if (CGM.getDataLayout().isBigEndian())
16300b57cec5SDimitry Andric     Offset = BitFieldInfo.StorageSize - BitFieldInfo.Size - Offset;
16310b57cec5SDimitry Andric   uint64_t OffsetInBits = StorageOffsetInBits + Offset;
16320b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = getAccessFlag(BitFieldDecl->getAccess(), RD);
1633349cc55cSDimitry Andric   llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(BitFieldDecl);
16340b57cec5SDimitry Andric   return DBuilder.createBitFieldMemberType(
16350b57cec5SDimitry Andric       RecordTy, Name, File, Line, SizeInBits, OffsetInBits, StorageOffsetInBits,
1636349cc55cSDimitry Andric       Flags, DebugType, Annotations);
16370b57cec5SDimitry Andric }
16380b57cec5SDimitry Andric 
163906c3fb27SDimitry Andric llvm::DIDerivedType *CGDebugInfo::createBitFieldSeparatorIfNeeded(
164006c3fb27SDimitry Andric     const FieldDecl *BitFieldDecl, const llvm::DIDerivedType *BitFieldDI,
164106c3fb27SDimitry Andric     llvm::ArrayRef<llvm::Metadata *> PreviousFieldsDI, const RecordDecl *RD) {
164206c3fb27SDimitry Andric 
164306c3fb27SDimitry Andric   if (!CGM.getTargetCodeGenInfo().shouldEmitDWARFBitFieldSeparators())
164406c3fb27SDimitry Andric     return nullptr;
164506c3fb27SDimitry Andric 
164606c3fb27SDimitry Andric   /*
164706c3fb27SDimitry Andric   Add a *single* zero-bitfield separator between two non-zero bitfields
164806c3fb27SDimitry Andric   separated by one or more zero-bitfields. This is used to distinguish between
164906c3fb27SDimitry Andric   structures such the ones below, where the memory layout is the same, but how
165006c3fb27SDimitry Andric   the ABI assigns fields to registers differs.
165106c3fb27SDimitry Andric 
165206c3fb27SDimitry Andric   struct foo {
165306c3fb27SDimitry Andric     int space[4];
165406c3fb27SDimitry Andric     char a : 8; // on amdgpu, passed on v4
165506c3fb27SDimitry Andric     char b : 8;
165606c3fb27SDimitry Andric     char x : 8;
165706c3fb27SDimitry Andric     char y : 8;
165806c3fb27SDimitry Andric   };
165906c3fb27SDimitry Andric   struct bar {
166006c3fb27SDimitry Andric     int space[4];
166106c3fb27SDimitry Andric     char a : 8; // on amdgpu, passed on v4
166206c3fb27SDimitry Andric     char b : 8;
166306c3fb27SDimitry Andric     char : 0;
166406c3fb27SDimitry Andric     char x : 8; // passed on v5
166506c3fb27SDimitry Andric     char y : 8;
166606c3fb27SDimitry Andric   };
166706c3fb27SDimitry Andric   */
166806c3fb27SDimitry Andric   if (PreviousFieldsDI.empty())
166906c3fb27SDimitry Andric     return nullptr;
167006c3fb27SDimitry Andric 
167106c3fb27SDimitry Andric   // If we already emitted metadata for a 0-length bitfield, nothing to do here.
167206c3fb27SDimitry Andric   auto *PreviousMDEntry =
167306c3fb27SDimitry Andric       PreviousFieldsDI.empty() ? nullptr : PreviousFieldsDI.back();
167406c3fb27SDimitry Andric   auto *PreviousMDField =
167506c3fb27SDimitry Andric       dyn_cast_or_null<llvm::DIDerivedType>(PreviousMDEntry);
167606c3fb27SDimitry Andric   if (!PreviousMDField || !PreviousMDField->isBitField() ||
167706c3fb27SDimitry Andric       PreviousMDField->getSizeInBits() == 0)
167806c3fb27SDimitry Andric     return nullptr;
167906c3fb27SDimitry Andric 
168006c3fb27SDimitry Andric   auto PreviousBitfield = RD->field_begin();
168106c3fb27SDimitry Andric   std::advance(PreviousBitfield, BitFieldDecl->getFieldIndex() - 1);
168206c3fb27SDimitry Andric 
168306c3fb27SDimitry Andric   assert(PreviousBitfield->isBitField());
168406c3fb27SDimitry Andric 
168506c3fb27SDimitry Andric   ASTContext &Context = CGM.getContext();
168606c3fb27SDimitry Andric   if (!PreviousBitfield->isZeroLengthBitField(Context))
168706c3fb27SDimitry Andric     return nullptr;
168806c3fb27SDimitry Andric 
168906c3fb27SDimitry Andric   QualType Ty = PreviousBitfield->getType();
169006c3fb27SDimitry Andric   SourceLocation Loc = PreviousBitfield->getLocation();
169106c3fb27SDimitry Andric   llvm::DIFile *VUnit = getOrCreateFile(Loc);
169206c3fb27SDimitry Andric   llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
169306c3fb27SDimitry Andric   llvm::DIScope *RecordTy = BitFieldDI->getScope();
169406c3fb27SDimitry Andric 
169506c3fb27SDimitry Andric   llvm::DIFile *File = getOrCreateFile(Loc);
169606c3fb27SDimitry Andric   unsigned Line = getLineNumber(Loc);
169706c3fb27SDimitry Andric 
169806c3fb27SDimitry Andric   uint64_t StorageOffsetInBits =
169906c3fb27SDimitry Andric       cast<llvm::ConstantInt>(BitFieldDI->getStorageOffsetInBits())
170006c3fb27SDimitry Andric           ->getZExtValue();
170106c3fb27SDimitry Andric 
170206c3fb27SDimitry Andric   llvm::DINode::DIFlags Flags =
170306c3fb27SDimitry Andric       getAccessFlag(PreviousBitfield->getAccess(), RD);
170406c3fb27SDimitry Andric   llvm::DINodeArray Annotations =
170506c3fb27SDimitry Andric       CollectBTFDeclTagAnnotations(*PreviousBitfield);
170606c3fb27SDimitry Andric   return DBuilder.createBitFieldMemberType(
170706c3fb27SDimitry Andric       RecordTy, "", File, Line, 0, StorageOffsetInBits, StorageOffsetInBits,
170806c3fb27SDimitry Andric       Flags, DebugType, Annotations);
170906c3fb27SDimitry Andric }
171006c3fb27SDimitry Andric 
171181ad6265SDimitry Andric llvm::DIType *CGDebugInfo::createFieldType(
171281ad6265SDimitry Andric     StringRef name, QualType type, SourceLocation loc, AccessSpecifier AS,
171381ad6265SDimitry Andric     uint64_t offsetInBits, uint32_t AlignInBits, llvm::DIFile *tunit,
171481ad6265SDimitry Andric     llvm::DIScope *scope, const RecordDecl *RD, llvm::DINodeArray Annotations) {
171581ad6265SDimitry Andric   llvm::DIType *debugType = getOrCreateType(type, tunit);
17160b57cec5SDimitry Andric 
17170b57cec5SDimitry Andric   // Get the location for the field.
17180b57cec5SDimitry Andric   llvm::DIFile *file = getOrCreateFile(loc);
1719e8d8bef9SDimitry Andric   const unsigned line = getLineNumber(loc.isValid() ? loc : CurLoc);
17200b57cec5SDimitry Andric 
17210b57cec5SDimitry Andric   uint64_t SizeInBits = 0;
17220b57cec5SDimitry Andric   auto Align = AlignInBits;
17230b57cec5SDimitry Andric   if (!type->isIncompleteArrayType()) {
17240b57cec5SDimitry Andric     TypeInfo TI = CGM.getContext().getTypeInfo(type);
17250b57cec5SDimitry Andric     SizeInBits = TI.Width;
17260b57cec5SDimitry Andric     if (!Align)
17270b57cec5SDimitry Andric       Align = getTypeAlignIfRequired(type, CGM.getContext());
17280b57cec5SDimitry Andric   }
17290b57cec5SDimitry Andric 
17300b57cec5SDimitry Andric   llvm::DINode::DIFlags flags = getAccessFlag(AS, RD);
17310b57cec5SDimitry Andric   return DBuilder.createMemberType(scope, name, file, line, SizeInBits, Align,
1732349cc55cSDimitry Andric                                    offsetInBits, flags, debugType, Annotations);
17330b57cec5SDimitry Andric }
17340b57cec5SDimitry Andric 
1735*0fca6ea1SDimitry Andric llvm::DISubprogram *
1736*0fca6ea1SDimitry Andric CGDebugInfo::createInlinedTrapSubprogram(StringRef FuncName,
1737*0fca6ea1SDimitry Andric                                          llvm::DIFile *FileScope) {
1738*0fca6ea1SDimitry Andric   // We are caching the subprogram because we don't want to duplicate
1739*0fca6ea1SDimitry Andric   // subprograms with the same message. Note that `SPFlagDefinition` prevents
1740*0fca6ea1SDimitry Andric   // subprograms from being uniqued.
1741*0fca6ea1SDimitry Andric   llvm::DISubprogram *&SP = InlinedTrapFuncMap[FuncName];
1742*0fca6ea1SDimitry Andric 
1743*0fca6ea1SDimitry Andric   if (!SP) {
1744*0fca6ea1SDimitry Andric     llvm::DISubroutineType *DIFnTy = DBuilder.createSubroutineType(nullptr);
1745*0fca6ea1SDimitry Andric     SP = DBuilder.createFunction(
1746*0fca6ea1SDimitry Andric         /*Scope=*/FileScope, /*Name=*/FuncName, /*LinkageName=*/StringRef(),
1747*0fca6ea1SDimitry Andric         /*File=*/FileScope, /*LineNo=*/0, /*Ty=*/DIFnTy,
1748*0fca6ea1SDimitry Andric         /*ScopeLine=*/0,
1749*0fca6ea1SDimitry Andric         /*Flags=*/llvm::DINode::FlagArtificial,
1750*0fca6ea1SDimitry Andric         /*SPFlags=*/llvm::DISubprogram::SPFlagDefinition,
1751*0fca6ea1SDimitry Andric         /*TParams=*/nullptr, /*ThrownTypes=*/nullptr, /*Annotations=*/nullptr);
1752*0fca6ea1SDimitry Andric   }
1753*0fca6ea1SDimitry Andric 
1754*0fca6ea1SDimitry Andric   return SP;
1755*0fca6ea1SDimitry Andric }
1756*0fca6ea1SDimitry Andric 
17570b57cec5SDimitry Andric void CGDebugInfo::CollectRecordLambdaFields(
17580b57cec5SDimitry Andric     const CXXRecordDecl *CXXDecl, SmallVectorImpl<llvm::Metadata *> &elements,
17590b57cec5SDimitry Andric     llvm::DIType *RecordTy) {
17600b57cec5SDimitry Andric   // For C++11 Lambdas a Field will be the same as a Capture, but the Capture
17610b57cec5SDimitry Andric   // has the name and the location of the variable so we should iterate over
17620b57cec5SDimitry Andric   // both concurrently.
17630b57cec5SDimitry Andric   const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl);
17640b57cec5SDimitry Andric   RecordDecl::field_iterator Field = CXXDecl->field_begin();
17650b57cec5SDimitry Andric   unsigned fieldno = 0;
17660b57cec5SDimitry Andric   for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(),
17670b57cec5SDimitry Andric                                              E = CXXDecl->captures_end();
17680b57cec5SDimitry Andric        I != E; ++I, ++Field, ++fieldno) {
17690b57cec5SDimitry Andric     const LambdaCapture &C = *I;
17700b57cec5SDimitry Andric     if (C.capturesVariable()) {
17710b57cec5SDimitry Andric       SourceLocation Loc = C.getLocation();
17720b57cec5SDimitry Andric       assert(!Field->isBitField() && "lambdas don't have bitfield members!");
1773bdd1243dSDimitry Andric       ValueDecl *V = C.getCapturedVar();
17740b57cec5SDimitry Andric       StringRef VName = V->getName();
17750b57cec5SDimitry Andric       llvm::DIFile *VUnit = getOrCreateFile(Loc);
17760b57cec5SDimitry Andric       auto Align = getDeclAlignIfRequired(V, CGM.getContext());
17770b57cec5SDimitry Andric       llvm::DIType *FieldType = createFieldType(
17780b57cec5SDimitry Andric           VName, Field->getType(), Loc, Field->getAccess(),
17790b57cec5SDimitry Andric           layout.getFieldOffset(fieldno), Align, VUnit, RecordTy, CXXDecl);
17800b57cec5SDimitry Andric       elements.push_back(FieldType);
17810b57cec5SDimitry Andric     } else if (C.capturesThis()) {
17820b57cec5SDimitry Andric       // TODO: Need to handle 'this' in some way by probably renaming the
17830b57cec5SDimitry Andric       // this of the lambda class and having a field member of 'this' or
17840b57cec5SDimitry Andric       // by using AT_object_pointer for the function and having that be
17850b57cec5SDimitry Andric       // used as 'this' for semantic references.
17860b57cec5SDimitry Andric       FieldDecl *f = *Field;
17870b57cec5SDimitry Andric       llvm::DIFile *VUnit = getOrCreateFile(f->getLocation());
17880b57cec5SDimitry Andric       QualType type = f->getType();
17895f757f3fSDimitry Andric       StringRef ThisName =
17905f757f3fSDimitry Andric           CGM.getCodeGenOpts().EmitCodeView ? "__this" : "this";
17910b57cec5SDimitry Andric       llvm::DIType *fieldType = createFieldType(
17925f757f3fSDimitry Andric           ThisName, type, f->getLocation(), f->getAccess(),
17930b57cec5SDimitry Andric           layout.getFieldOffset(fieldno), VUnit, RecordTy, CXXDecl);
17940b57cec5SDimitry Andric 
17950b57cec5SDimitry Andric       elements.push_back(fieldType);
17960b57cec5SDimitry Andric     }
17970b57cec5SDimitry Andric   }
17980b57cec5SDimitry Andric }
17990b57cec5SDimitry Andric 
18000b57cec5SDimitry Andric llvm::DIDerivedType *
18010b57cec5SDimitry Andric CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy,
18020b57cec5SDimitry Andric                                      const RecordDecl *RD) {
18030b57cec5SDimitry Andric   // Create the descriptor for the static variable, with or without
18040b57cec5SDimitry Andric   // constant initializers.
18050b57cec5SDimitry Andric   Var = Var->getCanonicalDecl();
18060b57cec5SDimitry Andric   llvm::DIFile *VUnit = getOrCreateFile(Var->getLocation());
18070b57cec5SDimitry Andric   llvm::DIType *VTy = getOrCreateType(Var->getType(), VUnit);
18080b57cec5SDimitry Andric 
18090b57cec5SDimitry Andric   unsigned LineNumber = getLineNumber(Var->getLocation());
18100b57cec5SDimitry Andric   StringRef VName = Var->getName();
18115f757f3fSDimitry Andric 
18125f757f3fSDimitry Andric   // FIXME: to avoid complications with type merging we should
18135f757f3fSDimitry Andric   // emit the constant on the definition instead of the declaration.
18140b57cec5SDimitry Andric   llvm::Constant *C = nullptr;
18150b57cec5SDimitry Andric   if (Var->getInit()) {
18160b57cec5SDimitry Andric     const APValue *Value = Var->evaluateValue();
18170b57cec5SDimitry Andric     if (Value) {
18180b57cec5SDimitry Andric       if (Value->isInt())
18190b57cec5SDimitry Andric         C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt());
18200b57cec5SDimitry Andric       if (Value->isFloat())
18210b57cec5SDimitry Andric         C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat());
18220b57cec5SDimitry Andric     }
18230b57cec5SDimitry Andric   }
18240b57cec5SDimitry Andric 
18250b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD);
18265f757f3fSDimitry Andric   auto Tag = CGM.getCodeGenOpts().DwarfVersion >= 5
18275f757f3fSDimitry Andric                  ? llvm::dwarf::DW_TAG_variable
18285f757f3fSDimitry Andric                  : llvm::dwarf::DW_TAG_member;
18290b57cec5SDimitry Andric   auto Align = getDeclAlignIfRequired(Var, CGM.getContext());
18300b57cec5SDimitry Andric   llvm::DIDerivedType *GV = DBuilder.createStaticMemberType(
18315f757f3fSDimitry Andric       RecordTy, VName, VUnit, LineNumber, VTy, Flags, C, Tag, Align);
18320b57cec5SDimitry Andric   StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV);
18330b57cec5SDimitry Andric   return GV;
18340b57cec5SDimitry Andric }
18350b57cec5SDimitry Andric 
18360b57cec5SDimitry Andric void CGDebugInfo::CollectRecordNormalField(
18370b57cec5SDimitry Andric     const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile *tunit,
18380b57cec5SDimitry Andric     SmallVectorImpl<llvm::Metadata *> &elements, llvm::DIType *RecordTy,
18390b57cec5SDimitry Andric     const RecordDecl *RD) {
18400b57cec5SDimitry Andric   StringRef name = field->getName();
18410b57cec5SDimitry Andric   QualType type = field->getType();
18420b57cec5SDimitry Andric 
18430b57cec5SDimitry Andric   // Ignore unnamed fields unless they're anonymous structs/unions.
18440b57cec5SDimitry Andric   if (name.empty() && !type->isRecordType())
18450b57cec5SDimitry Andric     return;
18460b57cec5SDimitry Andric 
18470b57cec5SDimitry Andric   llvm::DIType *FieldType;
18480b57cec5SDimitry Andric   if (field->isBitField()) {
184906c3fb27SDimitry Andric     llvm::DIDerivedType *BitFieldType;
185006c3fb27SDimitry Andric     FieldType = BitFieldType = createBitFieldType(field, RecordTy, RD);
185106c3fb27SDimitry Andric     if (llvm::DIType *Separator =
185206c3fb27SDimitry Andric             createBitFieldSeparatorIfNeeded(field, BitFieldType, elements, RD))
185306c3fb27SDimitry Andric       elements.push_back(Separator);
18540b57cec5SDimitry Andric   } else {
18550b57cec5SDimitry Andric     auto Align = getDeclAlignIfRequired(field, CGM.getContext());
1856349cc55cSDimitry Andric     llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(field);
185781ad6265SDimitry Andric     FieldType =
185881ad6265SDimitry Andric         createFieldType(name, type, field->getLocation(), field->getAccess(),
185981ad6265SDimitry Andric                         OffsetInBits, Align, tunit, RecordTy, RD, Annotations);
18600b57cec5SDimitry Andric   }
18610b57cec5SDimitry Andric 
18620b57cec5SDimitry Andric   elements.push_back(FieldType);
18630b57cec5SDimitry Andric }
18640b57cec5SDimitry Andric 
18650b57cec5SDimitry Andric void CGDebugInfo::CollectRecordNestedType(
18660b57cec5SDimitry Andric     const TypeDecl *TD, SmallVectorImpl<llvm::Metadata *> &elements) {
18670b57cec5SDimitry Andric   QualType Ty = CGM.getContext().getTypeDeclType(TD);
18680b57cec5SDimitry Andric   // Injected class names are not considered nested records.
18690b57cec5SDimitry Andric   if (isa<InjectedClassNameType>(Ty))
18700b57cec5SDimitry Andric     return;
18710b57cec5SDimitry Andric   SourceLocation Loc = TD->getLocation();
18720b57cec5SDimitry Andric   llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateFile(Loc));
18730b57cec5SDimitry Andric   elements.push_back(nestedType);
18740b57cec5SDimitry Andric }
18750b57cec5SDimitry Andric 
18760b57cec5SDimitry Andric void CGDebugInfo::CollectRecordFields(
18770b57cec5SDimitry Andric     const RecordDecl *record, llvm::DIFile *tunit,
18780b57cec5SDimitry Andric     SmallVectorImpl<llvm::Metadata *> &elements,
18790b57cec5SDimitry Andric     llvm::DICompositeType *RecordTy) {
18800b57cec5SDimitry Andric   const auto *CXXDecl = dyn_cast<CXXRecordDecl>(record);
18810b57cec5SDimitry Andric 
18820b57cec5SDimitry Andric   if (CXXDecl && CXXDecl->isLambda())
18830b57cec5SDimitry Andric     CollectRecordLambdaFields(CXXDecl, elements, RecordTy);
18840b57cec5SDimitry Andric   else {
18850b57cec5SDimitry Andric     const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record);
18860b57cec5SDimitry Andric 
18870b57cec5SDimitry Andric     // Field number for non-static fields.
18880b57cec5SDimitry Andric     unsigned fieldNo = 0;
18890b57cec5SDimitry Andric 
18900b57cec5SDimitry Andric     // Static and non-static members should appear in the same order as
18910b57cec5SDimitry Andric     // the corresponding declarations in the source program.
18920b57cec5SDimitry Andric     for (const auto *I : record->decls())
18930b57cec5SDimitry Andric       if (const auto *V = dyn_cast<VarDecl>(I)) {
18940b57cec5SDimitry Andric         if (V->hasAttr<NoDebugAttr>())
18950b57cec5SDimitry Andric           continue;
18960b57cec5SDimitry Andric 
18970b57cec5SDimitry Andric         // Skip variable template specializations when emitting CodeView. MSVC
18980b57cec5SDimitry Andric         // doesn't emit them.
18990b57cec5SDimitry Andric         if (CGM.getCodeGenOpts().EmitCodeView &&
19000b57cec5SDimitry Andric             isa<VarTemplateSpecializationDecl>(V))
19010b57cec5SDimitry Andric           continue;
19020b57cec5SDimitry Andric 
19030b57cec5SDimitry Andric         if (isa<VarTemplatePartialSpecializationDecl>(V))
19040b57cec5SDimitry Andric           continue;
19050b57cec5SDimitry Andric 
19060b57cec5SDimitry Andric         // Reuse the existing static member declaration if one exists
19070b57cec5SDimitry Andric         auto MI = StaticDataMemberCache.find(V->getCanonicalDecl());
19080b57cec5SDimitry Andric         if (MI != StaticDataMemberCache.end()) {
19090b57cec5SDimitry Andric           assert(MI->second &&
19100b57cec5SDimitry Andric                  "Static data member declaration should still exist");
19110b57cec5SDimitry Andric           elements.push_back(MI->second);
19120b57cec5SDimitry Andric         } else {
19130b57cec5SDimitry Andric           auto Field = CreateRecordStaticField(V, RecordTy, record);
19140b57cec5SDimitry Andric           elements.push_back(Field);
19150b57cec5SDimitry Andric         }
19160b57cec5SDimitry Andric       } else if (const auto *field = dyn_cast<FieldDecl>(I)) {
19170b57cec5SDimitry Andric         CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), tunit,
19180b57cec5SDimitry Andric                                  elements, RecordTy, record);
19190b57cec5SDimitry Andric 
19200b57cec5SDimitry Andric         // Bump field number for next field.
19210b57cec5SDimitry Andric         ++fieldNo;
19220b57cec5SDimitry Andric       } else if (CGM.getCodeGenOpts().EmitCodeView) {
19230b57cec5SDimitry Andric         // Debug info for nested types is included in the member list only for
19240b57cec5SDimitry Andric         // CodeView.
1925bdd1243dSDimitry Andric         if (const auto *nestedType = dyn_cast<TypeDecl>(I)) {
1926bdd1243dSDimitry Andric           // MSVC doesn't generate nested type for anonymous struct/union.
1927bdd1243dSDimitry Andric           if (isa<RecordDecl>(I) &&
1928bdd1243dSDimitry Andric               cast<RecordDecl>(I)->isAnonymousStructOrUnion())
1929bdd1243dSDimitry Andric             continue;
19300b57cec5SDimitry Andric           if (!nestedType->isImplicit() &&
19310b57cec5SDimitry Andric               nestedType->getDeclContext() == record)
19320b57cec5SDimitry Andric             CollectRecordNestedType(nestedType, elements);
19330b57cec5SDimitry Andric         }
19340b57cec5SDimitry Andric       }
19350b57cec5SDimitry Andric   }
19360b57cec5SDimitry Andric }
19370b57cec5SDimitry Andric 
19385ffd83dbSDimitry Andric llvm::DISubroutineType *
1939bdd1243dSDimitry Andric CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method,
1940bdd1243dSDimitry Andric                                    llvm::DIFile *Unit) {
1941bdd1243dSDimitry Andric   const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>();
1942bdd1243dSDimitry Andric   if (Method->isStatic())
1943bdd1243dSDimitry Andric     return cast_or_null<llvm::DISubroutineType>(
1944bdd1243dSDimitry Andric         getOrCreateType(QualType(Func, 0), Unit));
1945bdd1243dSDimitry Andric   return getOrCreateInstanceMethodType(Method->getThisType(), Func, Unit);
1946bdd1243dSDimitry Andric }
1947bdd1243dSDimitry Andric 
1948bdd1243dSDimitry Andric llvm::DISubroutineType *CGDebugInfo::getOrCreateInstanceMethodType(
1949bdd1243dSDimitry Andric     QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile *Unit) {
1950349cc55cSDimitry Andric   FunctionProtoType::ExtProtoInfo EPI = Func->getExtProtoInfo();
1951349cc55cSDimitry Andric   Qualifiers &Qc = EPI.TypeQuals;
1952349cc55cSDimitry Andric   Qc.removeConst();
1953349cc55cSDimitry Andric   Qc.removeVolatile();
1954349cc55cSDimitry Andric   Qc.removeRestrict();
1955349cc55cSDimitry Andric   Qc.removeUnaligned();
1956349cc55cSDimitry Andric   // Keep the removed qualifiers in sync with
1957349cc55cSDimitry Andric   // CreateQualifiedType(const FunctionPrototype*, DIFile *Unit)
1958349cc55cSDimitry Andric   // On a 'real' member function type, these qualifiers are carried on the type
1959349cc55cSDimitry Andric   // of the first parameter, not as separate DW_TAG_const_type (etc) decorator
1960349cc55cSDimitry Andric   // tags around them. (But, in the raw function types with qualifiers, they have
1961349cc55cSDimitry Andric   // to use wrapper types.)
1962349cc55cSDimitry Andric 
19630b57cec5SDimitry Andric   // Add "this" pointer.
1964349cc55cSDimitry Andric   const auto *OriginalFunc = cast<llvm::DISubroutineType>(
1965349cc55cSDimitry Andric       getOrCreateType(CGM.getContext().getFunctionType(
1966349cc55cSDimitry Andric                           Func->getReturnType(), Func->getParamTypes(), EPI),
1967349cc55cSDimitry Andric                       Unit));
1968349cc55cSDimitry Andric   llvm::DITypeRefArray Args = OriginalFunc->getTypeArray();
19690b57cec5SDimitry Andric   assert(Args.size() && "Invalid number of arguments!");
19700b57cec5SDimitry Andric 
19710b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 16> Elts;
197281ad6265SDimitry Andric 
1973bdd1243dSDimitry Andric   // First element is always return type. For 'void' functions it is NULL.
19740b57cec5SDimitry Andric   Elts.push_back(Args[0]);
19750b57cec5SDimitry Andric 
19760b57cec5SDimitry Andric   // "this" pointer is always first argument.
19770b57cec5SDimitry Andric   const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl();
19780b57cec5SDimitry Andric   if (isa<ClassTemplateSpecializationDecl>(RD)) {
19790b57cec5SDimitry Andric     // Create pointer type directly in this case.
19800b57cec5SDimitry Andric     const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr);
1981bdd1243dSDimitry Andric     uint64_t Size = CGM.getContext().getTypeSize(ThisPtrTy);
19820b57cec5SDimitry Andric     auto Align = getTypeAlignIfRequired(ThisPtrTy, CGM.getContext());
1983bdd1243dSDimitry Andric     llvm::DIType *PointeeType =
1984bdd1243dSDimitry Andric         getOrCreateType(ThisPtrTy->getPointeeType(), Unit);
19850b57cec5SDimitry Andric     llvm::DIType *ThisPtrType =
19860b57cec5SDimitry Andric         DBuilder.createPointerType(PointeeType, Size, Align);
19870b57cec5SDimitry Andric     TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType);
19880b57cec5SDimitry Andric     // TODO: This and the artificial type below are misleading, the
19890b57cec5SDimitry Andric     // types aren't artificial the argument is, but the current
19900b57cec5SDimitry Andric     // metadata doesn't represent that.
19910b57cec5SDimitry Andric     ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType);
19920b57cec5SDimitry Andric     Elts.push_back(ThisPtrType);
19930b57cec5SDimitry Andric   } else {
19940b57cec5SDimitry Andric     llvm::DIType *ThisPtrType = getOrCreateType(ThisPtr, Unit);
19950b57cec5SDimitry Andric     TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType);
19960b57cec5SDimitry Andric     ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType);
19970b57cec5SDimitry Andric     Elts.push_back(ThisPtrType);
19980b57cec5SDimitry Andric   }
19990b57cec5SDimitry Andric 
20000b57cec5SDimitry Andric   // Copy rest of the arguments.
20010b57cec5SDimitry Andric   for (unsigned i = 1, e = Args.size(); i != e; ++i)
20020b57cec5SDimitry Andric     Elts.push_back(Args[i]);
20030b57cec5SDimitry Andric 
20040b57cec5SDimitry Andric   llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
20050b57cec5SDimitry Andric 
2006349cc55cSDimitry Andric   return DBuilder.createSubroutineType(EltTypeArray, OriginalFunc->getFlags(),
20070b57cec5SDimitry Andric                                        getDwarfCC(Func->getCallConv()));
20080b57cec5SDimitry Andric }
20090b57cec5SDimitry Andric 
20100b57cec5SDimitry Andric /// isFunctionLocalClass - Return true if CXXRecordDecl is defined
20110b57cec5SDimitry Andric /// inside a function.
20120b57cec5SDimitry Andric static bool isFunctionLocalClass(const CXXRecordDecl *RD) {
20130b57cec5SDimitry Andric   if (const auto *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext()))
20140b57cec5SDimitry Andric     return isFunctionLocalClass(NRD);
20150b57cec5SDimitry Andric   if (isa<FunctionDecl>(RD->getDeclContext()))
20160b57cec5SDimitry Andric     return true;
20170b57cec5SDimitry Andric   return false;
20180b57cec5SDimitry Andric }
20190b57cec5SDimitry Andric 
20200b57cec5SDimitry Andric llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
20210b57cec5SDimitry Andric     const CXXMethodDecl *Method, llvm::DIFile *Unit, llvm::DIType *RecordTy) {
20220b57cec5SDimitry Andric   bool IsCtorOrDtor =
20230b57cec5SDimitry Andric       isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method);
20240b57cec5SDimitry Andric 
20250b57cec5SDimitry Andric   StringRef MethodName = getFunctionName(Method);
2026bdd1243dSDimitry Andric   llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit);
20270b57cec5SDimitry Andric 
20280b57cec5SDimitry Andric   // Since a single ctor/dtor corresponds to multiple functions, it doesn't
20290b57cec5SDimitry Andric   // make sense to give a single ctor/dtor a linkage name.
20300b57cec5SDimitry Andric   StringRef MethodLinkageName;
20310b57cec5SDimitry Andric   // FIXME: 'isFunctionLocalClass' seems like an arbitrary/unintentional
20320b57cec5SDimitry Andric   // property to use here. It may've been intended to model "is non-external
20330b57cec5SDimitry Andric   // type" but misses cases of non-function-local but non-external classes such
20340b57cec5SDimitry Andric   // as those in anonymous namespaces as well as the reverse - external types
20350b57cec5SDimitry Andric   // that are function local, such as those in (non-local) inline functions.
20360b57cec5SDimitry Andric   if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent()))
20370b57cec5SDimitry Andric     MethodLinkageName = CGM.getMangledName(Method);
20380b57cec5SDimitry Andric 
20390b57cec5SDimitry Andric   // Get the location for the method.
20400b57cec5SDimitry Andric   llvm::DIFile *MethodDefUnit = nullptr;
20410b57cec5SDimitry Andric   unsigned MethodLine = 0;
20420b57cec5SDimitry Andric   if (!Method->isImplicit()) {
20430b57cec5SDimitry Andric     MethodDefUnit = getOrCreateFile(Method->getLocation());
20440b57cec5SDimitry Andric     MethodLine = getLineNumber(Method->getLocation());
20450b57cec5SDimitry Andric   }
20460b57cec5SDimitry Andric 
20470b57cec5SDimitry Andric   // Collect virtual method info.
20480b57cec5SDimitry Andric   llvm::DIType *ContainingType = nullptr;
20490b57cec5SDimitry Andric   unsigned VIndex = 0;
20500b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
20510b57cec5SDimitry Andric   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
20520b57cec5SDimitry Andric   int ThisAdjustment = 0;
20530b57cec5SDimitry Andric 
2054bdd1243dSDimitry Andric   if (VTableContextBase::hasVtableSlot(Method)) {
20557a6dacacSDimitry Andric     if (Method->isPureVirtual())
20560b57cec5SDimitry Andric       SPFlags |= llvm::DISubprogram::SPFlagPureVirtual;
20570b57cec5SDimitry Andric     else
20580b57cec5SDimitry Andric       SPFlags |= llvm::DISubprogram::SPFlagVirtual;
20590b57cec5SDimitry Andric 
20600b57cec5SDimitry Andric     if (CGM.getTarget().getCXXABI().isItaniumFamily()) {
20610b57cec5SDimitry Andric       // It doesn't make sense to give a virtual destructor a vtable index,
20620b57cec5SDimitry Andric       // since a single destructor has two entries in the vtable.
20630b57cec5SDimitry Andric       if (!isa<CXXDestructorDecl>(Method))
20640b57cec5SDimitry Andric         VIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(Method);
20650b57cec5SDimitry Andric     } else {
20660b57cec5SDimitry Andric       // Emit MS ABI vftable information.  There is only one entry for the
20670b57cec5SDimitry Andric       // deleting dtor.
20680b57cec5SDimitry Andric       const auto *DD = dyn_cast<CXXDestructorDecl>(Method);
20690b57cec5SDimitry Andric       GlobalDecl GD = DD ? GlobalDecl(DD, Dtor_Deleting) : GlobalDecl(Method);
20700b57cec5SDimitry Andric       MethodVFTableLocation ML =
20710b57cec5SDimitry Andric           CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD);
20720b57cec5SDimitry Andric       VIndex = ML.Index;
20730b57cec5SDimitry Andric 
20740b57cec5SDimitry Andric       // CodeView only records the vftable offset in the class that introduces
20750b57cec5SDimitry Andric       // the virtual method. This is possible because, unlike Itanium, the MS
20760b57cec5SDimitry Andric       // C++ ABI does not include all virtual methods from non-primary bases in
20770b57cec5SDimitry Andric       // the vtable for the most derived class. For example, if C inherits from
20780b57cec5SDimitry Andric       // A and B, C's primary vftable will not include B's virtual methods.
20790b57cec5SDimitry Andric       if (Method->size_overridden_methods() == 0)
20800b57cec5SDimitry Andric         Flags |= llvm::DINode::FlagIntroducedVirtual;
20810b57cec5SDimitry Andric 
20820b57cec5SDimitry Andric       // The 'this' adjustment accounts for both the virtual and non-virtual
20830b57cec5SDimitry Andric       // portions of the adjustment. Presumably the debugger only uses it when
20840b57cec5SDimitry Andric       // it knows the dynamic type of an object.
20850b57cec5SDimitry Andric       ThisAdjustment = CGM.getCXXABI()
20860b57cec5SDimitry Andric                            .getVirtualFunctionPrologueThisAdjustment(GD)
20870b57cec5SDimitry Andric                            .getQuantity();
20880b57cec5SDimitry Andric     }
20890b57cec5SDimitry Andric     ContainingType = RecordTy;
20900b57cec5SDimitry Andric   }
20910b57cec5SDimitry Andric 
2092480093f4SDimitry Andric   if (Method->getCanonicalDecl()->isDeleted())
2093480093f4SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagDeleted;
2094480093f4SDimitry Andric 
2095a7dea167SDimitry Andric   if (Method->isNoReturn())
2096a7dea167SDimitry Andric     Flags |= llvm::DINode::FlagNoReturn;
2097480093f4SDimitry Andric 
20980b57cec5SDimitry Andric   if (Method->isStatic())
20990b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagStaticMember;
21000b57cec5SDimitry Andric   if (Method->isImplicit())
21010b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagArtificial;
21020b57cec5SDimitry Andric   Flags |= getAccessFlag(Method->getAccess(), Method->getParent());
21030b57cec5SDimitry Andric   if (const auto *CXXC = dyn_cast<CXXConstructorDecl>(Method)) {
21040b57cec5SDimitry Andric     if (CXXC->isExplicit())
21050b57cec5SDimitry Andric       Flags |= llvm::DINode::FlagExplicit;
21060b57cec5SDimitry Andric   } else if (const auto *CXXC = dyn_cast<CXXConversionDecl>(Method)) {
21070b57cec5SDimitry Andric     if (CXXC->isExplicit())
21080b57cec5SDimitry Andric       Flags |= llvm::DINode::FlagExplicit;
21090b57cec5SDimitry Andric   }
21100b57cec5SDimitry Andric   if (Method->hasPrototype())
21110b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagPrototyped;
21120b57cec5SDimitry Andric   if (Method->getRefQualifier() == RQ_LValue)
21130b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagLValueReference;
21140b57cec5SDimitry Andric   if (Method->getRefQualifier() == RQ_RValue)
21150b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagRValueReference;
2116fe6060f1SDimitry Andric   if (!Method->isExternallyVisible())
2117fe6060f1SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
21180b57cec5SDimitry Andric   if (CGM.getLangOpts().Optimize)
21190b57cec5SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagOptimized;
21200b57cec5SDimitry Andric 
2121480093f4SDimitry Andric   // In this debug mode, emit type info for a class when its constructor type
2122480093f4SDimitry Andric   // info is emitted.
212306c3fb27SDimitry Andric   if (DebugKind == llvm::codegenoptions::DebugInfoConstructor)
2124480093f4SDimitry Andric     if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(Method))
2125e8d8bef9SDimitry Andric       completeUnusedClass(*CD->getParent());
2126480093f4SDimitry Andric 
21270b57cec5SDimitry Andric   llvm::DINodeArray TParamsArray = CollectFunctionTemplateParams(Method, Unit);
21280b57cec5SDimitry Andric   llvm::DISubprogram *SP = DBuilder.createMethod(
21290b57cec5SDimitry Andric       RecordTy, MethodName, MethodLinkageName, MethodDefUnit, MethodLine,
21300b57cec5SDimitry Andric       MethodTy, VIndex, ThisAdjustment, ContainingType, Flags, SPFlags,
21310b57cec5SDimitry Andric       TParamsArray.get());
21320b57cec5SDimitry Andric 
21330b57cec5SDimitry Andric   SPCache[Method->getCanonicalDecl()].reset(SP);
21340b57cec5SDimitry Andric 
21350b57cec5SDimitry Andric   return SP;
21360b57cec5SDimitry Andric }
21370b57cec5SDimitry Andric 
21380b57cec5SDimitry Andric void CGDebugInfo::CollectCXXMemberFunctions(
21390b57cec5SDimitry Andric     const CXXRecordDecl *RD, llvm::DIFile *Unit,
21400b57cec5SDimitry Andric     SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy) {
21410b57cec5SDimitry Andric 
21420b57cec5SDimitry Andric   // Since we want more than just the individual member decls if we
21430b57cec5SDimitry Andric   // have templated functions iterate over every declaration to gather
21440b57cec5SDimitry Andric   // the functions.
21450b57cec5SDimitry Andric   for (const auto *I : RD->decls()) {
21460b57cec5SDimitry Andric     const auto *Method = dyn_cast<CXXMethodDecl>(I);
21470b57cec5SDimitry Andric     // If the member is implicit, don't add it to the member list. This avoids
21480b57cec5SDimitry Andric     // the member being added to type units by LLVM, while still allowing it
21490b57cec5SDimitry Andric     // to be emitted into the type declaration/reference inside the compile
21500b57cec5SDimitry Andric     // unit.
21510b57cec5SDimitry Andric     // Ditto 'nodebug' methods, for consistency with CodeGenFunction.cpp.
21520b57cec5SDimitry Andric     // FIXME: Handle Using(Shadow?)Decls here to create
21530b57cec5SDimitry Andric     // DW_TAG_imported_declarations inside the class for base decls brought into
21540b57cec5SDimitry Andric     // derived classes. GDB doesn't seem to notice/leverage these when I tried
21550b57cec5SDimitry Andric     // it, so I'm not rushing to fix this. (GCC seems to produce them, if
21560b57cec5SDimitry Andric     // referenced)
21570b57cec5SDimitry Andric     if (!Method || Method->isImplicit() || Method->hasAttr<NoDebugAttr>())
21580b57cec5SDimitry Andric       continue;
21590b57cec5SDimitry Andric 
2160a7dea167SDimitry Andric     if (Method->getType()->castAs<FunctionProtoType>()->getContainedAutoType())
21610b57cec5SDimitry Andric       continue;
21620b57cec5SDimitry Andric 
21630b57cec5SDimitry Andric     // Reuse the existing member function declaration if it exists.
21640b57cec5SDimitry Andric     // It may be associated with the declaration of the type & should be
21650b57cec5SDimitry Andric     // reused as we're building the definition.
21660b57cec5SDimitry Andric     //
21670b57cec5SDimitry Andric     // This situation can arise in the vtable-based debug info reduction where
21680b57cec5SDimitry Andric     // implicit members are emitted in a non-vtable TU.
21690b57cec5SDimitry Andric     auto MI = SPCache.find(Method->getCanonicalDecl());
21700b57cec5SDimitry Andric     EltTys.push_back(MI == SPCache.end()
21710b57cec5SDimitry Andric                          ? CreateCXXMemberFunction(Method, Unit, RecordTy)
21720b57cec5SDimitry Andric                          : static_cast<llvm::Metadata *>(MI->second));
21730b57cec5SDimitry Andric   }
21740b57cec5SDimitry Andric }
21750b57cec5SDimitry Andric 
21760b57cec5SDimitry Andric void CGDebugInfo::CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile *Unit,
21770b57cec5SDimitry Andric                                   SmallVectorImpl<llvm::Metadata *> &EltTys,
21780b57cec5SDimitry Andric                                   llvm::DIType *RecordTy) {
21790b57cec5SDimitry Andric   llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> SeenTypes;
21800b57cec5SDimitry Andric   CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->bases(), SeenTypes,
21810b57cec5SDimitry Andric                      llvm::DINode::FlagZero);
21820b57cec5SDimitry Andric 
21830b57cec5SDimitry Andric   // If we are generating CodeView debug info, we also need to emit records for
21840b57cec5SDimitry Andric   // indirect virtual base classes.
21850b57cec5SDimitry Andric   if (CGM.getCodeGenOpts().EmitCodeView) {
21860b57cec5SDimitry Andric     CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->vbases(), SeenTypes,
21870b57cec5SDimitry Andric                        llvm::DINode::FlagIndirectVirtualBase);
21880b57cec5SDimitry Andric   }
21890b57cec5SDimitry Andric }
21900b57cec5SDimitry Andric 
21910b57cec5SDimitry Andric void CGDebugInfo::CollectCXXBasesAux(
21920b57cec5SDimitry Andric     const CXXRecordDecl *RD, llvm::DIFile *Unit,
21930b57cec5SDimitry Andric     SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy,
21940b57cec5SDimitry Andric     const CXXRecordDecl::base_class_const_range &Bases,
21950b57cec5SDimitry Andric     llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> &SeenTypes,
21960b57cec5SDimitry Andric     llvm::DINode::DIFlags StartingFlags) {
21970b57cec5SDimitry Andric   const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
21980b57cec5SDimitry Andric   for (const auto &BI : Bases) {
21990b57cec5SDimitry Andric     const auto *Base =
2200a7dea167SDimitry Andric         cast<CXXRecordDecl>(BI.getType()->castAs<RecordType>()->getDecl());
22010b57cec5SDimitry Andric     if (!SeenTypes.insert(Base).second)
22020b57cec5SDimitry Andric       continue;
22030b57cec5SDimitry Andric     auto *BaseTy = getOrCreateType(BI.getType(), Unit);
22040b57cec5SDimitry Andric     llvm::DINode::DIFlags BFlags = StartingFlags;
22050b57cec5SDimitry Andric     uint64_t BaseOffset;
22060b57cec5SDimitry Andric     uint32_t VBPtrOffset = 0;
22070b57cec5SDimitry Andric 
22080b57cec5SDimitry Andric     if (BI.isVirtual()) {
22090b57cec5SDimitry Andric       if (CGM.getTarget().getCXXABI().isItaniumFamily()) {
22100b57cec5SDimitry Andric         // virtual base offset offset is -ve. The code generator emits dwarf
22110b57cec5SDimitry Andric         // expression where it expects +ve number.
22120b57cec5SDimitry Andric         BaseOffset = 0 - CGM.getItaniumVTableContext()
22130b57cec5SDimitry Andric                              .getVirtualBaseOffsetOffset(RD, Base)
22140b57cec5SDimitry Andric                              .getQuantity();
22150b57cec5SDimitry Andric       } else {
22160b57cec5SDimitry Andric         // In the MS ABI, store the vbtable offset, which is analogous to the
22170b57cec5SDimitry Andric         // vbase offset offset in Itanium.
22180b57cec5SDimitry Andric         BaseOffset =
22190b57cec5SDimitry Andric             4 * CGM.getMicrosoftVTableContext().getVBTableIndex(RD, Base);
22200b57cec5SDimitry Andric         VBPtrOffset = CGM.getContext()
22210b57cec5SDimitry Andric                           .getASTRecordLayout(RD)
22220b57cec5SDimitry Andric                           .getVBPtrOffset()
22230b57cec5SDimitry Andric                           .getQuantity();
22240b57cec5SDimitry Andric       }
22250b57cec5SDimitry Andric       BFlags |= llvm::DINode::FlagVirtual;
22260b57cec5SDimitry Andric     } else
22270b57cec5SDimitry Andric       BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base));
22280b57cec5SDimitry Andric     // FIXME: Inconsistent units for BaseOffset. It is in bytes when
22290b57cec5SDimitry Andric     // BI->isVirtual() and bits when not.
22300b57cec5SDimitry Andric 
22310b57cec5SDimitry Andric     BFlags |= getAccessFlag(BI.getAccessSpecifier(), RD);
22320b57cec5SDimitry Andric     llvm::DIType *DTy = DBuilder.createInheritance(RecordTy, BaseTy, BaseOffset,
22330b57cec5SDimitry Andric                                                    VBPtrOffset, BFlags);
22340b57cec5SDimitry Andric     EltTys.push_back(DTy);
22350b57cec5SDimitry Andric   }
22360b57cec5SDimitry Andric }
22370b57cec5SDimitry Andric 
22380b57cec5SDimitry Andric llvm::DINodeArray
2239bdd1243dSDimitry Andric CGDebugInfo::CollectTemplateParams(std::optional<TemplateArgs> OArgs,
22400b57cec5SDimitry Andric                                    llvm::DIFile *Unit) {
2241349cc55cSDimitry Andric   if (!OArgs)
2242349cc55cSDimitry Andric     return llvm::DINodeArray();
2243349cc55cSDimitry Andric   TemplateArgs &Args = *OArgs;
22440b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 16> TemplateParams;
2245349cc55cSDimitry Andric   for (unsigned i = 0, e = Args.Args.size(); i != e; ++i) {
2246349cc55cSDimitry Andric     const TemplateArgument &TA = Args.Args[i];
22470b57cec5SDimitry Andric     StringRef Name;
224806c3fb27SDimitry Andric     const bool defaultParameter = TA.getIsDefaulted();
224906c3fb27SDimitry Andric     if (Args.TList)
2250349cc55cSDimitry Andric       Name = Args.TList->getParam(i)->getName();
2251bdd1243dSDimitry Andric 
22520b57cec5SDimitry Andric     switch (TA.getKind()) {
22530b57cec5SDimitry Andric     case TemplateArgument::Type: {
22540b57cec5SDimitry Andric       llvm::DIType *TTy = getOrCreateType(TA.getAsType(), Unit);
22555ffd83dbSDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateTypeParameter(
22565ffd83dbSDimitry Andric           TheCU, Name, TTy, defaultParameter));
22575ffd83dbSDimitry Andric 
22580b57cec5SDimitry Andric     } break;
22590b57cec5SDimitry Andric     case TemplateArgument::Integral: {
22600b57cec5SDimitry Andric       llvm::DIType *TTy = getOrCreateType(TA.getIntegralType(), Unit);
22610b57cec5SDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateValueParameter(
22625ffd83dbSDimitry Andric           TheCU, Name, TTy, defaultParameter,
22630b57cec5SDimitry Andric           llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())));
22640b57cec5SDimitry Andric     } break;
22650b57cec5SDimitry Andric     case TemplateArgument::Declaration: {
22660b57cec5SDimitry Andric       const ValueDecl *D = TA.getAsDecl();
22670b57cec5SDimitry Andric       QualType T = TA.getParamTypeForDecl().getDesugaredType(CGM.getContext());
22680b57cec5SDimitry Andric       llvm::DIType *TTy = getOrCreateType(T, Unit);
22690b57cec5SDimitry Andric       llvm::Constant *V = nullptr;
22700b57cec5SDimitry Andric       // Skip retrieve the value if that template parameter has cuda device
22710b57cec5SDimitry Andric       // attribute, i.e. that value is not available at the host side.
22720b57cec5SDimitry Andric       if (!CGM.getLangOpts().CUDA || CGM.getLangOpts().CUDAIsDevice ||
22730b57cec5SDimitry Andric           !D->hasAttr<CUDADeviceAttr>()) {
22740b57cec5SDimitry Andric         // Variable pointer template parameters have a value that is the address
22750b57cec5SDimitry Andric         // of the variable.
22760b57cec5SDimitry Andric         if (const auto *VD = dyn_cast<VarDecl>(D))
22770b57cec5SDimitry Andric           V = CGM.GetAddrOfGlobalVar(VD);
22780b57cec5SDimitry Andric         // Member function pointers have special support for building them,
22790b57cec5SDimitry Andric         // though this is currently unsupported in LLVM CodeGen.
22805f757f3fSDimitry Andric         else if (const auto *MD = dyn_cast<CXXMethodDecl>(D);
22815f757f3fSDimitry Andric                  MD && MD->isImplicitObjectMemberFunction())
22820b57cec5SDimitry Andric           V = CGM.getCXXABI().EmitMemberFunctionPointer(MD);
22830b57cec5SDimitry Andric         else if (const auto *FD = dyn_cast<FunctionDecl>(D))
22840b57cec5SDimitry Andric           V = CGM.GetAddrOfFunction(FD);
22850b57cec5SDimitry Andric         // Member data pointers have special handling too to compute the fixed
22860b57cec5SDimitry Andric         // offset within the object.
22870b57cec5SDimitry Andric         else if (const auto *MPT =
22880b57cec5SDimitry Andric                      dyn_cast<MemberPointerType>(T.getTypePtr())) {
22890b57cec5SDimitry Andric           // These five lines (& possibly the above member function pointer
22900b57cec5SDimitry Andric           // handling) might be able to be refactored to use similar code in
22910b57cec5SDimitry Andric           // CodeGenModule::getMemberPointerConstant
22920b57cec5SDimitry Andric           uint64_t fieldOffset = CGM.getContext().getFieldOffset(D);
22930b57cec5SDimitry Andric           CharUnits chars =
22940b57cec5SDimitry Andric               CGM.getContext().toCharUnitsFromBits((int64_t)fieldOffset);
22950b57cec5SDimitry Andric           V = CGM.getCXXABI().EmitMemberDataPointer(MPT, chars);
22965ffd83dbSDimitry Andric         } else if (const auto *GD = dyn_cast<MSGuidDecl>(D)) {
22975ffd83dbSDimitry Andric           V = CGM.GetAddrOfMSGuidDecl(GD).getPointer();
2298e8d8bef9SDimitry Andric         } else if (const auto *TPO = dyn_cast<TemplateParamObjectDecl>(D)) {
2299e8d8bef9SDimitry Andric           if (T->isRecordType())
2300e8d8bef9SDimitry Andric             V = ConstantEmitter(CGM).emitAbstract(
2301e8d8bef9SDimitry Andric                 SourceLocation(), TPO->getValue(), TPO->getType());
2302e8d8bef9SDimitry Andric           else
2303e8d8bef9SDimitry Andric             V = CGM.GetAddrOfTemplateParamObject(TPO).getPointer();
23040b57cec5SDimitry Andric         }
2305a7dea167SDimitry Andric         assert(V && "Failed to find template parameter pointer");
23060b57cec5SDimitry Andric         V = V->stripPointerCasts();
23070b57cec5SDimitry Andric       }
23080b57cec5SDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateValueParameter(
23095ffd83dbSDimitry Andric           TheCU, Name, TTy, defaultParameter, cast_or_null<llvm::Constant>(V)));
23100b57cec5SDimitry Andric     } break;
23110b57cec5SDimitry Andric     case TemplateArgument::NullPtr: {
23120b57cec5SDimitry Andric       QualType T = TA.getNullPtrType();
23130b57cec5SDimitry Andric       llvm::DIType *TTy = getOrCreateType(T, Unit);
23140b57cec5SDimitry Andric       llvm::Constant *V = nullptr;
23150b57cec5SDimitry Andric       // Special case member data pointer null values since they're actually -1
23160b57cec5SDimitry Andric       // instead of zero.
23170b57cec5SDimitry Andric       if (const auto *MPT = dyn_cast<MemberPointerType>(T.getTypePtr()))
23180b57cec5SDimitry Andric         // But treat member function pointers as simple zero integers because
23190b57cec5SDimitry Andric         // it's easier than having a special case in LLVM's CodeGen. If LLVM
23200b57cec5SDimitry Andric         // CodeGen grows handling for values of non-null member function
23210b57cec5SDimitry Andric         // pointers then perhaps we could remove this special case and rely on
23220b57cec5SDimitry Andric         // EmitNullMemberPointer for member function pointers.
23230b57cec5SDimitry Andric         if (MPT->isMemberDataPointer())
23240b57cec5SDimitry Andric           V = CGM.getCXXABI().EmitNullMemberPointer(MPT);
23250b57cec5SDimitry Andric       if (!V)
23260b57cec5SDimitry Andric         V = llvm::ConstantInt::get(CGM.Int8Ty, 0);
23275ffd83dbSDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateValueParameter(
23285ffd83dbSDimitry Andric           TheCU, Name, TTy, defaultParameter, V));
23290b57cec5SDimitry Andric     } break;
23307a6dacacSDimitry Andric     case TemplateArgument::StructuralValue: {
23317a6dacacSDimitry Andric       QualType T = TA.getStructuralValueType();
23327a6dacacSDimitry Andric       llvm::DIType *TTy = getOrCreateType(T, Unit);
23337a6dacacSDimitry Andric       llvm::Constant *V = ConstantEmitter(CGM).emitAbstract(
23347a6dacacSDimitry Andric           SourceLocation(), TA.getAsStructuralValue(), T);
23357a6dacacSDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateValueParameter(
23367a6dacacSDimitry Andric           TheCU, Name, TTy, defaultParameter, V));
23377a6dacacSDimitry Andric     } break;
2338349cc55cSDimitry Andric     case TemplateArgument::Template: {
2339349cc55cSDimitry Andric       std::string QualName;
2340349cc55cSDimitry Andric       llvm::raw_string_ostream OS(QualName);
2341349cc55cSDimitry Andric       TA.getAsTemplate().getAsTemplateDecl()->printQualifiedName(
2342349cc55cSDimitry Andric           OS, getPrintingPolicy());
23430b57cec5SDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateTemplateParameter(
2344bdd1243dSDimitry Andric           TheCU, Name, nullptr, OS.str(), defaultParameter));
23450b57cec5SDimitry Andric       break;
2346349cc55cSDimitry Andric     }
23470b57cec5SDimitry Andric     case TemplateArgument::Pack:
23480b57cec5SDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateParameterPack(
23490b57cec5SDimitry Andric           TheCU, Name, nullptr,
2350349cc55cSDimitry Andric           CollectTemplateParams({{nullptr, TA.getPackAsArray()}}, Unit)));
23510b57cec5SDimitry Andric       break;
23520b57cec5SDimitry Andric     case TemplateArgument::Expression: {
23530b57cec5SDimitry Andric       const Expr *E = TA.getAsExpr();
23540b57cec5SDimitry Andric       QualType T = E->getType();
23550b57cec5SDimitry Andric       if (E->isGLValue())
23560b57cec5SDimitry Andric         T = CGM.getContext().getLValueReferenceType(T);
23570b57cec5SDimitry Andric       llvm::Constant *V = ConstantEmitter(CGM).emitAbstract(E, T);
23580b57cec5SDimitry Andric       assert(V && "Expression in template argument isn't constant");
23590b57cec5SDimitry Andric       llvm::DIType *TTy = getOrCreateType(T, Unit);
23600b57cec5SDimitry Andric       TemplateParams.push_back(DBuilder.createTemplateValueParameter(
23615ffd83dbSDimitry Andric           TheCU, Name, TTy, defaultParameter, V->stripPointerCasts()));
23620b57cec5SDimitry Andric     } break;
23630b57cec5SDimitry Andric     // And the following should never occur:
23640b57cec5SDimitry Andric     case TemplateArgument::TemplateExpansion:
23650b57cec5SDimitry Andric     case TemplateArgument::Null:
23660b57cec5SDimitry Andric       llvm_unreachable(
23670b57cec5SDimitry Andric           "These argument types shouldn't exist in concrete types");
23680b57cec5SDimitry Andric     }
23690b57cec5SDimitry Andric   }
23700b57cec5SDimitry Andric   return DBuilder.getOrCreateArray(TemplateParams);
23710b57cec5SDimitry Andric }
23720b57cec5SDimitry Andric 
2373bdd1243dSDimitry Andric std::optional<CGDebugInfo::TemplateArgs>
2374349cc55cSDimitry Andric CGDebugInfo::GetTemplateArgs(const FunctionDecl *FD) const {
23750b57cec5SDimitry Andric   if (FD->getTemplatedKind() ==
23760b57cec5SDimitry Andric       FunctionDecl::TK_FunctionTemplateSpecialization) {
23770b57cec5SDimitry Andric     const TemplateParameterList *TList = FD->getTemplateSpecializationInfo()
23780b57cec5SDimitry Andric                                              ->getTemplate()
23790b57cec5SDimitry Andric                                              ->getTemplateParameters();
2380349cc55cSDimitry Andric     return {{TList, FD->getTemplateSpecializationArgs()->asArray()}};
23810b57cec5SDimitry Andric   }
2382bdd1243dSDimitry Andric   return std::nullopt;
23830b57cec5SDimitry Andric }
2384bdd1243dSDimitry Andric std::optional<CGDebugInfo::TemplateArgs>
2385349cc55cSDimitry Andric CGDebugInfo::GetTemplateArgs(const VarDecl *VD) const {
23860b57cec5SDimitry Andric   // Always get the full list of parameters, not just the ones from the
23870b57cec5SDimitry Andric   // specialization. A partial specialization may have fewer parameters than
23880b57cec5SDimitry Andric   // there are arguments.
2389349cc55cSDimitry Andric   auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VD);
23900b57cec5SDimitry Andric   if (!TS)
2391bdd1243dSDimitry Andric     return std::nullopt;
23920b57cec5SDimitry Andric   VarTemplateDecl *T = TS->getSpecializedTemplate();
23930b57cec5SDimitry Andric   const TemplateParameterList *TList = T->getTemplateParameters();
23940b57cec5SDimitry Andric   auto TA = TS->getTemplateArgs().asArray();
2395349cc55cSDimitry Andric   return {{TList, TA}};
23960b57cec5SDimitry Andric }
2397bdd1243dSDimitry Andric std::optional<CGDebugInfo::TemplateArgs>
2398349cc55cSDimitry Andric CGDebugInfo::GetTemplateArgs(const RecordDecl *RD) const {
2399349cc55cSDimitry Andric   if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
24000b57cec5SDimitry Andric     // Always get the full list of parameters, not just the ones from the
24010b57cec5SDimitry Andric     // specialization. A partial specialization may have fewer parameters than
24020b57cec5SDimitry Andric     // there are arguments.
24030b57cec5SDimitry Andric     TemplateParameterList *TPList =
24040b57cec5SDimitry Andric         TSpecial->getSpecializedTemplate()->getTemplateParameters();
24050b57cec5SDimitry Andric     const TemplateArgumentList &TAList = TSpecial->getTemplateArgs();
2406349cc55cSDimitry Andric     return {{TPList, TAList.asArray()}};
2407349cc55cSDimitry Andric   }
2408bdd1243dSDimitry Andric   return std::nullopt;
2409349cc55cSDimitry Andric }
2410349cc55cSDimitry Andric 
2411349cc55cSDimitry Andric llvm::DINodeArray
2412349cc55cSDimitry Andric CGDebugInfo::CollectFunctionTemplateParams(const FunctionDecl *FD,
2413349cc55cSDimitry Andric                                            llvm::DIFile *Unit) {
2414349cc55cSDimitry Andric   return CollectTemplateParams(GetTemplateArgs(FD), Unit);
2415349cc55cSDimitry Andric }
2416349cc55cSDimitry Andric 
2417349cc55cSDimitry Andric llvm::DINodeArray CGDebugInfo::CollectVarTemplateParams(const VarDecl *VL,
2418349cc55cSDimitry Andric                                                         llvm::DIFile *Unit) {
2419349cc55cSDimitry Andric   return CollectTemplateParams(GetTemplateArgs(VL), Unit);
2420349cc55cSDimitry Andric }
2421349cc55cSDimitry Andric 
2422349cc55cSDimitry Andric llvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams(const RecordDecl *RD,
2423349cc55cSDimitry Andric                                                         llvm::DIFile *Unit) {
2424349cc55cSDimitry Andric   return CollectTemplateParams(GetTemplateArgs(RD), Unit);
2425349cc55cSDimitry Andric }
2426349cc55cSDimitry Andric 
2427349cc55cSDimitry Andric llvm::DINodeArray CGDebugInfo::CollectBTFDeclTagAnnotations(const Decl *D) {
2428349cc55cSDimitry Andric   if (!D->hasAttr<BTFDeclTagAttr>())
2429349cc55cSDimitry Andric     return nullptr;
2430349cc55cSDimitry Andric 
2431349cc55cSDimitry Andric   SmallVector<llvm::Metadata *, 4> Annotations;
2432349cc55cSDimitry Andric   for (const auto *I : D->specific_attrs<BTFDeclTagAttr>()) {
2433349cc55cSDimitry Andric     llvm::Metadata *Ops[2] = {
2434349cc55cSDimitry Andric         llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_decl_tag")),
2435349cc55cSDimitry Andric         llvm::MDString::get(CGM.getLLVMContext(), I->getBTFDeclTag())};
2436349cc55cSDimitry Andric     Annotations.push_back(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
2437349cc55cSDimitry Andric   }
2438349cc55cSDimitry Andric   return DBuilder.getOrCreateArray(Annotations);
24390b57cec5SDimitry Andric }
24400b57cec5SDimitry Andric 
24410b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) {
24420b57cec5SDimitry Andric   if (VTablePtrType)
24430b57cec5SDimitry Andric     return VTablePtrType;
24440b57cec5SDimitry Andric 
24450b57cec5SDimitry Andric   ASTContext &Context = CGM.getContext();
24460b57cec5SDimitry Andric 
24470b57cec5SDimitry Andric   /* Function type */
24480b57cec5SDimitry Andric   llvm::Metadata *STy = getOrCreateType(Context.IntTy, Unit);
24490b57cec5SDimitry Andric   llvm::DITypeRefArray SElements = DBuilder.getOrCreateTypeArray(STy);
24500b57cec5SDimitry Andric   llvm::DIType *SubTy = DBuilder.createSubroutineType(SElements);
24510b57cec5SDimitry Andric   unsigned Size = Context.getTypeSize(Context.VoidPtrTy);
24520b57cec5SDimitry Andric   unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace();
2453bdd1243dSDimitry Andric   std::optional<unsigned> DWARFAddressSpace =
24540b57cec5SDimitry Andric       CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace);
24550b57cec5SDimitry Andric 
24560b57cec5SDimitry Andric   llvm::DIType *vtbl_ptr_type = DBuilder.createPointerType(
24570b57cec5SDimitry Andric       SubTy, Size, 0, DWARFAddressSpace, "__vtbl_ptr_type");
24580b57cec5SDimitry Andric   VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size);
24590b57cec5SDimitry Andric   return VTablePtrType;
24600b57cec5SDimitry Andric }
24610b57cec5SDimitry Andric 
24620b57cec5SDimitry Andric StringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) {
24630b57cec5SDimitry Andric   // Copy the gdb compatible name on the side and use its reference.
24640b57cec5SDimitry Andric   return internString("_vptr$", RD->getNameAsString());
24650b57cec5SDimitry Andric }
24660b57cec5SDimitry Andric 
24670b57cec5SDimitry Andric StringRef CGDebugInfo::getDynamicInitializerName(const VarDecl *VD,
24680b57cec5SDimitry Andric                                                  DynamicInitKind StubKind,
24690b57cec5SDimitry Andric                                                  llvm::Function *InitFn) {
24700b57cec5SDimitry Andric   // If we're not emitting codeview, use the mangled name. For Itanium, this is
24710b57cec5SDimitry Andric   // arbitrary.
2472e8d8bef9SDimitry Andric   if (!CGM.getCodeGenOpts().EmitCodeView ||
2473e8d8bef9SDimitry Andric       StubKind == DynamicInitKind::GlobalArrayDestructor)
24740b57cec5SDimitry Andric     return InitFn->getName();
24750b57cec5SDimitry Andric 
24760b57cec5SDimitry Andric   // Print the normal qualified name for the variable, then break off the last
24770b57cec5SDimitry Andric   // NNS, and add the appropriate other text. Clang always prints the global
24780b57cec5SDimitry Andric   // variable name without template arguments, so we can use rsplit("::") and
24790b57cec5SDimitry Andric   // then recombine the pieces.
24800b57cec5SDimitry Andric   SmallString<128> QualifiedGV;
24810b57cec5SDimitry Andric   StringRef Quals;
24820b57cec5SDimitry Andric   StringRef GVName;
24830b57cec5SDimitry Andric   {
24840b57cec5SDimitry Andric     llvm::raw_svector_ostream OS(QualifiedGV);
24850b57cec5SDimitry Andric     VD->printQualifiedName(OS, getPrintingPolicy());
24860b57cec5SDimitry Andric     std::tie(Quals, GVName) = OS.str().rsplit("::");
24870b57cec5SDimitry Andric     if (GVName.empty())
24880b57cec5SDimitry Andric       std::swap(Quals, GVName);
24890b57cec5SDimitry Andric   }
24900b57cec5SDimitry Andric 
24910b57cec5SDimitry Andric   SmallString<128> InitName;
24920b57cec5SDimitry Andric   llvm::raw_svector_ostream OS(InitName);
24930b57cec5SDimitry Andric   if (!Quals.empty())
24940b57cec5SDimitry Andric     OS << Quals << "::";
24950b57cec5SDimitry Andric 
24960b57cec5SDimitry Andric   switch (StubKind) {
24970b57cec5SDimitry Andric   case DynamicInitKind::NoStub:
2498e8d8bef9SDimitry Andric   case DynamicInitKind::GlobalArrayDestructor:
24990b57cec5SDimitry Andric     llvm_unreachable("not an initializer");
25000b57cec5SDimitry Andric   case DynamicInitKind::Initializer:
25010b57cec5SDimitry Andric     OS << "`dynamic initializer for '";
25020b57cec5SDimitry Andric     break;
25030b57cec5SDimitry Andric   case DynamicInitKind::AtExit:
25040b57cec5SDimitry Andric     OS << "`dynamic atexit destructor for '";
25050b57cec5SDimitry Andric     break;
25060b57cec5SDimitry Andric   }
25070b57cec5SDimitry Andric 
25080b57cec5SDimitry Andric   OS << GVName;
25090b57cec5SDimitry Andric 
25100b57cec5SDimitry Andric   // Add any template specialization args.
25110b57cec5SDimitry Andric   if (const auto *VTpl = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
25120b57cec5SDimitry Andric     printTemplateArgumentList(OS, VTpl->getTemplateArgs().asArray(),
25130b57cec5SDimitry Andric                               getPrintingPolicy());
25140b57cec5SDimitry Andric   }
25150b57cec5SDimitry Andric 
25160b57cec5SDimitry Andric   OS << '\'';
25170b57cec5SDimitry Andric 
25180b57cec5SDimitry Andric   return internString(OS.str());
25190b57cec5SDimitry Andric }
25200b57cec5SDimitry Andric 
25210b57cec5SDimitry Andric void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,
2522e8d8bef9SDimitry Andric                                     SmallVectorImpl<llvm::Metadata *> &EltTys) {
25230b57cec5SDimitry Andric   // If this class is not dynamic then there is not any vtable info to collect.
25240b57cec5SDimitry Andric   if (!RD->isDynamicClass())
25250b57cec5SDimitry Andric     return;
25260b57cec5SDimitry Andric 
25270b57cec5SDimitry Andric   // Don't emit any vtable shape or vptr info if this class doesn't have an
25280b57cec5SDimitry Andric   // extendable vfptr. This can happen if the class doesn't have virtual
25290b57cec5SDimitry Andric   // methods, or in the MS ABI if those virtual methods only come from virtually
25300b57cec5SDimitry Andric   // inherited bases.
25310b57cec5SDimitry Andric   const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
25320b57cec5SDimitry Andric   if (!RL.hasExtendableVFPtr())
25330b57cec5SDimitry Andric     return;
25340b57cec5SDimitry Andric 
25350b57cec5SDimitry Andric   // CodeView needs to know how large the vtable of every dynamic class is, so
25360b57cec5SDimitry Andric   // emit a special named pointer type into the element list. The vptr type
25370b57cec5SDimitry Andric   // points to this type as well.
25380b57cec5SDimitry Andric   llvm::DIType *VPtrTy = nullptr;
25390b57cec5SDimitry Andric   bool NeedVTableShape = CGM.getCodeGenOpts().EmitCodeView &&
25400b57cec5SDimitry Andric                          CGM.getTarget().getCXXABI().isMicrosoft();
25410b57cec5SDimitry Andric   if (NeedVTableShape) {
25420b57cec5SDimitry Andric     uint64_t PtrWidth =
25430b57cec5SDimitry Andric         CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
25440b57cec5SDimitry Andric     const VTableLayout &VFTLayout =
25450b57cec5SDimitry Andric         CGM.getMicrosoftVTableContext().getVFTableLayout(RD, CharUnits::Zero());
25460b57cec5SDimitry Andric     unsigned VSlotCount =
25470b57cec5SDimitry Andric         VFTLayout.vtable_components().size() - CGM.getLangOpts().RTTIData;
25480b57cec5SDimitry Andric     unsigned VTableWidth = PtrWidth * VSlotCount;
25490b57cec5SDimitry Andric     unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace();
2550bdd1243dSDimitry Andric     std::optional<unsigned> DWARFAddressSpace =
25510b57cec5SDimitry Andric         CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace);
25520b57cec5SDimitry Andric 
25530b57cec5SDimitry Andric     // Create a very wide void* type and insert it directly in the element list.
25540b57cec5SDimitry Andric     llvm::DIType *VTableType = DBuilder.createPointerType(
25550b57cec5SDimitry Andric         nullptr, VTableWidth, 0, DWARFAddressSpace, "__vtbl_ptr_type");
25560b57cec5SDimitry Andric     EltTys.push_back(VTableType);
25570b57cec5SDimitry Andric 
25580b57cec5SDimitry Andric     // The vptr is a pointer to this special vtable type.
25590b57cec5SDimitry Andric     VPtrTy = DBuilder.createPointerType(VTableType, PtrWidth);
25600b57cec5SDimitry Andric   }
25610b57cec5SDimitry Andric 
25620b57cec5SDimitry Andric   // If there is a primary base then the artificial vptr member lives there.
25630b57cec5SDimitry Andric   if (RL.getPrimaryBase())
25640b57cec5SDimitry Andric     return;
25650b57cec5SDimitry Andric 
25660b57cec5SDimitry Andric   if (!VPtrTy)
25670b57cec5SDimitry Andric     VPtrTy = getOrCreateVTablePtrType(Unit);
25680b57cec5SDimitry Andric 
25690b57cec5SDimitry Andric   unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
25700b57cec5SDimitry Andric   llvm::DIType *VPtrMember =
25710b57cec5SDimitry Andric       DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 0, Size, 0, 0,
25720b57cec5SDimitry Andric                                 llvm::DINode::FlagArtificial, VPtrTy);
25730b57cec5SDimitry Andric   EltTys.push_back(VPtrMember);
25740b57cec5SDimitry Andric }
25750b57cec5SDimitry Andric 
25760b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy,
25770b57cec5SDimitry Andric                                                  SourceLocation Loc) {
2578480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
25790b57cec5SDimitry Andric   llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc));
25800b57cec5SDimitry Andric   return T;
25810b57cec5SDimitry Andric }
25820b57cec5SDimitry Andric 
25830b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::getOrCreateInterfaceType(QualType D,
25840b57cec5SDimitry Andric                                                     SourceLocation Loc) {
25850b57cec5SDimitry Andric   return getOrCreateStandaloneType(D, Loc);
25860b57cec5SDimitry Andric }
25870b57cec5SDimitry Andric 
25880b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D,
25890b57cec5SDimitry Andric                                                      SourceLocation Loc) {
2590480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
25910b57cec5SDimitry Andric   assert(!D.isNull() && "null type");
25920b57cec5SDimitry Andric   llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
25930b57cec5SDimitry Andric   assert(T && "could not create debug info for type");
25940b57cec5SDimitry Andric 
25950b57cec5SDimitry Andric   RetainedTypes.push_back(D.getAsOpaquePtr());
25960b57cec5SDimitry Andric   return T;
25970b57cec5SDimitry Andric }
25980b57cec5SDimitry Andric 
25995ffd83dbSDimitry Andric void CGDebugInfo::addHeapAllocSiteMetadata(llvm::CallBase *CI,
26005ffd83dbSDimitry Andric                                            QualType AllocatedTy,
26010b57cec5SDimitry Andric                                            SourceLocation Loc) {
26025ffd83dbSDimitry Andric   if (CGM.getCodeGenOpts().getDebugInfo() <=
260306c3fb27SDimitry Andric       llvm::codegenoptions::DebugLineTablesOnly)
26045ffd83dbSDimitry Andric     return;
26050b57cec5SDimitry Andric   llvm::MDNode *node;
26065ffd83dbSDimitry Andric   if (AllocatedTy->isVoidType())
2607bdd1243dSDimitry Andric     node = llvm::MDNode::get(CGM.getLLVMContext(), std::nullopt);
26085ffd83dbSDimitry Andric   else
26095ffd83dbSDimitry Andric     node = getOrCreateType(AllocatedTy, getOrCreateFile(Loc));
26100b57cec5SDimitry Andric 
26110b57cec5SDimitry Andric   CI->setMetadata("heapallocsite", node);
26120b57cec5SDimitry Andric }
26130b57cec5SDimitry Andric 
26140b57cec5SDimitry Andric void CGDebugInfo::completeType(const EnumDecl *ED) {
261506c3fb27SDimitry Andric   if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
26160b57cec5SDimitry Andric     return;
26170b57cec5SDimitry Andric   QualType Ty = CGM.getContext().getEnumType(ED);
26180b57cec5SDimitry Andric   void *TyPtr = Ty.getAsOpaquePtr();
26190b57cec5SDimitry Andric   auto I = TypeCache.find(TyPtr);
26200b57cec5SDimitry Andric   if (I == TypeCache.end() || !cast<llvm::DIType>(I->second)->isForwardDecl())
26210b57cec5SDimitry Andric     return;
26220b57cec5SDimitry Andric   llvm::DIType *Res = CreateTypeDefinition(Ty->castAs<EnumType>());
26230b57cec5SDimitry Andric   assert(!Res->isForwardDecl());
26240b57cec5SDimitry Andric   TypeCache[TyPtr].reset(Res);
26250b57cec5SDimitry Andric }
26260b57cec5SDimitry Andric 
26270b57cec5SDimitry Andric void CGDebugInfo::completeType(const RecordDecl *RD) {
262806c3fb27SDimitry Andric   if (DebugKind > llvm::codegenoptions::LimitedDebugInfo ||
26290b57cec5SDimitry Andric       !CGM.getLangOpts().CPlusPlus)
26300b57cec5SDimitry Andric     completeRequiredType(RD);
26310b57cec5SDimitry Andric }
26320b57cec5SDimitry Andric 
26330b57cec5SDimitry Andric /// Return true if the class or any of its methods are marked dllimport.
26340b57cec5SDimitry Andric static bool isClassOrMethodDLLImport(const CXXRecordDecl *RD) {
26350b57cec5SDimitry Andric   if (RD->hasAttr<DLLImportAttr>())
26360b57cec5SDimitry Andric     return true;
26370b57cec5SDimitry Andric   for (const CXXMethodDecl *MD : RD->methods())
26380b57cec5SDimitry Andric     if (MD->hasAttr<DLLImportAttr>())
26390b57cec5SDimitry Andric       return true;
26400b57cec5SDimitry Andric   return false;
26410b57cec5SDimitry Andric }
26420b57cec5SDimitry Andric 
26430b57cec5SDimitry Andric /// Does a type definition exist in an imported clang module?
26440b57cec5SDimitry Andric static bool isDefinedInClangModule(const RecordDecl *RD) {
26450b57cec5SDimitry Andric   // Only definitions that where imported from an AST file come from a module.
26460b57cec5SDimitry Andric   if (!RD || !RD->isFromASTFile())
26470b57cec5SDimitry Andric     return false;
26480b57cec5SDimitry Andric   // Anonymous entities cannot be addressed. Treat them as not from module.
26490b57cec5SDimitry Andric   if (!RD->isExternallyVisible() && RD->getName().empty())
26500b57cec5SDimitry Andric     return false;
26510b57cec5SDimitry Andric   if (auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) {
26520b57cec5SDimitry Andric     if (!CXXDecl->isCompleteDefinition())
26530b57cec5SDimitry Andric       return false;
26540b57cec5SDimitry Andric     // Check wether RD is a template.
26550b57cec5SDimitry Andric     auto TemplateKind = CXXDecl->getTemplateSpecializationKind();
26560b57cec5SDimitry Andric     if (TemplateKind != TSK_Undeclared) {
26570b57cec5SDimitry Andric       // Unfortunately getOwningModule() isn't accurate enough to find the
26580b57cec5SDimitry Andric       // owning module of a ClassTemplateSpecializationDecl that is inside a
26590b57cec5SDimitry Andric       // namespace spanning multiple modules.
26600b57cec5SDimitry Andric       bool Explicit = false;
26610b57cec5SDimitry Andric       if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(CXXDecl))
26620b57cec5SDimitry Andric         Explicit = TD->isExplicitInstantiationOrSpecialization();
26630b57cec5SDimitry Andric       if (!Explicit && CXXDecl->getEnclosingNamespaceContext())
26640b57cec5SDimitry Andric         return false;
26650b57cec5SDimitry Andric       // This is a template, check the origin of the first member.
26660b57cec5SDimitry Andric       if (CXXDecl->field_begin() == CXXDecl->field_end())
26670b57cec5SDimitry Andric         return TemplateKind == TSK_ExplicitInstantiationDeclaration;
26680b57cec5SDimitry Andric       if (!CXXDecl->field_begin()->isFromASTFile())
26690b57cec5SDimitry Andric         return false;
26700b57cec5SDimitry Andric     }
26710b57cec5SDimitry Andric   }
26720b57cec5SDimitry Andric   return true;
26730b57cec5SDimitry Andric }
26740b57cec5SDimitry Andric 
26750b57cec5SDimitry Andric void CGDebugInfo::completeClassData(const RecordDecl *RD) {
26760b57cec5SDimitry Andric   if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
26770b57cec5SDimitry Andric     if (CXXRD->isDynamicClass() &&
26780b57cec5SDimitry Andric         CGM.getVTableLinkage(CXXRD) ==
26790b57cec5SDimitry Andric             llvm::GlobalValue::AvailableExternallyLinkage &&
26800b57cec5SDimitry Andric         !isClassOrMethodDLLImport(CXXRD))
26810b57cec5SDimitry Andric       return;
26820b57cec5SDimitry Andric 
26830b57cec5SDimitry Andric   if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition()))
26840b57cec5SDimitry Andric     return;
26850b57cec5SDimitry Andric 
26860b57cec5SDimitry Andric   completeClass(RD);
26870b57cec5SDimitry Andric }
26880b57cec5SDimitry Andric 
26890b57cec5SDimitry Andric void CGDebugInfo::completeClass(const RecordDecl *RD) {
269006c3fb27SDimitry Andric   if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
26910b57cec5SDimitry Andric     return;
26920b57cec5SDimitry Andric   QualType Ty = CGM.getContext().getRecordType(RD);
26930b57cec5SDimitry Andric   void *TyPtr = Ty.getAsOpaquePtr();
26940b57cec5SDimitry Andric   auto I = TypeCache.find(TyPtr);
26950b57cec5SDimitry Andric   if (I != TypeCache.end() && !cast<llvm::DIType>(I->second)->isForwardDecl())
26960b57cec5SDimitry Andric     return;
269706c3fb27SDimitry Andric 
269806c3fb27SDimitry Andric   // We want the canonical definition of the structure to not
269906c3fb27SDimitry Andric   // be the typedef. Since that would lead to circular typedef
270006c3fb27SDimitry Andric   // metadata.
270106c3fb27SDimitry Andric   auto [Res, PrefRes] = CreateTypeDefinition(Ty->castAs<RecordType>());
27020b57cec5SDimitry Andric   assert(!Res->isForwardDecl());
27030b57cec5SDimitry Andric   TypeCache[TyPtr].reset(Res);
27040b57cec5SDimitry Andric }
27050b57cec5SDimitry Andric 
27060b57cec5SDimitry Andric static bool hasExplicitMemberDefinition(CXXRecordDecl::method_iterator I,
27070b57cec5SDimitry Andric                                         CXXRecordDecl::method_iterator End) {
27080b57cec5SDimitry Andric   for (CXXMethodDecl *MD : llvm::make_range(I, End))
27090b57cec5SDimitry Andric     if (FunctionDecl *Tmpl = MD->getInstantiatedFromMemberFunction())
27100b57cec5SDimitry Andric       if (!Tmpl->isImplicit() && Tmpl->isThisDeclarationADefinition() &&
27110b57cec5SDimitry Andric           !MD->getMemberSpecializationInfo()->isExplicitSpecialization())
27120b57cec5SDimitry Andric         return true;
27130b57cec5SDimitry Andric   return false;
27140b57cec5SDimitry Andric }
27150b57cec5SDimitry Andric 
2716e8d8bef9SDimitry Andric static bool canUseCtorHoming(const CXXRecordDecl *RD) {
2717e8d8bef9SDimitry Andric   // Constructor homing can be used for classes that cannnot be constructed
2718e8d8bef9SDimitry Andric   // without emitting code for one of their constructors. This is classes that
2719e8d8bef9SDimitry Andric   // don't have trivial or constexpr constructors, or can be created from
2720e8d8bef9SDimitry Andric   // aggregate initialization. Also skip lambda objects because they don't call
2721e8d8bef9SDimitry Andric   // constructors.
2722e8d8bef9SDimitry Andric 
2723e8d8bef9SDimitry Andric   // Skip this optimization if the class or any of its methods are marked
2724e8d8bef9SDimitry Andric   // dllimport.
2725e8d8bef9SDimitry Andric   if (isClassOrMethodDLLImport(RD))
2726e8d8bef9SDimitry Andric     return false;
2727e8d8bef9SDimitry Andric 
272806c3fb27SDimitry Andric   if (RD->isLambda() || RD->isAggregate() ||
272906c3fb27SDimitry Andric       RD->hasTrivialDefaultConstructor() ||
273006c3fb27SDimitry Andric       RD->hasConstexprNonCopyMoveConstructor())
273106c3fb27SDimitry Andric     return false;
273206c3fb27SDimitry Andric 
273306c3fb27SDimitry Andric   for (const CXXConstructorDecl *Ctor : RD->ctors()) {
273406c3fb27SDimitry Andric     if (Ctor->isCopyOrMoveConstructor())
273506c3fb27SDimitry Andric       continue;
273606c3fb27SDimitry Andric     if (!Ctor->isDeleted())
273706c3fb27SDimitry Andric       return true;
273806c3fb27SDimitry Andric   }
273906c3fb27SDimitry Andric   return false;
2740e8d8bef9SDimitry Andric }
2741e8d8bef9SDimitry Andric 
274206c3fb27SDimitry Andric static bool shouldOmitDefinition(llvm::codegenoptions::DebugInfoKind DebugKind,
27430b57cec5SDimitry Andric                                  bool DebugTypeExtRefs, const RecordDecl *RD,
27440b57cec5SDimitry Andric                                  const LangOptions &LangOpts) {
27450b57cec5SDimitry Andric   if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition()))
27460b57cec5SDimitry Andric     return true;
27470b57cec5SDimitry Andric 
27480b57cec5SDimitry Andric   if (auto *ES = RD->getASTContext().getExternalSource())
27490b57cec5SDimitry Andric     if (ES->hasExternalDefinitions(RD) == ExternalASTSource::EK_Always)
27500b57cec5SDimitry Andric       return true;
27510b57cec5SDimitry Andric 
2752e8d8bef9SDimitry Andric   // Only emit forward declarations in line tables only to keep debug info size
2753e8d8bef9SDimitry Andric   // small. This only applies to CodeView, since we don't emit types in DWARF
2754e8d8bef9SDimitry Andric   // line tables only.
275506c3fb27SDimitry Andric   if (DebugKind == llvm::codegenoptions::DebugLineTablesOnly)
2756e8d8bef9SDimitry Andric     return true;
2757e8d8bef9SDimitry Andric 
275806c3fb27SDimitry Andric   if (DebugKind > llvm::codegenoptions::LimitedDebugInfo ||
2759fe6060f1SDimitry Andric       RD->hasAttr<StandaloneDebugAttr>())
27600b57cec5SDimitry Andric     return false;
27610b57cec5SDimitry Andric 
27620b57cec5SDimitry Andric   if (!LangOpts.CPlusPlus)
27630b57cec5SDimitry Andric     return false;
27640b57cec5SDimitry Andric 
27650b57cec5SDimitry Andric   if (!RD->isCompleteDefinitionRequired())
27660b57cec5SDimitry Andric     return true;
27670b57cec5SDimitry Andric 
27680b57cec5SDimitry Andric   const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
27690b57cec5SDimitry Andric 
27700b57cec5SDimitry Andric   if (!CXXDecl)
27710b57cec5SDimitry Andric     return false;
27720b57cec5SDimitry Andric 
27730b57cec5SDimitry Andric   // Only emit complete debug info for a dynamic class when its vtable is
27740b57cec5SDimitry Andric   // emitted.  However, Microsoft debuggers don't resolve type information
27750b57cec5SDimitry Andric   // across DLL boundaries, so skip this optimization if the class or any of its
27760b57cec5SDimitry Andric   // methods are marked dllimport. This isn't a complete solution, since objects
27770b57cec5SDimitry Andric   // without any dllimport methods can be used in one DLL and constructed in
27780b57cec5SDimitry Andric   // another, but it is the current behavior of LimitedDebugInfo.
27790b57cec5SDimitry Andric   if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass() &&
27800b57cec5SDimitry Andric       !isClassOrMethodDLLImport(CXXDecl))
27810b57cec5SDimitry Andric     return true;
27820b57cec5SDimitry Andric 
27830b57cec5SDimitry Andric   TemplateSpecializationKind Spec = TSK_Undeclared;
27840b57cec5SDimitry Andric   if (const auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
27850b57cec5SDimitry Andric     Spec = SD->getSpecializationKind();
27860b57cec5SDimitry Andric 
27870b57cec5SDimitry Andric   if (Spec == TSK_ExplicitInstantiationDeclaration &&
27880b57cec5SDimitry Andric       hasExplicitMemberDefinition(CXXDecl->method_begin(),
27890b57cec5SDimitry Andric                                   CXXDecl->method_end()))
27900b57cec5SDimitry Andric     return true;
27910b57cec5SDimitry Andric 
2792e8d8bef9SDimitry Andric   // In constructor homing mode, only emit complete debug info for a class
2793e8d8bef9SDimitry Andric   // when its constructor is emitted.
279406c3fb27SDimitry Andric   if ((DebugKind == llvm::codegenoptions::DebugInfoConstructor) &&
2795e8d8bef9SDimitry Andric       canUseCtorHoming(CXXDecl))
2796e8d8bef9SDimitry Andric     return true;
2797e8d8bef9SDimitry Andric 
27980b57cec5SDimitry Andric   return false;
27990b57cec5SDimitry Andric }
28000b57cec5SDimitry Andric 
28010b57cec5SDimitry Andric void CGDebugInfo::completeRequiredType(const RecordDecl *RD) {
28020b57cec5SDimitry Andric   if (shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD, CGM.getLangOpts()))
28030b57cec5SDimitry Andric     return;
28040b57cec5SDimitry Andric 
28050b57cec5SDimitry Andric   QualType Ty = CGM.getContext().getRecordType(RD);
28060b57cec5SDimitry Andric   llvm::DIType *T = getTypeOrNull(Ty);
28070b57cec5SDimitry Andric   if (T && T->isForwardDecl())
28080b57cec5SDimitry Andric     completeClassData(RD);
28090b57cec5SDimitry Andric }
28100b57cec5SDimitry Andric 
28110b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const RecordType *Ty) {
28120b57cec5SDimitry Andric   RecordDecl *RD = Ty->getDecl();
28130b57cec5SDimitry Andric   llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(QualType(Ty, 0)));
28140b57cec5SDimitry Andric   if (T || shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD,
28150b57cec5SDimitry Andric                                 CGM.getLangOpts())) {
28160b57cec5SDimitry Andric     if (!T)
28170b57cec5SDimitry Andric       T = getOrCreateRecordFwdDecl(Ty, getDeclContextDescriptor(RD));
28180b57cec5SDimitry Andric     return T;
28190b57cec5SDimitry Andric   }
28200b57cec5SDimitry Andric 
282106c3fb27SDimitry Andric   auto [Def, Pref] = CreateTypeDefinition(Ty);
282206c3fb27SDimitry Andric 
282306c3fb27SDimitry Andric   return Pref ? Pref : Def;
28240b57cec5SDimitry Andric }
28250b57cec5SDimitry Andric 
282606c3fb27SDimitry Andric llvm::DIType *CGDebugInfo::GetPreferredNameType(const CXXRecordDecl *RD,
282706c3fb27SDimitry Andric                                                 llvm::DIFile *Unit) {
282806c3fb27SDimitry Andric   if (!RD)
282906c3fb27SDimitry Andric     return nullptr;
283006c3fb27SDimitry Andric 
283106c3fb27SDimitry Andric   auto const *PNA = RD->getAttr<PreferredNameAttr>();
283206c3fb27SDimitry Andric   if (!PNA)
283306c3fb27SDimitry Andric     return nullptr;
283406c3fb27SDimitry Andric 
283506c3fb27SDimitry Andric   return getOrCreateType(PNA->getTypedefType(), Unit);
283606c3fb27SDimitry Andric }
283706c3fb27SDimitry Andric 
283806c3fb27SDimitry Andric std::pair<llvm::DIType *, llvm::DIType *>
283906c3fb27SDimitry Andric CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) {
28400b57cec5SDimitry Andric   RecordDecl *RD = Ty->getDecl();
28410b57cec5SDimitry Andric 
28420b57cec5SDimitry Andric   // Get overall information about the record type for the debug info.
28430b57cec5SDimitry Andric   llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
28440b57cec5SDimitry Andric 
28450b57cec5SDimitry Andric   // Records and classes and unions can all be recursive.  To handle them, we
28460b57cec5SDimitry Andric   // first generate a debug descriptor for the struct as a forward declaration.
28470b57cec5SDimitry Andric   // Then (if it is a definition) we go through and get debug info for all of
28480b57cec5SDimitry Andric   // its members.  Finally, we create a descriptor for the complete type (which
28490b57cec5SDimitry Andric   // may refer to the forward decl if the struct is recursive) and replace all
28500b57cec5SDimitry Andric   // uses of the forward declaration with the final definition.
2851e8d8bef9SDimitry Andric   llvm::DICompositeType *FwdDecl = getOrCreateLimitedType(Ty);
28520b57cec5SDimitry Andric 
28530b57cec5SDimitry Andric   const RecordDecl *D = RD->getDefinition();
28540b57cec5SDimitry Andric   if (!D || !D->isCompleteDefinition())
285506c3fb27SDimitry Andric     return {FwdDecl, nullptr};
28560b57cec5SDimitry Andric 
28570b57cec5SDimitry Andric   if (const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD))
28580b57cec5SDimitry Andric     CollectContainingType(CXXDecl, FwdDecl);
28590b57cec5SDimitry Andric 
28600b57cec5SDimitry Andric   // Push the struct on region stack.
28610b57cec5SDimitry Andric   LexicalBlockStack.emplace_back(&*FwdDecl);
28620b57cec5SDimitry Andric   RegionMap[Ty->getDecl()].reset(FwdDecl);
28630b57cec5SDimitry Andric 
28640b57cec5SDimitry Andric   // Convert all the elements.
28650b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 16> EltTys;
28660b57cec5SDimitry Andric   // what about nested types?
28670b57cec5SDimitry Andric 
28680b57cec5SDimitry Andric   // Note: The split of CXXDecl information here is intentional, the
28690b57cec5SDimitry Andric   // gdb tests will depend on a certain ordering at printout. The debug
28700b57cec5SDimitry Andric   // information offsets are still correct if we merge them all together
28710b57cec5SDimitry Andric   // though.
28720b57cec5SDimitry Andric   const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
28730b57cec5SDimitry Andric   if (CXXDecl) {
28740b57cec5SDimitry Andric     CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl);
2875e8d8bef9SDimitry Andric     CollectVTableInfo(CXXDecl, DefUnit, EltTys);
28760b57cec5SDimitry Andric   }
28770b57cec5SDimitry Andric 
28780b57cec5SDimitry Andric   // Collect data fields (including static variables and any initializers).
28790b57cec5SDimitry Andric   CollectRecordFields(RD, DefUnit, EltTys, FwdDecl);
2880*0fca6ea1SDimitry Andric   if (CXXDecl && !CGM.getCodeGenOpts().DebugOmitUnreferencedMethods)
28810b57cec5SDimitry Andric     CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl);
28820b57cec5SDimitry Andric 
28830b57cec5SDimitry Andric   LexicalBlockStack.pop_back();
28840b57cec5SDimitry Andric   RegionMap.erase(Ty->getDecl());
28850b57cec5SDimitry Andric 
28860b57cec5SDimitry Andric   llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
28870b57cec5SDimitry Andric   DBuilder.replaceArrays(FwdDecl, Elements);
28880b57cec5SDimitry Andric 
28890b57cec5SDimitry Andric   if (FwdDecl->isTemporary())
28900b57cec5SDimitry Andric     FwdDecl =
28910b57cec5SDimitry Andric         llvm::MDNode::replaceWithPermanent(llvm::TempDICompositeType(FwdDecl));
28920b57cec5SDimitry Andric 
28930b57cec5SDimitry Andric   RegionMap[Ty->getDecl()].reset(FwdDecl);
289406c3fb27SDimitry Andric 
289506c3fb27SDimitry Andric   if (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB)
289606c3fb27SDimitry Andric     if (auto *PrefDI = GetPreferredNameType(CXXDecl, DefUnit))
289706c3fb27SDimitry Andric       return {FwdDecl, PrefDI};
289806c3fb27SDimitry Andric 
289906c3fb27SDimitry Andric   return {FwdDecl, nullptr};
29000b57cec5SDimitry Andric }
29010b57cec5SDimitry Andric 
29020b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectType *Ty,
29030b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
29040b57cec5SDimitry Andric   // Ignore protocols.
29050b57cec5SDimitry Andric   return getOrCreateType(Ty->getBaseType(), Unit);
29060b57cec5SDimitry Andric }
29070b57cec5SDimitry Andric 
29080b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const ObjCTypeParamType *Ty,
29090b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
29100b57cec5SDimitry Andric   // Ignore protocols.
29110b57cec5SDimitry Andric   SourceLocation Loc = Ty->getDecl()->getLocation();
29120b57cec5SDimitry Andric 
29130b57cec5SDimitry Andric   // Use Typedefs to represent ObjCTypeParamType.
29140b57cec5SDimitry Andric   return DBuilder.createTypedef(
29150b57cec5SDimitry Andric       getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit),
29160b57cec5SDimitry Andric       Ty->getDecl()->getName(), getOrCreateFile(Loc), getLineNumber(Loc),
29170b57cec5SDimitry Andric       getDeclContextDescriptor(Ty->getDecl()));
29180b57cec5SDimitry Andric }
29190b57cec5SDimitry Andric 
29200b57cec5SDimitry Andric /// \return true if Getter has the default name for the property PD.
29210b57cec5SDimitry Andric static bool hasDefaultGetterName(const ObjCPropertyDecl *PD,
29220b57cec5SDimitry Andric                                  const ObjCMethodDecl *Getter) {
29230b57cec5SDimitry Andric   assert(PD);
29240b57cec5SDimitry Andric   if (!Getter)
29250b57cec5SDimitry Andric     return true;
29260b57cec5SDimitry Andric 
29270b57cec5SDimitry Andric   assert(Getter->getDeclName().isObjCZeroArgSelector());
29280b57cec5SDimitry Andric   return PD->getName() ==
29290b57cec5SDimitry Andric          Getter->getDeclName().getObjCSelector().getNameForSlot(0);
29300b57cec5SDimitry Andric }
29310b57cec5SDimitry Andric 
29320b57cec5SDimitry Andric /// \return true if Setter has the default name for the property PD.
29330b57cec5SDimitry Andric static bool hasDefaultSetterName(const ObjCPropertyDecl *PD,
29340b57cec5SDimitry Andric                                  const ObjCMethodDecl *Setter) {
29350b57cec5SDimitry Andric   assert(PD);
29360b57cec5SDimitry Andric   if (!Setter)
29370b57cec5SDimitry Andric     return true;
29380b57cec5SDimitry Andric 
29390b57cec5SDimitry Andric   assert(Setter->getDeclName().isObjCOneArgSelector());
29400b57cec5SDimitry Andric   return SelectorTable::constructSetterName(PD->getName()) ==
29410b57cec5SDimitry Andric          Setter->getDeclName().getObjCSelector().getNameForSlot(0);
29420b57cec5SDimitry Andric }
29430b57cec5SDimitry Andric 
29440b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
29450b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
29460b57cec5SDimitry Andric   ObjCInterfaceDecl *ID = Ty->getDecl();
29470b57cec5SDimitry Andric   if (!ID)
29480b57cec5SDimitry Andric     return nullptr;
29490b57cec5SDimitry Andric 
29500b57cec5SDimitry Andric   // Return a forward declaration if this type was imported from a clang module,
29510b57cec5SDimitry Andric   // and this is not the compile unit with the implementation of the type (which
29520b57cec5SDimitry Andric   // may contain hidden ivars).
29530b57cec5SDimitry Andric   if (DebugTypeExtRefs && ID->isFromASTFile() && ID->getDefinition() &&
29540b57cec5SDimitry Andric       !ID->getImplementation())
29550b57cec5SDimitry Andric     return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
29560b57cec5SDimitry Andric                                       ID->getName(),
29570b57cec5SDimitry Andric                                       getDeclContextDescriptor(ID), Unit, 0);
29580b57cec5SDimitry Andric 
29590b57cec5SDimitry Andric   // Get overall information about the record type for the debug info.
29600b57cec5SDimitry Andric   llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
29610b57cec5SDimitry Andric   unsigned Line = getLineNumber(ID->getLocation());
29620b57cec5SDimitry Andric   auto RuntimeLang =
29630b57cec5SDimitry Andric       static_cast<llvm::dwarf::SourceLanguage>(TheCU->getSourceLanguage());
29640b57cec5SDimitry Andric 
29650b57cec5SDimitry Andric   // If this is just a forward declaration return a special forward-declaration
29660b57cec5SDimitry Andric   // debug type since we won't be able to lay out the entire type.
29670b57cec5SDimitry Andric   ObjCInterfaceDecl *Def = ID->getDefinition();
29680b57cec5SDimitry Andric   if (!Def || !Def->getImplementation()) {
29690b57cec5SDimitry Andric     llvm::DIScope *Mod = getParentModuleOrNull(ID);
29700b57cec5SDimitry Andric     llvm::DIType *FwdDecl = DBuilder.createReplaceableCompositeType(
29710b57cec5SDimitry Andric         llvm::dwarf::DW_TAG_structure_type, ID->getName(), Mod ? Mod : TheCU,
29720b57cec5SDimitry Andric         DefUnit, Line, RuntimeLang);
29730b57cec5SDimitry Andric     ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit));
29740b57cec5SDimitry Andric     return FwdDecl;
29750b57cec5SDimitry Andric   }
29760b57cec5SDimitry Andric 
29770b57cec5SDimitry Andric   return CreateTypeDefinition(Ty, Unit);
29780b57cec5SDimitry Andric }
29790b57cec5SDimitry Andric 
29805ffd83dbSDimitry Andric llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod,
29810b57cec5SDimitry Andric                                                   bool CreateSkeletonCU) {
29820b57cec5SDimitry Andric   // Use the Module pointer as the key into the cache. This is a
29830b57cec5SDimitry Andric   // nullptr if the "Module" is a PCH, which is safe because we don't
29840b57cec5SDimitry Andric   // support chained PCH debug info, so there can only be a single PCH.
29850b57cec5SDimitry Andric   const Module *M = Mod.getModuleOrNull();
29860b57cec5SDimitry Andric   auto ModRef = ModuleCache.find(M);
29870b57cec5SDimitry Andric   if (ModRef != ModuleCache.end())
29880b57cec5SDimitry Andric     return cast<llvm::DIModule>(ModRef->second);
29890b57cec5SDimitry Andric 
29900b57cec5SDimitry Andric   // Macro definitions that were defined with "-D" on the command line.
29910b57cec5SDimitry Andric   SmallString<128> ConfigMacros;
29920b57cec5SDimitry Andric   {
29930b57cec5SDimitry Andric     llvm::raw_svector_ostream OS(ConfigMacros);
29940b57cec5SDimitry Andric     const auto &PPOpts = CGM.getPreprocessorOpts();
29950b57cec5SDimitry Andric     unsigned I = 0;
29960b57cec5SDimitry Andric     // Translate the macro definitions back into a command line.
29970b57cec5SDimitry Andric     for (auto &M : PPOpts.Macros) {
29980b57cec5SDimitry Andric       if (++I > 1)
29990b57cec5SDimitry Andric         OS << " ";
30000b57cec5SDimitry Andric       const std::string &Macro = M.first;
30010b57cec5SDimitry Andric       bool Undef = M.second;
30020b57cec5SDimitry Andric       OS << "\"-" << (Undef ? 'U' : 'D');
30030b57cec5SDimitry Andric       for (char c : Macro)
30040b57cec5SDimitry Andric         switch (c) {
30050b57cec5SDimitry Andric         case '\\':
30060b57cec5SDimitry Andric           OS << "\\\\";
30070b57cec5SDimitry Andric           break;
30080b57cec5SDimitry Andric         case '"':
30090b57cec5SDimitry Andric           OS << "\\\"";
30100b57cec5SDimitry Andric           break;
30110b57cec5SDimitry Andric         default:
30120b57cec5SDimitry Andric           OS << c;
30130b57cec5SDimitry Andric         }
30140b57cec5SDimitry Andric       OS << '\"';
30150b57cec5SDimitry Andric     }
30160b57cec5SDimitry Andric   }
30170b57cec5SDimitry Andric 
30180b57cec5SDimitry Andric   bool IsRootModule = M ? !M->Parent : true;
30190b57cec5SDimitry Andric   // When a module name is specified as -fmodule-name, that module gets a
30200b57cec5SDimitry Andric   // clang::Module object, but it won't actually be built or imported; it will
30210b57cec5SDimitry Andric   // be textual.
30220b57cec5SDimitry Andric   if (CreateSkeletonCU && IsRootModule && Mod.getASTFile().empty() && M)
30235f757f3fSDimitry Andric     assert(StringRef(M->Name).starts_with(CGM.getLangOpts().ModuleName) &&
30240b57cec5SDimitry Andric            "clang module without ASTFile must be specified by -fmodule-name");
30250b57cec5SDimitry Andric 
30265ffd83dbSDimitry Andric   // Return a StringRef to the remapped Path.
30275ffd83dbSDimitry Andric   auto RemapPath = [this](StringRef Path) -> std::string {
30285ffd83dbSDimitry Andric     std::string Remapped = remapDIPath(Path);
30295ffd83dbSDimitry Andric     StringRef Relative(Remapped);
30305ffd83dbSDimitry Andric     StringRef CompDir = TheCU->getDirectory();
30315ffd83dbSDimitry Andric     if (Relative.consume_front(CompDir))
30325ffd83dbSDimitry Andric       Relative.consume_front(llvm::sys::path::get_separator());
30335ffd83dbSDimitry Andric 
30345ffd83dbSDimitry Andric     return Relative.str();
30355ffd83dbSDimitry Andric   };
30365ffd83dbSDimitry Andric 
30370b57cec5SDimitry Andric   if (CreateSkeletonCU && IsRootModule && !Mod.getASTFile().empty()) {
30380b57cec5SDimitry Andric     // PCH files don't have a signature field in the control block,
30390b57cec5SDimitry Andric     // but LLVM detects skeleton CUs by looking for a non-zero DWO id.
30400b57cec5SDimitry Andric     // We use the lower 64 bits for debug info.
30415ffd83dbSDimitry Andric 
30425ffd83dbSDimitry Andric     uint64_t Signature = 0;
3043e8d8bef9SDimitry Andric     if (const auto &ModSig = Mod.getSignature())
3044e8d8bef9SDimitry Andric       Signature = ModSig.truncatedValue();
3045e8d8bef9SDimitry Andric     else
30465ffd83dbSDimitry Andric       Signature = ~1ULL;
3047e8d8bef9SDimitry Andric 
30480b57cec5SDimitry Andric     llvm::DIBuilder DIB(CGM.getModule());
30495ffd83dbSDimitry Andric     SmallString<0> PCM;
3050bdd1243dSDimitry Andric     if (!llvm::sys::path::is_absolute(Mod.getASTFile())) {
3051bdd1243dSDimitry Andric       if (CGM.getHeaderSearchOpts().ModuleFileHomeIsCwd)
3052bdd1243dSDimitry Andric         PCM = getCurrentDirname();
3053bdd1243dSDimitry Andric       else
30545ffd83dbSDimitry Andric         PCM = Mod.getPath();
3055bdd1243dSDimitry Andric     }
30565ffd83dbSDimitry Andric     llvm::sys::path::append(PCM, Mod.getASTFile());
30575ffd83dbSDimitry Andric     DIB.createCompileUnit(
30585ffd83dbSDimitry Andric         TheCU->getSourceLanguage(),
30590b57cec5SDimitry Andric         // TODO: Support "Source" from external AST providers?
30605ffd83dbSDimitry Andric         DIB.createFile(Mod.getModuleName(), TheCU->getDirectory()),
30615ffd83dbSDimitry Andric         TheCU->getProducer(), false, StringRef(), 0, RemapPath(PCM),
30625ffd83dbSDimitry Andric         llvm::DICompileUnit::FullDebug, Signature);
30630b57cec5SDimitry Andric     DIB.finalize();
30640b57cec5SDimitry Andric   }
30650b57cec5SDimitry Andric 
30660b57cec5SDimitry Andric   llvm::DIModule *Parent =
30670b57cec5SDimitry Andric       IsRootModule ? nullptr
30685ffd83dbSDimitry Andric                    : getOrCreateModuleRef(ASTSourceDescriptor(*M->Parent),
30690b57cec5SDimitry Andric                                           CreateSkeletonCU);
30705ffd83dbSDimitry Andric   std::string IncludePath = Mod.getPath().str();
30710b57cec5SDimitry Andric   llvm::DIModule *DIMod =
30720b57cec5SDimitry Andric       DBuilder.createModule(Parent, Mod.getModuleName(), ConfigMacros,
30735ffd83dbSDimitry Andric                             RemapPath(IncludePath));
30740b57cec5SDimitry Andric   ModuleCache[M].reset(DIMod);
30750b57cec5SDimitry Andric   return DIMod;
30760b57cec5SDimitry Andric }
30770b57cec5SDimitry Andric 
30780b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
30790b57cec5SDimitry Andric                                                 llvm::DIFile *Unit) {
30800b57cec5SDimitry Andric   ObjCInterfaceDecl *ID = Ty->getDecl();
30810b57cec5SDimitry Andric   llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
30820b57cec5SDimitry Andric   unsigned Line = getLineNumber(ID->getLocation());
30830b57cec5SDimitry Andric   unsigned RuntimeLang = TheCU->getSourceLanguage();
30840b57cec5SDimitry Andric 
30850b57cec5SDimitry Andric   // Bit size, align and offset of the type.
30860b57cec5SDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(Ty);
30870b57cec5SDimitry Andric   auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
30880b57cec5SDimitry Andric 
30890b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
30900b57cec5SDimitry Andric   if (ID->getImplementation())
30910b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagObjcClassComplete;
30920b57cec5SDimitry Andric 
30930b57cec5SDimitry Andric   llvm::DIScope *Mod = getParentModuleOrNull(ID);
30940b57cec5SDimitry Andric   llvm::DICompositeType *RealDecl = DBuilder.createStructType(
30950b57cec5SDimitry Andric       Mod ? Mod : Unit, ID->getName(), DefUnit, Line, Size, Align, Flags,
30960b57cec5SDimitry Andric       nullptr, llvm::DINodeArray(), RuntimeLang);
30970b57cec5SDimitry Andric 
30980b57cec5SDimitry Andric   QualType QTy(Ty, 0);
30990b57cec5SDimitry Andric   TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl);
31000b57cec5SDimitry Andric 
31010b57cec5SDimitry Andric   // Push the struct on region stack.
31020b57cec5SDimitry Andric   LexicalBlockStack.emplace_back(RealDecl);
31030b57cec5SDimitry Andric   RegionMap[Ty->getDecl()].reset(RealDecl);
31040b57cec5SDimitry Andric 
31050b57cec5SDimitry Andric   // Convert all the elements.
31060b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 16> EltTys;
31070b57cec5SDimitry Andric 
31080b57cec5SDimitry Andric   ObjCInterfaceDecl *SClass = ID->getSuperClass();
31090b57cec5SDimitry Andric   if (SClass) {
31100b57cec5SDimitry Andric     llvm::DIType *SClassTy =
31110b57cec5SDimitry Andric         getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit);
31120b57cec5SDimitry Andric     if (!SClassTy)
31130b57cec5SDimitry Andric       return nullptr;
31140b57cec5SDimitry Andric 
31150b57cec5SDimitry Andric     llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0, 0,
31160b57cec5SDimitry Andric                                                       llvm::DINode::FlagZero);
31170b57cec5SDimitry Andric     EltTys.push_back(InhTag);
31180b57cec5SDimitry Andric   }
31190b57cec5SDimitry Andric 
31200b57cec5SDimitry Andric   // Create entries for all of the properties.
31210b57cec5SDimitry Andric   auto AddProperty = [&](const ObjCPropertyDecl *PD) {
31220b57cec5SDimitry Andric     SourceLocation Loc = PD->getLocation();
31230b57cec5SDimitry Andric     llvm::DIFile *PUnit = getOrCreateFile(Loc);
31240b57cec5SDimitry Andric     unsigned PLine = getLineNumber(Loc);
31250b57cec5SDimitry Andric     ObjCMethodDecl *Getter = PD->getGetterMethodDecl();
31260b57cec5SDimitry Andric     ObjCMethodDecl *Setter = PD->getSetterMethodDecl();
31270b57cec5SDimitry Andric     llvm::MDNode *PropertyNode = DBuilder.createObjCProperty(
31280b57cec5SDimitry Andric         PD->getName(), PUnit, PLine,
31290b57cec5SDimitry Andric         hasDefaultGetterName(PD, Getter) ? ""
31300b57cec5SDimitry Andric                                          : getSelectorName(PD->getGetterName()),
31310b57cec5SDimitry Andric         hasDefaultSetterName(PD, Setter) ? ""
31320b57cec5SDimitry Andric                                          : getSelectorName(PD->getSetterName()),
31330b57cec5SDimitry Andric         PD->getPropertyAttributes(), getOrCreateType(PD->getType(), PUnit));
31340b57cec5SDimitry Andric     EltTys.push_back(PropertyNode);
31350b57cec5SDimitry Andric   };
31360b57cec5SDimitry Andric   {
3137fe6060f1SDimitry Andric     // Use 'char' for the isClassProperty bit as DenseSet requires space for
3138fe6060f1SDimitry Andric     // empty/tombstone keys in the data type (and bool is too small for that).
3139fe6060f1SDimitry Andric     typedef std::pair<char, const IdentifierInfo *> IsClassAndIdent;
3140fe6060f1SDimitry Andric     /// List of already emitted properties. Two distinct class and instance
3141fe6060f1SDimitry Andric     /// properties can share the same identifier (but not two instance
3142fe6060f1SDimitry Andric     /// properties or two class properties).
3143fe6060f1SDimitry Andric     llvm::DenseSet<IsClassAndIdent> PropertySet;
3144fe6060f1SDimitry Andric     /// Returns the IsClassAndIdent key for the given property.
3145fe6060f1SDimitry Andric     auto GetIsClassAndIdent = [](const ObjCPropertyDecl *PD) {
3146fe6060f1SDimitry Andric       return std::make_pair(PD->isClassProperty(), PD->getIdentifier());
3147fe6060f1SDimitry Andric     };
31480b57cec5SDimitry Andric     for (const ObjCCategoryDecl *ClassExt : ID->known_extensions())
31490b57cec5SDimitry Andric       for (auto *PD : ClassExt->properties()) {
3150fe6060f1SDimitry Andric         PropertySet.insert(GetIsClassAndIdent(PD));
31510b57cec5SDimitry Andric         AddProperty(PD);
31520b57cec5SDimitry Andric       }
31530b57cec5SDimitry Andric     for (const auto *PD : ID->properties()) {
31540b57cec5SDimitry Andric       // Don't emit duplicate metadata for properties that were already in a
31550b57cec5SDimitry Andric       // class extension.
3156fe6060f1SDimitry Andric       if (!PropertySet.insert(GetIsClassAndIdent(PD)).second)
31570b57cec5SDimitry Andric         continue;
31580b57cec5SDimitry Andric       AddProperty(PD);
31590b57cec5SDimitry Andric     }
31600b57cec5SDimitry Andric   }
31610b57cec5SDimitry Andric 
31620b57cec5SDimitry Andric   const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID);
31630b57cec5SDimitry Andric   unsigned FieldNo = 0;
31640b57cec5SDimitry Andric   for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field;
31650b57cec5SDimitry Andric        Field = Field->getNextIvar(), ++FieldNo) {
31660b57cec5SDimitry Andric     llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
31670b57cec5SDimitry Andric     if (!FieldTy)
31680b57cec5SDimitry Andric       return nullptr;
31690b57cec5SDimitry Andric 
31700b57cec5SDimitry Andric     StringRef FieldName = Field->getName();
31710b57cec5SDimitry Andric 
31720b57cec5SDimitry Andric     // Ignore unnamed fields.
31730b57cec5SDimitry Andric     if (FieldName.empty())
31740b57cec5SDimitry Andric       continue;
31750b57cec5SDimitry Andric 
31760b57cec5SDimitry Andric     // Get the location for the field.
31770b57cec5SDimitry Andric     llvm::DIFile *FieldDefUnit = getOrCreateFile(Field->getLocation());
31780b57cec5SDimitry Andric     unsigned FieldLine = getLineNumber(Field->getLocation());
31790b57cec5SDimitry Andric     QualType FType = Field->getType();
31800b57cec5SDimitry Andric     uint64_t FieldSize = 0;
31810b57cec5SDimitry Andric     uint32_t FieldAlign = 0;
31820b57cec5SDimitry Andric 
31830b57cec5SDimitry Andric     if (!FType->isIncompleteArrayType()) {
31840b57cec5SDimitry Andric 
31850b57cec5SDimitry Andric       // Bit size, align and offset of the type.
31860b57cec5SDimitry Andric       FieldSize = Field->isBitField()
31870b57cec5SDimitry Andric                       ? Field->getBitWidthValue(CGM.getContext())
31880b57cec5SDimitry Andric                       : CGM.getContext().getTypeSize(FType);
31890b57cec5SDimitry Andric       FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext());
31900b57cec5SDimitry Andric     }
31910b57cec5SDimitry Andric 
31920b57cec5SDimitry Andric     uint64_t FieldOffset;
31930b57cec5SDimitry Andric     if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) {
31940b57cec5SDimitry Andric       // We don't know the runtime offset of an ivar if we're using the
31950b57cec5SDimitry Andric       // non-fragile ABI.  For bitfields, use the bit offset into the first
31960b57cec5SDimitry Andric       // byte of storage of the bitfield.  For other fields, use zero.
31970b57cec5SDimitry Andric       if (Field->isBitField()) {
31980b57cec5SDimitry Andric         FieldOffset =
31990b57cec5SDimitry Andric             CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field);
32000b57cec5SDimitry Andric         FieldOffset %= CGM.getContext().getCharWidth();
32010b57cec5SDimitry Andric       } else {
32020b57cec5SDimitry Andric         FieldOffset = 0;
32030b57cec5SDimitry Andric       }
32040b57cec5SDimitry Andric     } else {
32050b57cec5SDimitry Andric       FieldOffset = RL.getFieldOffset(FieldNo);
32060b57cec5SDimitry Andric     }
32070b57cec5SDimitry Andric 
32080b57cec5SDimitry Andric     llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
32090b57cec5SDimitry Andric     if (Field->getAccessControl() == ObjCIvarDecl::Protected)
32100b57cec5SDimitry Andric       Flags = llvm::DINode::FlagProtected;
32110b57cec5SDimitry Andric     else if (Field->getAccessControl() == ObjCIvarDecl::Private)
32120b57cec5SDimitry Andric       Flags = llvm::DINode::FlagPrivate;
32130b57cec5SDimitry Andric     else if (Field->getAccessControl() == ObjCIvarDecl::Public)
32140b57cec5SDimitry Andric       Flags = llvm::DINode::FlagPublic;
32150b57cec5SDimitry Andric 
3216bdd1243dSDimitry Andric     if (Field->isBitField())
3217bdd1243dSDimitry Andric       Flags |= llvm::DINode::FlagBitField;
3218bdd1243dSDimitry Andric 
32190b57cec5SDimitry Andric     llvm::MDNode *PropertyNode = nullptr;
32200b57cec5SDimitry Andric     if (ObjCImplementationDecl *ImpD = ID->getImplementation()) {
32210b57cec5SDimitry Andric       if (ObjCPropertyImplDecl *PImpD =
32220b57cec5SDimitry Andric               ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) {
32230b57cec5SDimitry Andric         if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) {
32240b57cec5SDimitry Andric           SourceLocation Loc = PD->getLocation();
32250b57cec5SDimitry Andric           llvm::DIFile *PUnit = getOrCreateFile(Loc);
32260b57cec5SDimitry Andric           unsigned PLine = getLineNumber(Loc);
3227480093f4SDimitry Andric           ObjCMethodDecl *Getter = PImpD->getGetterMethodDecl();
3228480093f4SDimitry Andric           ObjCMethodDecl *Setter = PImpD->getSetterMethodDecl();
32290b57cec5SDimitry Andric           PropertyNode = DBuilder.createObjCProperty(
32300b57cec5SDimitry Andric               PD->getName(), PUnit, PLine,
32310b57cec5SDimitry Andric               hasDefaultGetterName(PD, Getter)
32320b57cec5SDimitry Andric                   ? ""
32330b57cec5SDimitry Andric                   : getSelectorName(PD->getGetterName()),
32340b57cec5SDimitry Andric               hasDefaultSetterName(PD, Setter)
32350b57cec5SDimitry Andric                   ? ""
32360b57cec5SDimitry Andric                   : getSelectorName(PD->getSetterName()),
32370b57cec5SDimitry Andric               PD->getPropertyAttributes(),
32380b57cec5SDimitry Andric               getOrCreateType(PD->getType(), PUnit));
32390b57cec5SDimitry Andric         }
32400b57cec5SDimitry Andric       }
32410b57cec5SDimitry Andric     }
32420b57cec5SDimitry Andric     FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, FieldLine,
32430b57cec5SDimitry Andric                                       FieldSize, FieldAlign, FieldOffset, Flags,
32440b57cec5SDimitry Andric                                       FieldTy, PropertyNode);
32450b57cec5SDimitry Andric     EltTys.push_back(FieldTy);
32460b57cec5SDimitry Andric   }
32470b57cec5SDimitry Andric 
32480b57cec5SDimitry Andric   llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
32490b57cec5SDimitry Andric   DBuilder.replaceArrays(RealDecl, Elements);
32500b57cec5SDimitry Andric 
32510b57cec5SDimitry Andric   LexicalBlockStack.pop_back();
32520b57cec5SDimitry Andric   return RealDecl;
32530b57cec5SDimitry Andric }
32540b57cec5SDimitry Andric 
32550b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const VectorType *Ty,
32560b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
325781ad6265SDimitry Andric   if (Ty->isExtVectorBoolType()) {
325881ad6265SDimitry Andric     // Boolean ext_vector_type(N) are special because their real element type
325981ad6265SDimitry Andric     // (bits of bit size) is not their Clang element type (_Bool of size byte).
326081ad6265SDimitry Andric     // For now, we pretend the boolean vector were actually a vector of bytes
326181ad6265SDimitry Andric     // (where each byte represents 8 bits of the actual vector).
326281ad6265SDimitry Andric     // FIXME Debug info should actually represent this proper as a vector mask
326381ad6265SDimitry Andric     // type.
326481ad6265SDimitry Andric     auto &Ctx = CGM.getContext();
326581ad6265SDimitry Andric     uint64_t Size = CGM.getContext().getTypeSize(Ty);
326681ad6265SDimitry Andric     uint64_t NumVectorBytes = Size / Ctx.getCharWidth();
326781ad6265SDimitry Andric 
326881ad6265SDimitry Andric     // Construct the vector of 'char' type.
32695f757f3fSDimitry Andric     QualType CharVecTy =
32705f757f3fSDimitry Andric         Ctx.getVectorType(Ctx.CharTy, NumVectorBytes, VectorKind::Generic);
327181ad6265SDimitry Andric     return CreateType(CharVecTy->getAs<VectorType>(), Unit);
327281ad6265SDimitry Andric   }
327381ad6265SDimitry Andric 
32740b57cec5SDimitry Andric   llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit);
32750b57cec5SDimitry Andric   int64_t Count = Ty->getNumElements();
32760b57cec5SDimitry Andric 
32770b57cec5SDimitry Andric   llvm::Metadata *Subscript;
32780b57cec5SDimitry Andric   QualType QTy(Ty, 0);
32790b57cec5SDimitry Andric   auto SizeExpr = SizeExprCache.find(QTy);
32800b57cec5SDimitry Andric   if (SizeExpr != SizeExprCache.end())
32815ffd83dbSDimitry Andric     Subscript = DBuilder.getOrCreateSubrange(
32825ffd83dbSDimitry Andric         SizeExpr->getSecond() /*count*/, nullptr /*lowerBound*/,
32835ffd83dbSDimitry Andric         nullptr /*upperBound*/, nullptr /*stride*/);
32845ffd83dbSDimitry Andric   else {
32855ffd83dbSDimitry Andric     auto *CountNode =
32865ffd83dbSDimitry Andric         llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
32875ffd83dbSDimitry Andric             llvm::Type::getInt64Ty(CGM.getLLVMContext()), Count ? Count : -1));
32885ffd83dbSDimitry Andric     Subscript = DBuilder.getOrCreateSubrange(
32895ffd83dbSDimitry Andric         CountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
32905ffd83dbSDimitry Andric         nullptr /*stride*/);
32915ffd83dbSDimitry Andric   }
32920b57cec5SDimitry Andric   llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
32930b57cec5SDimitry Andric 
32940b57cec5SDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(Ty);
32950b57cec5SDimitry Andric   auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
32960b57cec5SDimitry Andric 
32970b57cec5SDimitry Andric   return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray);
32980b57cec5SDimitry Andric }
32990b57cec5SDimitry Andric 
33005ffd83dbSDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const ConstantMatrixType *Ty,
33015ffd83dbSDimitry Andric                                       llvm::DIFile *Unit) {
33025ffd83dbSDimitry Andric   // FIXME: Create another debug type for matrices
33035ffd83dbSDimitry Andric   // For the time being, it treats it like a nested ArrayType.
33045ffd83dbSDimitry Andric 
33055ffd83dbSDimitry Andric   llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit);
33065ffd83dbSDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(Ty);
33075ffd83dbSDimitry Andric   uint32_t Align = getTypeAlignIfRequired(Ty, CGM.getContext());
33085ffd83dbSDimitry Andric 
33095ffd83dbSDimitry Andric   // Create ranges for both dimensions.
33105ffd83dbSDimitry Andric   llvm::SmallVector<llvm::Metadata *, 2> Subscripts;
33115ffd83dbSDimitry Andric   auto *ColumnCountNode =
33125ffd83dbSDimitry Andric       llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
33135ffd83dbSDimitry Andric           llvm::Type::getInt64Ty(CGM.getLLVMContext()), Ty->getNumColumns()));
33145ffd83dbSDimitry Andric   auto *RowCountNode =
33155ffd83dbSDimitry Andric       llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
33165ffd83dbSDimitry Andric           llvm::Type::getInt64Ty(CGM.getLLVMContext()), Ty->getNumRows()));
33175ffd83dbSDimitry Andric   Subscripts.push_back(DBuilder.getOrCreateSubrange(
33185ffd83dbSDimitry Andric       ColumnCountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
33195ffd83dbSDimitry Andric       nullptr /*stride*/));
33205ffd83dbSDimitry Andric   Subscripts.push_back(DBuilder.getOrCreateSubrange(
33215ffd83dbSDimitry Andric       RowCountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
33225ffd83dbSDimitry Andric       nullptr /*stride*/));
33235ffd83dbSDimitry Andric   llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);
33245ffd83dbSDimitry Andric   return DBuilder.createArrayType(Size, Align, ElementTy, SubscriptArray);
33255ffd83dbSDimitry Andric }
33265ffd83dbSDimitry Andric 
33270b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const ArrayType *Ty, llvm::DIFile *Unit) {
33280b57cec5SDimitry Andric   uint64_t Size;
33290b57cec5SDimitry Andric   uint32_t Align;
33300b57cec5SDimitry Andric 
33310b57cec5SDimitry Andric   // FIXME: make getTypeAlign() aware of VLAs and incomplete array types
33320b57cec5SDimitry Andric   if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
33330b57cec5SDimitry Andric     Size = 0;
33340b57cec5SDimitry Andric     Align = getTypeAlignIfRequired(CGM.getContext().getBaseElementType(VAT),
33350b57cec5SDimitry Andric                                    CGM.getContext());
33360b57cec5SDimitry Andric   } else if (Ty->isIncompleteArrayType()) {
33370b57cec5SDimitry Andric     Size = 0;
33380b57cec5SDimitry Andric     if (Ty->getElementType()->isIncompleteType())
33390b57cec5SDimitry Andric       Align = 0;
33400b57cec5SDimitry Andric     else
33410b57cec5SDimitry Andric       Align = getTypeAlignIfRequired(Ty->getElementType(), CGM.getContext());
33420b57cec5SDimitry Andric   } else if (Ty->isIncompleteType()) {
33430b57cec5SDimitry Andric     Size = 0;
33440b57cec5SDimitry Andric     Align = 0;
33450b57cec5SDimitry Andric   } else {
33460b57cec5SDimitry Andric     // Size and align of the whole array, not the element type.
33470b57cec5SDimitry Andric     Size = CGM.getContext().getTypeSize(Ty);
33480b57cec5SDimitry Andric     Align = getTypeAlignIfRequired(Ty, CGM.getContext());
33490b57cec5SDimitry Andric   }
33500b57cec5SDimitry Andric 
33510b57cec5SDimitry Andric   // Add the dimensions of the array.  FIXME: This loses CV qualifiers from
33520b57cec5SDimitry Andric   // interior arrays, do we care?  Why aren't nested arrays represented the
33530b57cec5SDimitry Andric   // obvious/recursive way?
33540b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 8> Subscripts;
33550b57cec5SDimitry Andric   QualType EltTy(Ty, 0);
33560b57cec5SDimitry Andric   while ((Ty = dyn_cast<ArrayType>(EltTy))) {
33570b57cec5SDimitry Andric     // If the number of elements is known, then count is that number. Otherwise,
33580b57cec5SDimitry Andric     // it's -1. This allows us to represent a subrange with an array of 0
33590b57cec5SDimitry Andric     // elements, like this:
33600b57cec5SDimitry Andric     //
33610b57cec5SDimitry Andric     //   struct foo {
33620b57cec5SDimitry Andric     //     int x[0];
33630b57cec5SDimitry Andric     //   };
33640b57cec5SDimitry Andric     int64_t Count = -1; // Count == -1 is an unbounded array.
33650b57cec5SDimitry Andric     if (const auto *CAT = dyn_cast<ConstantArrayType>(Ty))
3366*0fca6ea1SDimitry Andric       Count = CAT->getZExtSize();
33670b57cec5SDimitry Andric     else if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
33680b57cec5SDimitry Andric       if (Expr *Size = VAT->getSizeExpr()) {
33690b57cec5SDimitry Andric         Expr::EvalResult Result;
33700b57cec5SDimitry Andric         if (Size->EvaluateAsInt(Result, CGM.getContext()))
33710b57cec5SDimitry Andric           Count = Result.Val.getInt().getExtValue();
33720b57cec5SDimitry Andric       }
33730b57cec5SDimitry Andric     }
33740b57cec5SDimitry Andric 
33750b57cec5SDimitry Andric     auto SizeNode = SizeExprCache.find(EltTy);
33760b57cec5SDimitry Andric     if (SizeNode != SizeExprCache.end())
33775ffd83dbSDimitry Andric       Subscripts.push_back(DBuilder.getOrCreateSubrange(
33785ffd83dbSDimitry Andric           SizeNode->getSecond() /*count*/, nullptr /*lowerBound*/,
33795ffd83dbSDimitry Andric           nullptr /*upperBound*/, nullptr /*stride*/));
33805ffd83dbSDimitry Andric     else {
33815ffd83dbSDimitry Andric       auto *CountNode =
33825ffd83dbSDimitry Andric           llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
33835ffd83dbSDimitry Andric               llvm::Type::getInt64Ty(CGM.getLLVMContext()), Count));
33845ffd83dbSDimitry Andric       Subscripts.push_back(DBuilder.getOrCreateSubrange(
33855ffd83dbSDimitry Andric           CountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
33865ffd83dbSDimitry Andric           nullptr /*stride*/));
33875ffd83dbSDimitry Andric     }
33880b57cec5SDimitry Andric     EltTy = Ty->getElementType();
33890b57cec5SDimitry Andric   }
33900b57cec5SDimitry Andric 
33910b57cec5SDimitry Andric   llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);
33920b57cec5SDimitry Andric 
33930b57cec5SDimitry Andric   return DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit),
33940b57cec5SDimitry Andric                                   SubscriptArray);
33950b57cec5SDimitry Andric }
33960b57cec5SDimitry Andric 
33970b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const LValueReferenceType *Ty,
33980b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
33990b57cec5SDimitry Andric   return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, Ty,
34000b57cec5SDimitry Andric                                Ty->getPointeeType(), Unit);
34010b57cec5SDimitry Andric }
34020b57cec5SDimitry Andric 
34030b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const RValueReferenceType *Ty,
34040b57cec5SDimitry Andric                                       llvm::DIFile *Unit) {
3405fe6060f1SDimitry Andric   llvm::dwarf::Tag Tag = llvm::dwarf::DW_TAG_rvalue_reference_type;
3406fe6060f1SDimitry Andric   // DW_TAG_rvalue_reference_type was introduced in DWARF 4.
3407fe6060f1SDimitry Andric   if (CGM.getCodeGenOpts().DebugStrictDwarf &&
3408fe6060f1SDimitry Andric       CGM.getCodeGenOpts().DwarfVersion < 4)
3409fe6060f1SDimitry Andric     Tag = llvm::dwarf::DW_TAG_reference_type;
3410fe6060f1SDimitry Andric 
3411fe6060f1SDimitry Andric   return CreatePointerLikeType(Tag, Ty, Ty->getPointeeType(), Unit);
34120b57cec5SDimitry Andric }
34130b57cec5SDimitry Andric 
34140b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const MemberPointerType *Ty,
34150b57cec5SDimitry Andric                                       llvm::DIFile *U) {
34160b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
34170b57cec5SDimitry Andric   uint64_t Size = 0;
34180b57cec5SDimitry Andric 
34190b57cec5SDimitry Andric   if (!Ty->isIncompleteType()) {
34200b57cec5SDimitry Andric     Size = CGM.getContext().getTypeSize(Ty);
34210b57cec5SDimitry Andric 
34220b57cec5SDimitry Andric     // Set the MS inheritance model. There is no flag for the unspecified model.
34230b57cec5SDimitry Andric     if (CGM.getTarget().getCXXABI().isMicrosoft()) {
34240b57cec5SDimitry Andric       switch (Ty->getMostRecentCXXRecordDecl()->getMSInheritanceModel()) {
3425480093f4SDimitry Andric       case MSInheritanceModel::Single:
34260b57cec5SDimitry Andric         Flags |= llvm::DINode::FlagSingleInheritance;
34270b57cec5SDimitry Andric         break;
3428480093f4SDimitry Andric       case MSInheritanceModel::Multiple:
34290b57cec5SDimitry Andric         Flags |= llvm::DINode::FlagMultipleInheritance;
34300b57cec5SDimitry Andric         break;
3431480093f4SDimitry Andric       case MSInheritanceModel::Virtual:
34320b57cec5SDimitry Andric         Flags |= llvm::DINode::FlagVirtualInheritance;
34330b57cec5SDimitry Andric         break;
3434480093f4SDimitry Andric       case MSInheritanceModel::Unspecified:
34350b57cec5SDimitry Andric         break;
34360b57cec5SDimitry Andric       }
34370b57cec5SDimitry Andric     }
34380b57cec5SDimitry Andric   }
34390b57cec5SDimitry Andric 
34400b57cec5SDimitry Andric   llvm::DIType *ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U);
34410b57cec5SDimitry Andric   if (Ty->isMemberDataPointerType())
34420b57cec5SDimitry Andric     return DBuilder.createMemberPointerType(
34430b57cec5SDimitry Andric         getOrCreateType(Ty->getPointeeType(), U), ClassType, Size, /*Align=*/0,
34440b57cec5SDimitry Andric         Flags);
34450b57cec5SDimitry Andric 
34460b57cec5SDimitry Andric   const FunctionProtoType *FPT =
344706c3fb27SDimitry Andric       Ty->getPointeeType()->castAs<FunctionProtoType>();
34480b57cec5SDimitry Andric   return DBuilder.createMemberPointerType(
34490b57cec5SDimitry Andric       getOrCreateInstanceMethodType(
34500b57cec5SDimitry Andric           CXXMethodDecl::getThisType(FPT, Ty->getMostRecentCXXRecordDecl()),
3451bdd1243dSDimitry Andric           FPT, U),
34520b57cec5SDimitry Andric       ClassType, Size, /*Align=*/0, Flags);
34530b57cec5SDimitry Andric }
34540b57cec5SDimitry Andric 
34550b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const AtomicType *Ty, llvm::DIFile *U) {
34560b57cec5SDimitry Andric   auto *FromTy = getOrCreateType(Ty->getValueType(), U);
34570b57cec5SDimitry Andric   return DBuilder.createQualifiedType(llvm::dwarf::DW_TAG_atomic_type, FromTy);
34580b57cec5SDimitry Andric }
34590b57cec5SDimitry Andric 
34600b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateType(const PipeType *Ty, llvm::DIFile *U) {
34610b57cec5SDimitry Andric   return getOrCreateType(Ty->getElementType(), U);
34620b57cec5SDimitry Andric }
34630b57cec5SDimitry Andric 
34640b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateEnumType(const EnumType *Ty) {
34650b57cec5SDimitry Andric   const EnumDecl *ED = Ty->getDecl();
34660b57cec5SDimitry Andric 
34670b57cec5SDimitry Andric   uint64_t Size = 0;
34680b57cec5SDimitry Andric   uint32_t Align = 0;
34690b57cec5SDimitry Andric   if (!ED->getTypeForDecl()->isIncompleteType()) {
34700b57cec5SDimitry Andric     Size = CGM.getContext().getTypeSize(ED->getTypeForDecl());
34710b57cec5SDimitry Andric     Align = getDeclAlignIfRequired(ED, CGM.getContext());
34720b57cec5SDimitry Andric   }
34730b57cec5SDimitry Andric 
34740b57cec5SDimitry Andric   SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
34750b57cec5SDimitry Andric 
34760b57cec5SDimitry Andric   bool isImportedFromModule =
34770b57cec5SDimitry Andric       DebugTypeExtRefs && ED->isFromASTFile() && ED->getDefinition();
34780b57cec5SDimitry Andric 
34790b57cec5SDimitry Andric   // If this is just a forward declaration, construct an appropriately
34800b57cec5SDimitry Andric   // marked node and just return it.
34810b57cec5SDimitry Andric   if (isImportedFromModule || !ED->getDefinition()) {
34820b57cec5SDimitry Andric     // Note that it is possible for enums to be created as part of
34830b57cec5SDimitry Andric     // their own declcontext. In this case a FwdDecl will be created
34840b57cec5SDimitry Andric     // twice. This doesn't cause a problem because both FwdDecls are
34850b57cec5SDimitry Andric     // entered into the ReplaceMap: finalize() will replace the first
34860b57cec5SDimitry Andric     // FwdDecl with the second and then replace the second with
34870b57cec5SDimitry Andric     // complete type.
34880b57cec5SDimitry Andric     llvm::DIScope *EDContext = getDeclContextDescriptor(ED);
34890b57cec5SDimitry Andric     llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
34900b57cec5SDimitry Andric     llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType(
34910b57cec5SDimitry Andric         llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit, 0));
34920b57cec5SDimitry Andric 
34930b57cec5SDimitry Andric     unsigned Line = getLineNumber(ED->getLocation());
34940b57cec5SDimitry Andric     StringRef EDName = ED->getName();
34950b57cec5SDimitry Andric     llvm::DIType *RetTy = DBuilder.createReplaceableCompositeType(
34960b57cec5SDimitry Andric         llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line,
34970b57cec5SDimitry Andric         0, Size, Align, llvm::DINode::FlagFwdDecl, Identifier);
34980b57cec5SDimitry Andric 
34990b57cec5SDimitry Andric     ReplaceMap.emplace_back(
35000b57cec5SDimitry Andric         std::piecewise_construct, std::make_tuple(Ty),
35010b57cec5SDimitry Andric         std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
35020b57cec5SDimitry Andric     return RetTy;
35030b57cec5SDimitry Andric   }
35040b57cec5SDimitry Andric 
35050b57cec5SDimitry Andric   return CreateTypeDefinition(Ty);
35060b57cec5SDimitry Andric }
35070b57cec5SDimitry Andric 
35080b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
35090b57cec5SDimitry Andric   const EnumDecl *ED = Ty->getDecl();
35100b57cec5SDimitry Andric   uint64_t Size = 0;
35110b57cec5SDimitry Andric   uint32_t Align = 0;
35120b57cec5SDimitry Andric   if (!ED->getTypeForDecl()->isIncompleteType()) {
35130b57cec5SDimitry Andric     Size = CGM.getContext().getTypeSize(ED->getTypeForDecl());
35140b57cec5SDimitry Andric     Align = getDeclAlignIfRequired(ED, CGM.getContext());
35150b57cec5SDimitry Andric   }
35160b57cec5SDimitry Andric 
35170b57cec5SDimitry Andric   SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
35180b57cec5SDimitry Andric 
35190b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 16> Enumerators;
35200b57cec5SDimitry Andric   ED = ED->getDefinition();
35210b57cec5SDimitry Andric   for (const auto *Enum : ED->enumerators()) {
35220b57cec5SDimitry Andric     Enumerators.push_back(
3523fe6060f1SDimitry Andric         DBuilder.createEnumerator(Enum->getName(), Enum->getInitVal()));
35240b57cec5SDimitry Andric   }
35250b57cec5SDimitry Andric 
35260b57cec5SDimitry Andric   // Return a CompositeType for the enum itself.
35270b57cec5SDimitry Andric   llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
35280b57cec5SDimitry Andric 
35290b57cec5SDimitry Andric   llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
35300b57cec5SDimitry Andric   unsigned Line = getLineNumber(ED->getLocation());
35310b57cec5SDimitry Andric   llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
35320b57cec5SDimitry Andric   llvm::DIType *ClassTy = getOrCreateType(ED->getIntegerType(), DefUnit);
35335f757f3fSDimitry Andric   return DBuilder.createEnumerationType(
35345f757f3fSDimitry Andric       EnumContext, ED->getName(), DefUnit, Line, Size, Align, EltArray, ClassTy,
35355f757f3fSDimitry Andric       /*RunTimeLang=*/0, Identifier, ED->isScoped());
35360b57cec5SDimitry Andric }
35370b57cec5SDimitry Andric 
35380b57cec5SDimitry Andric llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
35390b57cec5SDimitry Andric                                         unsigned MType, SourceLocation LineLoc,
35400b57cec5SDimitry Andric                                         StringRef Name, StringRef Value) {
35410b57cec5SDimitry Andric   unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
35420b57cec5SDimitry Andric   return DBuilder.createMacro(Parent, Line, MType, Name, Value);
35430b57cec5SDimitry Andric }
35440b57cec5SDimitry Andric 
35450b57cec5SDimitry Andric llvm::DIMacroFile *CGDebugInfo::CreateTempMacroFile(llvm::DIMacroFile *Parent,
35460b57cec5SDimitry Andric                                                     SourceLocation LineLoc,
35470b57cec5SDimitry Andric                                                     SourceLocation FileLoc) {
35480b57cec5SDimitry Andric   llvm::DIFile *FName = getOrCreateFile(FileLoc);
35490b57cec5SDimitry Andric   unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
35500b57cec5SDimitry Andric   return DBuilder.createTempMacroFile(Parent, Line, FName);
35510b57cec5SDimitry Andric }
35520b57cec5SDimitry Andric 
3553*0fca6ea1SDimitry Andric llvm::DILocation *CGDebugInfo::CreateTrapFailureMessageFor(
3554*0fca6ea1SDimitry Andric     llvm::DebugLoc TrapLocation, StringRef Category, StringRef FailureMsg) {
3555*0fca6ea1SDimitry Andric   // Create a debug location from `TrapLocation` that adds an artificial inline
3556*0fca6ea1SDimitry Andric   // frame.
3557*0fca6ea1SDimitry Andric   SmallString<64> FuncName(ClangTrapPrefix);
3558*0fca6ea1SDimitry Andric 
3559*0fca6ea1SDimitry Andric   FuncName += "$";
3560*0fca6ea1SDimitry Andric   FuncName += Category;
3561*0fca6ea1SDimitry Andric   FuncName += "$";
3562*0fca6ea1SDimitry Andric   FuncName += FailureMsg;
3563*0fca6ea1SDimitry Andric 
3564*0fca6ea1SDimitry Andric   llvm::DISubprogram *TrapSP =
3565*0fca6ea1SDimitry Andric       createInlinedTrapSubprogram(FuncName, TrapLocation->getFile());
3566*0fca6ea1SDimitry Andric   return llvm::DILocation::get(CGM.getLLVMContext(), /*Line=*/0, /*Column=*/0,
3567*0fca6ea1SDimitry Andric                                /*Scope=*/TrapSP, /*InlinedAt=*/TrapLocation);
3568*0fca6ea1SDimitry Andric }
3569*0fca6ea1SDimitry Andric 
35700b57cec5SDimitry Andric static QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) {
35710b57cec5SDimitry Andric   Qualifiers Quals;
35720b57cec5SDimitry Andric   do {
35730b57cec5SDimitry Andric     Qualifiers InnerQuals = T.getLocalQualifiers();
35740b57cec5SDimitry Andric     // Qualifiers::operator+() doesn't like it if you add a Qualifier
35750b57cec5SDimitry Andric     // that is already there.
35760b57cec5SDimitry Andric     Quals += Qualifiers::removeCommonQualifiers(Quals, InnerQuals);
35770b57cec5SDimitry Andric     Quals += InnerQuals;
35780b57cec5SDimitry Andric     QualType LastT = T;
35790b57cec5SDimitry Andric     switch (T->getTypeClass()) {
35800b57cec5SDimitry Andric     default:
35810b57cec5SDimitry Andric       return C.getQualifiedType(T.getTypePtr(), Quals);
35820b57cec5SDimitry Andric     case Type::TemplateSpecialization: {
35830b57cec5SDimitry Andric       const auto *Spec = cast<TemplateSpecializationType>(T);
35840b57cec5SDimitry Andric       if (Spec->isTypeAlias())
35850b57cec5SDimitry Andric         return C.getQualifiedType(T.getTypePtr(), Quals);
35860b57cec5SDimitry Andric       T = Spec->desugar();
35870b57cec5SDimitry Andric       break;
35880b57cec5SDimitry Andric     }
35890b57cec5SDimitry Andric     case Type::TypeOfExpr:
35900b57cec5SDimitry Andric       T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType();
35910b57cec5SDimitry Andric       break;
35920b57cec5SDimitry Andric     case Type::TypeOf:
3593bdd1243dSDimitry Andric       T = cast<TypeOfType>(T)->getUnmodifiedType();
35940b57cec5SDimitry Andric       break;
35950b57cec5SDimitry Andric     case Type::Decltype:
35960b57cec5SDimitry Andric       T = cast<DecltypeType>(T)->getUnderlyingType();
35970b57cec5SDimitry Andric       break;
35980b57cec5SDimitry Andric     case Type::UnaryTransform:
35990b57cec5SDimitry Andric       T = cast<UnaryTransformType>(T)->getUnderlyingType();
36000b57cec5SDimitry Andric       break;
36010b57cec5SDimitry Andric     case Type::Attributed:
36020b57cec5SDimitry Andric       T = cast<AttributedType>(T)->getEquivalentType();
36030b57cec5SDimitry Andric       break;
360481ad6265SDimitry Andric     case Type::BTFTagAttributed:
360581ad6265SDimitry Andric       T = cast<BTFTagAttributedType>(T)->getWrappedType();
360681ad6265SDimitry Andric       break;
3607*0fca6ea1SDimitry Andric     case Type::CountAttributed:
3608*0fca6ea1SDimitry Andric       T = cast<CountAttributedType>(T)->desugar();
3609*0fca6ea1SDimitry Andric       break;
36100b57cec5SDimitry Andric     case Type::Elaborated:
36110b57cec5SDimitry Andric       T = cast<ElaboratedType>(T)->getNamedType();
36120b57cec5SDimitry Andric       break;
36130eae32dcSDimitry Andric     case Type::Using:
36140eae32dcSDimitry Andric       T = cast<UsingType>(T)->getUnderlyingType();
36150eae32dcSDimitry Andric       break;
36160b57cec5SDimitry Andric     case Type::Paren:
36170b57cec5SDimitry Andric       T = cast<ParenType>(T)->getInnerType();
36180b57cec5SDimitry Andric       break;
36190b57cec5SDimitry Andric     case Type::MacroQualified:
36200b57cec5SDimitry Andric       T = cast<MacroQualifiedType>(T)->getUnderlyingType();
36210b57cec5SDimitry Andric       break;
36220b57cec5SDimitry Andric     case Type::SubstTemplateTypeParm:
36230b57cec5SDimitry Andric       T = cast<SubstTemplateTypeParmType>(T)->getReplacementType();
36240b57cec5SDimitry Andric       break;
36250b57cec5SDimitry Andric     case Type::Auto:
36260b57cec5SDimitry Andric     case Type::DeducedTemplateSpecialization: {
36270b57cec5SDimitry Andric       QualType DT = cast<DeducedType>(T)->getDeducedType();
36280b57cec5SDimitry Andric       assert(!DT.isNull() && "Undeduced types shouldn't reach here.");
36290b57cec5SDimitry Andric       T = DT;
36300b57cec5SDimitry Andric       break;
36310b57cec5SDimitry Andric     }
3632*0fca6ea1SDimitry Andric     case Type::PackIndexing: {
3633*0fca6ea1SDimitry Andric       T = cast<PackIndexingType>(T)->getSelectedType();
3634*0fca6ea1SDimitry Andric       break;
3635*0fca6ea1SDimitry Andric     }
36360b57cec5SDimitry Andric     case Type::Adjusted:
36370b57cec5SDimitry Andric     case Type::Decayed:
36380b57cec5SDimitry Andric       // Decayed and adjusted types use the adjusted type in LLVM and DWARF.
36390b57cec5SDimitry Andric       T = cast<AdjustedType>(T)->getAdjustedType();
36400b57cec5SDimitry Andric       break;
36410b57cec5SDimitry Andric     }
36420b57cec5SDimitry Andric 
36430b57cec5SDimitry Andric     assert(T != LastT && "Type unwrapping failed to unwrap!");
36440b57cec5SDimitry Andric     (void)LastT;
36450b57cec5SDimitry Andric   } while (true);
36460b57cec5SDimitry Andric }
36470b57cec5SDimitry Andric 
36480b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::getTypeOrNull(QualType Ty) {
3649e8d8bef9SDimitry Andric   assert(Ty == UnwrapTypeForDebugInfo(Ty, CGM.getContext()));
36500b57cec5SDimitry Andric   auto It = TypeCache.find(Ty.getAsOpaquePtr());
36510b57cec5SDimitry Andric   if (It != TypeCache.end()) {
36520b57cec5SDimitry Andric     // Verify that the debug info still exists.
36530b57cec5SDimitry Andric     if (llvm::Metadata *V = It->second)
36540b57cec5SDimitry Andric       return cast<llvm::DIType>(V);
36550b57cec5SDimitry Andric   }
36560b57cec5SDimitry Andric 
36570b57cec5SDimitry Andric   return nullptr;
36580b57cec5SDimitry Andric }
36590b57cec5SDimitry Andric 
36600b57cec5SDimitry Andric void CGDebugInfo::completeTemplateDefinition(
36610b57cec5SDimitry Andric     const ClassTemplateSpecializationDecl &SD) {
36620b57cec5SDimitry Andric   completeUnusedClass(SD);
36630b57cec5SDimitry Andric }
36640b57cec5SDimitry Andric 
36650b57cec5SDimitry Andric void CGDebugInfo::completeUnusedClass(const CXXRecordDecl &D) {
366606c3fb27SDimitry Andric   if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly ||
366706c3fb27SDimitry Andric       D.isDynamicClass())
36680b57cec5SDimitry Andric     return;
36690b57cec5SDimitry Andric 
36700b57cec5SDimitry Andric   completeClassData(&D);
36710b57cec5SDimitry Andric   // In case this type has no member function definitions being emitted, ensure
36720b57cec5SDimitry Andric   // it is retained
36730b57cec5SDimitry Andric   RetainedTypes.push_back(CGM.getContext().getRecordType(&D).getAsOpaquePtr());
36740b57cec5SDimitry Andric }
36750b57cec5SDimitry Andric 
367681ad6265SDimitry Andric llvm::DIType *CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile *Unit) {
36770b57cec5SDimitry Andric   if (Ty.isNull())
36780b57cec5SDimitry Andric     return nullptr;
36790b57cec5SDimitry Andric 
3680480093f4SDimitry Andric   llvm::TimeTraceScope TimeScope("DebugType", [&]() {
3681480093f4SDimitry Andric     std::string Name;
3682480093f4SDimitry Andric     llvm::raw_string_ostream OS(Name);
3683480093f4SDimitry Andric     Ty.print(OS, getPrintingPolicy());
3684480093f4SDimitry Andric     return Name;
3685480093f4SDimitry Andric   });
3686480093f4SDimitry Andric 
36870b57cec5SDimitry Andric   // Unwrap the type as needed for debug information.
36880b57cec5SDimitry Andric   Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext());
36890b57cec5SDimitry Andric 
36900b57cec5SDimitry Andric   if (auto *T = getTypeOrNull(Ty))
36910b57cec5SDimitry Andric     return T;
36920b57cec5SDimitry Andric 
369381ad6265SDimitry Andric   llvm::DIType *Res = CreateTypeNode(Ty, Unit);
36940b57cec5SDimitry Andric   void *TyPtr = Ty.getAsOpaquePtr();
36950b57cec5SDimitry Andric 
36960b57cec5SDimitry Andric   // And update the type cache.
36970b57cec5SDimitry Andric   TypeCache[TyPtr].reset(Res);
36980b57cec5SDimitry Andric 
36990b57cec5SDimitry Andric   return Res;
37000b57cec5SDimitry Andric }
37010b57cec5SDimitry Andric 
37020b57cec5SDimitry Andric llvm::DIModule *CGDebugInfo::getParentModuleOrNull(const Decl *D) {
37030b57cec5SDimitry Andric   // A forward declaration inside a module header does not belong to the module.
37040b57cec5SDimitry Andric   if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->getDefinition())
37050b57cec5SDimitry Andric     return nullptr;
37060b57cec5SDimitry Andric   if (DebugTypeExtRefs && D->isFromASTFile()) {
37070b57cec5SDimitry Andric     // Record a reference to an imported clang module or precompiled header.
37080b57cec5SDimitry Andric     auto *Reader = CGM.getContext().getExternalSource();
37090b57cec5SDimitry Andric     auto Idx = D->getOwningModuleID();
37100b57cec5SDimitry Andric     auto Info = Reader->getSourceDescriptor(Idx);
37110b57cec5SDimitry Andric     if (Info)
37120b57cec5SDimitry Andric       return getOrCreateModuleRef(*Info, /*SkeletonCU=*/true);
37130b57cec5SDimitry Andric   } else if (ClangModuleMap) {
37140b57cec5SDimitry Andric     // We are building a clang module or a precompiled header.
37150b57cec5SDimitry Andric     //
37160b57cec5SDimitry Andric     // TODO: When D is a CXXRecordDecl or a C++ Enum, the ODR applies
37170b57cec5SDimitry Andric     // and it wouldn't be necessary to specify the parent scope
37180b57cec5SDimitry Andric     // because the type is already unique by definition (it would look
37190b57cec5SDimitry Andric     // like the output of -fno-standalone-debug). On the other hand,
37200b57cec5SDimitry Andric     // the parent scope helps a consumer to quickly locate the object
37210b57cec5SDimitry Andric     // file where the type's definition is located, so it might be
37220b57cec5SDimitry Andric     // best to make this behavior a command line or debugger tuning
37230b57cec5SDimitry Andric     // option.
37240b57cec5SDimitry Andric     if (Module *M = D->getOwningModule()) {
37250b57cec5SDimitry Andric       // This is a (sub-)module.
37265ffd83dbSDimitry Andric       auto Info = ASTSourceDescriptor(*M);
37270b57cec5SDimitry Andric       return getOrCreateModuleRef(Info, /*SkeletonCU=*/false);
37280b57cec5SDimitry Andric     } else {
37290b57cec5SDimitry Andric       // This the precompiled header being built.
37300b57cec5SDimitry Andric       return getOrCreateModuleRef(PCHDescriptor, /*SkeletonCU=*/false);
37310b57cec5SDimitry Andric     }
37320b57cec5SDimitry Andric   }
37330b57cec5SDimitry Andric 
37340b57cec5SDimitry Andric   return nullptr;
37350b57cec5SDimitry Andric }
37360b57cec5SDimitry Andric 
373781ad6265SDimitry Andric llvm::DIType *CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile *Unit) {
37380b57cec5SDimitry Andric   // Handle qualifiers, which recursively handles what they refer to.
37390b57cec5SDimitry Andric   if (Ty.hasLocalQualifiers())
374081ad6265SDimitry Andric     return CreateQualifiedType(Ty, Unit);
37410b57cec5SDimitry Andric 
37420b57cec5SDimitry Andric   // Work out details of type.
37430b57cec5SDimitry Andric   switch (Ty->getTypeClass()) {
37440b57cec5SDimitry Andric #define TYPE(Class, Base)
37450b57cec5SDimitry Andric #define ABSTRACT_TYPE(Class, Base)
37460b57cec5SDimitry Andric #define NON_CANONICAL_TYPE(Class, Base)
37470b57cec5SDimitry Andric #define DEPENDENT_TYPE(Class, Base) case Type::Class:
3748a7dea167SDimitry Andric #include "clang/AST/TypeNodes.inc"
37490b57cec5SDimitry Andric     llvm_unreachable("Dependent types cannot show up in debug information");
37500b57cec5SDimitry Andric 
37510b57cec5SDimitry Andric   case Type::ExtVector:
37520b57cec5SDimitry Andric   case Type::Vector:
37530b57cec5SDimitry Andric     return CreateType(cast<VectorType>(Ty), Unit);
37545ffd83dbSDimitry Andric   case Type::ConstantMatrix:
37555ffd83dbSDimitry Andric     return CreateType(cast<ConstantMatrixType>(Ty), Unit);
37560b57cec5SDimitry Andric   case Type::ObjCObjectPointer:
37570b57cec5SDimitry Andric     return CreateType(cast<ObjCObjectPointerType>(Ty), Unit);
37580b57cec5SDimitry Andric   case Type::ObjCObject:
37590b57cec5SDimitry Andric     return CreateType(cast<ObjCObjectType>(Ty), Unit);
37600b57cec5SDimitry Andric   case Type::ObjCTypeParam:
37610b57cec5SDimitry Andric     return CreateType(cast<ObjCTypeParamType>(Ty), Unit);
37620b57cec5SDimitry Andric   case Type::ObjCInterface:
37630b57cec5SDimitry Andric     return CreateType(cast<ObjCInterfaceType>(Ty), Unit);
37640b57cec5SDimitry Andric   case Type::Builtin:
37650b57cec5SDimitry Andric     return CreateType(cast<BuiltinType>(Ty));
37660b57cec5SDimitry Andric   case Type::Complex:
37670b57cec5SDimitry Andric     return CreateType(cast<ComplexType>(Ty));
37680b57cec5SDimitry Andric   case Type::Pointer:
376981ad6265SDimitry Andric     return CreateType(cast<PointerType>(Ty), Unit);
37700b57cec5SDimitry Andric   case Type::BlockPointer:
37710b57cec5SDimitry Andric     return CreateType(cast<BlockPointerType>(Ty), Unit);
37720b57cec5SDimitry Andric   case Type::Typedef:
37730b57cec5SDimitry Andric     return CreateType(cast<TypedefType>(Ty), Unit);
37740b57cec5SDimitry Andric   case Type::Record:
37750b57cec5SDimitry Andric     return CreateType(cast<RecordType>(Ty));
37760b57cec5SDimitry Andric   case Type::Enum:
37770b57cec5SDimitry Andric     return CreateEnumType(cast<EnumType>(Ty));
37780b57cec5SDimitry Andric   case Type::FunctionProto:
37790b57cec5SDimitry Andric   case Type::FunctionNoProto:
378081ad6265SDimitry Andric     return CreateType(cast<FunctionType>(Ty), Unit);
37810b57cec5SDimitry Andric   case Type::ConstantArray:
37820b57cec5SDimitry Andric   case Type::VariableArray:
37830b57cec5SDimitry Andric   case Type::IncompleteArray:
3784*0fca6ea1SDimitry Andric   case Type::ArrayParameter:
37850b57cec5SDimitry Andric     return CreateType(cast<ArrayType>(Ty), Unit);
37860b57cec5SDimitry Andric 
37870b57cec5SDimitry Andric   case Type::LValueReference:
37880b57cec5SDimitry Andric     return CreateType(cast<LValueReferenceType>(Ty), Unit);
37890b57cec5SDimitry Andric   case Type::RValueReference:
37900b57cec5SDimitry Andric     return CreateType(cast<RValueReferenceType>(Ty), Unit);
37910b57cec5SDimitry Andric 
37920b57cec5SDimitry Andric   case Type::MemberPointer:
37930b57cec5SDimitry Andric     return CreateType(cast<MemberPointerType>(Ty), Unit);
37940b57cec5SDimitry Andric 
37950b57cec5SDimitry Andric   case Type::Atomic:
37960b57cec5SDimitry Andric     return CreateType(cast<AtomicType>(Ty), Unit);
37970b57cec5SDimitry Andric 
37980eae32dcSDimitry Andric   case Type::BitInt:
37990eae32dcSDimitry Andric     return CreateType(cast<BitIntType>(Ty));
38000b57cec5SDimitry Andric   case Type::Pipe:
38010b57cec5SDimitry Andric     return CreateType(cast<PipeType>(Ty), Unit);
38020b57cec5SDimitry Andric 
38030b57cec5SDimitry Andric   case Type::TemplateSpecialization:
38040b57cec5SDimitry Andric     return CreateType(cast<TemplateSpecializationType>(Ty), Unit);
38050b57cec5SDimitry Andric 
3806*0fca6ea1SDimitry Andric   case Type::CountAttributed:
38070b57cec5SDimitry Andric   case Type::Auto:
38080b57cec5SDimitry Andric   case Type::Attributed:
380981ad6265SDimitry Andric   case Type::BTFTagAttributed:
38100b57cec5SDimitry Andric   case Type::Adjusted:
38110b57cec5SDimitry Andric   case Type::Decayed:
38120b57cec5SDimitry Andric   case Type::DeducedTemplateSpecialization:
38130b57cec5SDimitry Andric   case Type::Elaborated:
38140eae32dcSDimitry Andric   case Type::Using:
38150b57cec5SDimitry Andric   case Type::Paren:
38160b57cec5SDimitry Andric   case Type::MacroQualified:
38170b57cec5SDimitry Andric   case Type::SubstTemplateTypeParm:
38180b57cec5SDimitry Andric   case Type::TypeOfExpr:
38190b57cec5SDimitry Andric   case Type::TypeOf:
38200b57cec5SDimitry Andric   case Type::Decltype:
3821*0fca6ea1SDimitry Andric   case Type::PackIndexing:
38220b57cec5SDimitry Andric   case Type::UnaryTransform:
38230b57cec5SDimitry Andric     break;
38240b57cec5SDimitry Andric   }
38250b57cec5SDimitry Andric 
38260b57cec5SDimitry Andric   llvm_unreachable("type should have been unwrapped!");
38270b57cec5SDimitry Andric }
38280b57cec5SDimitry Andric 
3829e8d8bef9SDimitry Andric llvm::DICompositeType *
3830e8d8bef9SDimitry Andric CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty) {
38310b57cec5SDimitry Andric   QualType QTy(Ty, 0);
38320b57cec5SDimitry Andric 
38330b57cec5SDimitry Andric   auto *T = cast_or_null<llvm::DICompositeType>(getTypeOrNull(QTy));
38340b57cec5SDimitry Andric 
38350b57cec5SDimitry Andric   // We may have cached a forward decl when we could have created
38360b57cec5SDimitry Andric   // a non-forward decl. Go ahead and create a non-forward decl
38370b57cec5SDimitry Andric   // now.
38380b57cec5SDimitry Andric   if (T && !T->isForwardDecl())
38390b57cec5SDimitry Andric     return T;
38400b57cec5SDimitry Andric 
38410b57cec5SDimitry Andric   // Otherwise create the type.
38420b57cec5SDimitry Andric   llvm::DICompositeType *Res = CreateLimitedType(Ty);
38430b57cec5SDimitry Andric 
38440b57cec5SDimitry Andric   // Propagate members from the declaration to the definition
38450b57cec5SDimitry Andric   // CreateType(const RecordType*) will overwrite this with the members in the
38460b57cec5SDimitry Andric   // correct order if the full type is needed.
38470b57cec5SDimitry Andric   DBuilder.replaceArrays(Res, T ? T->getElements() : llvm::DINodeArray());
38480b57cec5SDimitry Andric 
38490b57cec5SDimitry Andric   // And update the type cache.
38500b57cec5SDimitry Andric   TypeCache[QTy.getAsOpaquePtr()].reset(Res);
38510b57cec5SDimitry Andric   return Res;
38520b57cec5SDimitry Andric }
38530b57cec5SDimitry Andric 
38540b57cec5SDimitry Andric // TODO: Currently used for context chains when limiting debug info.
38550b57cec5SDimitry Andric llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
38560b57cec5SDimitry Andric   RecordDecl *RD = Ty->getDecl();
38570b57cec5SDimitry Andric 
38580b57cec5SDimitry Andric   // Get overall information about the record type for the debug info.
38590b57cec5SDimitry Andric   StringRef RDName = getClassName(RD);
3860e8d8bef9SDimitry Andric   const SourceLocation Loc = RD->getLocation();
3861e8d8bef9SDimitry Andric   llvm::DIFile *DefUnit = nullptr;
3862e8d8bef9SDimitry Andric   unsigned Line = 0;
3863e8d8bef9SDimitry Andric   if (Loc.isValid()) {
3864e8d8bef9SDimitry Andric     DefUnit = getOrCreateFile(Loc);
3865e8d8bef9SDimitry Andric     Line = getLineNumber(Loc);
3866e8d8bef9SDimitry Andric   }
38670b57cec5SDimitry Andric 
38680b57cec5SDimitry Andric   llvm::DIScope *RDContext = getDeclContextDescriptor(RD);
38690b57cec5SDimitry Andric 
38700b57cec5SDimitry Andric   // If we ended up creating the type during the context chain construction,
38710b57cec5SDimitry Andric   // just return that.
38720b57cec5SDimitry Andric   auto *T = cast_or_null<llvm::DICompositeType>(
38730b57cec5SDimitry Andric       getTypeOrNull(CGM.getContext().getRecordType(RD)));
38740b57cec5SDimitry Andric   if (T && (!T->isForwardDecl() || !RD->getDefinition()))
38750b57cec5SDimitry Andric     return T;
38760b57cec5SDimitry Andric 
38770b57cec5SDimitry Andric   // If this is just a forward or incomplete declaration, construct an
38780b57cec5SDimitry Andric   // appropriately marked node and just return it.
38790b57cec5SDimitry Andric   const RecordDecl *D = RD->getDefinition();
38800b57cec5SDimitry Andric   if (!D || !D->isCompleteDefinition())
38810b57cec5SDimitry Andric     return getOrCreateRecordFwdDecl(Ty, RDContext);
38820b57cec5SDimitry Andric 
38830b57cec5SDimitry Andric   uint64_t Size = CGM.getContext().getTypeSize(Ty);
388481ad6265SDimitry Andric   // __attribute__((aligned)) can increase or decrease alignment *except* on a
388581ad6265SDimitry Andric   // struct or struct member, where it only increases  alignment unless 'packed'
388681ad6265SDimitry Andric   // is also specified. To handle this case, the `getTypeAlignIfRequired` needs
388781ad6265SDimitry Andric   // to be used.
388881ad6265SDimitry Andric   auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
38890b57cec5SDimitry Andric 
38900b57cec5SDimitry Andric   SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
38910b57cec5SDimitry Andric 
3892a7dea167SDimitry Andric   // Explicitly record the calling convention and export symbols for C++
3893a7dea167SDimitry Andric   // records.
38940b57cec5SDimitry Andric   auto Flags = llvm::DINode::FlagZero;
38950b57cec5SDimitry Andric   if (auto CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
38960b57cec5SDimitry Andric     if (CGM.getCXXABI().getRecordArgABI(CXXRD) == CGCXXABI::RAA_Indirect)
38970b57cec5SDimitry Andric       Flags |= llvm::DINode::FlagTypePassByReference;
38980b57cec5SDimitry Andric     else
38990b57cec5SDimitry Andric       Flags |= llvm::DINode::FlagTypePassByValue;
39000b57cec5SDimitry Andric 
39010b57cec5SDimitry Andric     // Record if a C++ record is non-trivial type.
39020b57cec5SDimitry Andric     if (!CXXRD->isTrivial())
39030b57cec5SDimitry Andric       Flags |= llvm::DINode::FlagNonTrivial;
3904a7dea167SDimitry Andric 
3905a7dea167SDimitry Andric     // Record exports it symbols to the containing structure.
3906a7dea167SDimitry Andric     if (CXXRD->isAnonymousStructOrUnion())
3907a7dea167SDimitry Andric         Flags |= llvm::DINode::FlagExportSymbols;
39080eae32dcSDimitry Andric 
39090eae32dcSDimitry Andric     Flags |= getAccessFlag(CXXRD->getAccess(),
39100eae32dcSDimitry Andric                            dyn_cast<CXXRecordDecl>(CXXRD->getDeclContext()));
39110b57cec5SDimitry Andric   }
39120b57cec5SDimitry Andric 
3913349cc55cSDimitry Andric   llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
39140b57cec5SDimitry Andric   llvm::DICompositeType *RealDecl = DBuilder.createReplaceableCompositeType(
39150b57cec5SDimitry Andric       getTagForRecord(RD), RDName, RDContext, DefUnit, Line, 0, Size, Align,
3916349cc55cSDimitry Andric       Flags, Identifier, Annotations);
39170b57cec5SDimitry Andric 
39180b57cec5SDimitry Andric   // Elements of composite types usually have back to the type, creating
39190b57cec5SDimitry Andric   // uniquing cycles.  Distinct nodes are more efficient.
39200b57cec5SDimitry Andric   switch (RealDecl->getTag()) {
39210b57cec5SDimitry Andric   default:
39220b57cec5SDimitry Andric     llvm_unreachable("invalid composite type tag");
39230b57cec5SDimitry Andric 
39240b57cec5SDimitry Andric   case llvm::dwarf::DW_TAG_array_type:
39250b57cec5SDimitry Andric   case llvm::dwarf::DW_TAG_enumeration_type:
39260b57cec5SDimitry Andric     // Array elements and most enumeration elements don't have back references,
39270b57cec5SDimitry Andric     // so they don't tend to be involved in uniquing cycles and there is some
39280b57cec5SDimitry Andric     // chance of merging them when linking together two modules.  Only make
39290b57cec5SDimitry Andric     // them distinct if they are ODR-uniqued.
39300b57cec5SDimitry Andric     if (Identifier.empty())
39310b57cec5SDimitry Andric       break;
3932bdd1243dSDimitry Andric     [[fallthrough]];
39330b57cec5SDimitry Andric 
39340b57cec5SDimitry Andric   case llvm::dwarf::DW_TAG_structure_type:
39350b57cec5SDimitry Andric   case llvm::dwarf::DW_TAG_union_type:
39360b57cec5SDimitry Andric   case llvm::dwarf::DW_TAG_class_type:
39370b57cec5SDimitry Andric     // Immediately resolve to a distinct node.
39380b57cec5SDimitry Andric     RealDecl =
39390b57cec5SDimitry Andric         llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
39400b57cec5SDimitry Andric     break;
39410b57cec5SDimitry Andric   }
39420b57cec5SDimitry Andric 
39430b57cec5SDimitry Andric   RegionMap[Ty->getDecl()].reset(RealDecl);
39440b57cec5SDimitry Andric   TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
39450b57cec5SDimitry Andric 
39460b57cec5SDimitry Andric   if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
39470b57cec5SDimitry Andric     DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(),
39480b57cec5SDimitry Andric                            CollectCXXTemplateParams(TSpecial, DefUnit));
39490b57cec5SDimitry Andric   return RealDecl;
39500b57cec5SDimitry Andric }
39510b57cec5SDimitry Andric 
39520b57cec5SDimitry Andric void CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD,
39530b57cec5SDimitry Andric                                         llvm::DICompositeType *RealDecl) {
39540b57cec5SDimitry Andric   // A class's primary base or the class itself contains the vtable.
395506c3fb27SDimitry Andric   llvm::DIType *ContainingType = nullptr;
39560b57cec5SDimitry Andric   const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
39570b57cec5SDimitry Andric   if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) {
39580b57cec5SDimitry Andric     // Seek non-virtual primary base root.
395904eeddc0SDimitry Andric     while (true) {
39600b57cec5SDimitry Andric       const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase);
39610b57cec5SDimitry Andric       const CXXRecordDecl *PBT = BRL.getPrimaryBase();
39620b57cec5SDimitry Andric       if (PBT && !BRL.isPrimaryBaseVirtual())
39630b57cec5SDimitry Andric         PBase = PBT;
39640b57cec5SDimitry Andric       else
39650b57cec5SDimitry Andric         break;
39660b57cec5SDimitry Andric     }
396706c3fb27SDimitry Andric     ContainingType = getOrCreateType(QualType(PBase->getTypeForDecl(), 0),
396806c3fb27SDimitry Andric                                      getOrCreateFile(RD->getLocation()));
39690b57cec5SDimitry Andric   } else if (RD->isDynamicClass())
39700b57cec5SDimitry Andric     ContainingType = RealDecl;
39710b57cec5SDimitry Andric 
39720b57cec5SDimitry Andric   DBuilder.replaceVTableHolder(RealDecl, ContainingType);
39730b57cec5SDimitry Andric }
39740b57cec5SDimitry Andric 
39750b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateMemberType(llvm::DIFile *Unit, QualType FType,
39760b57cec5SDimitry Andric                                             StringRef Name, uint64_t *Offset) {
39770b57cec5SDimitry Andric   llvm::DIType *FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
39780b57cec5SDimitry Andric   uint64_t FieldSize = CGM.getContext().getTypeSize(FType);
39790b57cec5SDimitry Andric   auto FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext());
39800b57cec5SDimitry Andric   llvm::DIType *Ty =
39810b57cec5SDimitry Andric       DBuilder.createMemberType(Unit, Name, Unit, 0, FieldSize, FieldAlign,
39820b57cec5SDimitry Andric                                 *Offset, llvm::DINode::FlagZero, FieldTy);
39830b57cec5SDimitry Andric   *Offset += FieldSize;
39840b57cec5SDimitry Andric   return Ty;
39850b57cec5SDimitry Andric }
39860b57cec5SDimitry Andric 
39870b57cec5SDimitry Andric void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit,
39880b57cec5SDimitry Andric                                            StringRef &Name,
39890b57cec5SDimitry Andric                                            StringRef &LinkageName,
39900b57cec5SDimitry Andric                                            llvm::DIScope *&FDContext,
39910b57cec5SDimitry Andric                                            llvm::DINodeArray &TParamsArray,
39920b57cec5SDimitry Andric                                            llvm::DINode::DIFlags &Flags) {
3993fe6060f1SDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getCanonicalDecl().getDecl());
39940b57cec5SDimitry Andric   Name = getFunctionName(FD);
39950b57cec5SDimitry Andric   // Use mangled name as linkage name for C/C++ functions.
3996fe6060f1SDimitry Andric   if (FD->getType()->getAs<FunctionProtoType>())
39970b57cec5SDimitry Andric     LinkageName = CGM.getMangledName(GD);
3998fe6060f1SDimitry Andric   if (FD->hasPrototype())
39990b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagPrototyped;
40000b57cec5SDimitry Andric   // No need to replicate the linkage name if it isn't different from the
40010b57cec5SDimitry Andric   // subprogram name, no need to have it at all unless coverage is enabled or
40020b57cec5SDimitry Andric   // debug is set to more than just line tables or extra debug info is needed.
400306c3fb27SDimitry Andric   if (LinkageName == Name ||
400406c3fb27SDimitry Andric       (CGM.getCodeGenOpts().CoverageNotesFile.empty() &&
400506c3fb27SDimitry Andric        CGM.getCodeGenOpts().CoverageDataFile.empty() &&
40060b57cec5SDimitry Andric        !CGM.getCodeGenOpts().DebugInfoForProfiling &&
4007fe6060f1SDimitry Andric        !CGM.getCodeGenOpts().PseudoProbeForProfiling &&
400806c3fb27SDimitry Andric        DebugKind <= llvm::codegenoptions::DebugLineTablesOnly))
40090b57cec5SDimitry Andric     LinkageName = StringRef();
40100b57cec5SDimitry Andric 
4011e8d8bef9SDimitry Andric   // Emit the function scope in line tables only mode (if CodeView) to
4012e8d8bef9SDimitry Andric   // differentiate between function names.
4013e8d8bef9SDimitry Andric   if (CGM.getCodeGenOpts().hasReducedDebugInfo() ||
401406c3fb27SDimitry Andric       (DebugKind == llvm::codegenoptions::DebugLineTablesOnly &&
4015e8d8bef9SDimitry Andric        CGM.getCodeGenOpts().EmitCodeView)) {
40160b57cec5SDimitry Andric     if (const NamespaceDecl *NSDecl =
40170b57cec5SDimitry Andric             dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
40180b57cec5SDimitry Andric       FDContext = getOrCreateNamespace(NSDecl);
40190b57cec5SDimitry Andric     else if (const RecordDecl *RDecl =
40200b57cec5SDimitry Andric                  dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) {
40210b57cec5SDimitry Andric       llvm::DIScope *Mod = getParentModuleOrNull(RDecl);
40220b57cec5SDimitry Andric       FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU);
40230b57cec5SDimitry Andric     }
4024e8d8bef9SDimitry Andric   }
4025e8d8bef9SDimitry Andric   if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
40260b57cec5SDimitry Andric     // Check if it is a noreturn-marked function
40270b57cec5SDimitry Andric     if (FD->isNoReturn())
40280b57cec5SDimitry Andric       Flags |= llvm::DINode::FlagNoReturn;
40290b57cec5SDimitry Andric     // Collect template parameters.
40300b57cec5SDimitry Andric     TParamsArray = CollectFunctionTemplateParams(FD, Unit);
40310b57cec5SDimitry Andric   }
40320b57cec5SDimitry Andric }
40330b57cec5SDimitry Andric 
40340b57cec5SDimitry Andric void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit,
40350b57cec5SDimitry Andric                                       unsigned &LineNo, QualType &T,
40360b57cec5SDimitry Andric                                       StringRef &Name, StringRef &LinkageName,
40370b57cec5SDimitry Andric                                       llvm::MDTuple *&TemplateParameters,
40380b57cec5SDimitry Andric                                       llvm::DIScope *&VDContext) {
40390b57cec5SDimitry Andric   Unit = getOrCreateFile(VD->getLocation());
40400b57cec5SDimitry Andric   LineNo = getLineNumber(VD->getLocation());
40410b57cec5SDimitry Andric 
40420b57cec5SDimitry Andric   setLocation(VD->getLocation());
40430b57cec5SDimitry Andric 
40440b57cec5SDimitry Andric   T = VD->getType();
40450b57cec5SDimitry Andric   if (T->isIncompleteArrayType()) {
40460b57cec5SDimitry Andric     // CodeGen turns int[] into int[1] so we'll do the same here.
40470b57cec5SDimitry Andric     llvm::APInt ConstVal(32, 1);
40480b57cec5SDimitry Andric     QualType ET = CGM.getContext().getAsArrayType(T)->getElementType();
40490b57cec5SDimitry Andric 
4050a7dea167SDimitry Andric     T = CGM.getContext().getConstantArrayType(ET, ConstVal, nullptr,
40515f757f3fSDimitry Andric                                               ArraySizeModifier::Normal, 0);
40520b57cec5SDimitry Andric   }
40530b57cec5SDimitry Andric 
40540b57cec5SDimitry Andric   Name = VD->getName();
40550b57cec5SDimitry Andric   if (VD->getDeclContext() && !isa<FunctionDecl>(VD->getDeclContext()) &&
40560b57cec5SDimitry Andric       !isa<ObjCMethodDecl>(VD->getDeclContext()))
40570b57cec5SDimitry Andric     LinkageName = CGM.getMangledName(VD);
40580b57cec5SDimitry Andric   if (LinkageName == Name)
40590b57cec5SDimitry Andric     LinkageName = StringRef();
40600b57cec5SDimitry Andric 
40610b57cec5SDimitry Andric   if (isa<VarTemplateSpecializationDecl>(VD)) {
40620b57cec5SDimitry Andric     llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VD, &*Unit);
40630b57cec5SDimitry Andric     TemplateParameters = parameterNodes.get();
40640b57cec5SDimitry Andric   } else {
40650b57cec5SDimitry Andric     TemplateParameters = nullptr;
40660b57cec5SDimitry Andric   }
40670b57cec5SDimitry Andric 
40680b57cec5SDimitry Andric   // Since we emit declarations (DW_AT_members) for static members, place the
40690b57cec5SDimitry Andric   // definition of those static members in the namespace they were declared in
40700b57cec5SDimitry Andric   // in the source code (the lexical decl context).
40710b57cec5SDimitry Andric   // FIXME: Generalize this for even non-member global variables where the
40720b57cec5SDimitry Andric   // declaration and definition may have different lexical decl contexts, once
40730b57cec5SDimitry Andric   // we have support for emitting declarations of (non-member) global variables.
40740b57cec5SDimitry Andric   const DeclContext *DC = VD->isStaticDataMember() ? VD->getLexicalDeclContext()
40750b57cec5SDimitry Andric                                                    : VD->getDeclContext();
40760b57cec5SDimitry Andric   // When a record type contains an in-line initialization of a static data
40770b57cec5SDimitry Andric   // member, and the record type is marked as __declspec(dllexport), an implicit
40780b57cec5SDimitry Andric   // definition of the member will be created in the record context.  DWARF
40790b57cec5SDimitry Andric   // doesn't seem to have a nice way to describe this in a form that consumers
40800b57cec5SDimitry Andric   // are likely to understand, so fake the "normal" situation of a definition
40810b57cec5SDimitry Andric   // outside the class by putting it in the global scope.
40820b57cec5SDimitry Andric   if (DC->isRecord())
40830b57cec5SDimitry Andric     DC = CGM.getContext().getTranslationUnitDecl();
40840b57cec5SDimitry Andric 
40850b57cec5SDimitry Andric   llvm::DIScope *Mod = getParentModuleOrNull(VD);
40860b57cec5SDimitry Andric   VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU);
40870b57cec5SDimitry Andric }
40880b57cec5SDimitry Andric 
40890b57cec5SDimitry Andric llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
40900b57cec5SDimitry Andric                                                           bool Stub) {
40910b57cec5SDimitry Andric   llvm::DINodeArray TParamsArray;
40920b57cec5SDimitry Andric   StringRef Name, LinkageName;
40930b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
40940b57cec5SDimitry Andric   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
40950b57cec5SDimitry Andric   SourceLocation Loc = GD.getDecl()->getLocation();
40960b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(Loc);
40970b57cec5SDimitry Andric   llvm::DIScope *DContext = Unit;
40980b57cec5SDimitry Andric   unsigned Line = getLineNumber(Loc);
40990b57cec5SDimitry Andric   collectFunctionDeclProps(GD, Unit, Name, LinkageName, DContext, TParamsArray,
41000b57cec5SDimitry Andric                            Flags);
4101a7dea167SDimitry Andric   auto *FD = cast<FunctionDecl>(GD.getDecl());
41020b57cec5SDimitry Andric 
41030b57cec5SDimitry Andric   // Build function type.
41040b57cec5SDimitry Andric   SmallVector<QualType, 16> ArgTypes;
41050b57cec5SDimitry Andric   for (const ParmVarDecl *Parm : FD->parameters())
41060b57cec5SDimitry Andric     ArgTypes.push_back(Parm->getType());
4107a7dea167SDimitry Andric 
41080b57cec5SDimitry Andric   CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv();
41090b57cec5SDimitry Andric   QualType FnType = CGM.getContext().getFunctionType(
41100b57cec5SDimitry Andric       FD->getReturnType(), ArgTypes, FunctionProtoType::ExtProtoInfo(CC));
41110b57cec5SDimitry Andric   if (!FD->isExternallyVisible())
41120b57cec5SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
41130b57cec5SDimitry Andric   if (CGM.getLangOpts().Optimize)
41140b57cec5SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagOptimized;
41150b57cec5SDimitry Andric 
41160b57cec5SDimitry Andric   if (Stub) {
41170b57cec5SDimitry Andric     Flags |= getCallSiteRelatedAttrs();
41180b57cec5SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagDefinition;
41190b57cec5SDimitry Andric     return DBuilder.createFunction(
41200b57cec5SDimitry Andric         DContext, Name, LinkageName, Unit, Line,
41210b57cec5SDimitry Andric         getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
41220b57cec5SDimitry Andric         TParamsArray.get(), getFunctionDeclaration(FD));
41230b57cec5SDimitry Andric   }
41240b57cec5SDimitry Andric 
41250b57cec5SDimitry Andric   llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(
41260b57cec5SDimitry Andric       DContext, Name, LinkageName, Unit, Line,
41270b57cec5SDimitry Andric       getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
41280b57cec5SDimitry Andric       TParamsArray.get(), getFunctionDeclaration(FD));
41290b57cec5SDimitry Andric   const FunctionDecl *CanonDecl = FD->getCanonicalDecl();
41300b57cec5SDimitry Andric   FwdDeclReplaceMap.emplace_back(std::piecewise_construct,
41310b57cec5SDimitry Andric                                  std::make_tuple(CanonDecl),
41320b57cec5SDimitry Andric                                  std::make_tuple(SP));
41330b57cec5SDimitry Andric   return SP;
41340b57cec5SDimitry Andric }
41350b57cec5SDimitry Andric 
41360b57cec5SDimitry Andric llvm::DISubprogram *CGDebugInfo::getFunctionForwardDeclaration(GlobalDecl GD) {
41370b57cec5SDimitry Andric   return getFunctionFwdDeclOrStub(GD, /* Stub = */ false);
41380b57cec5SDimitry Andric }
41390b57cec5SDimitry Andric 
41400b57cec5SDimitry Andric llvm::DISubprogram *CGDebugInfo::getFunctionStub(GlobalDecl GD) {
41410b57cec5SDimitry Andric   return getFunctionFwdDeclOrStub(GD, /* Stub = */ true);
41420b57cec5SDimitry Andric }
41430b57cec5SDimitry Andric 
41440b57cec5SDimitry Andric llvm::DIGlobalVariable *
41450b57cec5SDimitry Andric CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {
41460b57cec5SDimitry Andric   QualType T;
41470b57cec5SDimitry Andric   StringRef Name, LinkageName;
41480b57cec5SDimitry Andric   SourceLocation Loc = VD->getLocation();
41490b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(Loc);
41500b57cec5SDimitry Andric   llvm::DIScope *DContext = Unit;
41510b57cec5SDimitry Andric   unsigned Line = getLineNumber(Loc);
41520b57cec5SDimitry Andric   llvm::MDTuple *TemplateParameters = nullptr;
41530b57cec5SDimitry Andric 
41540b57cec5SDimitry Andric   collectVarDeclProps(VD, Unit, Line, T, Name, LinkageName, TemplateParameters,
41550b57cec5SDimitry Andric                       DContext);
41560b57cec5SDimitry Andric   auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
41570b57cec5SDimitry Andric   auto *GV = DBuilder.createTempGlobalVariableFwdDecl(
41580b57cec5SDimitry Andric       DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit),
41590b57cec5SDimitry Andric       !VD->isExternallyVisible(), nullptr, TemplateParameters, Align);
41600b57cec5SDimitry Andric   FwdDeclReplaceMap.emplace_back(
41610b57cec5SDimitry Andric       std::piecewise_construct,
41620b57cec5SDimitry Andric       std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())),
41630b57cec5SDimitry Andric       std::make_tuple(static_cast<llvm::Metadata *>(GV)));
41640b57cec5SDimitry Andric   return GV;
41650b57cec5SDimitry Andric }
41660b57cec5SDimitry Andric 
41670b57cec5SDimitry Andric llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) {
41680b57cec5SDimitry Andric   // We only need a declaration (not a definition) of the type - so use whatever
41690b57cec5SDimitry Andric   // we would otherwise do to get a type for a pointee. (forward declarations in
41700b57cec5SDimitry Andric   // limited debug info, full definitions (if the type definition is available)
41710b57cec5SDimitry Andric   // in unlimited debug info)
41720b57cec5SDimitry Andric   if (const auto *TD = dyn_cast<TypeDecl>(D))
41730b57cec5SDimitry Andric     return getOrCreateType(CGM.getContext().getTypeDeclType(TD),
41740b57cec5SDimitry Andric                            getOrCreateFile(TD->getLocation()));
41750b57cec5SDimitry Andric   auto I = DeclCache.find(D->getCanonicalDecl());
41760b57cec5SDimitry Andric 
41770b57cec5SDimitry Andric   if (I != DeclCache.end()) {
41780b57cec5SDimitry Andric     auto N = I->second;
41790b57cec5SDimitry Andric     if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(N))
41800b57cec5SDimitry Andric       return GVE->getVariable();
418181ad6265SDimitry Andric     return cast<llvm::DINode>(N);
418281ad6265SDimitry Andric   }
418381ad6265SDimitry Andric 
418481ad6265SDimitry Andric   // Search imported declaration cache if it is already defined
418581ad6265SDimitry Andric   // as imported declaration.
418681ad6265SDimitry Andric   auto IE = ImportedDeclCache.find(D->getCanonicalDecl());
418781ad6265SDimitry Andric 
418881ad6265SDimitry Andric   if (IE != ImportedDeclCache.end()) {
418981ad6265SDimitry Andric     auto N = IE->second;
419081ad6265SDimitry Andric     if (auto *GVE = dyn_cast_or_null<llvm::DIImportedEntity>(N))
419181ad6265SDimitry Andric       return cast<llvm::DINode>(GVE);
41920b57cec5SDimitry Andric     return dyn_cast_or_null<llvm::DINode>(N);
41930b57cec5SDimitry Andric   }
41940b57cec5SDimitry Andric 
41950b57cec5SDimitry Andric   // No definition for now. Emit a forward definition that might be
41960b57cec5SDimitry Andric   // merged with a potential upcoming definition.
41970b57cec5SDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(D))
41980b57cec5SDimitry Andric     return getFunctionForwardDeclaration(FD);
41990b57cec5SDimitry Andric   else if (const auto *VD = dyn_cast<VarDecl>(D))
42000b57cec5SDimitry Andric     return getGlobalVariableForwardDeclaration(VD);
42010b57cec5SDimitry Andric 
42020b57cec5SDimitry Andric   return nullptr;
42030b57cec5SDimitry Andric }
42040b57cec5SDimitry Andric 
42050b57cec5SDimitry Andric llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) {
420606c3fb27SDimitry Andric   if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
42070b57cec5SDimitry Andric     return nullptr;
42080b57cec5SDimitry Andric 
42090b57cec5SDimitry Andric   const auto *FD = dyn_cast<FunctionDecl>(D);
42100b57cec5SDimitry Andric   if (!FD)
42110b57cec5SDimitry Andric     return nullptr;
42120b57cec5SDimitry Andric 
42130b57cec5SDimitry Andric   // Setup context.
42140b57cec5SDimitry Andric   auto *S = getDeclContextDescriptor(D);
42150b57cec5SDimitry Andric 
42160b57cec5SDimitry Andric   auto MI = SPCache.find(FD->getCanonicalDecl());
42170b57cec5SDimitry Andric   if (MI == SPCache.end()) {
42180b57cec5SDimitry Andric     if (const auto *MD = dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) {
42190b57cec5SDimitry Andric       return CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()),
42200b57cec5SDimitry Andric                                      cast<llvm::DICompositeType>(S));
42210b57cec5SDimitry Andric     }
42220b57cec5SDimitry Andric   }
42230b57cec5SDimitry Andric   if (MI != SPCache.end()) {
42240b57cec5SDimitry Andric     auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
42250b57cec5SDimitry Andric     if (SP && !SP->isDefinition())
42260b57cec5SDimitry Andric       return SP;
42270b57cec5SDimitry Andric   }
42280b57cec5SDimitry Andric 
4229bdd1243dSDimitry Andric   for (auto *NextFD : FD->redecls()) {
42300b57cec5SDimitry Andric     auto MI = SPCache.find(NextFD->getCanonicalDecl());
42310b57cec5SDimitry Andric     if (MI != SPCache.end()) {
42320b57cec5SDimitry Andric       auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
42330b57cec5SDimitry Andric       if (SP && !SP->isDefinition())
42340b57cec5SDimitry Andric         return SP;
42350b57cec5SDimitry Andric     }
42360b57cec5SDimitry Andric   }
42370b57cec5SDimitry Andric   return nullptr;
42380b57cec5SDimitry Andric }
42390b57cec5SDimitry Andric 
4240480093f4SDimitry Andric llvm::DISubprogram *CGDebugInfo::getObjCMethodDeclaration(
4241480093f4SDimitry Andric     const Decl *D, llvm::DISubroutineType *FnType, unsigned LineNo,
4242480093f4SDimitry Andric     llvm::DINode::DIFlags Flags, llvm::DISubprogram::DISPFlags SPFlags) {
424306c3fb27SDimitry Andric   if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
4244480093f4SDimitry Andric     return nullptr;
4245480093f4SDimitry Andric 
4246480093f4SDimitry Andric   const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
4247480093f4SDimitry Andric   if (!OMD)
4248480093f4SDimitry Andric     return nullptr;
4249480093f4SDimitry Andric 
4250480093f4SDimitry Andric   if (CGM.getCodeGenOpts().DwarfVersion < 5 && !OMD->isDirectMethod())
4251480093f4SDimitry Andric     return nullptr;
4252480093f4SDimitry Andric 
4253480093f4SDimitry Andric   if (OMD->isDirectMethod())
4254480093f4SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagObjCDirect;
4255480093f4SDimitry Andric 
4256480093f4SDimitry Andric   // Starting with DWARF V5 method declarations are emitted as children of
4257480093f4SDimitry Andric   // the interface type.
4258480093f4SDimitry Andric   auto *ID = dyn_cast_or_null<ObjCInterfaceDecl>(D->getDeclContext());
4259480093f4SDimitry Andric   if (!ID)
4260480093f4SDimitry Andric     ID = OMD->getClassInterface();
4261480093f4SDimitry Andric   if (!ID)
4262480093f4SDimitry Andric     return nullptr;
4263480093f4SDimitry Andric   QualType QTy(ID->getTypeForDecl(), 0);
4264480093f4SDimitry Andric   auto It = TypeCache.find(QTy.getAsOpaquePtr());
4265480093f4SDimitry Andric   if (It == TypeCache.end())
4266480093f4SDimitry Andric     return nullptr;
4267480093f4SDimitry Andric   auto *InterfaceType = cast<llvm::DICompositeType>(It->second);
4268480093f4SDimitry Andric   llvm::DISubprogram *FD = DBuilder.createFunction(
4269480093f4SDimitry Andric       InterfaceType, getObjCMethodName(OMD), StringRef(),
4270480093f4SDimitry Andric       InterfaceType->getFile(), LineNo, FnType, LineNo, Flags, SPFlags);
4271480093f4SDimitry Andric   DBuilder.finalizeSubprogram(FD);
4272480093f4SDimitry Andric   ObjCMethodCache[ID].push_back({FD, OMD->isDirectMethod()});
4273480093f4SDimitry Andric   return FD;
4274480093f4SDimitry Andric }
4275480093f4SDimitry Andric 
42760b57cec5SDimitry Andric // getOrCreateFunctionType - Construct type. If it is a c++ method, include
42770b57cec5SDimitry Andric // implicit parameter "this".
42780b57cec5SDimitry Andric llvm::DISubroutineType *CGDebugInfo::getOrCreateFunctionType(const Decl *D,
42790b57cec5SDimitry Andric                                                              QualType FnType,
42800b57cec5SDimitry Andric                                                              llvm::DIFile *F) {
4281e8d8bef9SDimitry Andric   // In CodeView, we emit the function types in line tables only because the
4282e8d8bef9SDimitry Andric   // only way to distinguish between functions is by display name and type.
428306c3fb27SDimitry Andric   if (!D || (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly &&
4284e8d8bef9SDimitry Andric              !CGM.getCodeGenOpts().EmitCodeView))
42850b57cec5SDimitry Andric     // Create fake but valid subroutine type. Otherwise -verify would fail, and
42860b57cec5SDimitry Andric     // subprogram DIE will miss DW_AT_decl_file and DW_AT_decl_line fields.
4287bdd1243dSDimitry Andric     return DBuilder.createSubroutineType(
4288bdd1243dSDimitry Andric         DBuilder.getOrCreateTypeArray(std::nullopt));
42890b57cec5SDimitry Andric 
42900b57cec5SDimitry Andric   if (const auto *Method = dyn_cast<CXXMethodDecl>(D))
4291bdd1243dSDimitry Andric     return getOrCreateMethodType(Method, F);
42920b57cec5SDimitry Andric 
42930b57cec5SDimitry Andric   const auto *FTy = FnType->getAs<FunctionType>();
42940b57cec5SDimitry Andric   CallingConv CC = FTy ? FTy->getCallConv() : CallingConv::CC_C;
42950b57cec5SDimitry Andric 
42960b57cec5SDimitry Andric   if (const auto *OMethod = dyn_cast<ObjCMethodDecl>(D)) {
42970b57cec5SDimitry Andric     // Add "self" and "_cmd"
42980b57cec5SDimitry Andric     SmallVector<llvm::Metadata *, 16> Elts;
42990b57cec5SDimitry Andric 
43000b57cec5SDimitry Andric     // First element is always return type. For 'void' functions it is NULL.
43010b57cec5SDimitry Andric     QualType ResultTy = OMethod->getReturnType();
43020b57cec5SDimitry Andric 
43030b57cec5SDimitry Andric     // Replace the instancetype keyword with the actual type.
43040b57cec5SDimitry Andric     if (ResultTy == CGM.getContext().getObjCInstanceType())
43050b57cec5SDimitry Andric       ResultTy = CGM.getContext().getPointerType(
43060b57cec5SDimitry Andric           QualType(OMethod->getClassInterface()->getTypeForDecl(), 0));
43070b57cec5SDimitry Andric 
43080b57cec5SDimitry Andric     Elts.push_back(getOrCreateType(ResultTy, F));
43090b57cec5SDimitry Andric     // "self" pointer is always first argument.
43100b57cec5SDimitry Andric     QualType SelfDeclTy;
43110b57cec5SDimitry Andric     if (auto *SelfDecl = OMethod->getSelfDecl())
43120b57cec5SDimitry Andric       SelfDeclTy = SelfDecl->getType();
43130b57cec5SDimitry Andric     else if (auto *FPT = dyn_cast<FunctionProtoType>(FnType))
43140b57cec5SDimitry Andric       if (FPT->getNumParams() > 1)
43150b57cec5SDimitry Andric         SelfDeclTy = FPT->getParamType(0);
43160b57cec5SDimitry Andric     if (!SelfDeclTy.isNull())
43170b57cec5SDimitry Andric       Elts.push_back(
43180b57cec5SDimitry Andric           CreateSelfType(SelfDeclTy, getOrCreateType(SelfDeclTy, F)));
43190b57cec5SDimitry Andric     // "_cmd" pointer is always second argument.
43200b57cec5SDimitry Andric     Elts.push_back(DBuilder.createArtificialType(
43210b57cec5SDimitry Andric         getOrCreateType(CGM.getContext().getObjCSelType(), F)));
43220b57cec5SDimitry Andric     // Get rest of the arguments.
43230b57cec5SDimitry Andric     for (const auto *PI : OMethod->parameters())
43240b57cec5SDimitry Andric       Elts.push_back(getOrCreateType(PI->getType(), F));
43250b57cec5SDimitry Andric     // Variadic methods need a special marker at the end of the type list.
43260b57cec5SDimitry Andric     if (OMethod->isVariadic())
43270b57cec5SDimitry Andric       Elts.push_back(DBuilder.createUnspecifiedParameter());
43280b57cec5SDimitry Andric 
43290b57cec5SDimitry Andric     llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
43300b57cec5SDimitry Andric     return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero,
43310b57cec5SDimitry Andric                                          getDwarfCC(CC));
43320b57cec5SDimitry Andric   }
43330b57cec5SDimitry Andric 
43340b57cec5SDimitry Andric   // Handle variadic function types; they need an additional
43350b57cec5SDimitry Andric   // unspecified parameter.
43360b57cec5SDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(D))
43370b57cec5SDimitry Andric     if (FD->isVariadic()) {
43380b57cec5SDimitry Andric       SmallVector<llvm::Metadata *, 16> EltTys;
43390b57cec5SDimitry Andric       EltTys.push_back(getOrCreateType(FD->getReturnType(), F));
43400b57cec5SDimitry Andric       if (const auto *FPT = dyn_cast<FunctionProtoType>(FnType))
43410b57cec5SDimitry Andric         for (QualType ParamType : FPT->param_types())
43420b57cec5SDimitry Andric           EltTys.push_back(getOrCreateType(ParamType, F));
43430b57cec5SDimitry Andric       EltTys.push_back(DBuilder.createUnspecifiedParameter());
43440b57cec5SDimitry Andric       llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
43450b57cec5SDimitry Andric       return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero,
43460b57cec5SDimitry Andric                                            getDwarfCC(CC));
43470b57cec5SDimitry Andric     }
43480b57cec5SDimitry Andric 
434981ad6265SDimitry Andric   return cast<llvm::DISubroutineType>(getOrCreateType(FnType, F));
4350349cc55cSDimitry Andric }
4351349cc55cSDimitry Andric 
4352349cc55cSDimitry Andric QualType
4353349cc55cSDimitry Andric CGDebugInfo::getFunctionType(const FunctionDecl *FD, QualType RetTy,
4354349cc55cSDimitry Andric                              const SmallVectorImpl<const VarDecl *> &Args) {
4355349cc55cSDimitry Andric   CallingConv CC = CallingConv::CC_C;
4356349cc55cSDimitry Andric   if (FD)
4357349cc55cSDimitry Andric     if (const auto *SrcFnTy = FD->getType()->getAs<FunctionType>())
4358349cc55cSDimitry Andric       CC = SrcFnTy->getCallConv();
4359349cc55cSDimitry Andric   SmallVector<QualType, 16> ArgTypes;
4360349cc55cSDimitry Andric   for (const VarDecl *VD : Args)
4361349cc55cSDimitry Andric     ArgTypes.push_back(VD->getType());
4362349cc55cSDimitry Andric   return CGM.getContext().getFunctionType(RetTy, ArgTypes,
4363349cc55cSDimitry Andric                                           FunctionProtoType::ExtProtoInfo(CC));
43640b57cec5SDimitry Andric }
43650b57cec5SDimitry Andric 
4366e8d8bef9SDimitry Andric void CGDebugInfo::emitFunctionStart(GlobalDecl GD, SourceLocation Loc,
43670b57cec5SDimitry Andric                                     SourceLocation ScopeLoc, QualType FnType,
4368e8d8bef9SDimitry Andric                                     llvm::Function *Fn, bool CurFuncIsThunk) {
43690b57cec5SDimitry Andric   StringRef Name;
43700b57cec5SDimitry Andric   StringRef LinkageName;
43710b57cec5SDimitry Andric 
43720b57cec5SDimitry Andric   FnBeginRegionCount.push_back(LexicalBlockStack.size());
43730b57cec5SDimitry Andric 
43740b57cec5SDimitry Andric   const Decl *D = GD.getDecl();
43750b57cec5SDimitry Andric   bool HasDecl = (D != nullptr);
43760b57cec5SDimitry Andric 
43770b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
43780b57cec5SDimitry Andric   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
43790b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(Loc);
43800b57cec5SDimitry Andric   llvm::DIScope *FDContext = Unit;
43810b57cec5SDimitry Andric   llvm::DINodeArray TParamsArray;
43820b57cec5SDimitry Andric   if (!HasDecl) {
43830b57cec5SDimitry Andric     // Use llvm function name.
43840b57cec5SDimitry Andric     LinkageName = Fn->getName();
43850b57cec5SDimitry Andric   } else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
43860b57cec5SDimitry Andric     // If there is a subprogram for this function available then use it.
43870b57cec5SDimitry Andric     auto FI = SPCache.find(FD->getCanonicalDecl());
43880b57cec5SDimitry Andric     if (FI != SPCache.end()) {
43890b57cec5SDimitry Andric       auto *SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
43900b57cec5SDimitry Andric       if (SP && SP->isDefinition()) {
43910b57cec5SDimitry Andric         LexicalBlockStack.emplace_back(SP);
43920b57cec5SDimitry Andric         RegionMap[D].reset(SP);
43930b57cec5SDimitry Andric         return;
43940b57cec5SDimitry Andric       }
43950b57cec5SDimitry Andric     }
43960b57cec5SDimitry Andric     collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
43970b57cec5SDimitry Andric                              TParamsArray, Flags);
43980b57cec5SDimitry Andric   } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
43990b57cec5SDimitry Andric     Name = getObjCMethodName(OMD);
44000b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagPrototyped;
44010b57cec5SDimitry Andric   } else if (isa<VarDecl>(D) &&
44020b57cec5SDimitry Andric              GD.getDynamicInitKind() != DynamicInitKind::NoStub) {
44030b57cec5SDimitry Andric     // This is a global initializer or atexit destructor for a global variable.
44040b57cec5SDimitry Andric     Name = getDynamicInitializerName(cast<VarDecl>(D), GD.getDynamicInitKind(),
44050b57cec5SDimitry Andric                                      Fn);
44060b57cec5SDimitry Andric   } else {
44070b57cec5SDimitry Andric     Name = Fn->getName();
44085ffd83dbSDimitry Andric 
44095ffd83dbSDimitry Andric     if (isa<BlockDecl>(D))
44105ffd83dbSDimitry Andric       LinkageName = Name;
44115ffd83dbSDimitry Andric 
44120b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagPrototyped;
44130b57cec5SDimitry Andric   }
44145f757f3fSDimitry Andric   if (Name.starts_with("\01"))
44150b57cec5SDimitry Andric     Name = Name.substr(1);
44160b57cec5SDimitry Andric 
4417bdd1243dSDimitry Andric   assert((!D || !isa<VarDecl>(D) ||
4418bdd1243dSDimitry Andric           GD.getDynamicInitKind() != DynamicInitKind::NoStub) &&
4419bdd1243dSDimitry Andric          "Unexpected DynamicInitKind !");
4420bdd1243dSDimitry Andric 
4421e8d8bef9SDimitry Andric   if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() ||
4422bdd1243dSDimitry Andric       isa<VarDecl>(D) || isa<CapturedDecl>(D)) {
44230b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagArtificial;
44240b57cec5SDimitry Andric     // Artificial functions should not silently reuse CurLoc.
44250b57cec5SDimitry Andric     CurLoc = SourceLocation();
44260b57cec5SDimitry Andric   }
44270b57cec5SDimitry Andric 
44280b57cec5SDimitry Andric   if (CurFuncIsThunk)
44290b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagThunk;
44300b57cec5SDimitry Andric 
44310b57cec5SDimitry Andric   if (Fn->hasLocalLinkage())
44320b57cec5SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
44330b57cec5SDimitry Andric   if (CGM.getLangOpts().Optimize)
44340b57cec5SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagOptimized;
44350b57cec5SDimitry Andric 
44360b57cec5SDimitry Andric   llvm::DINode::DIFlags FlagsForDef = Flags | getCallSiteRelatedAttrs();
44370b57cec5SDimitry Andric   llvm::DISubprogram::DISPFlags SPFlagsForDef =
44380b57cec5SDimitry Andric       SPFlags | llvm::DISubprogram::SPFlagDefinition;
44390b57cec5SDimitry Andric 
4440e8d8bef9SDimitry Andric   const unsigned LineNo = getLineNumber(Loc.isValid() ? Loc : CurLoc);
44410b57cec5SDimitry Andric   unsigned ScopeLine = getLineNumber(ScopeLoc);
4442480093f4SDimitry Andric   llvm::DISubroutineType *DIFnType = getOrCreateFunctionType(D, FnType, Unit);
4443480093f4SDimitry Andric   llvm::DISubprogram *Decl = nullptr;
4444349cc55cSDimitry Andric   llvm::DINodeArray Annotations = nullptr;
4445349cc55cSDimitry Andric   if (D) {
4446480093f4SDimitry Andric     Decl = isa<ObjCMethodDecl>(D)
4447480093f4SDimitry Andric                ? getObjCMethodDeclaration(D, DIFnType, LineNo, Flags, SPFlags)
4448480093f4SDimitry Andric                : getFunctionDeclaration(D);
4449349cc55cSDimitry Andric     Annotations = CollectBTFDeclTagAnnotations(D);
4450349cc55cSDimitry Andric   }
44510b57cec5SDimitry Andric 
44520b57cec5SDimitry Andric   // FIXME: The function declaration we're constructing here is mostly reusing
44530b57cec5SDimitry Andric   // declarations from CXXMethodDecl and not constructing new ones for arbitrary
44540b57cec5SDimitry Andric   // FunctionDecls. When/if we fix this we can have FDContext be TheCU/null for
44550b57cec5SDimitry Andric   // all subprograms instead of the actual context since subprogram definitions
44560b57cec5SDimitry Andric   // are emitted as CU level entities by the backend.
44570b57cec5SDimitry Andric   llvm::DISubprogram *SP = DBuilder.createFunction(
4458480093f4SDimitry Andric       FDContext, Name, LinkageName, Unit, LineNo, DIFnType, ScopeLine,
4459349cc55cSDimitry Andric       FlagsForDef, SPFlagsForDef, TParamsArray.get(), Decl, nullptr,
4460349cc55cSDimitry Andric       Annotations);
44610b57cec5SDimitry Andric   Fn->setSubprogram(SP);
44620b57cec5SDimitry Andric   // We might get here with a VarDecl in the case we're generating
44630b57cec5SDimitry Andric   // code for the initialization of globals. Do not record these decls
44640b57cec5SDimitry Andric   // as they will overwrite the actual VarDecl Decl in the cache.
44650b57cec5SDimitry Andric   if (HasDecl && isa<FunctionDecl>(D))
44660b57cec5SDimitry Andric     DeclCache[D->getCanonicalDecl()].reset(SP);
44670b57cec5SDimitry Andric 
44680b57cec5SDimitry Andric   // Push the function onto the lexical block stack.
44690b57cec5SDimitry Andric   LexicalBlockStack.emplace_back(SP);
44700b57cec5SDimitry Andric 
44710b57cec5SDimitry Andric   if (HasDecl)
44720b57cec5SDimitry Andric     RegionMap[D].reset(SP);
44730b57cec5SDimitry Andric }
44740b57cec5SDimitry Andric 
44750b57cec5SDimitry Andric void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc,
44760b57cec5SDimitry Andric                                    QualType FnType, llvm::Function *Fn) {
44770b57cec5SDimitry Andric   StringRef Name;
44780b57cec5SDimitry Andric   StringRef LinkageName;
44790b57cec5SDimitry Andric 
44800b57cec5SDimitry Andric   const Decl *D = GD.getDecl();
44810b57cec5SDimitry Andric   if (!D)
44820b57cec5SDimitry Andric     return;
44830b57cec5SDimitry Andric 
4484480093f4SDimitry Andric   llvm::TimeTraceScope TimeScope("DebugFunction", [&]() {
4485fe6060f1SDimitry Andric     return GetName(D, true);
4486480093f4SDimitry Andric   });
4487480093f4SDimitry Andric 
44880b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
44890b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(Loc);
44900b57cec5SDimitry Andric   bool IsDeclForCallSite = Fn ? true : false;
44910b57cec5SDimitry Andric   llvm::DIScope *FDContext =
44920b57cec5SDimitry Andric       IsDeclForCallSite ? Unit : getDeclContextDescriptor(D);
44930b57cec5SDimitry Andric   llvm::DINodeArray TParamsArray;
44940b57cec5SDimitry Andric   if (isa<FunctionDecl>(D)) {
44950b57cec5SDimitry Andric     // If there is a DISubprogram for this function available then use it.
44960b57cec5SDimitry Andric     collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
44970b57cec5SDimitry Andric                              TParamsArray, Flags);
44980b57cec5SDimitry Andric   } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
44990b57cec5SDimitry Andric     Name = getObjCMethodName(OMD);
45000b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagPrototyped;
45010b57cec5SDimitry Andric   } else {
45020b57cec5SDimitry Andric     llvm_unreachable("not a function or ObjC method");
45030b57cec5SDimitry Andric   }
45040b57cec5SDimitry Andric   if (!Name.empty() && Name[0] == '\01')
45050b57cec5SDimitry Andric     Name = Name.substr(1);
45060b57cec5SDimitry Andric 
45070b57cec5SDimitry Andric   if (D->isImplicit()) {
45080b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagArtificial;
45090b57cec5SDimitry Andric     // Artificial functions without a location should not silently reuse CurLoc.
45100b57cec5SDimitry Andric     if (Loc.isInvalid())
45110b57cec5SDimitry Andric       CurLoc = SourceLocation();
45120b57cec5SDimitry Andric   }
45130b57cec5SDimitry Andric   unsigned LineNo = getLineNumber(Loc);
45140b57cec5SDimitry Andric   unsigned ScopeLine = 0;
45150b57cec5SDimitry Andric   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
45160b57cec5SDimitry Andric   if (CGM.getLangOpts().Optimize)
45170b57cec5SDimitry Andric     SPFlags |= llvm::DISubprogram::SPFlagOptimized;
45180b57cec5SDimitry Andric 
4519349cc55cSDimitry Andric   llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
4520bdd1243dSDimitry Andric   llvm::DISubroutineType *STy = getOrCreateFunctionType(D, FnType, Unit);
452106c3fb27SDimitry Andric   llvm::DISubprogram *SP = DBuilder.createFunction(
452206c3fb27SDimitry Andric       FDContext, Name, LinkageName, Unit, LineNo, STy, ScopeLine, Flags,
452306c3fb27SDimitry Andric       SPFlags, TParamsArray.get(), nullptr, nullptr, Annotations);
4524bdd1243dSDimitry Andric 
4525bdd1243dSDimitry Andric   // Preserve btf_decl_tag attributes for parameters of extern functions
4526bdd1243dSDimitry Andric   // for BPF target. The parameters created in this loop are attached as
4527bdd1243dSDimitry Andric   // DISubprogram's retainedNodes in the subsequent finalizeSubprogram call.
4528bdd1243dSDimitry Andric   if (IsDeclForCallSite && CGM.getTarget().getTriple().isBPF()) {
4529bdd1243dSDimitry Andric     if (auto *FD = dyn_cast<FunctionDecl>(D)) {
4530bdd1243dSDimitry Andric       llvm::DITypeRefArray ParamTypes = STy->getTypeArray();
4531bdd1243dSDimitry Andric       unsigned ArgNo = 1;
4532bdd1243dSDimitry Andric       for (ParmVarDecl *PD : FD->parameters()) {
4533bdd1243dSDimitry Andric         llvm::DINodeArray ParamAnnotations = CollectBTFDeclTagAnnotations(PD);
4534bdd1243dSDimitry Andric         DBuilder.createParameterVariable(
4535bdd1243dSDimitry Andric             SP, PD->getName(), ArgNo, Unit, LineNo, ParamTypes[ArgNo], true,
4536bdd1243dSDimitry Andric             llvm::DINode::FlagZero, ParamAnnotations);
4537bdd1243dSDimitry Andric         ++ArgNo;
4538bdd1243dSDimitry Andric       }
4539bdd1243dSDimitry Andric     }
4540bdd1243dSDimitry Andric   }
45410b57cec5SDimitry Andric 
45420b57cec5SDimitry Andric   if (IsDeclForCallSite)
45430b57cec5SDimitry Andric     Fn->setSubprogram(SP);
45440b57cec5SDimitry Andric 
45455ffd83dbSDimitry Andric   DBuilder.finalizeSubprogram(SP);
45460b57cec5SDimitry Andric }
45470b57cec5SDimitry Andric 
45480b57cec5SDimitry Andric void CGDebugInfo::EmitFuncDeclForCallSite(llvm::CallBase *CallOrInvoke,
45490b57cec5SDimitry Andric                                           QualType CalleeType,
45500b57cec5SDimitry Andric                                           const FunctionDecl *CalleeDecl) {
4551480093f4SDimitry Andric   if (!CallOrInvoke)
45520b57cec5SDimitry Andric     return;
45530b57cec5SDimitry Andric   auto *Func = CallOrInvoke->getCalledFunction();
45540b57cec5SDimitry Andric   if (!Func)
45550b57cec5SDimitry Andric     return;
4556480093f4SDimitry Andric   if (Func->getSubprogram())
4557480093f4SDimitry Andric     return;
4558480093f4SDimitry Andric 
4559bdd1243dSDimitry Andric   // Do not emit a declaration subprogram for a function with nodebug
4560bdd1243dSDimitry Andric   // attribute, or if call site info isn't required.
4561bdd1243dSDimitry Andric   if (CalleeDecl->hasAttr<NoDebugAttr>() ||
4562480093f4SDimitry Andric       getCallSiteRelatedAttrs() == llvm::DINode::FlagZero)
4563480093f4SDimitry Andric     return;
45640b57cec5SDimitry Andric 
45650b57cec5SDimitry Andric   // If there is no DISubprogram attached to the function being called,
45660b57cec5SDimitry Andric   // create the one describing the function in order to have complete
45670b57cec5SDimitry Andric   // call site debug info.
45680b57cec5SDimitry Andric   if (!CalleeDecl->isStatic() && !CalleeDecl->isInlined())
45690b57cec5SDimitry Andric     EmitFunctionDecl(CalleeDecl, CalleeDecl->getLocation(), CalleeType, Func);
45700b57cec5SDimitry Andric }
45710b57cec5SDimitry Andric 
45720b57cec5SDimitry Andric void CGDebugInfo::EmitInlineFunctionStart(CGBuilderTy &Builder, GlobalDecl GD) {
45730b57cec5SDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getDecl());
45740b57cec5SDimitry Andric   // If there is a subprogram for this function available then use it.
45750b57cec5SDimitry Andric   auto FI = SPCache.find(FD->getCanonicalDecl());
45760b57cec5SDimitry Andric   llvm::DISubprogram *SP = nullptr;
45770b57cec5SDimitry Andric   if (FI != SPCache.end())
45780b57cec5SDimitry Andric     SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
45790b57cec5SDimitry Andric   if (!SP || !SP->isDefinition())
45800b57cec5SDimitry Andric     SP = getFunctionStub(GD);
45810b57cec5SDimitry Andric   FnBeginRegionCount.push_back(LexicalBlockStack.size());
45820b57cec5SDimitry Andric   LexicalBlockStack.emplace_back(SP);
45830b57cec5SDimitry Andric   setInlinedAt(Builder.getCurrentDebugLocation());
45840b57cec5SDimitry Andric   EmitLocation(Builder, FD->getLocation());
45850b57cec5SDimitry Andric }
45860b57cec5SDimitry Andric 
45870b57cec5SDimitry Andric void CGDebugInfo::EmitInlineFunctionEnd(CGBuilderTy &Builder) {
45880b57cec5SDimitry Andric   assert(CurInlinedAt && "unbalanced inline scope stack");
45890b57cec5SDimitry Andric   EmitFunctionEnd(Builder, nullptr);
45900b57cec5SDimitry Andric   setInlinedAt(llvm::DebugLoc(CurInlinedAt).getInlinedAt());
45910b57cec5SDimitry Andric }
45920b57cec5SDimitry Andric 
45930b57cec5SDimitry Andric void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {
45940b57cec5SDimitry Andric   // Update our current location
45950b57cec5SDimitry Andric   setLocation(Loc);
45960b57cec5SDimitry Andric 
45970b57cec5SDimitry Andric   if (CurLoc.isInvalid() || CurLoc.isMacroID() || LexicalBlockStack.empty())
45980b57cec5SDimitry Andric     return;
45990b57cec5SDimitry Andric 
46000b57cec5SDimitry Andric   llvm::MDNode *Scope = LexicalBlockStack.back();
4601e8d8bef9SDimitry Andric   Builder.SetCurrentDebugLocation(
4602e8d8bef9SDimitry Andric       llvm::DILocation::get(CGM.getLLVMContext(), getLineNumber(CurLoc),
4603e8d8bef9SDimitry Andric                             getColumnNumber(CurLoc), Scope, CurInlinedAt));
46040b57cec5SDimitry Andric }
46050b57cec5SDimitry Andric 
46060b57cec5SDimitry Andric void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
46070b57cec5SDimitry Andric   llvm::MDNode *Back = nullptr;
46080b57cec5SDimitry Andric   if (!LexicalBlockStack.empty())
46090b57cec5SDimitry Andric     Back = LexicalBlockStack.back().get();
46100b57cec5SDimitry Andric   LexicalBlockStack.emplace_back(DBuilder.createLexicalBlock(
46110b57cec5SDimitry Andric       cast<llvm::DIScope>(Back), getOrCreateFile(CurLoc), getLineNumber(CurLoc),
46120b57cec5SDimitry Andric       getColumnNumber(CurLoc)));
46130b57cec5SDimitry Andric }
46140b57cec5SDimitry Andric 
46150b57cec5SDimitry Andric void CGDebugInfo::AppendAddressSpaceXDeref(
461604eeddc0SDimitry Andric     unsigned AddressSpace, SmallVectorImpl<uint64_t> &Expr) const {
4617bdd1243dSDimitry Andric   std::optional<unsigned> DWARFAddressSpace =
46180b57cec5SDimitry Andric       CGM.getTarget().getDWARFAddressSpace(AddressSpace);
46190b57cec5SDimitry Andric   if (!DWARFAddressSpace)
46200b57cec5SDimitry Andric     return;
46210b57cec5SDimitry Andric 
46220b57cec5SDimitry Andric   Expr.push_back(llvm::dwarf::DW_OP_constu);
462381ad6265SDimitry Andric   Expr.push_back(*DWARFAddressSpace);
46240b57cec5SDimitry Andric   Expr.push_back(llvm::dwarf::DW_OP_swap);
46250b57cec5SDimitry Andric   Expr.push_back(llvm::dwarf::DW_OP_xderef);
46260b57cec5SDimitry Andric }
46270b57cec5SDimitry Andric 
46280b57cec5SDimitry Andric void CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder,
46290b57cec5SDimitry Andric                                         SourceLocation Loc) {
46300b57cec5SDimitry Andric   // Set our current location.
46310b57cec5SDimitry Andric   setLocation(Loc);
46320b57cec5SDimitry Andric 
46330b57cec5SDimitry Andric   // Emit a line table change for the current location inside the new scope.
4634e8d8bef9SDimitry Andric   Builder.SetCurrentDebugLocation(llvm::DILocation::get(
4635e8d8bef9SDimitry Andric       CGM.getLLVMContext(), getLineNumber(Loc), getColumnNumber(Loc),
46360b57cec5SDimitry Andric       LexicalBlockStack.back(), CurInlinedAt));
46370b57cec5SDimitry Andric 
463806c3fb27SDimitry Andric   if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
46390b57cec5SDimitry Andric     return;
46400b57cec5SDimitry Andric 
46410b57cec5SDimitry Andric   // Create a new lexical block and push it on the stack.
46420b57cec5SDimitry Andric   CreateLexicalBlock(Loc);
46430b57cec5SDimitry Andric }
46440b57cec5SDimitry Andric 
46450b57cec5SDimitry Andric void CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder,
46460b57cec5SDimitry Andric                                       SourceLocation Loc) {
46470b57cec5SDimitry Andric   assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
46480b57cec5SDimitry Andric 
46490b57cec5SDimitry Andric   // Provide an entry in the line table for the end of the block.
46500b57cec5SDimitry Andric   EmitLocation(Builder, Loc);
46510b57cec5SDimitry Andric 
465206c3fb27SDimitry Andric   if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
46530b57cec5SDimitry Andric     return;
46540b57cec5SDimitry Andric 
46550b57cec5SDimitry Andric   LexicalBlockStack.pop_back();
46560b57cec5SDimitry Andric }
46570b57cec5SDimitry Andric 
46580b57cec5SDimitry Andric void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder, llvm::Function *Fn) {
46590b57cec5SDimitry Andric   assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
46600b57cec5SDimitry Andric   unsigned RCount = FnBeginRegionCount.back();
46610b57cec5SDimitry Andric   assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch");
46620b57cec5SDimitry Andric 
46630b57cec5SDimitry Andric   // Pop all regions for this function.
46640b57cec5SDimitry Andric   while (LexicalBlockStack.size() != RCount) {
46650b57cec5SDimitry Andric     // Provide an entry in the line table for the end of the block.
46660b57cec5SDimitry Andric     EmitLocation(Builder, CurLoc);
46670b57cec5SDimitry Andric     LexicalBlockStack.pop_back();
46680b57cec5SDimitry Andric   }
46690b57cec5SDimitry Andric   FnBeginRegionCount.pop_back();
46700b57cec5SDimitry Andric 
46710b57cec5SDimitry Andric   if (Fn && Fn->getSubprogram())
46720b57cec5SDimitry Andric     DBuilder.finalizeSubprogram(Fn->getSubprogram());
46730b57cec5SDimitry Andric }
46740b57cec5SDimitry Andric 
46750b57cec5SDimitry Andric CGDebugInfo::BlockByRefType
46760b57cec5SDimitry Andric CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
46770b57cec5SDimitry Andric                                           uint64_t *XOffset) {
46780b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 5> EltTys;
46790b57cec5SDimitry Andric   QualType FType;
46800b57cec5SDimitry Andric   uint64_t FieldSize, FieldOffset;
46810b57cec5SDimitry Andric   uint32_t FieldAlign;
46820b57cec5SDimitry Andric 
46830b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
46840b57cec5SDimitry Andric   QualType Type = VD->getType();
46850b57cec5SDimitry Andric 
46860b57cec5SDimitry Andric   FieldOffset = 0;
46870b57cec5SDimitry Andric   FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
46880b57cec5SDimitry Andric   EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset));
46890b57cec5SDimitry Andric   EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset));
46900b57cec5SDimitry Andric   FType = CGM.getContext().IntTy;
46910b57cec5SDimitry Andric   EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset));
46920b57cec5SDimitry Andric   EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset));
46930b57cec5SDimitry Andric 
46940b57cec5SDimitry Andric   bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD);
46950b57cec5SDimitry Andric   if (HasCopyAndDispose) {
46960b57cec5SDimitry Andric     FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
46970b57cec5SDimitry Andric     EltTys.push_back(
46980b57cec5SDimitry Andric         CreateMemberType(Unit, FType, "__copy_helper", &FieldOffset));
46990b57cec5SDimitry Andric     EltTys.push_back(
47000b57cec5SDimitry Andric         CreateMemberType(Unit, FType, "__destroy_helper", &FieldOffset));
47010b57cec5SDimitry Andric   }
47020b57cec5SDimitry Andric   bool HasByrefExtendedLayout;
47030b57cec5SDimitry Andric   Qualifiers::ObjCLifetime Lifetime;
47040b57cec5SDimitry Andric   if (CGM.getContext().getByrefLifetime(Type, Lifetime,
47050b57cec5SDimitry Andric                                         HasByrefExtendedLayout) &&
47060b57cec5SDimitry Andric       HasByrefExtendedLayout) {
47070b57cec5SDimitry Andric     FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
47080b57cec5SDimitry Andric     EltTys.push_back(
47090b57cec5SDimitry Andric         CreateMemberType(Unit, FType, "__byref_variable_layout", &FieldOffset));
47100b57cec5SDimitry Andric   }
47110b57cec5SDimitry Andric 
47120b57cec5SDimitry Andric   CharUnits Align = CGM.getContext().getDeclAlign(VD);
47130b57cec5SDimitry Andric   if (Align > CGM.getContext().toCharUnitsFromBits(
4714bdd1243dSDimitry Andric                   CGM.getTarget().getPointerAlign(LangAS::Default))) {
47150b57cec5SDimitry Andric     CharUnits FieldOffsetInBytes =
47160b57cec5SDimitry Andric         CGM.getContext().toCharUnitsFromBits(FieldOffset);
47170b57cec5SDimitry Andric     CharUnits AlignedOffsetInBytes = FieldOffsetInBytes.alignTo(Align);
47180b57cec5SDimitry Andric     CharUnits NumPaddingBytes = AlignedOffsetInBytes - FieldOffsetInBytes;
47190b57cec5SDimitry Andric 
47200b57cec5SDimitry Andric     if (NumPaddingBytes.isPositive()) {
47210b57cec5SDimitry Andric       llvm::APInt pad(32, NumPaddingBytes.getQuantity());
4722a7dea167SDimitry Andric       FType = CGM.getContext().getConstantArrayType(
47235f757f3fSDimitry Andric           CGM.getContext().CharTy, pad, nullptr, ArraySizeModifier::Normal, 0);
47240b57cec5SDimitry Andric       EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset));
47250b57cec5SDimitry Andric     }
47260b57cec5SDimitry Andric   }
47270b57cec5SDimitry Andric 
47280b57cec5SDimitry Andric   FType = Type;
47290b57cec5SDimitry Andric   llvm::DIType *WrappedTy = getOrCreateType(FType, Unit);
47300b57cec5SDimitry Andric   FieldSize = CGM.getContext().getTypeSize(FType);
47310b57cec5SDimitry Andric   FieldAlign = CGM.getContext().toBits(Align);
47320b57cec5SDimitry Andric 
47330b57cec5SDimitry Andric   *XOffset = FieldOffset;
47340b57cec5SDimitry Andric   llvm::DIType *FieldTy = DBuilder.createMemberType(
47350b57cec5SDimitry Andric       Unit, VD->getName(), Unit, 0, FieldSize, FieldAlign, FieldOffset,
47360b57cec5SDimitry Andric       llvm::DINode::FlagZero, WrappedTy);
47370b57cec5SDimitry Andric   EltTys.push_back(FieldTy);
47380b57cec5SDimitry Andric   FieldOffset += FieldSize;
47390b57cec5SDimitry Andric 
47400b57cec5SDimitry Andric   llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
47410b57cec5SDimitry Andric   return {DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0,
47420b57cec5SDimitry Andric                                     llvm::DINode::FlagZero, nullptr, Elements),
47430b57cec5SDimitry Andric           WrappedTy};
47440b57cec5SDimitry Andric }
47450b57cec5SDimitry Andric 
47460b57cec5SDimitry Andric llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
47470b57cec5SDimitry Andric                                                 llvm::Value *Storage,
4748bdd1243dSDimitry Andric                                                 std::optional<unsigned> ArgNo,
47490b57cec5SDimitry Andric                                                 CGBuilderTy &Builder,
47500b57cec5SDimitry Andric                                                 const bool UsePointerValue) {
4751480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
47520b57cec5SDimitry Andric   assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
47530b57cec5SDimitry Andric   if (VD->hasAttr<NoDebugAttr>())
47540b57cec5SDimitry Andric     return nullptr;
47550b57cec5SDimitry Andric 
47560b57cec5SDimitry Andric   bool Unwritten =
47570b57cec5SDimitry Andric       VD->isImplicit() || (isa<Decl>(VD->getDeclContext()) &&
47580b57cec5SDimitry Andric                            cast<Decl>(VD->getDeclContext())->isImplicit());
47590b57cec5SDimitry Andric   llvm::DIFile *Unit = nullptr;
47600b57cec5SDimitry Andric   if (!Unwritten)
47610b57cec5SDimitry Andric     Unit = getOrCreateFile(VD->getLocation());
47620b57cec5SDimitry Andric   llvm::DIType *Ty;
47630b57cec5SDimitry Andric   uint64_t XOffset = 0;
47640b57cec5SDimitry Andric   if (VD->hasAttr<BlocksAttr>())
47650b57cec5SDimitry Andric     Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
476681ad6265SDimitry Andric   else
476781ad6265SDimitry Andric     Ty = getOrCreateType(VD->getType(), Unit);
47680b57cec5SDimitry Andric 
47690b57cec5SDimitry Andric   // If there is no debug info for this type then do not emit debug info
47700b57cec5SDimitry Andric   // for this variable.
47710b57cec5SDimitry Andric   if (!Ty)
47720b57cec5SDimitry Andric     return nullptr;
47730b57cec5SDimitry Andric 
47740b57cec5SDimitry Andric   // Get location information.
47750b57cec5SDimitry Andric   unsigned Line = 0;
47760b57cec5SDimitry Andric   unsigned Column = 0;
47770b57cec5SDimitry Andric   if (!Unwritten) {
47780b57cec5SDimitry Andric     Line = getLineNumber(VD->getLocation());
47790b57cec5SDimitry Andric     Column = getColumnNumber(VD->getLocation());
47800b57cec5SDimitry Andric   }
478104eeddc0SDimitry Andric   SmallVector<uint64_t, 13> Expr;
47820b57cec5SDimitry Andric   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
47830b57cec5SDimitry Andric   if (VD->isImplicit())
47840b57cec5SDimitry Andric     Flags |= llvm::DINode::FlagArtificial;
47850b57cec5SDimitry Andric 
47860b57cec5SDimitry Andric   auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
47870b57cec5SDimitry Andric 
4788bdd1243dSDimitry Andric   unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(VD->getType());
47890b57cec5SDimitry Andric   AppendAddressSpaceXDeref(AddressSpace, Expr);
47900b57cec5SDimitry Andric 
47910b57cec5SDimitry Andric   // If this is implicit parameter of CXXThis or ObjCSelf kind, then give it an
47920b57cec5SDimitry Andric   // object pointer flag.
47930b57cec5SDimitry Andric   if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD)) {
47945f757f3fSDimitry Andric     if (IPD->getParameterKind() == ImplicitParamKind::CXXThis ||
47955f757f3fSDimitry Andric         IPD->getParameterKind() == ImplicitParamKind::ObjCSelf)
47960b57cec5SDimitry Andric       Flags |= llvm::DINode::FlagObjectPointer;
47970b57cec5SDimitry Andric   }
47980b57cec5SDimitry Andric 
47990b57cec5SDimitry Andric   // Note: Older versions of clang used to emit byval references with an extra
48000b57cec5SDimitry Andric   // DW_OP_deref, because they referenced the IR arg directly instead of
48010b57cec5SDimitry Andric   // referencing an alloca. Newer versions of LLVM don't treat allocas
48020b57cec5SDimitry Andric   // differently from other function arguments when used in a dbg.declare.
48030b57cec5SDimitry Andric   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
48040b57cec5SDimitry Andric   StringRef Name = VD->getName();
48050b57cec5SDimitry Andric   if (!Name.empty()) {
4806fe6060f1SDimitry Andric     // __block vars are stored on the heap if they are captured by a block that
4807fe6060f1SDimitry Andric     // can escape the local scope.
4808fe6060f1SDimitry Andric     if (VD->isEscapingByref()) {
48090b57cec5SDimitry Andric       // Here, we need an offset *into* the alloca.
48100b57cec5SDimitry Andric       CharUnits offset = CharUnits::fromQuantity(32);
48110b57cec5SDimitry Andric       Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
48120b57cec5SDimitry Andric       // offset of __forwarding field
48130b57cec5SDimitry Andric       offset = CGM.getContext().toCharUnitsFromBits(
4814bdd1243dSDimitry Andric           CGM.getTarget().getPointerWidth(LangAS::Default));
48150b57cec5SDimitry Andric       Expr.push_back(offset.getQuantity());
48160b57cec5SDimitry Andric       Expr.push_back(llvm::dwarf::DW_OP_deref);
48170b57cec5SDimitry Andric       Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
48180b57cec5SDimitry Andric       // offset of x field
48190b57cec5SDimitry Andric       offset = CGM.getContext().toCharUnitsFromBits(XOffset);
48200b57cec5SDimitry Andric       Expr.push_back(offset.getQuantity());
48210b57cec5SDimitry Andric     }
48220b57cec5SDimitry Andric   } else if (const auto *RT = dyn_cast<RecordType>(VD->getType())) {
48230b57cec5SDimitry Andric     // If VD is an anonymous union then Storage represents value for
48240b57cec5SDimitry Andric     // all union fields.
48250b57cec5SDimitry Andric     const RecordDecl *RD = RT->getDecl();
48260b57cec5SDimitry Andric     if (RD->isUnion() && RD->isAnonymousStructOrUnion()) {
48270b57cec5SDimitry Andric       // GDB has trouble finding local variables in anonymous unions, so we emit
48280b57cec5SDimitry Andric       // artificial local variables for each of the members.
48290b57cec5SDimitry Andric       //
48300b57cec5SDimitry Andric       // FIXME: Remove this code as soon as GDB supports this.
48310b57cec5SDimitry Andric       // The debug info verifier in LLVM operates based on the assumption that a
48320b57cec5SDimitry Andric       // variable has the same size as its storage and we had to disable the
48330b57cec5SDimitry Andric       // check for artificial variables.
48340b57cec5SDimitry Andric       for (const auto *Field : RD->fields()) {
48350b57cec5SDimitry Andric         llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
48360b57cec5SDimitry Andric         StringRef FieldName = Field->getName();
48370b57cec5SDimitry Andric 
48380b57cec5SDimitry Andric         // Ignore unnamed fields. Do not ignore unnamed records.
48390b57cec5SDimitry Andric         if (FieldName.empty() && !isa<RecordType>(Field->getType()))
48400b57cec5SDimitry Andric           continue;
48410b57cec5SDimitry Andric 
48420b57cec5SDimitry Andric         // Use VarDecl's Tag, Scope and Line number.
48430b57cec5SDimitry Andric         auto FieldAlign = getDeclAlignIfRequired(Field, CGM.getContext());
48440b57cec5SDimitry Andric         auto *D = DBuilder.createAutoVariable(
48450b57cec5SDimitry Andric             Scope, FieldName, Unit, Line, FieldTy, CGM.getLangOpts().Optimize,
48460b57cec5SDimitry Andric             Flags | llvm::DINode::FlagArtificial, FieldAlign);
48470b57cec5SDimitry Andric 
48480b57cec5SDimitry Andric         // Insert an llvm.dbg.declare into the current block.
4849e8d8bef9SDimitry Andric         DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
4850e8d8bef9SDimitry Andric                                llvm::DILocation::get(CGM.getLLVMContext(), Line,
4851e8d8bef9SDimitry Andric                                                      Column, Scope,
4852e8d8bef9SDimitry Andric                                                      CurInlinedAt),
48530b57cec5SDimitry Andric                                Builder.GetInsertBlock());
48540b57cec5SDimitry Andric       }
48550b57cec5SDimitry Andric     }
48560b57cec5SDimitry Andric   }
48570b57cec5SDimitry Andric 
48580b57cec5SDimitry Andric   // Clang stores the sret pointer provided by the caller in a static alloca.
48590b57cec5SDimitry Andric   // Use DW_OP_deref to tell the debugger to load the pointer and treat it as
48600b57cec5SDimitry Andric   // the address of the variable.
48610b57cec5SDimitry Andric   if (UsePointerValue) {
4862349cc55cSDimitry Andric     assert(!llvm::is_contained(Expr, llvm::dwarf::DW_OP_deref) &&
48630b57cec5SDimitry Andric            "Debug info already contains DW_OP_deref.");
48640b57cec5SDimitry Andric     Expr.push_back(llvm::dwarf::DW_OP_deref);
48650b57cec5SDimitry Andric   }
48660b57cec5SDimitry Andric 
48670b57cec5SDimitry Andric   // Create the descriptor for the variable.
4868fe6060f1SDimitry Andric   llvm::DILocalVariable *D = nullptr;
4869fe6060f1SDimitry Andric   if (ArgNo) {
4870349cc55cSDimitry Andric     llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(VD);
4871fe6060f1SDimitry Andric     D = DBuilder.createParameterVariable(Scope, Name, *ArgNo, Unit, Line, Ty,
4872349cc55cSDimitry Andric                                          CGM.getLangOpts().Optimize, Flags,
4873349cc55cSDimitry Andric                                          Annotations);
4874fe6060f1SDimitry Andric   } else {
4875fe6060f1SDimitry Andric     // For normal local variable, we will try to find out whether 'VD' is the
4876fe6060f1SDimitry Andric     // copy parameter of coroutine.
4877fe6060f1SDimitry Andric     // If yes, we are going to use DIVariable of the origin parameter instead
4878fe6060f1SDimitry Andric     // of creating the new one.
4879fe6060f1SDimitry Andric     // If no, it might be a normal alloc, we just create a new one for it.
48800b57cec5SDimitry Andric 
4881fe6060f1SDimitry Andric     // Check whether the VD is move parameters.
4882fe6060f1SDimitry Andric     auto RemapCoroArgToLocalVar = [&]() -> llvm::DILocalVariable * {
4883fe6060f1SDimitry Andric       // The scope of parameter and move-parameter should be distinct
4884fe6060f1SDimitry Andric       // DISubprogram.
4885fe6060f1SDimitry Andric       if (!isa<llvm::DISubprogram>(Scope) || !Scope->isDistinct())
4886fe6060f1SDimitry Andric         return nullptr;
4887fe6060f1SDimitry Andric 
4888fe6060f1SDimitry Andric       auto Iter = llvm::find_if(CoroutineParameterMappings, [&](auto &Pair) {
4889fe6060f1SDimitry Andric         Stmt *StmtPtr = const_cast<Stmt *>(Pair.second);
4890fe6060f1SDimitry Andric         if (DeclStmt *DeclStmtPtr = dyn_cast<DeclStmt>(StmtPtr)) {
4891fe6060f1SDimitry Andric           DeclGroupRef DeclGroup = DeclStmtPtr->getDeclGroup();
4892fe6060f1SDimitry Andric           Decl *Decl = DeclGroup.getSingleDecl();
4893fe6060f1SDimitry Andric           if (VD == dyn_cast_or_null<VarDecl>(Decl))
4894fe6060f1SDimitry Andric             return true;
4895fe6060f1SDimitry Andric         }
4896fe6060f1SDimitry Andric         return false;
4897fe6060f1SDimitry Andric       });
4898fe6060f1SDimitry Andric 
4899fe6060f1SDimitry Andric       if (Iter != CoroutineParameterMappings.end()) {
4900fe6060f1SDimitry Andric         ParmVarDecl *PD = const_cast<ParmVarDecl *>(Iter->first);
4901fe6060f1SDimitry Andric         auto Iter2 = llvm::find_if(ParamDbgMappings, [&](auto &DbgPair) {
4902fe6060f1SDimitry Andric           return DbgPair.first == PD && DbgPair.second->getScope() == Scope;
4903fe6060f1SDimitry Andric         });
4904fe6060f1SDimitry Andric         if (Iter2 != ParamDbgMappings.end())
4905fe6060f1SDimitry Andric           return const_cast<llvm::DILocalVariable *>(Iter2->second);
4906fe6060f1SDimitry Andric       }
4907fe6060f1SDimitry Andric       return nullptr;
4908fe6060f1SDimitry Andric     };
4909fe6060f1SDimitry Andric 
4910fe6060f1SDimitry Andric     // If we couldn't find a move param DIVariable, create a new one.
4911fe6060f1SDimitry Andric     D = RemapCoroArgToLocalVar();
4912fe6060f1SDimitry Andric     // Or we will create a new DIVariable for this Decl if D dose not exists.
4913fe6060f1SDimitry Andric     if (!D)
4914fe6060f1SDimitry Andric       D = DBuilder.createAutoVariable(Scope, Name, Unit, Line, Ty,
4915fe6060f1SDimitry Andric                                       CGM.getLangOpts().Optimize, Flags, Align);
4916fe6060f1SDimitry Andric   }
49170b57cec5SDimitry Andric   // Insert an llvm.dbg.declare into the current block.
49180b57cec5SDimitry Andric   DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
4919e8d8bef9SDimitry Andric                          llvm::DILocation::get(CGM.getLLVMContext(), Line,
4920e8d8bef9SDimitry Andric                                                Column, Scope, CurInlinedAt),
49210b57cec5SDimitry Andric                          Builder.GetInsertBlock());
49220b57cec5SDimitry Andric 
49230b57cec5SDimitry Andric   return D;
49240b57cec5SDimitry Andric }
49250b57cec5SDimitry Andric 
492681ad6265SDimitry Andric llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const BindingDecl *BD,
492781ad6265SDimitry Andric                                                 llvm::Value *Storage,
4928bdd1243dSDimitry Andric                                                 std::optional<unsigned> ArgNo,
492981ad6265SDimitry Andric                                                 CGBuilderTy &Builder,
493081ad6265SDimitry Andric                                                 const bool UsePointerValue) {
493181ad6265SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
493281ad6265SDimitry Andric   assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
493381ad6265SDimitry Andric   if (BD->hasAttr<NoDebugAttr>())
493481ad6265SDimitry Andric     return nullptr;
493581ad6265SDimitry Andric 
493681ad6265SDimitry Andric   // Skip the tuple like case, we don't handle that here
493781ad6265SDimitry Andric   if (isa<DeclRefExpr>(BD->getBinding()))
493881ad6265SDimitry Andric     return nullptr;
493981ad6265SDimitry Andric 
4940*0fca6ea1SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(BD->getLocation());
4941*0fca6ea1SDimitry Andric   llvm::DIType *Ty = getOrCreateType(BD->getType(), Unit);
494281ad6265SDimitry Andric 
494381ad6265SDimitry Andric   // If there is no debug info for this type then do not emit debug info
494481ad6265SDimitry Andric   // for this variable.
494581ad6265SDimitry Andric   if (!Ty)
494681ad6265SDimitry Andric     return nullptr;
494781ad6265SDimitry Andric 
494881ad6265SDimitry Andric   auto Align = getDeclAlignIfRequired(BD, CGM.getContext());
4949bdd1243dSDimitry Andric   unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(BD->getType());
495081ad6265SDimitry Andric 
495181ad6265SDimitry Andric   SmallVector<uint64_t, 3> Expr;
495281ad6265SDimitry Andric   AppendAddressSpaceXDeref(AddressSpace, Expr);
495381ad6265SDimitry Andric 
495481ad6265SDimitry Andric   // Clang stores the sret pointer provided by the caller in a static alloca.
495581ad6265SDimitry Andric   // Use DW_OP_deref to tell the debugger to load the pointer and treat it as
495681ad6265SDimitry Andric   // the address of the variable.
495781ad6265SDimitry Andric   if (UsePointerValue) {
495881ad6265SDimitry Andric     assert(!llvm::is_contained(Expr, llvm::dwarf::DW_OP_deref) &&
495981ad6265SDimitry Andric            "Debug info already contains DW_OP_deref.");
496081ad6265SDimitry Andric     Expr.push_back(llvm::dwarf::DW_OP_deref);
496181ad6265SDimitry Andric   }
496281ad6265SDimitry Andric 
496381ad6265SDimitry Andric   unsigned Line = getLineNumber(BD->getLocation());
496481ad6265SDimitry Andric   unsigned Column = getColumnNumber(BD->getLocation());
496581ad6265SDimitry Andric   StringRef Name = BD->getName();
496681ad6265SDimitry Andric   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
496781ad6265SDimitry Andric   // Create the descriptor for the variable.
496881ad6265SDimitry Andric   llvm::DILocalVariable *D = DBuilder.createAutoVariable(
496981ad6265SDimitry Andric       Scope, Name, Unit, Line, Ty, CGM.getLangOpts().Optimize,
497081ad6265SDimitry Andric       llvm::DINode::FlagZero, Align);
497181ad6265SDimitry Andric 
497281ad6265SDimitry Andric   if (const MemberExpr *ME = dyn_cast<MemberExpr>(BD->getBinding())) {
497381ad6265SDimitry Andric     if (const FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
497481ad6265SDimitry Andric       const unsigned fieldIndex = FD->getFieldIndex();
497581ad6265SDimitry Andric       const clang::CXXRecordDecl *parent =
497681ad6265SDimitry Andric           (const CXXRecordDecl *)FD->getParent();
497781ad6265SDimitry Andric       const ASTRecordLayout &layout =
497881ad6265SDimitry Andric           CGM.getContext().getASTRecordLayout(parent);
497981ad6265SDimitry Andric       const uint64_t fieldOffset = layout.getFieldOffset(fieldIndex);
4980*0fca6ea1SDimitry Andric       if (FD->isBitField()) {
4981*0fca6ea1SDimitry Andric         const CGRecordLayout &RL =
4982*0fca6ea1SDimitry Andric             CGM.getTypes().getCGRecordLayout(FD->getParent());
4983*0fca6ea1SDimitry Andric         const CGBitFieldInfo &Info = RL.getBitFieldInfo(FD);
4984*0fca6ea1SDimitry Andric         // Use DW_OP_plus_uconst to adjust to the start of the bitfield
4985*0fca6ea1SDimitry Andric         // storage.
4986*0fca6ea1SDimitry Andric         if (!Info.StorageOffset.isZero()) {
4987*0fca6ea1SDimitry Andric           Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4988*0fca6ea1SDimitry Andric           Expr.push_back(Info.StorageOffset.getQuantity());
4989*0fca6ea1SDimitry Andric         }
4990*0fca6ea1SDimitry Andric         // Use LLVM_extract_bits to extract the appropriate bits from this
4991*0fca6ea1SDimitry Andric         // bitfield.
4992*0fca6ea1SDimitry Andric         Expr.push_back(Info.IsSigned
4993*0fca6ea1SDimitry Andric                            ? llvm::dwarf::DW_OP_LLVM_extract_bits_sext
4994*0fca6ea1SDimitry Andric                            : llvm::dwarf::DW_OP_LLVM_extract_bits_zext);
4995*0fca6ea1SDimitry Andric         Expr.push_back(Info.Offset);
4996*0fca6ea1SDimitry Andric         // If we have an oversized bitfield then the value won't be more than
4997*0fca6ea1SDimitry Andric         // the size of the type.
4998*0fca6ea1SDimitry Andric         const uint64_t TypeSize = CGM.getContext().getTypeSize(BD->getType());
4999*0fca6ea1SDimitry Andric         Expr.push_back(std::min((uint64_t)Info.Size, TypeSize));
5000*0fca6ea1SDimitry Andric       } else if (fieldOffset != 0) {
5001*0fca6ea1SDimitry Andric         assert(fieldOffset % CGM.getContext().getCharWidth() == 0 &&
5002*0fca6ea1SDimitry Andric                "Unexpected non-bitfield with non-byte-aligned offset");
500381ad6265SDimitry Andric         Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
500481ad6265SDimitry Andric         Expr.push_back(
500581ad6265SDimitry Andric             CGM.getContext().toCharUnitsFromBits(fieldOffset).getQuantity());
500681ad6265SDimitry Andric       }
500781ad6265SDimitry Andric     }
500881ad6265SDimitry Andric   } else if (const ArraySubscriptExpr *ASE =
500981ad6265SDimitry Andric                  dyn_cast<ArraySubscriptExpr>(BD->getBinding())) {
501081ad6265SDimitry Andric     if (const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(ASE->getIdx())) {
501181ad6265SDimitry Andric       const uint64_t value = IL->getValue().getZExtValue();
501281ad6265SDimitry Andric       const uint64_t typeSize = CGM.getContext().getTypeSize(BD->getType());
501381ad6265SDimitry Andric 
501481ad6265SDimitry Andric       if (value != 0) {
501581ad6265SDimitry Andric         Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
501681ad6265SDimitry Andric         Expr.push_back(CGM.getContext()
501781ad6265SDimitry Andric                            .toCharUnitsFromBits(value * typeSize)
501881ad6265SDimitry Andric                            .getQuantity());
501981ad6265SDimitry Andric       }
502081ad6265SDimitry Andric     }
502181ad6265SDimitry Andric   }
502281ad6265SDimitry Andric 
502381ad6265SDimitry Andric   // Insert an llvm.dbg.declare into the current block.
502481ad6265SDimitry Andric   DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
502581ad6265SDimitry Andric                          llvm::DILocation::get(CGM.getLLVMContext(), Line,
502681ad6265SDimitry Andric                                                Column, Scope, CurInlinedAt),
502781ad6265SDimitry Andric                          Builder.GetInsertBlock());
502881ad6265SDimitry Andric 
502981ad6265SDimitry Andric   return D;
503081ad6265SDimitry Andric }
503181ad6265SDimitry Andric 
50320b57cec5SDimitry Andric llvm::DILocalVariable *
50330b57cec5SDimitry Andric CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, llvm::Value *Storage,
50340b57cec5SDimitry Andric                                        CGBuilderTy &Builder,
50350b57cec5SDimitry Andric                                        const bool UsePointerValue) {
5036480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
503781ad6265SDimitry Andric 
50385f757f3fSDimitry Andric   if (auto *DD = dyn_cast<DecompositionDecl>(VD)) {
503981ad6265SDimitry Andric     for (auto *B : DD->bindings()) {
5040bdd1243dSDimitry Andric       EmitDeclare(B, Storage, std::nullopt, Builder,
504181ad6265SDimitry Andric                   VD->getType()->isReferenceType());
504281ad6265SDimitry Andric     }
50435f757f3fSDimitry Andric     // Don't emit an llvm.dbg.declare for the composite storage as it doesn't
50445f757f3fSDimitry Andric     // correspond to a user variable.
50455f757f3fSDimitry Andric     return nullptr;
50465f757f3fSDimitry Andric   }
504781ad6265SDimitry Andric 
5048bdd1243dSDimitry Andric   return EmitDeclare(VD, Storage, std::nullopt, Builder, UsePointerValue);
50490b57cec5SDimitry Andric }
50500b57cec5SDimitry Andric 
50510b57cec5SDimitry Andric void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
5052480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
50530b57cec5SDimitry Andric   assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
50540b57cec5SDimitry Andric 
50550b57cec5SDimitry Andric   if (D->hasAttr<NoDebugAttr>())
50560b57cec5SDimitry Andric     return;
50570b57cec5SDimitry Andric 
50580b57cec5SDimitry Andric   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
50590b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
50600b57cec5SDimitry Andric 
50610b57cec5SDimitry Andric   // Get location information.
50620b57cec5SDimitry Andric   unsigned Line = getLineNumber(D->getLocation());
50630b57cec5SDimitry Andric   unsigned Column = getColumnNumber(D->getLocation());
50640b57cec5SDimitry Andric 
50650b57cec5SDimitry Andric   StringRef Name = D->getName();
50660b57cec5SDimitry Andric 
50670b57cec5SDimitry Andric   // Create the descriptor for the label.
50680b57cec5SDimitry Andric   auto *L =
50690b57cec5SDimitry Andric       DBuilder.createLabel(Scope, Name, Unit, Line, CGM.getLangOpts().Optimize);
50700b57cec5SDimitry Andric 
50710b57cec5SDimitry Andric   // Insert an llvm.dbg.label into the current block.
50720b57cec5SDimitry Andric   DBuilder.insertLabel(L,
5073e8d8bef9SDimitry Andric                        llvm::DILocation::get(CGM.getLLVMContext(), Line, Column,
5074e8d8bef9SDimitry Andric                                              Scope, CurInlinedAt),
50750b57cec5SDimitry Andric                        Builder.GetInsertBlock());
50760b57cec5SDimitry Andric }
50770b57cec5SDimitry Andric 
50780b57cec5SDimitry Andric llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy,
50790b57cec5SDimitry Andric                                           llvm::DIType *Ty) {
50800b57cec5SDimitry Andric   llvm::DIType *CachedTy = getTypeOrNull(QualTy);
50810b57cec5SDimitry Andric   if (CachedTy)
50820b57cec5SDimitry Andric     Ty = CachedTy;
50830b57cec5SDimitry Andric   return DBuilder.createObjectPointerType(Ty);
50840b57cec5SDimitry Andric }
50850b57cec5SDimitry Andric 
50860b57cec5SDimitry Andric void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
50870b57cec5SDimitry Andric     const VarDecl *VD, llvm::Value *Storage, CGBuilderTy &Builder,
50880b57cec5SDimitry Andric     const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) {
5089480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
50900b57cec5SDimitry Andric   assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
50910b57cec5SDimitry Andric 
50920b57cec5SDimitry Andric   if (Builder.GetInsertBlock() == nullptr)
50930b57cec5SDimitry Andric     return;
50940b57cec5SDimitry Andric   if (VD->hasAttr<NoDebugAttr>())
50950b57cec5SDimitry Andric     return;
50960b57cec5SDimitry Andric 
50970b57cec5SDimitry Andric   bool isByRef = VD->hasAttr<BlocksAttr>();
50980b57cec5SDimitry Andric 
50990b57cec5SDimitry Andric   uint64_t XOffset = 0;
51000b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
51010b57cec5SDimitry Andric   llvm::DIType *Ty;
51020b57cec5SDimitry Andric   if (isByRef)
51030b57cec5SDimitry Andric     Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
51040b57cec5SDimitry Andric   else
51050b57cec5SDimitry Andric     Ty = getOrCreateType(VD->getType(), Unit);
51060b57cec5SDimitry Andric 
51070b57cec5SDimitry Andric   // Self is passed along as an implicit non-arg variable in a
51080b57cec5SDimitry Andric   // block. Mark it as the object pointer.
51090b57cec5SDimitry Andric   if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD))
51105f757f3fSDimitry Andric     if (IPD->getParameterKind() == ImplicitParamKind::ObjCSelf)
51110b57cec5SDimitry Andric       Ty = CreateSelfType(VD->getType(), Ty);
51120b57cec5SDimitry Andric 
51130b57cec5SDimitry Andric   // Get location information.
5114e8d8bef9SDimitry Andric   const unsigned Line =
5115e8d8bef9SDimitry Andric       getLineNumber(VD->getLocation().isValid() ? VD->getLocation() : CurLoc);
51160b57cec5SDimitry Andric   unsigned Column = getColumnNumber(VD->getLocation());
51170b57cec5SDimitry Andric 
51180b57cec5SDimitry Andric   const llvm::DataLayout &target = CGM.getDataLayout();
51190b57cec5SDimitry Andric 
51200b57cec5SDimitry Andric   CharUnits offset = CharUnits::fromQuantity(
51210b57cec5SDimitry Andric       target.getStructLayout(blockInfo.StructureType)
51220b57cec5SDimitry Andric           ->getElementOffset(blockInfo.getCapture(VD).getIndex()));
51230b57cec5SDimitry Andric 
512404eeddc0SDimitry Andric   SmallVector<uint64_t, 9> addr;
51250b57cec5SDimitry Andric   addr.push_back(llvm::dwarf::DW_OP_deref);
51260b57cec5SDimitry Andric   addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
51270b57cec5SDimitry Andric   addr.push_back(offset.getQuantity());
51280b57cec5SDimitry Andric   if (isByRef) {
51290b57cec5SDimitry Andric     addr.push_back(llvm::dwarf::DW_OP_deref);
51300b57cec5SDimitry Andric     addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
51310b57cec5SDimitry Andric     // offset of __forwarding field
51320b57cec5SDimitry Andric     offset =
51330b57cec5SDimitry Andric         CGM.getContext().toCharUnitsFromBits(target.getPointerSizeInBits(0));
51340b57cec5SDimitry Andric     addr.push_back(offset.getQuantity());
51350b57cec5SDimitry Andric     addr.push_back(llvm::dwarf::DW_OP_deref);
51360b57cec5SDimitry Andric     addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
51370b57cec5SDimitry Andric     // offset of x field
51380b57cec5SDimitry Andric     offset = CGM.getContext().toCharUnitsFromBits(XOffset);
51390b57cec5SDimitry Andric     addr.push_back(offset.getQuantity());
51400b57cec5SDimitry Andric   }
51410b57cec5SDimitry Andric 
51420b57cec5SDimitry Andric   // Create the descriptor for the variable.
51430b57cec5SDimitry Andric   auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
51440b57cec5SDimitry Andric   auto *D = DBuilder.createAutoVariable(
51450b57cec5SDimitry Andric       cast<llvm::DILocalScope>(LexicalBlockStack.back()), VD->getName(), Unit,
51460b57cec5SDimitry Andric       Line, Ty, false, llvm::DINode::FlagZero, Align);
51470b57cec5SDimitry Andric 
51480b57cec5SDimitry Andric   // Insert an llvm.dbg.declare into the current block.
5149e8d8bef9SDimitry Andric   auto DL = llvm::DILocation::get(CGM.getLLVMContext(), Line, Column,
5150e8d8bef9SDimitry Andric                                   LexicalBlockStack.back(), CurInlinedAt);
51510b57cec5SDimitry Andric   auto *Expr = DBuilder.createExpression(addr);
51520b57cec5SDimitry Andric   if (InsertPoint)
51530b57cec5SDimitry Andric     DBuilder.insertDeclare(Storage, D, Expr, DL, InsertPoint);
51540b57cec5SDimitry Andric   else
51550b57cec5SDimitry Andric     DBuilder.insertDeclare(Storage, D, Expr, DL, Builder.GetInsertBlock());
51560b57cec5SDimitry Andric }
51570b57cec5SDimitry Andric 
5158fe6060f1SDimitry Andric llvm::DILocalVariable *
5159fe6060f1SDimitry Andric CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI,
516006c3fb27SDimitry Andric                                       unsigned ArgNo, CGBuilderTy &Builder,
516106c3fb27SDimitry Andric                                       bool UsePointerValue) {
5162480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
516306c3fb27SDimitry Andric   return EmitDeclare(VD, AI, ArgNo, Builder, UsePointerValue);
51640b57cec5SDimitry Andric }
51650b57cec5SDimitry Andric 
51660b57cec5SDimitry Andric namespace {
51670b57cec5SDimitry Andric struct BlockLayoutChunk {
51680b57cec5SDimitry Andric   uint64_t OffsetInBits;
51690b57cec5SDimitry Andric   const BlockDecl::Capture *Capture;
51700b57cec5SDimitry Andric };
51710b57cec5SDimitry Andric bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) {
51720b57cec5SDimitry Andric   return l.OffsetInBits < r.OffsetInBits;
51730b57cec5SDimitry Andric }
51740b57cec5SDimitry Andric } // namespace
51750b57cec5SDimitry Andric 
51760b57cec5SDimitry Andric void CGDebugInfo::collectDefaultFieldsForBlockLiteralDeclare(
51770b57cec5SDimitry Andric     const CGBlockInfo &Block, const ASTContext &Context, SourceLocation Loc,
51780b57cec5SDimitry Andric     const llvm::StructLayout &BlockLayout, llvm::DIFile *Unit,
51790b57cec5SDimitry Andric     SmallVectorImpl<llvm::Metadata *> &Fields) {
51800b57cec5SDimitry Andric   // Blocks in OpenCL have unique constraints which make the standard fields
51810b57cec5SDimitry Andric   // redundant while requiring size and align fields for enqueue_kernel. See
51820b57cec5SDimitry Andric   // initializeForBlockHeader in CGBlocks.cpp
51830b57cec5SDimitry Andric   if (CGM.getLangOpts().OpenCL) {
51840b57cec5SDimitry Andric     Fields.push_back(createFieldType("__size", Context.IntTy, Loc, AS_public,
51850b57cec5SDimitry Andric                                      BlockLayout.getElementOffsetInBits(0),
51860b57cec5SDimitry Andric                                      Unit, Unit));
51870b57cec5SDimitry Andric     Fields.push_back(createFieldType("__align", Context.IntTy, Loc, AS_public,
51880b57cec5SDimitry Andric                                      BlockLayout.getElementOffsetInBits(1),
51890b57cec5SDimitry Andric                                      Unit, Unit));
51900b57cec5SDimitry Andric   } else {
51910b57cec5SDimitry Andric     Fields.push_back(createFieldType("__isa", Context.VoidPtrTy, Loc, AS_public,
51920b57cec5SDimitry Andric                                      BlockLayout.getElementOffsetInBits(0),
51930b57cec5SDimitry Andric                                      Unit, Unit));
51940b57cec5SDimitry Andric     Fields.push_back(createFieldType("__flags", Context.IntTy, Loc, AS_public,
51950b57cec5SDimitry Andric                                      BlockLayout.getElementOffsetInBits(1),
51960b57cec5SDimitry Andric                                      Unit, Unit));
51970b57cec5SDimitry Andric     Fields.push_back(
51980b57cec5SDimitry Andric         createFieldType("__reserved", Context.IntTy, Loc, AS_public,
51990b57cec5SDimitry Andric                         BlockLayout.getElementOffsetInBits(2), Unit, Unit));
52000b57cec5SDimitry Andric     auto *FnTy = Block.getBlockExpr()->getFunctionType();
52010b57cec5SDimitry Andric     auto FnPtrType = CGM.getContext().getPointerType(FnTy->desugar());
52020b57cec5SDimitry Andric     Fields.push_back(createFieldType("__FuncPtr", FnPtrType, Loc, AS_public,
52030b57cec5SDimitry Andric                                      BlockLayout.getElementOffsetInBits(3),
52040b57cec5SDimitry Andric                                      Unit, Unit));
52050b57cec5SDimitry Andric     Fields.push_back(createFieldType(
52060b57cec5SDimitry Andric         "__descriptor",
52070b57cec5SDimitry Andric         Context.getPointerType(Block.NeedsCopyDispose
52080b57cec5SDimitry Andric                                    ? Context.getBlockDescriptorExtendedType()
52090b57cec5SDimitry Andric                                    : Context.getBlockDescriptorType()),
52100b57cec5SDimitry Andric         Loc, AS_public, BlockLayout.getElementOffsetInBits(4), Unit, Unit));
52110b57cec5SDimitry Andric   }
52120b57cec5SDimitry Andric }
52130b57cec5SDimitry Andric 
52140b57cec5SDimitry Andric void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
52150b57cec5SDimitry Andric                                                        StringRef Name,
52160b57cec5SDimitry Andric                                                        unsigned ArgNo,
52170b57cec5SDimitry Andric                                                        llvm::AllocaInst *Alloca,
52180b57cec5SDimitry Andric                                                        CGBuilderTy &Builder) {
5219480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
52200b57cec5SDimitry Andric   ASTContext &C = CGM.getContext();
52210b57cec5SDimitry Andric   const BlockDecl *blockDecl = block.getBlockDecl();
52220b57cec5SDimitry Andric 
52230b57cec5SDimitry Andric   // Collect some general information about the block's location.
52240b57cec5SDimitry Andric   SourceLocation loc = blockDecl->getCaretLocation();
52250b57cec5SDimitry Andric   llvm::DIFile *tunit = getOrCreateFile(loc);
52260b57cec5SDimitry Andric   unsigned line = getLineNumber(loc);
52270b57cec5SDimitry Andric   unsigned column = getColumnNumber(loc);
52280b57cec5SDimitry Andric 
52290b57cec5SDimitry Andric   // Build the debug-info type for the block literal.
52300b57cec5SDimitry Andric   getDeclContextDescriptor(blockDecl);
52310b57cec5SDimitry Andric 
52320b57cec5SDimitry Andric   const llvm::StructLayout *blockLayout =
52330b57cec5SDimitry Andric       CGM.getDataLayout().getStructLayout(block.StructureType);
52340b57cec5SDimitry Andric 
52350b57cec5SDimitry Andric   SmallVector<llvm::Metadata *, 16> fields;
52360b57cec5SDimitry Andric   collectDefaultFieldsForBlockLiteralDeclare(block, C, loc, *blockLayout, tunit,
52370b57cec5SDimitry Andric                                              fields);
52380b57cec5SDimitry Andric 
52390b57cec5SDimitry Andric   // We want to sort the captures by offset, not because DWARF
52400b57cec5SDimitry Andric   // requires this, but because we're paranoid about debuggers.
52410b57cec5SDimitry Andric   SmallVector<BlockLayoutChunk, 8> chunks;
52420b57cec5SDimitry Andric 
52430b57cec5SDimitry Andric   // 'this' capture.
52440b57cec5SDimitry Andric   if (blockDecl->capturesCXXThis()) {
52450b57cec5SDimitry Andric     BlockLayoutChunk chunk;
52460b57cec5SDimitry Andric     chunk.OffsetInBits =
52470b57cec5SDimitry Andric         blockLayout->getElementOffsetInBits(block.CXXThisIndex);
52480b57cec5SDimitry Andric     chunk.Capture = nullptr;
52490b57cec5SDimitry Andric     chunks.push_back(chunk);
52500b57cec5SDimitry Andric   }
52510b57cec5SDimitry Andric 
52520b57cec5SDimitry Andric   // Variable captures.
52530b57cec5SDimitry Andric   for (const auto &capture : blockDecl->captures()) {
52540b57cec5SDimitry Andric     const VarDecl *variable = capture.getVariable();
52550b57cec5SDimitry Andric     const CGBlockInfo::Capture &captureInfo = block.getCapture(variable);
52560b57cec5SDimitry Andric 
52570b57cec5SDimitry Andric     // Ignore constant captures.
52580b57cec5SDimitry Andric     if (captureInfo.isConstant())
52590b57cec5SDimitry Andric       continue;
52600b57cec5SDimitry Andric 
52610b57cec5SDimitry Andric     BlockLayoutChunk chunk;
52620b57cec5SDimitry Andric     chunk.OffsetInBits =
52630b57cec5SDimitry Andric         blockLayout->getElementOffsetInBits(captureInfo.getIndex());
52640b57cec5SDimitry Andric     chunk.Capture = &capture;
52650b57cec5SDimitry Andric     chunks.push_back(chunk);
52660b57cec5SDimitry Andric   }
52670b57cec5SDimitry Andric 
52680b57cec5SDimitry Andric   // Sort by offset.
52690b57cec5SDimitry Andric   llvm::array_pod_sort(chunks.begin(), chunks.end());
52700b57cec5SDimitry Andric 
52710b57cec5SDimitry Andric   for (const BlockLayoutChunk &Chunk : chunks) {
52720b57cec5SDimitry Andric     uint64_t offsetInBits = Chunk.OffsetInBits;
52730b57cec5SDimitry Andric     const BlockDecl::Capture *capture = Chunk.Capture;
52740b57cec5SDimitry Andric 
52750b57cec5SDimitry Andric     // If we have a null capture, this must be the C++ 'this' capture.
52760b57cec5SDimitry Andric     if (!capture) {
52770b57cec5SDimitry Andric       QualType type;
52780b57cec5SDimitry Andric       if (auto *Method =
52790b57cec5SDimitry Andric               cast_or_null<CXXMethodDecl>(blockDecl->getNonClosureContext()))
52800b57cec5SDimitry Andric         type = Method->getThisType();
52810b57cec5SDimitry Andric       else if (auto *RDecl = dyn_cast<CXXRecordDecl>(blockDecl->getParent()))
52820b57cec5SDimitry Andric         type = QualType(RDecl->getTypeForDecl(), 0);
52830b57cec5SDimitry Andric       else
52840b57cec5SDimitry Andric         llvm_unreachable("unexpected block declcontext");
52850b57cec5SDimitry Andric 
52860b57cec5SDimitry Andric       fields.push_back(createFieldType("this", type, loc, AS_public,
52870b57cec5SDimitry Andric                                        offsetInBits, tunit, tunit));
52880b57cec5SDimitry Andric       continue;
52890b57cec5SDimitry Andric     }
52900b57cec5SDimitry Andric 
52910b57cec5SDimitry Andric     const VarDecl *variable = capture->getVariable();
52920b57cec5SDimitry Andric     StringRef name = variable->getName();
52930b57cec5SDimitry Andric 
52940b57cec5SDimitry Andric     llvm::DIType *fieldType;
52950b57cec5SDimitry Andric     if (capture->isByRef()) {
52960b57cec5SDimitry Andric       TypeInfo PtrInfo = C.getTypeInfo(C.VoidPtrTy);
5297349cc55cSDimitry Andric       auto Align = PtrInfo.isAlignRequired() ? PtrInfo.Align : 0;
52980b57cec5SDimitry Andric       // FIXME: This recomputes the layout of the BlockByRefWrapper.
52990b57cec5SDimitry Andric       uint64_t xoffset;
53000b57cec5SDimitry Andric       fieldType =
53010b57cec5SDimitry Andric           EmitTypeForVarWithBlocksAttr(variable, &xoffset).BlockByRefWrapper;
53020b57cec5SDimitry Andric       fieldType = DBuilder.createPointerType(fieldType, PtrInfo.Width);
53030b57cec5SDimitry Andric       fieldType = DBuilder.createMemberType(tunit, name, tunit, line,
53040b57cec5SDimitry Andric                                             PtrInfo.Width, Align, offsetInBits,
53050b57cec5SDimitry Andric                                             llvm::DINode::FlagZero, fieldType);
53060b57cec5SDimitry Andric     } else {
53070b57cec5SDimitry Andric       auto Align = getDeclAlignIfRequired(variable, CGM.getContext());
53080b57cec5SDimitry Andric       fieldType = createFieldType(name, variable->getType(), loc, AS_public,
53090b57cec5SDimitry Andric                                   offsetInBits, Align, tunit, tunit);
53100b57cec5SDimitry Andric     }
53110b57cec5SDimitry Andric     fields.push_back(fieldType);
53120b57cec5SDimitry Andric   }
53130b57cec5SDimitry Andric 
53140b57cec5SDimitry Andric   SmallString<36> typeName;
53150b57cec5SDimitry Andric   llvm::raw_svector_ostream(typeName)
53160b57cec5SDimitry Andric       << "__block_literal_" << CGM.getUniqueBlockCount();
53170b57cec5SDimitry Andric 
53180b57cec5SDimitry Andric   llvm::DINodeArray fieldsArray = DBuilder.getOrCreateArray(fields);
53190b57cec5SDimitry Andric 
53200b57cec5SDimitry Andric   llvm::DIType *type =
53210b57cec5SDimitry Andric       DBuilder.createStructType(tunit, typeName.str(), tunit, line,
53220b57cec5SDimitry Andric                                 CGM.getContext().toBits(block.BlockSize), 0,
53230b57cec5SDimitry Andric                                 llvm::DINode::FlagZero, nullptr, fieldsArray);
53240b57cec5SDimitry Andric   type = DBuilder.createPointerType(type, CGM.PointerWidthInBits);
53250b57cec5SDimitry Andric 
53260b57cec5SDimitry Andric   // Get overall information about the block.
53270b57cec5SDimitry Andric   llvm::DINode::DIFlags flags = llvm::DINode::FlagArtificial;
53280b57cec5SDimitry Andric   auto *scope = cast<llvm::DILocalScope>(LexicalBlockStack.back());
53290b57cec5SDimitry Andric 
53300b57cec5SDimitry Andric   // Create the descriptor for the parameter.
53310b57cec5SDimitry Andric   auto *debugVar = DBuilder.createParameterVariable(
53320b57cec5SDimitry Andric       scope, Name, ArgNo, tunit, line, type, CGM.getLangOpts().Optimize, flags);
53330b57cec5SDimitry Andric 
53340b57cec5SDimitry Andric   // Insert an llvm.dbg.declare into the current block.
53350b57cec5SDimitry Andric   DBuilder.insertDeclare(Alloca, debugVar, DBuilder.createExpression(),
5336e8d8bef9SDimitry Andric                          llvm::DILocation::get(CGM.getLLVMContext(), line,
5337e8d8bef9SDimitry Andric                                                column, scope, CurInlinedAt),
53380b57cec5SDimitry Andric                          Builder.GetInsertBlock());
53390b57cec5SDimitry Andric }
53400b57cec5SDimitry Andric 
53410b57cec5SDimitry Andric llvm::DIDerivedType *
53420b57cec5SDimitry Andric CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) {
53430b57cec5SDimitry Andric   if (!D || !D->isStaticDataMember())
53440b57cec5SDimitry Andric     return nullptr;
53450b57cec5SDimitry Andric 
53460b57cec5SDimitry Andric   auto MI = StaticDataMemberCache.find(D->getCanonicalDecl());
53470b57cec5SDimitry Andric   if (MI != StaticDataMemberCache.end()) {
53480b57cec5SDimitry Andric     assert(MI->second && "Static data member declaration should still exist");
53490b57cec5SDimitry Andric     return MI->second;
53500b57cec5SDimitry Andric   }
53510b57cec5SDimitry Andric 
53520b57cec5SDimitry Andric   // If the member wasn't found in the cache, lazily construct and add it to the
53530b57cec5SDimitry Andric   // type (used when a limited form of the type is emitted).
53540b57cec5SDimitry Andric   auto DC = D->getDeclContext();
53550b57cec5SDimitry Andric   auto *Ctxt = cast<llvm::DICompositeType>(getDeclContextDescriptor(D));
53560b57cec5SDimitry Andric   return CreateRecordStaticField(D, Ctxt, cast<RecordDecl>(DC));
53570b57cec5SDimitry Andric }
53580b57cec5SDimitry Andric 
53590b57cec5SDimitry Andric llvm::DIGlobalVariableExpression *CGDebugInfo::CollectAnonRecordDecls(
53600b57cec5SDimitry Andric     const RecordDecl *RD, llvm::DIFile *Unit, unsigned LineNo,
53610b57cec5SDimitry Andric     StringRef LinkageName, llvm::GlobalVariable *Var, llvm::DIScope *DContext) {
53620b57cec5SDimitry Andric   llvm::DIGlobalVariableExpression *GVE = nullptr;
53630b57cec5SDimitry Andric 
53640b57cec5SDimitry Andric   for (const auto *Field : RD->fields()) {
53650b57cec5SDimitry Andric     llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
53660b57cec5SDimitry Andric     StringRef FieldName = Field->getName();
53670b57cec5SDimitry Andric 
53680b57cec5SDimitry Andric     // Ignore unnamed fields, but recurse into anonymous records.
53690b57cec5SDimitry Andric     if (FieldName.empty()) {
53700b57cec5SDimitry Andric       if (const auto *RT = dyn_cast<RecordType>(Field->getType()))
53710b57cec5SDimitry Andric         GVE = CollectAnonRecordDecls(RT->getDecl(), Unit, LineNo, LinkageName,
53720b57cec5SDimitry Andric                                      Var, DContext);
53730b57cec5SDimitry Andric       continue;
53740b57cec5SDimitry Andric     }
53750b57cec5SDimitry Andric     // Use VarDecl's Tag, Scope and Line number.
53760b57cec5SDimitry Andric     GVE = DBuilder.createGlobalVariableExpression(
53770b57cec5SDimitry Andric         DContext, FieldName, LinkageName, Unit, LineNo, FieldTy,
53780b57cec5SDimitry Andric         Var->hasLocalLinkage());
53790b57cec5SDimitry Andric     Var->addDebugInfo(GVE);
53800b57cec5SDimitry Andric   }
53810b57cec5SDimitry Andric   return GVE;
53820b57cec5SDimitry Andric }
53830b57cec5SDimitry Andric 
538481ad6265SDimitry Andric static bool ReferencesAnonymousEntity(ArrayRef<TemplateArgument> Args);
538581ad6265SDimitry Andric static bool ReferencesAnonymousEntity(RecordType *RT) {
538681ad6265SDimitry Andric   // Unnamed classes/lambdas can't be reconstituted due to a lack of column
538781ad6265SDimitry Andric   // info we produce in the DWARF, so we can't get Clang's full name back.
538881ad6265SDimitry Andric   // But so long as it's not one of those, it doesn't matter if some sub-type
538981ad6265SDimitry Andric   // of the record (a template parameter) can't be reconstituted - because the
539081ad6265SDimitry Andric   // un-reconstitutable type itself will carry its own name.
539181ad6265SDimitry Andric   const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl());
539281ad6265SDimitry Andric   if (!RD)
539381ad6265SDimitry Andric     return false;
539481ad6265SDimitry Andric   if (!RD->getIdentifier())
539581ad6265SDimitry Andric     return true;
539681ad6265SDimitry Andric   auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD);
539781ad6265SDimitry Andric   if (!TSpecial)
539881ad6265SDimitry Andric     return false;
539981ad6265SDimitry Andric   return ReferencesAnonymousEntity(TSpecial->getTemplateArgs().asArray());
540081ad6265SDimitry Andric }
540181ad6265SDimitry Andric static bool ReferencesAnonymousEntity(ArrayRef<TemplateArgument> Args) {
540281ad6265SDimitry Andric   return llvm::any_of(Args, [&](const TemplateArgument &TA) {
540381ad6265SDimitry Andric     switch (TA.getKind()) {
540481ad6265SDimitry Andric     case TemplateArgument::Pack:
540581ad6265SDimitry Andric       return ReferencesAnonymousEntity(TA.getPackAsArray());
540681ad6265SDimitry Andric     case TemplateArgument::Type: {
540781ad6265SDimitry Andric       struct ReferencesAnonymous
540881ad6265SDimitry Andric           : public RecursiveASTVisitor<ReferencesAnonymous> {
540981ad6265SDimitry Andric         bool RefAnon = false;
541081ad6265SDimitry Andric         bool VisitRecordType(RecordType *RT) {
541181ad6265SDimitry Andric           if (ReferencesAnonymousEntity(RT)) {
541281ad6265SDimitry Andric             RefAnon = true;
541381ad6265SDimitry Andric             return false;
541481ad6265SDimitry Andric           }
541581ad6265SDimitry Andric           return true;
541681ad6265SDimitry Andric         }
541781ad6265SDimitry Andric       };
541881ad6265SDimitry Andric       ReferencesAnonymous RT;
541981ad6265SDimitry Andric       RT.TraverseType(TA.getAsType());
542081ad6265SDimitry Andric       if (RT.RefAnon)
542181ad6265SDimitry Andric         return true;
542281ad6265SDimitry Andric       break;
542381ad6265SDimitry Andric     }
542481ad6265SDimitry Andric     default:
542581ad6265SDimitry Andric       break;
542681ad6265SDimitry Andric     }
542781ad6265SDimitry Andric     return false;
542881ad6265SDimitry Andric   });
542981ad6265SDimitry Andric }
5430349cc55cSDimitry Andric namespace {
5431349cc55cSDimitry Andric struct ReconstitutableType : public RecursiveASTVisitor<ReconstitutableType> {
5432349cc55cSDimitry Andric   bool Reconstitutable = true;
5433349cc55cSDimitry Andric   bool VisitVectorType(VectorType *FT) {
5434349cc55cSDimitry Andric     Reconstitutable = false;
5435349cc55cSDimitry Andric     return false;
5436349cc55cSDimitry Andric   }
5437349cc55cSDimitry Andric   bool VisitAtomicType(AtomicType *FT) {
5438349cc55cSDimitry Andric     Reconstitutable = false;
5439349cc55cSDimitry Andric     return false;
5440349cc55cSDimitry Andric   }
544181ad6265SDimitry Andric   bool VisitType(Type *T) {
544281ad6265SDimitry Andric     // _BitInt(N) isn't reconstitutable because the bit width isn't encoded in
544381ad6265SDimitry Andric     // the DWARF, only the byte width.
544481ad6265SDimitry Andric     if (T->isBitIntType()) {
544581ad6265SDimitry Andric       Reconstitutable = false;
544681ad6265SDimitry Andric       return false;
544781ad6265SDimitry Andric     }
544881ad6265SDimitry Andric     return true;
544981ad6265SDimitry Andric   }
5450349cc55cSDimitry Andric   bool TraverseEnumType(EnumType *ET) {
5451349cc55cSDimitry Andric     // Unnamed enums can't be reconstituted due to a lack of column info we
5452349cc55cSDimitry Andric     // produce in the DWARF, so we can't get Clang's full name back.
5453349cc55cSDimitry Andric     if (const auto *ED = dyn_cast<EnumDecl>(ET->getDecl())) {
5454349cc55cSDimitry Andric       if (!ED->getIdentifier()) {
5455349cc55cSDimitry Andric         Reconstitutable = false;
5456349cc55cSDimitry Andric         return false;
5457349cc55cSDimitry Andric       }
545881ad6265SDimitry Andric       if (!ED->isExternallyVisible()) {
545981ad6265SDimitry Andric         Reconstitutable = false;
546081ad6265SDimitry Andric         return false;
546181ad6265SDimitry Andric       }
5462349cc55cSDimitry Andric     }
5463349cc55cSDimitry Andric     return true;
5464349cc55cSDimitry Andric   }
5465349cc55cSDimitry Andric   bool VisitFunctionProtoType(FunctionProtoType *FT) {
5466349cc55cSDimitry Andric     // noexcept is not encoded in DWARF, so the reversi
5467349cc55cSDimitry Andric     Reconstitutable &= !isNoexceptExceptionSpec(FT->getExceptionSpecType());
546881ad6265SDimitry Andric     Reconstitutable &= !FT->getNoReturnAttr();
5469349cc55cSDimitry Andric     return Reconstitutable;
5470349cc55cSDimitry Andric   }
547181ad6265SDimitry Andric   bool VisitRecordType(RecordType *RT) {
547281ad6265SDimitry Andric     if (ReferencesAnonymousEntity(RT)) {
5473349cc55cSDimitry Andric       Reconstitutable = false;
5474349cc55cSDimitry Andric       return false;
5475349cc55cSDimitry Andric     }
5476349cc55cSDimitry Andric     return true;
5477349cc55cSDimitry Andric   }
5478349cc55cSDimitry Andric };
5479349cc55cSDimitry Andric } // anonymous namespace
5480349cc55cSDimitry Andric 
5481349cc55cSDimitry Andric // Test whether a type name could be rebuilt from emitted debug info.
5482349cc55cSDimitry Andric static bool IsReconstitutableType(QualType QT) {
5483349cc55cSDimitry Andric   ReconstitutableType T;
5484349cc55cSDimitry Andric   T.TraverseType(QT);
5485349cc55cSDimitry Andric   return T.Reconstitutable;
5486349cc55cSDimitry Andric }
5487349cc55cSDimitry Andric 
5488*0fca6ea1SDimitry Andric bool CGDebugInfo::HasReconstitutableArgs(
5489*0fca6ea1SDimitry Andric     ArrayRef<TemplateArgument> Args) const {
5490*0fca6ea1SDimitry Andric   return llvm::all_of(Args, [&](const TemplateArgument &TA) {
5491*0fca6ea1SDimitry Andric     switch (TA.getKind()) {
5492*0fca6ea1SDimitry Andric     case TemplateArgument::Template:
5493*0fca6ea1SDimitry Andric       // Easy to reconstitute - the value of the parameter in the debug
5494*0fca6ea1SDimitry Andric       // info is the string name of the template. The template name
5495*0fca6ea1SDimitry Andric       // itself won't benefit from any name rebuilding, but that's a
5496*0fca6ea1SDimitry Andric       // representational limitation - maybe DWARF could be
5497*0fca6ea1SDimitry Andric       // changed/improved to use some more structural representation.
5498*0fca6ea1SDimitry Andric       return true;
5499*0fca6ea1SDimitry Andric     case TemplateArgument::Declaration:
5500*0fca6ea1SDimitry Andric       // Reference and pointer non-type template parameters point to
5501*0fca6ea1SDimitry Andric       // variables, functions, etc and their value is, at best (for
5502*0fca6ea1SDimitry Andric       // variables) represented as an address - not a reference to the
5503*0fca6ea1SDimitry Andric       // DWARF describing the variable/function/etc. This makes it hard,
5504*0fca6ea1SDimitry Andric       // possibly impossible to rebuild the original name - looking up
5505*0fca6ea1SDimitry Andric       // the address in the executable file's symbol table would be
5506*0fca6ea1SDimitry Andric       // needed.
5507*0fca6ea1SDimitry Andric       return false;
5508*0fca6ea1SDimitry Andric     case TemplateArgument::NullPtr:
5509*0fca6ea1SDimitry Andric       // These could be rebuilt, but figured they're close enough to the
5510*0fca6ea1SDimitry Andric       // declaration case, and not worth rebuilding.
5511*0fca6ea1SDimitry Andric       return false;
5512*0fca6ea1SDimitry Andric     case TemplateArgument::Pack:
5513*0fca6ea1SDimitry Andric       // A pack is invalid if any of the elements of the pack are
5514*0fca6ea1SDimitry Andric       // invalid.
5515*0fca6ea1SDimitry Andric       return HasReconstitutableArgs(TA.getPackAsArray());
5516*0fca6ea1SDimitry Andric     case TemplateArgument::Integral:
5517*0fca6ea1SDimitry Andric       // Larger integers get encoded as DWARF blocks which are a bit
5518*0fca6ea1SDimitry Andric       // harder to parse back into a large integer, etc - so punting on
5519*0fca6ea1SDimitry Andric       // this for now. Re-parsing the integers back into APInt is
5520*0fca6ea1SDimitry Andric       // probably feasible some day.
5521*0fca6ea1SDimitry Andric       return TA.getAsIntegral().getBitWidth() <= 64 &&
5522*0fca6ea1SDimitry Andric              IsReconstitutableType(TA.getIntegralType());
5523*0fca6ea1SDimitry Andric     case TemplateArgument::StructuralValue:
5524*0fca6ea1SDimitry Andric       return false;
5525*0fca6ea1SDimitry Andric     case TemplateArgument::Type:
5526*0fca6ea1SDimitry Andric       return IsReconstitutableType(TA.getAsType());
5527*0fca6ea1SDimitry Andric     case TemplateArgument::Expression:
5528*0fca6ea1SDimitry Andric       return IsReconstitutableType(TA.getAsExpr()->getType());
5529*0fca6ea1SDimitry Andric     default:
5530*0fca6ea1SDimitry Andric       llvm_unreachable("Other, unresolved, template arguments should "
5531*0fca6ea1SDimitry Andric                        "not be seen here");
5532*0fca6ea1SDimitry Andric     }
5533*0fca6ea1SDimitry Andric   });
5534*0fca6ea1SDimitry Andric }
5535*0fca6ea1SDimitry Andric 
5536fe6060f1SDimitry Andric std::string CGDebugInfo::GetName(const Decl *D, bool Qualified) const {
5537fe6060f1SDimitry Andric   std::string Name;
5538fe6060f1SDimitry Andric   llvm::raw_string_ostream OS(Name);
5539349cc55cSDimitry Andric   const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5540349cc55cSDimitry Andric   if (!ND)
5541349cc55cSDimitry Andric     return Name;
554206c3fb27SDimitry Andric   llvm::codegenoptions::DebugTemplateNamesKind TemplateNamesKind =
5543349cc55cSDimitry Andric       CGM.getCodeGenOpts().getDebugSimpleTemplateNames();
554481ad6265SDimitry Andric 
554581ad6265SDimitry Andric   if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
554606c3fb27SDimitry Andric     TemplateNamesKind = llvm::codegenoptions::DebugTemplateNamesKind::Full;
554781ad6265SDimitry Andric 
5548bdd1243dSDimitry Andric   std::optional<TemplateArgs> Args;
5549349cc55cSDimitry Andric 
5550349cc55cSDimitry Andric   bool IsOperatorOverload = false; // isa<CXXConversionDecl>(ND);
5551349cc55cSDimitry Andric   if (auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
5552349cc55cSDimitry Andric     Args = GetTemplateArgs(RD);
5553349cc55cSDimitry Andric   } else if (auto *FD = dyn_cast<FunctionDecl>(ND)) {
5554349cc55cSDimitry Andric     Args = GetTemplateArgs(FD);
5555349cc55cSDimitry Andric     auto NameKind = ND->getDeclName().getNameKind();
5556349cc55cSDimitry Andric     IsOperatorOverload |=
5557349cc55cSDimitry Andric         NameKind == DeclarationName::CXXOperatorName ||
5558349cc55cSDimitry Andric         NameKind == DeclarationName::CXXConversionFunctionName;
5559349cc55cSDimitry Andric   } else if (auto *VD = dyn_cast<VarDecl>(ND)) {
5560349cc55cSDimitry Andric     Args = GetTemplateArgs(VD);
5561349cc55cSDimitry Andric   }
5562*0fca6ea1SDimitry Andric 
5563349cc55cSDimitry Andric   // A conversion operator presents complications/ambiguity if there's a
5564349cc55cSDimitry Andric   // conversion to class template that is itself a template, eg:
5565349cc55cSDimitry Andric   // template<typename T>
5566349cc55cSDimitry Andric   // operator ns::t1<T, int>();
5567349cc55cSDimitry Andric   // This should be named, eg: "operator ns::t1<float, int><float>"
5568349cc55cSDimitry Andric   // (ignoring clang bug that means this is currently "operator t1<float>")
5569349cc55cSDimitry Andric   // but if the arguments were stripped, the consumer couldn't differentiate
5570349cc55cSDimitry Andric   // whether the template argument list for the conversion type was the
5571349cc55cSDimitry Andric   // function's argument list (& no reconstitution was needed) or not.
5572349cc55cSDimitry Andric   // This could be handled if reconstitutable names had a separate attribute
5573349cc55cSDimitry Andric   // annotating them as such - this would remove the ambiguity.
5574349cc55cSDimitry Andric   //
5575349cc55cSDimitry Andric   // Alternatively the template argument list could be parsed enough to check
5576349cc55cSDimitry Andric   // whether there's one list or two, then compare that with the DWARF
5577349cc55cSDimitry Andric   // description of the return type and the template argument lists to determine
5578349cc55cSDimitry Andric   // how many lists there should be and if one is missing it could be assumed(?)
5579349cc55cSDimitry Andric   // to be the function's template argument list  & then be rebuilt.
5580349cc55cSDimitry Andric   //
5581349cc55cSDimitry Andric   // Other operator overloads that aren't conversion operators could be
5582349cc55cSDimitry Andric   // reconstituted but would require a bit more nuance about detecting the
5583349cc55cSDimitry Andric   // difference between these different operators during that rebuilding.
5584349cc55cSDimitry Andric   bool Reconstitutable =
5585349cc55cSDimitry Andric       Args && HasReconstitutableArgs(Args->Args) && !IsOperatorOverload;
5586349cc55cSDimitry Andric 
5587fe6060f1SDimitry Andric   PrintingPolicy PP = getPrintingPolicy();
5588349cc55cSDimitry Andric 
558906c3fb27SDimitry Andric   if (TemplateNamesKind == llvm::codegenoptions::DebugTemplateNamesKind::Full ||
5590349cc55cSDimitry Andric       !Reconstitutable) {
5591fe6060f1SDimitry Andric     ND->getNameForDiagnostic(OS, PP, Qualified);
5592349cc55cSDimitry Andric   } else {
559306c3fb27SDimitry Andric     bool Mangled = TemplateNamesKind ==
559406c3fb27SDimitry Andric                    llvm::codegenoptions::DebugTemplateNamesKind::Mangled;
5595349cc55cSDimitry Andric     // check if it's a template
5596349cc55cSDimitry Andric     if (Mangled)
559781ad6265SDimitry Andric       OS << "_STN|";
5598349cc55cSDimitry Andric 
5599349cc55cSDimitry Andric     OS << ND->getDeclName();
5600349cc55cSDimitry Andric     std::string EncodedOriginalName;
5601349cc55cSDimitry Andric     llvm::raw_string_ostream EncodedOriginalNameOS(EncodedOriginalName);
5602349cc55cSDimitry Andric     EncodedOriginalNameOS << ND->getDeclName();
5603349cc55cSDimitry Andric 
5604349cc55cSDimitry Andric     if (Mangled) {
5605349cc55cSDimitry Andric       OS << "|";
5606349cc55cSDimitry Andric       printTemplateArgumentList(OS, Args->Args, PP);
5607349cc55cSDimitry Andric       printTemplateArgumentList(EncodedOriginalNameOS, Args->Args, PP);
5608349cc55cSDimitry Andric #ifndef NDEBUG
5609349cc55cSDimitry Andric       std::string CanonicalOriginalName;
5610349cc55cSDimitry Andric       llvm::raw_string_ostream OriginalOS(CanonicalOriginalName);
5611349cc55cSDimitry Andric       ND->getNameForDiagnostic(OriginalOS, PP, Qualified);
5612349cc55cSDimitry Andric       assert(EncodedOriginalNameOS.str() == OriginalOS.str());
5613349cc55cSDimitry Andric #endif
5614349cc55cSDimitry Andric     }
5615fe6060f1SDimitry Andric   }
5616fe6060f1SDimitry Andric   return Name;
5617fe6060f1SDimitry Andric }
5618fe6060f1SDimitry Andric 
56190b57cec5SDimitry Andric void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
56200b57cec5SDimitry Andric                                      const VarDecl *D) {
5621480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
56220b57cec5SDimitry Andric   if (D->hasAttr<NoDebugAttr>())
56230b57cec5SDimitry Andric     return;
56240b57cec5SDimitry Andric 
5625480093f4SDimitry Andric   llvm::TimeTraceScope TimeScope("DebugGlobalVariable", [&]() {
5626fe6060f1SDimitry Andric     return GetName(D, true);
5627480093f4SDimitry Andric   });
5628480093f4SDimitry Andric 
56290b57cec5SDimitry Andric   // If we already created a DIGlobalVariable for this declaration, just attach
56300b57cec5SDimitry Andric   // it to the llvm::GlobalVariable.
56310b57cec5SDimitry Andric   auto Cached = DeclCache.find(D->getCanonicalDecl());
56320b57cec5SDimitry Andric   if (Cached != DeclCache.end())
56330b57cec5SDimitry Andric     return Var->addDebugInfo(
56340b57cec5SDimitry Andric         cast<llvm::DIGlobalVariableExpression>(Cached->second));
56350b57cec5SDimitry Andric 
56360b57cec5SDimitry Andric   // Create global variable debug descriptor.
56370b57cec5SDimitry Andric   llvm::DIFile *Unit = nullptr;
56380b57cec5SDimitry Andric   llvm::DIScope *DContext = nullptr;
56390b57cec5SDimitry Andric   unsigned LineNo;
56400b57cec5SDimitry Andric   StringRef DeclName, LinkageName;
56410b57cec5SDimitry Andric   QualType T;
56420b57cec5SDimitry Andric   llvm::MDTuple *TemplateParameters = nullptr;
56430b57cec5SDimitry Andric   collectVarDeclProps(D, Unit, LineNo, T, DeclName, LinkageName,
56440b57cec5SDimitry Andric                       TemplateParameters, DContext);
56450b57cec5SDimitry Andric 
56460b57cec5SDimitry Andric   // Attempt to store one global variable for the declaration - even if we
56470b57cec5SDimitry Andric   // emit a lot of fields.
56480b57cec5SDimitry Andric   llvm::DIGlobalVariableExpression *GVE = nullptr;
56490b57cec5SDimitry Andric 
56500b57cec5SDimitry Andric   // If this is an anonymous union then we'll want to emit a global
56510b57cec5SDimitry Andric   // variable for each member of the anonymous union so that it's possible
56520b57cec5SDimitry Andric   // to find the name of any field in the union.
56530b57cec5SDimitry Andric   if (T->isUnionType() && DeclName.empty()) {
56540b57cec5SDimitry Andric     const RecordDecl *RD = T->castAs<RecordType>()->getDecl();
56550b57cec5SDimitry Andric     assert(RD->isAnonymousStructOrUnion() &&
56560b57cec5SDimitry Andric            "unnamed non-anonymous struct or union?");
56570b57cec5SDimitry Andric     GVE = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext);
56580b57cec5SDimitry Andric   } else {
56590b57cec5SDimitry Andric     auto Align = getDeclAlignIfRequired(D, CGM.getContext());
56600b57cec5SDimitry Andric 
566104eeddc0SDimitry Andric     SmallVector<uint64_t, 4> Expr;
5662bdd1243dSDimitry Andric     unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(D->getType());
56630b57cec5SDimitry Andric     if (CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) {
56640b57cec5SDimitry Andric       if (D->hasAttr<CUDASharedAttr>())
56650b57cec5SDimitry Andric         AddressSpace =
56660b57cec5SDimitry Andric             CGM.getContext().getTargetAddressSpace(LangAS::cuda_shared);
56670b57cec5SDimitry Andric       else if (D->hasAttr<CUDAConstantAttr>())
56680b57cec5SDimitry Andric         AddressSpace =
56690b57cec5SDimitry Andric             CGM.getContext().getTargetAddressSpace(LangAS::cuda_constant);
56700b57cec5SDimitry Andric     }
56710b57cec5SDimitry Andric     AppendAddressSpaceXDeref(AddressSpace, Expr);
56720b57cec5SDimitry Andric 
5673349cc55cSDimitry Andric     llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
56740b57cec5SDimitry Andric     GVE = DBuilder.createGlobalVariableExpression(
567581ad6265SDimitry Andric         DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit),
567681ad6265SDimitry Andric         Var->hasLocalLinkage(), true,
56770b57cec5SDimitry Andric         Expr.empty() ? nullptr : DBuilder.createExpression(Expr),
56780b57cec5SDimitry Andric         getOrCreateStaticDataMemberDeclarationOrNull(D), TemplateParameters,
5679349cc55cSDimitry Andric         Align, Annotations);
56800b57cec5SDimitry Andric     Var->addDebugInfo(GVE);
56810b57cec5SDimitry Andric   }
56820b57cec5SDimitry Andric   DeclCache[D->getCanonicalDecl()].reset(GVE);
56830b57cec5SDimitry Andric }
56840b57cec5SDimitry Andric 
56850b57cec5SDimitry Andric void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
5686480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
56870b57cec5SDimitry Andric   if (VD->hasAttr<NoDebugAttr>())
56880b57cec5SDimitry Andric     return;
5689480093f4SDimitry Andric   llvm::TimeTraceScope TimeScope("DebugConstGlobalVariable", [&]() {
5690fe6060f1SDimitry Andric     return GetName(VD, true);
5691480093f4SDimitry Andric   });
5692480093f4SDimitry Andric 
56930b57cec5SDimitry Andric   auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
56940b57cec5SDimitry Andric   // Create the descriptor for the variable.
56950b57cec5SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
56960b57cec5SDimitry Andric   StringRef Name = VD->getName();
56970b57cec5SDimitry Andric   llvm::DIType *Ty = getOrCreateType(VD->getType(), Unit);
56980b57cec5SDimitry Andric 
56990b57cec5SDimitry Andric   if (const auto *ECD = dyn_cast<EnumConstantDecl>(VD)) {
57000b57cec5SDimitry Andric     const auto *ED = cast<EnumDecl>(ECD->getDeclContext());
57010b57cec5SDimitry Andric     assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?");
57020b57cec5SDimitry Andric 
5703a7dea167SDimitry Andric     if (CGM.getCodeGenOpts().EmitCodeView) {
57040b57cec5SDimitry Andric       // If CodeView, emit enums as global variables, unless they are defined
57050b57cec5SDimitry Andric       // inside a class. We do this because MSVC doesn't emit S_CONSTANTs for
57060b57cec5SDimitry Andric       // enums in classes, and because it is difficult to attach this scope
57070b57cec5SDimitry Andric       // information to the global variable.
5708a7dea167SDimitry Andric       if (isa<RecordDecl>(ED->getDeclContext()))
57090b57cec5SDimitry Andric         return;
5710a7dea167SDimitry Andric     } else {
5711a7dea167SDimitry Andric       // If not CodeView, emit DW_TAG_enumeration_type if necessary. For
5712a7dea167SDimitry Andric       // example: for "enum { ZERO };", a DW_TAG_enumeration_type is created the
5713a7dea167SDimitry Andric       // first time `ZERO` is referenced in a function.
5714a7dea167SDimitry Andric       llvm::DIType *EDTy =
5715a7dea167SDimitry Andric           getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit);
5716a7dea167SDimitry Andric       assert (EDTy->getTag() == llvm::dwarf::DW_TAG_enumeration_type);
5717a7dea167SDimitry Andric       (void)EDTy;
5718a7dea167SDimitry Andric       return;
5719a7dea167SDimitry Andric     }
57200b57cec5SDimitry Andric   }
57210b57cec5SDimitry Andric 
57220b57cec5SDimitry Andric   // Do not emit separate definitions for function local consts.
57230b57cec5SDimitry Andric   if (isa<FunctionDecl>(VD->getDeclContext()))
57240b57cec5SDimitry Andric     return;
57250b57cec5SDimitry Andric 
57260b57cec5SDimitry Andric   VD = cast<ValueDecl>(VD->getCanonicalDecl());
57270b57cec5SDimitry Andric   auto *VarD = dyn_cast<VarDecl>(VD);
57280b57cec5SDimitry Andric   if (VarD && VarD->isStaticDataMember()) {
57290b57cec5SDimitry Andric     auto *RD = cast<RecordDecl>(VarD->getDeclContext());
57300b57cec5SDimitry Andric     getDeclContextDescriptor(VarD);
57310b57cec5SDimitry Andric     // Ensure that the type is retained even though it's otherwise unreferenced.
57320b57cec5SDimitry Andric     //
57330b57cec5SDimitry Andric     // FIXME: This is probably unnecessary, since Ty should reference RD
57340b57cec5SDimitry Andric     // through its scope.
57350b57cec5SDimitry Andric     RetainedTypes.push_back(
57360b57cec5SDimitry Andric         CGM.getContext().getRecordType(RD).getAsOpaquePtr());
57370b57cec5SDimitry Andric 
57380b57cec5SDimitry Andric     return;
57390b57cec5SDimitry Andric   }
5740e8d8bef9SDimitry Andric   llvm::DIScope *DContext = getDeclContextDescriptor(VD);
57410b57cec5SDimitry Andric 
57420b57cec5SDimitry Andric   auto &GV = DeclCache[VD];
57430b57cec5SDimitry Andric   if (GV)
57440b57cec5SDimitry Andric     return;
57450b57cec5SDimitry Andric 
57465f757f3fSDimitry Andric   llvm::DIExpression *InitExpr = createConstantValueExpression(VD, Init);
57470b57cec5SDimitry Andric   llvm::MDTuple *TemplateParameters = nullptr;
57480b57cec5SDimitry Andric 
57490b57cec5SDimitry Andric   if (isa<VarTemplateSpecializationDecl>(VD))
57500b57cec5SDimitry Andric     if (VarD) {
57510b57cec5SDimitry Andric       llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VarD, &*Unit);
57520b57cec5SDimitry Andric       TemplateParameters = parameterNodes.get();
57530b57cec5SDimitry Andric     }
57540b57cec5SDimitry Andric 
57550b57cec5SDimitry Andric   GV.reset(DBuilder.createGlobalVariableExpression(
57560b57cec5SDimitry Andric       DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty,
5757480093f4SDimitry Andric       true, true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD),
57580b57cec5SDimitry Andric       TemplateParameters, Align));
57590b57cec5SDimitry Andric }
57600b57cec5SDimitry Andric 
5761480093f4SDimitry Andric void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
5762480093f4SDimitry Andric                                        const VarDecl *D) {
5763480093f4SDimitry Andric   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5764480093f4SDimitry Andric   if (D->hasAttr<NoDebugAttr>())
5765480093f4SDimitry Andric     return;
5766480093f4SDimitry Andric 
5767480093f4SDimitry Andric   auto Align = getDeclAlignIfRequired(D, CGM.getContext());
5768480093f4SDimitry Andric   llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
5769480093f4SDimitry Andric   StringRef Name = D->getName();
5770480093f4SDimitry Andric   llvm::DIType *Ty = getOrCreateType(D->getType(), Unit);
5771480093f4SDimitry Andric 
5772480093f4SDimitry Andric   llvm::DIScope *DContext = getDeclContextDescriptor(D);
5773480093f4SDimitry Andric   llvm::DIGlobalVariableExpression *GVE =
5774480093f4SDimitry Andric       DBuilder.createGlobalVariableExpression(
5775480093f4SDimitry Andric           DContext, Name, StringRef(), Unit, getLineNumber(D->getLocation()),
5776480093f4SDimitry Andric           Ty, false, false, nullptr, nullptr, nullptr, Align);
5777480093f4SDimitry Andric   Var->addDebugInfo(GVE);
5778480093f4SDimitry Andric }
5779480093f4SDimitry Andric 
5780*0fca6ea1SDimitry Andric void CGDebugInfo::EmitPseudoVariable(CGBuilderTy &Builder,
5781*0fca6ea1SDimitry Andric                                      llvm::Instruction *Value, QualType Ty) {
5782*0fca6ea1SDimitry Andric   // Only when -g2 or above is specified, debug info for variables will be
5783*0fca6ea1SDimitry Andric   // generated.
5784*0fca6ea1SDimitry Andric   if (CGM.getCodeGenOpts().getDebugInfo() <=
5785*0fca6ea1SDimitry Andric       llvm::codegenoptions::DebugLineTablesOnly)
5786*0fca6ea1SDimitry Andric     return;
5787*0fca6ea1SDimitry Andric 
5788*0fca6ea1SDimitry Andric   llvm::DILocation *DIL = Value->getDebugLoc().get();
5789*0fca6ea1SDimitry Andric   if (!DIL)
5790*0fca6ea1SDimitry Andric     return;
5791*0fca6ea1SDimitry Andric 
5792*0fca6ea1SDimitry Andric   llvm::DIFile *Unit = DIL->getFile();
5793*0fca6ea1SDimitry Andric   llvm::DIType *Type = getOrCreateType(Ty, Unit);
5794*0fca6ea1SDimitry Andric 
5795*0fca6ea1SDimitry Andric   // Check if Value is already a declared variable and has debug info, in this
5796*0fca6ea1SDimitry Andric   // case we have nothing to do. Clang emits a declared variable as alloca, and
5797*0fca6ea1SDimitry Andric   // it is loaded upon use, so we identify such pattern here.
5798*0fca6ea1SDimitry Andric   if (llvm::LoadInst *Load = dyn_cast<llvm::LoadInst>(Value)) {
5799*0fca6ea1SDimitry Andric     llvm::Value *Var = Load->getPointerOperand();
5800*0fca6ea1SDimitry Andric     // There can be implicit type cast applied on a variable if it is an opaque
5801*0fca6ea1SDimitry Andric     // ptr, in this case its debug info may not match the actual type of object
5802*0fca6ea1SDimitry Andric     // being used as in the next instruction, so we will need to emit a pseudo
5803*0fca6ea1SDimitry Andric     // variable for type-casted value.
5804*0fca6ea1SDimitry Andric     auto DeclareTypeMatches = [&](auto *DbgDeclare) {
5805*0fca6ea1SDimitry Andric       return DbgDeclare->getVariable()->getType() == Type;
5806*0fca6ea1SDimitry Andric     };
5807*0fca6ea1SDimitry Andric     if (any_of(llvm::findDbgDeclares(Var), DeclareTypeMatches) ||
5808*0fca6ea1SDimitry Andric         any_of(llvm::findDVRDeclares(Var), DeclareTypeMatches))
5809*0fca6ea1SDimitry Andric       return;
5810*0fca6ea1SDimitry Andric   }
5811*0fca6ea1SDimitry Andric 
5812*0fca6ea1SDimitry Andric   llvm::DILocalVariable *D =
5813*0fca6ea1SDimitry Andric       DBuilder.createAutoVariable(LexicalBlockStack.back(), "", nullptr, 0,
5814*0fca6ea1SDimitry Andric                                   Type, false, llvm::DINode::FlagArtificial);
5815*0fca6ea1SDimitry Andric 
5816*0fca6ea1SDimitry Andric   if (auto InsertPoint = Value->getInsertionPointAfterDef()) {
5817*0fca6ea1SDimitry Andric     DBuilder.insertDbgValueIntrinsic(Value, D, DBuilder.createExpression(), DIL,
5818*0fca6ea1SDimitry Andric                                      &**InsertPoint);
5819*0fca6ea1SDimitry Andric   }
5820*0fca6ea1SDimitry Andric }
5821*0fca6ea1SDimitry Andric 
582281ad6265SDimitry Andric void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
582381ad6265SDimitry Andric                                   const GlobalDecl GD) {
582481ad6265SDimitry Andric 
582581ad6265SDimitry Andric   assert(GV);
582681ad6265SDimitry Andric 
582781ad6265SDimitry Andric   if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
582881ad6265SDimitry Andric     return;
582981ad6265SDimitry Andric 
583081ad6265SDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
583181ad6265SDimitry Andric   if (D->hasAttr<NoDebugAttr>())
583281ad6265SDimitry Andric     return;
583381ad6265SDimitry Andric 
583481ad6265SDimitry Andric   auto AliaseeDecl = CGM.getMangledNameDecl(GV->getName());
583581ad6265SDimitry Andric   llvm::DINode *DI;
583681ad6265SDimitry Andric 
583781ad6265SDimitry Andric   if (!AliaseeDecl)
583881ad6265SDimitry Andric     // FIXME: Aliasee not declared yet - possibly declared later
583981ad6265SDimitry Andric     // For example,
584081ad6265SDimitry Andric     //
584181ad6265SDimitry Andric     //   1 extern int newname __attribute__((alias("oldname")));
584281ad6265SDimitry Andric     //   2 int oldname = 1;
584381ad6265SDimitry Andric     //
584481ad6265SDimitry Andric     // No debug info would be generated for 'newname' in this case.
584581ad6265SDimitry Andric     //
584681ad6265SDimitry Andric     // Fix compiler to generate "newname" as imported_declaration
584781ad6265SDimitry Andric     // pointing to the DIE of "oldname".
584881ad6265SDimitry Andric     return;
584981ad6265SDimitry Andric   if (!(DI = getDeclarationOrDefinition(
585081ad6265SDimitry Andric             AliaseeDecl.getCanonicalDecl().getDecl())))
585181ad6265SDimitry Andric     return;
585281ad6265SDimitry Andric 
585381ad6265SDimitry Andric   llvm::DIScope *DContext = getDeclContextDescriptor(D);
585481ad6265SDimitry Andric   auto Loc = D->getLocation();
585581ad6265SDimitry Andric 
585681ad6265SDimitry Andric   llvm::DIImportedEntity *ImportDI = DBuilder.createImportedDeclaration(
585781ad6265SDimitry Andric       DContext, DI, getOrCreateFile(Loc), getLineNumber(Loc), D->getName());
585881ad6265SDimitry Andric 
585981ad6265SDimitry Andric   // Record this DIE in the cache for nested declaration reference.
586081ad6265SDimitry Andric   ImportedDeclCache[GD.getCanonicalDecl().getDecl()].reset(ImportDI);
586181ad6265SDimitry Andric }
586281ad6265SDimitry Andric 
586381ad6265SDimitry Andric void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,
586481ad6265SDimitry Andric                                             const StringLiteral *S) {
586581ad6265SDimitry Andric   SourceLocation Loc = S->getStrTokenLoc(0);
586681ad6265SDimitry Andric   PresumedLoc PLoc = CGM.getContext().getSourceManager().getPresumedLoc(Loc);
586781ad6265SDimitry Andric   if (!PLoc.isValid())
586881ad6265SDimitry Andric     return;
586981ad6265SDimitry Andric 
587081ad6265SDimitry Andric   llvm::DIFile *File = getOrCreateFile(Loc);
587181ad6265SDimitry Andric   llvm::DIGlobalVariableExpression *Debug =
587281ad6265SDimitry Andric       DBuilder.createGlobalVariableExpression(
587381ad6265SDimitry Andric           nullptr, StringRef(), StringRef(), getOrCreateFile(Loc),
587481ad6265SDimitry Andric           getLineNumber(Loc), getOrCreateType(S->getType(), File), true);
587581ad6265SDimitry Andric   GV->addDebugInfo(Debug);
587681ad6265SDimitry Andric }
587781ad6265SDimitry Andric 
58780b57cec5SDimitry Andric llvm::DIScope *CGDebugInfo::getCurrentContextDescriptor(const Decl *D) {
58790b57cec5SDimitry Andric   if (!LexicalBlockStack.empty())
58800b57cec5SDimitry Andric     return LexicalBlockStack.back();
58810b57cec5SDimitry Andric   llvm::DIScope *Mod = getParentModuleOrNull(D);
58820b57cec5SDimitry Andric   return getContextDescriptor(D, Mod ? Mod : TheCU);
58830b57cec5SDimitry Andric }
58840b57cec5SDimitry Andric 
58850b57cec5SDimitry Andric void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
5886480093f4SDimitry Andric   if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
58870b57cec5SDimitry Andric     return;
58880b57cec5SDimitry Andric   const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
58890b57cec5SDimitry Andric   if (!NSDecl->isAnonymousNamespace() ||
58900b57cec5SDimitry Andric       CGM.getCodeGenOpts().DebugExplicitImport) {
58910b57cec5SDimitry Andric     auto Loc = UD.getLocation();
5892e8d8bef9SDimitry Andric     if (!Loc.isValid())
5893e8d8bef9SDimitry Andric       Loc = CurLoc;
58940b57cec5SDimitry Andric     DBuilder.createImportedModule(
58950b57cec5SDimitry Andric         getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())),
58960b57cec5SDimitry Andric         getOrCreateNamespace(NSDecl), getOrCreateFile(Loc), getLineNumber(Loc));
58970b57cec5SDimitry Andric   }
58980b57cec5SDimitry Andric }
58990b57cec5SDimitry Andric 
5900fe6060f1SDimitry Andric void CGDebugInfo::EmitUsingShadowDecl(const UsingShadowDecl &USD) {
59010b57cec5SDimitry Andric   if (llvm::DINode *Target =
59020b57cec5SDimitry Andric           getDeclarationOrDefinition(USD.getUnderlyingDecl())) {
59030b57cec5SDimitry Andric     auto Loc = USD.getLocation();
59040b57cec5SDimitry Andric     DBuilder.createImportedDeclaration(
59050b57cec5SDimitry Andric         getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target,
59060b57cec5SDimitry Andric         getOrCreateFile(Loc), getLineNumber(Loc));
59070b57cec5SDimitry Andric   }
59080b57cec5SDimitry Andric }
59090b57cec5SDimitry Andric 
5910fe6060f1SDimitry Andric void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) {
5911fe6060f1SDimitry Andric   if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
5912fe6060f1SDimitry Andric     return;
5913fe6060f1SDimitry Andric   assert(UD.shadow_size() &&
5914fe6060f1SDimitry Andric          "We shouldn't be codegening an invalid UsingDecl containing no decls");
5915fe6060f1SDimitry Andric 
5916fe6060f1SDimitry Andric   for (const auto *USD : UD.shadows()) {
5917fe6060f1SDimitry Andric     // FIXME: Skip functions with undeduced auto return type for now since we
5918fe6060f1SDimitry Andric     // don't currently have the plumbing for separate declarations & definitions
5919fe6060f1SDimitry Andric     // of free functions and mismatched types (auto in the declaration, concrete
5920fe6060f1SDimitry Andric     // return type in the definition)
5921fe6060f1SDimitry Andric     if (const auto *FD = dyn_cast<FunctionDecl>(USD->getUnderlyingDecl()))
5922fe6060f1SDimitry Andric       if (const auto *AT = FD->getType()
5923fe6060f1SDimitry Andric                                ->castAs<FunctionProtoType>()
5924fe6060f1SDimitry Andric                                ->getContainedAutoType())
5925fe6060f1SDimitry Andric         if (AT->getDeducedType().isNull())
5926fe6060f1SDimitry Andric           continue;
5927fe6060f1SDimitry Andric 
5928fe6060f1SDimitry Andric     EmitUsingShadowDecl(*USD);
5929fe6060f1SDimitry Andric     // Emitting one decl is sufficient - debuggers can detect that this is an
5930fe6060f1SDimitry Andric     // overloaded name & provide lookup for all the overloads.
5931fe6060f1SDimitry Andric     break;
5932fe6060f1SDimitry Andric   }
5933fe6060f1SDimitry Andric }
5934fe6060f1SDimitry Andric 
5935fe6060f1SDimitry Andric void CGDebugInfo::EmitUsingEnumDecl(const UsingEnumDecl &UD) {
5936fe6060f1SDimitry Andric   if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
5937fe6060f1SDimitry Andric     return;
5938fe6060f1SDimitry Andric   assert(UD.shadow_size() &&
5939fe6060f1SDimitry Andric          "We shouldn't be codegening an invalid UsingEnumDecl"
5940fe6060f1SDimitry Andric          " containing no decls");
5941fe6060f1SDimitry Andric 
5942fe6060f1SDimitry Andric   for (const auto *USD : UD.shadows())
5943fe6060f1SDimitry Andric     EmitUsingShadowDecl(*USD);
5944fe6060f1SDimitry Andric }
5945fe6060f1SDimitry Andric 
59460b57cec5SDimitry Andric void CGDebugInfo::EmitImportDecl(const ImportDecl &ID) {
59470b57cec5SDimitry Andric   if (CGM.getCodeGenOpts().getDebuggerTuning() != llvm::DebuggerKind::LLDB)
59480b57cec5SDimitry Andric     return;
59490b57cec5SDimitry Andric   if (Module *M = ID.getImportedModule()) {
59505ffd83dbSDimitry Andric     auto Info = ASTSourceDescriptor(*M);
59510b57cec5SDimitry Andric     auto Loc = ID.getLocation();
59520b57cec5SDimitry Andric     DBuilder.createImportedDeclaration(
59530b57cec5SDimitry Andric         getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())),
59540b57cec5SDimitry Andric         getOrCreateModuleRef(Info, DebugTypeExtRefs), getOrCreateFile(Loc),
59550b57cec5SDimitry Andric         getLineNumber(Loc));
59560b57cec5SDimitry Andric   }
59570b57cec5SDimitry Andric }
59580b57cec5SDimitry Andric 
59590b57cec5SDimitry Andric llvm::DIImportedEntity *
59600b57cec5SDimitry Andric CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) {
5961480093f4SDimitry Andric   if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
59620b57cec5SDimitry Andric     return nullptr;
59630b57cec5SDimitry Andric   auto &VH = NamespaceAliasCache[&NA];
59640b57cec5SDimitry Andric   if (VH)
59650b57cec5SDimitry Andric     return cast<llvm::DIImportedEntity>(VH);
59660b57cec5SDimitry Andric   llvm::DIImportedEntity *R;
59670b57cec5SDimitry Andric   auto Loc = NA.getLocation();
59680b57cec5SDimitry Andric   if (const auto *Underlying =
59690b57cec5SDimitry Andric           dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace()))
59700b57cec5SDimitry Andric     // This could cache & dedup here rather than relying on metadata deduping.
59710b57cec5SDimitry Andric     R = DBuilder.createImportedDeclaration(
59720b57cec5SDimitry Andric         getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())),
59730b57cec5SDimitry Andric         EmitNamespaceAlias(*Underlying), getOrCreateFile(Loc),
59740b57cec5SDimitry Andric         getLineNumber(Loc), NA.getName());
59750b57cec5SDimitry Andric   else
59760b57cec5SDimitry Andric     R = DBuilder.createImportedDeclaration(
59770b57cec5SDimitry Andric         getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())),
59780b57cec5SDimitry Andric         getOrCreateNamespace(cast<NamespaceDecl>(NA.getAliasedNamespace())),
59790b57cec5SDimitry Andric         getOrCreateFile(Loc), getLineNumber(Loc), NA.getName());
59800b57cec5SDimitry Andric   VH.reset(R);
59810b57cec5SDimitry Andric   return R;
59820b57cec5SDimitry Andric }
59830b57cec5SDimitry Andric 
59840b57cec5SDimitry Andric llvm::DINamespace *
59850b57cec5SDimitry Andric CGDebugInfo::getOrCreateNamespace(const NamespaceDecl *NSDecl) {
59860b57cec5SDimitry Andric   // Don't canonicalize the NamespaceDecl here: The DINamespace will be uniqued
59870b57cec5SDimitry Andric   // if necessary, and this way multiple declarations of the same namespace in
59880b57cec5SDimitry Andric   // different parent modules stay distinct.
59890b57cec5SDimitry Andric   auto I = NamespaceCache.find(NSDecl);
59900b57cec5SDimitry Andric   if (I != NamespaceCache.end())
59910b57cec5SDimitry Andric     return cast<llvm::DINamespace>(I->second);
59920b57cec5SDimitry Andric 
59930b57cec5SDimitry Andric   llvm::DIScope *Context = getDeclContextDescriptor(NSDecl);
59940b57cec5SDimitry Andric   // Don't trust the context if it is a DIModule (see comment above).
59950b57cec5SDimitry Andric   llvm::DINamespace *NS =
59960b57cec5SDimitry Andric       DBuilder.createNameSpace(Context, NSDecl->getName(), NSDecl->isInline());
59970b57cec5SDimitry Andric   NamespaceCache[NSDecl].reset(NS);
59980b57cec5SDimitry Andric   return NS;
59990b57cec5SDimitry Andric }
60000b57cec5SDimitry Andric 
60010b57cec5SDimitry Andric void CGDebugInfo::setDwoId(uint64_t Signature) {
60020b57cec5SDimitry Andric   assert(TheCU && "no main compile unit");
60030b57cec5SDimitry Andric   TheCU->setDWOId(Signature);
60040b57cec5SDimitry Andric }
60050b57cec5SDimitry Andric 
60060b57cec5SDimitry Andric void CGDebugInfo::finalize() {
60070b57cec5SDimitry Andric   // Creating types might create further types - invalidating the current
60080b57cec5SDimitry Andric   // element and the size(), so don't cache/reference them.
60090b57cec5SDimitry Andric   for (size_t i = 0; i != ObjCInterfaceCache.size(); ++i) {
60100b57cec5SDimitry Andric     ObjCInterfaceCacheEntry E = ObjCInterfaceCache[i];
60110b57cec5SDimitry Andric     llvm::DIType *Ty = E.Type->getDecl()->getDefinition()
60120b57cec5SDimitry Andric                            ? CreateTypeDefinition(E.Type, E.Unit)
60130b57cec5SDimitry Andric                            : E.Decl;
60140b57cec5SDimitry Andric     DBuilder.replaceTemporary(llvm::TempDIType(E.Decl), Ty);
60150b57cec5SDimitry Andric   }
60160b57cec5SDimitry Andric 
60170b57cec5SDimitry Andric   // Add methods to interface.
60180b57cec5SDimitry Andric   for (const auto &P : ObjCMethodCache) {
60190b57cec5SDimitry Andric     if (P.second.empty())
60200b57cec5SDimitry Andric       continue;
60210b57cec5SDimitry Andric 
60220b57cec5SDimitry Andric     QualType QTy(P.first->getTypeForDecl(), 0);
60230b57cec5SDimitry Andric     auto It = TypeCache.find(QTy.getAsOpaquePtr());
60240b57cec5SDimitry Andric     assert(It != TypeCache.end());
60250b57cec5SDimitry Andric 
60260b57cec5SDimitry Andric     llvm::DICompositeType *InterfaceDecl =
60270b57cec5SDimitry Andric         cast<llvm::DICompositeType>(It->second);
60280b57cec5SDimitry Andric 
6029480093f4SDimitry Andric     auto CurElts = InterfaceDecl->getElements();
6030480093f4SDimitry Andric     SmallVector<llvm::Metadata *, 16> EltTys(CurElts.begin(), CurElts.end());
6031480093f4SDimitry Andric 
6032480093f4SDimitry Andric     // For DWARF v4 or earlier, only add objc_direct methods.
6033480093f4SDimitry Andric     for (auto &SubprogramDirect : P.second)
6034480093f4SDimitry Andric       if (CGM.getCodeGenOpts().DwarfVersion >= 5 || SubprogramDirect.getInt())
6035480093f4SDimitry Andric         EltTys.push_back(SubprogramDirect.getPointer());
6036480093f4SDimitry Andric 
60370b57cec5SDimitry Andric     llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
60380b57cec5SDimitry Andric     DBuilder.replaceArrays(InterfaceDecl, Elements);
60390b57cec5SDimitry Andric   }
60400b57cec5SDimitry Andric 
60410b57cec5SDimitry Andric   for (const auto &P : ReplaceMap) {
60420b57cec5SDimitry Andric     assert(P.second);
60430b57cec5SDimitry Andric     auto *Ty = cast<llvm::DIType>(P.second);
60440b57cec5SDimitry Andric     assert(Ty->isForwardDecl());
60450b57cec5SDimitry Andric 
60460b57cec5SDimitry Andric     auto It = TypeCache.find(P.first);
60470b57cec5SDimitry Andric     assert(It != TypeCache.end());
60480b57cec5SDimitry Andric     assert(It->second);
60490b57cec5SDimitry Andric 
60500b57cec5SDimitry Andric     DBuilder.replaceTemporary(llvm::TempDIType(Ty),
60510b57cec5SDimitry Andric                               cast<llvm::DIType>(It->second));
60520b57cec5SDimitry Andric   }
60530b57cec5SDimitry Andric 
60540b57cec5SDimitry Andric   for (const auto &P : FwdDeclReplaceMap) {
60550b57cec5SDimitry Andric     assert(P.second);
60560b57cec5SDimitry Andric     llvm::TempMDNode FwdDecl(cast<llvm::MDNode>(P.second));
60570b57cec5SDimitry Andric     llvm::Metadata *Repl;
60580b57cec5SDimitry Andric 
60590b57cec5SDimitry Andric     auto It = DeclCache.find(P.first);
60600b57cec5SDimitry Andric     // If there has been no definition for the declaration, call RAUW
60610b57cec5SDimitry Andric     // with ourselves, that will destroy the temporary MDNode and
60620b57cec5SDimitry Andric     // replace it with a standard one, avoiding leaking memory.
60630b57cec5SDimitry Andric     if (It == DeclCache.end())
60640b57cec5SDimitry Andric       Repl = P.second;
60650b57cec5SDimitry Andric     else
60660b57cec5SDimitry Andric       Repl = It->second;
60670b57cec5SDimitry Andric 
60680b57cec5SDimitry Andric     if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(Repl))
60690b57cec5SDimitry Andric       Repl = GVE->getVariable();
60700b57cec5SDimitry Andric     DBuilder.replaceTemporary(std::move(FwdDecl), cast<llvm::MDNode>(Repl));
60710b57cec5SDimitry Andric   }
60720b57cec5SDimitry Andric 
60730b57cec5SDimitry Andric   // We keep our own list of retained types, because we need to look
60740b57cec5SDimitry Andric   // up the final type in the type cache.
60750b57cec5SDimitry Andric   for (auto &RT : RetainedTypes)
60760b57cec5SDimitry Andric     if (auto MD = TypeCache[RT])
60770b57cec5SDimitry Andric       DBuilder.retainType(cast<llvm::DIType>(MD));
60780b57cec5SDimitry Andric 
60790b57cec5SDimitry Andric   DBuilder.finalize();
60800b57cec5SDimitry Andric }
60810b57cec5SDimitry Andric 
60820b57cec5SDimitry Andric // Don't ignore in case of explicit cast where it is referenced indirectly.
6083e8d8bef9SDimitry Andric void CGDebugInfo::EmitExplicitCastType(QualType Ty) {
6084e8d8bef9SDimitry Andric   if (CGM.getCodeGenOpts().hasReducedDebugInfo())
6085e8d8bef9SDimitry Andric     if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile()))
6086e8d8bef9SDimitry Andric       DBuilder.retainType(DieTy);
6087e8d8bef9SDimitry Andric }
6088e8d8bef9SDimitry Andric 
6089e8d8bef9SDimitry Andric void CGDebugInfo::EmitAndRetainType(QualType Ty) {
6090e8d8bef9SDimitry Andric   if (CGM.getCodeGenOpts().hasMaybeUnusedDebugInfo())
6091e8d8bef9SDimitry Andric     if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile()))
60920b57cec5SDimitry Andric       DBuilder.retainType(DieTy);
60930b57cec5SDimitry Andric }
60940b57cec5SDimitry Andric 
60950b57cec5SDimitry Andric llvm::DebugLoc CGDebugInfo::SourceLocToDebugLoc(SourceLocation Loc) {
60960b57cec5SDimitry Andric   if (LexicalBlockStack.empty())
60970b57cec5SDimitry Andric     return llvm::DebugLoc();
60980b57cec5SDimitry Andric 
60990b57cec5SDimitry Andric   llvm::MDNode *Scope = LexicalBlockStack.back();
6100e8d8bef9SDimitry Andric   return llvm::DILocation::get(CGM.getLLVMContext(), getLineNumber(Loc),
6101e8d8bef9SDimitry Andric                                getColumnNumber(Loc), Scope);
61020b57cec5SDimitry Andric }
61030b57cec5SDimitry Andric 
61040b57cec5SDimitry Andric llvm::DINode::DIFlags CGDebugInfo::getCallSiteRelatedAttrs() const {
61050b57cec5SDimitry Andric   // Call site-related attributes are only useful in optimized programs, and
61060b57cec5SDimitry Andric   // when there's a possibility of debugging backtraces.
610706c3fb27SDimitry Andric   if (!CGM.getLangOpts().Optimize ||
610806c3fb27SDimitry Andric       DebugKind == llvm::codegenoptions::NoDebugInfo ||
610906c3fb27SDimitry Andric       DebugKind == llvm::codegenoptions::LocTrackingOnly)
61100b57cec5SDimitry Andric     return llvm::DINode::FlagZero;
61110b57cec5SDimitry Andric 
61120b57cec5SDimitry Andric   // Call site-related attributes are available in DWARF v5. Some debuggers,
61130b57cec5SDimitry Andric   // while not fully DWARF v5-compliant, may accept these attributes as if they
61140b57cec5SDimitry Andric   // were part of DWARF v4.
61150b57cec5SDimitry Andric   bool SupportsDWARFv4Ext =
61160b57cec5SDimitry Andric       CGM.getCodeGenOpts().DwarfVersion == 4 &&
61170b57cec5SDimitry Andric       (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB ||
6118480093f4SDimitry Andric        CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::GDB);
61190b57cec5SDimitry Andric 
61205ffd83dbSDimitry Andric   if (!SupportsDWARFv4Ext && CGM.getCodeGenOpts().DwarfVersion < 5)
61210b57cec5SDimitry Andric     return llvm::DINode::FlagZero;
61220b57cec5SDimitry Andric 
61230b57cec5SDimitry Andric   return llvm::DINode::FlagAllCallsDescribed;
61240b57cec5SDimitry Andric }
61255f757f3fSDimitry Andric 
61265f757f3fSDimitry Andric llvm::DIExpression *
61275f757f3fSDimitry Andric CGDebugInfo::createConstantValueExpression(const clang::ValueDecl *VD,
61285f757f3fSDimitry Andric                                            const APValue &Val) {
61295f757f3fSDimitry Andric   // FIXME: Add a representation for integer constants wider than 64 bits.
61305f757f3fSDimitry Andric   if (CGM.getContext().getTypeSize(VD->getType()) > 64)
61315f757f3fSDimitry Andric     return nullptr;
61325f757f3fSDimitry Andric 
61335f757f3fSDimitry Andric   if (Val.isFloat())
61345f757f3fSDimitry Andric     return DBuilder.createConstantValueExpression(
61355f757f3fSDimitry Andric         Val.getFloat().bitcastToAPInt().getZExtValue());
61365f757f3fSDimitry Andric 
61375f757f3fSDimitry Andric   if (!Val.isInt())
61385f757f3fSDimitry Andric     return nullptr;
61395f757f3fSDimitry Andric 
61405f757f3fSDimitry Andric   llvm::APSInt const &ValInt = Val.getInt();
61415f757f3fSDimitry Andric   std::optional<uint64_t> ValIntOpt;
61425f757f3fSDimitry Andric   if (ValInt.isUnsigned())
61435f757f3fSDimitry Andric     ValIntOpt = ValInt.tryZExtValue();
61445f757f3fSDimitry Andric   else if (auto tmp = ValInt.trySExtValue())
61455f757f3fSDimitry Andric     // Transform a signed optional to unsigned optional. When cpp 23 comes,
61465f757f3fSDimitry Andric     // use std::optional::transform
61475f757f3fSDimitry Andric     ValIntOpt = static_cast<uint64_t>(*tmp);
61485f757f3fSDimitry Andric 
61495f757f3fSDimitry Andric   if (ValIntOpt)
61505f757f3fSDimitry Andric     return DBuilder.createConstantValueExpression(ValIntOpt.value());
61515f757f3fSDimitry Andric 
61525f757f3fSDimitry Andric   return nullptr;
61535f757f3fSDimitry Andric }
6154