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