1 //===--- CGDebugInfo.cpp - Emit Debug Information for a Module ------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This coordinates the debug information generation while generating code. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "CGDebugInfo.h" 14 #include "CGBlocks.h" 15 #include "CGCXXABI.h" 16 #include "CGObjCRuntime.h" 17 #include "CGRecordLayout.h" 18 #include "CodeGenFunction.h" 19 #include "CodeGenModule.h" 20 #include "ConstantEmitter.h" 21 #include "TargetInfo.h" 22 #include "clang/AST/ASTContext.h" 23 #include "clang/AST/Attr.h" 24 #include "clang/AST/DeclFriend.h" 25 #include "clang/AST/DeclObjC.h" 26 #include "clang/AST/DeclTemplate.h" 27 #include "clang/AST/Expr.h" 28 #include "clang/AST/RecordLayout.h" 29 #include "clang/AST/RecursiveASTVisitor.h" 30 #include "clang/AST/VTableBuilder.h" 31 #include "clang/Basic/CodeGenOptions.h" 32 #include "clang/Basic/FileManager.h" 33 #include "clang/Basic/SourceManager.h" 34 #include "clang/Basic/Version.h" 35 #include "clang/CodeGen/ModuleBuilder.h" 36 #include "clang/Frontend/FrontendOptions.h" 37 #include "clang/Lex/HeaderSearchOptions.h" 38 #include "clang/Lex/ModuleMap.h" 39 #include "clang/Lex/PreprocessorOptions.h" 40 #include "llvm/ADT/DenseSet.h" 41 #include "llvm/ADT/SmallVector.h" 42 #include "llvm/ADT/StringExtras.h" 43 #include "llvm/IR/Constants.h" 44 #include "llvm/IR/DataLayout.h" 45 #include "llvm/IR/DerivedTypes.h" 46 #include "llvm/IR/Instructions.h" 47 #include "llvm/IR/Intrinsics.h" 48 #include "llvm/IR/Metadata.h" 49 #include "llvm/IR/Module.h" 50 #include "llvm/Support/FileSystem.h" 51 #include "llvm/Support/MD5.h" 52 #include "llvm/Support/Path.h" 53 #include "llvm/Support/SHA1.h" 54 #include "llvm/Support/SHA256.h" 55 #include "llvm/Support/TimeProfiler.h" 56 #include <optional> 57 using namespace clang; 58 using namespace clang::CodeGen; 59 60 static uint32_t getTypeAlignIfRequired(const Type *Ty, const ASTContext &Ctx) { 61 auto TI = Ctx.getTypeInfo(Ty); 62 if (TI.isAlignRequired()) 63 return TI.Align; 64 65 // MaxFieldAlignmentAttr is the attribute added to types 66 // declared after #pragma pack(n). 67 if (auto *Decl = Ty->getAsRecordDecl()) 68 if (Decl->hasAttr<MaxFieldAlignmentAttr>()) 69 return TI.Align; 70 71 return 0; 72 } 73 74 static uint32_t getTypeAlignIfRequired(QualType Ty, const ASTContext &Ctx) { 75 return getTypeAlignIfRequired(Ty.getTypePtr(), Ctx); 76 } 77 78 static uint32_t getDeclAlignIfRequired(const Decl *D, const ASTContext &Ctx) { 79 return D->hasAttr<AlignedAttr>() ? D->getMaxAlignment() : 0; 80 } 81 82 CGDebugInfo::CGDebugInfo(CodeGenModule &CGM) 83 : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()), 84 DebugTypeExtRefs(CGM.getCodeGenOpts().DebugTypeExtRefs), 85 DBuilder(CGM.getModule()) { 86 CreateCompileUnit(); 87 } 88 89 CGDebugInfo::~CGDebugInfo() { 90 assert(LexicalBlockStack.empty() && 91 "Region stack mismatch, stack not empty!"); 92 } 93 94 ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, 95 SourceLocation TemporaryLocation) 96 : CGF(&CGF) { 97 init(TemporaryLocation); 98 } 99 100 ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, 101 bool DefaultToEmpty, 102 SourceLocation TemporaryLocation) 103 : CGF(&CGF) { 104 init(TemporaryLocation, DefaultToEmpty); 105 } 106 107 void ApplyDebugLocation::init(SourceLocation TemporaryLocation, 108 bool DefaultToEmpty) { 109 auto *DI = CGF->getDebugInfo(); 110 if (!DI) { 111 CGF = nullptr; 112 return; 113 } 114 115 OriginalLocation = CGF->Builder.getCurrentDebugLocation(); 116 117 if (OriginalLocation && !DI->CGM.getExpressionLocationsEnabled()) 118 return; 119 120 if (TemporaryLocation.isValid()) { 121 DI->EmitLocation(CGF->Builder, TemporaryLocation); 122 return; 123 } 124 125 if (DefaultToEmpty) { 126 CGF->Builder.SetCurrentDebugLocation(llvm::DebugLoc()); 127 return; 128 } 129 130 // Construct a location that has a valid scope, but no line info. 131 assert(!DI->LexicalBlockStack.empty()); 132 CGF->Builder.SetCurrentDebugLocation( 133 llvm::DILocation::get(DI->LexicalBlockStack.back()->getContext(), 0, 0, 134 DI->LexicalBlockStack.back(), DI->getInlinedAt())); 135 } 136 137 ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E) 138 : CGF(&CGF) { 139 init(E->getExprLoc()); 140 } 141 142 ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc) 143 : CGF(&CGF) { 144 if (!CGF.getDebugInfo()) { 145 this->CGF = nullptr; 146 return; 147 } 148 OriginalLocation = CGF.Builder.getCurrentDebugLocation(); 149 if (Loc) 150 CGF.Builder.SetCurrentDebugLocation(std::move(Loc)); 151 } 152 153 ApplyDebugLocation::~ApplyDebugLocation() { 154 // Query CGF so the location isn't overwritten when location updates are 155 // temporarily disabled (for C++ default function arguments) 156 if (CGF) 157 CGF->Builder.SetCurrentDebugLocation(std::move(OriginalLocation)); 158 } 159 160 ApplyInlineDebugLocation::ApplyInlineDebugLocation(CodeGenFunction &CGF, 161 GlobalDecl InlinedFn) 162 : CGF(&CGF) { 163 if (!CGF.getDebugInfo()) { 164 this->CGF = nullptr; 165 return; 166 } 167 auto &DI = *CGF.getDebugInfo(); 168 SavedLocation = DI.getLocation(); 169 assert((DI.getInlinedAt() == 170 CGF.Builder.getCurrentDebugLocation()->getInlinedAt()) && 171 "CGDebugInfo and IRBuilder are out of sync"); 172 173 DI.EmitInlineFunctionStart(CGF.Builder, InlinedFn); 174 } 175 176 ApplyInlineDebugLocation::~ApplyInlineDebugLocation() { 177 if (!CGF) 178 return; 179 auto &DI = *CGF->getDebugInfo(); 180 DI.EmitInlineFunctionEnd(CGF->Builder); 181 DI.EmitLocation(CGF->Builder, SavedLocation); 182 } 183 184 void CGDebugInfo::setLocation(SourceLocation Loc) { 185 // If the new location isn't valid return. 186 if (Loc.isInvalid()) 187 return; 188 189 CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc); 190 191 // If we've changed files in the middle of a lexical scope go ahead 192 // and create a new lexical scope with file node if it's different 193 // from the one in the scope. 194 if (LexicalBlockStack.empty()) 195 return; 196 197 SourceManager &SM = CGM.getContext().getSourceManager(); 198 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back()); 199 PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); 200 if (PCLoc.isInvalid() || Scope->getFile() == getOrCreateFile(CurLoc)) 201 return; 202 203 if (auto *LBF = dyn_cast<llvm::DILexicalBlockFile>(Scope)) { 204 LexicalBlockStack.pop_back(); 205 LexicalBlockStack.emplace_back(DBuilder.createLexicalBlockFile( 206 LBF->getScope(), getOrCreateFile(CurLoc))); 207 } else if (isa<llvm::DILexicalBlock>(Scope) || 208 isa<llvm::DISubprogram>(Scope)) { 209 LexicalBlockStack.pop_back(); 210 LexicalBlockStack.emplace_back( 211 DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc))); 212 } 213 } 214 215 llvm::DIScope *CGDebugInfo::getDeclContextDescriptor(const Decl *D) { 216 llvm::DIScope *Mod = getParentModuleOrNull(D); 217 return getContextDescriptor(cast<Decl>(D->getDeclContext()), 218 Mod ? Mod : TheCU); 219 } 220 221 llvm::DIScope *CGDebugInfo::getContextDescriptor(const Decl *Context, 222 llvm::DIScope *Default) { 223 if (!Context) 224 return Default; 225 226 auto I = RegionMap.find(Context); 227 if (I != RegionMap.end()) { 228 llvm::Metadata *V = I->second; 229 return dyn_cast_or_null<llvm::DIScope>(V); 230 } 231 232 // Check namespace. 233 if (const auto *NSDecl = dyn_cast<NamespaceDecl>(Context)) 234 return getOrCreateNamespace(NSDecl); 235 236 if (const auto *RDecl = dyn_cast<RecordDecl>(Context)) 237 if (!RDecl->isDependentType()) 238 return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl), 239 TheCU->getFile()); 240 return Default; 241 } 242 243 PrintingPolicy CGDebugInfo::getPrintingPolicy() const { 244 PrintingPolicy PP = CGM.getContext().getPrintingPolicy(); 245 246 // If we're emitting codeview, it's important to try to match MSVC's naming so 247 // that visualizers written for MSVC will trigger for our class names. In 248 // particular, we can't have spaces between arguments of standard templates 249 // like basic_string and vector, but we must have spaces between consecutive 250 // angle brackets that close nested template argument lists. 251 if (CGM.getCodeGenOpts().EmitCodeView) { 252 PP.MSVCFormatting = true; 253 PP.SplitTemplateClosers = true; 254 } else { 255 // For DWARF, printing rules are underspecified. 256 // SplitTemplateClosers yields better interop with GCC and GDB (PR46052). 257 PP.SplitTemplateClosers = true; 258 } 259 260 PP.SuppressInlineNamespace = false; 261 PP.PrintCanonicalTypes = true; 262 PP.UsePreferredNames = false; 263 PP.AlwaysIncludeTypeForTemplateArgument = true; 264 PP.UseEnumerators = false; 265 266 // Apply -fdebug-prefix-map. 267 PP.Callbacks = &PrintCB; 268 return PP; 269 } 270 271 StringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) { 272 return internString(GetName(FD)); 273 } 274 275 StringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) { 276 SmallString<256> MethodName; 277 llvm::raw_svector_ostream OS(MethodName); 278 OS << (OMD->isInstanceMethod() ? '-' : '+') << '['; 279 const DeclContext *DC = OMD->getDeclContext(); 280 if (const auto *OID = dyn_cast<ObjCImplementationDecl>(DC)) { 281 OS << OID->getName(); 282 } else if (const auto *OID = dyn_cast<ObjCInterfaceDecl>(DC)) { 283 OS << OID->getName(); 284 } else if (const auto *OC = dyn_cast<ObjCCategoryDecl>(DC)) { 285 if (OC->IsClassExtension()) { 286 OS << OC->getClassInterface()->getName(); 287 } else { 288 OS << OC->getIdentifier()->getNameStart() << '(' 289 << OC->getIdentifier()->getNameStart() << ')'; 290 } 291 } else if (const auto *OCD = dyn_cast<ObjCCategoryImplDecl>(DC)) { 292 OS << OCD->getClassInterface()->getName() << '(' << OCD->getName() << ')'; 293 } 294 OS << ' ' << OMD->getSelector().getAsString() << ']'; 295 296 return internString(OS.str()); 297 } 298 299 StringRef CGDebugInfo::getSelectorName(Selector S) { 300 return internString(S.getAsString()); 301 } 302 303 StringRef CGDebugInfo::getClassName(const RecordDecl *RD) { 304 if (isa<ClassTemplateSpecializationDecl>(RD)) { 305 // Copy this name on the side and use its reference. 306 return internString(GetName(RD)); 307 } 308 309 // quick optimization to avoid having to intern strings that are already 310 // stored reliably elsewhere 311 if (const IdentifierInfo *II = RD->getIdentifier()) 312 return II->getName(); 313 314 // The CodeView printer in LLVM wants to see the names of unnamed types 315 // because they need to have a unique identifier. 316 // These names are used to reconstruct the fully qualified type names. 317 if (CGM.getCodeGenOpts().EmitCodeView) { 318 if (const TypedefNameDecl *D = RD->getTypedefNameForAnonDecl()) { 319 assert(RD->getDeclContext() == D->getDeclContext() && 320 "Typedef should not be in another decl context!"); 321 assert(D->getDeclName().getAsIdentifierInfo() && 322 "Typedef was not named!"); 323 return D->getDeclName().getAsIdentifierInfo()->getName(); 324 } 325 326 if (CGM.getLangOpts().CPlusPlus) { 327 StringRef Name; 328 329 ASTContext &Context = CGM.getContext(); 330 if (const DeclaratorDecl *DD = Context.getDeclaratorForUnnamedTagDecl(RD)) 331 // Anonymous types without a name for linkage purposes have their 332 // declarator mangled in if they have one. 333 Name = DD->getName(); 334 else if (const TypedefNameDecl *TND = 335 Context.getTypedefNameForUnnamedTagDecl(RD)) 336 // Anonymous types without a name for linkage purposes have their 337 // associate typedef mangled in if they have one. 338 Name = TND->getName(); 339 340 // Give lambdas a display name based on their name mangling. 341 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) 342 if (CXXRD->isLambda()) 343 return internString( 344 CGM.getCXXABI().getMangleContext().getLambdaString(CXXRD)); 345 346 if (!Name.empty()) { 347 SmallString<256> UnnamedType("<unnamed-type-"); 348 UnnamedType += Name; 349 UnnamedType += '>'; 350 return internString(UnnamedType); 351 } 352 } 353 } 354 355 return StringRef(); 356 } 357 358 std::optional<llvm::DIFile::ChecksumKind> 359 CGDebugInfo::computeChecksum(FileID FID, SmallString<64> &Checksum) const { 360 Checksum.clear(); 361 362 if (!CGM.getCodeGenOpts().EmitCodeView && 363 CGM.getCodeGenOpts().DwarfVersion < 5) 364 return std::nullopt; 365 366 SourceManager &SM = CGM.getContext().getSourceManager(); 367 std::optional<llvm::MemoryBufferRef> MemBuffer = SM.getBufferOrNone(FID); 368 if (!MemBuffer) 369 return std::nullopt; 370 371 auto Data = llvm::arrayRefFromStringRef(MemBuffer->getBuffer()); 372 switch (CGM.getCodeGenOpts().getDebugSrcHash()) { 373 case clang::CodeGenOptions::DSH_MD5: 374 llvm::toHex(llvm::MD5::hash(Data), /*LowerCase=*/true, Checksum); 375 return llvm::DIFile::CSK_MD5; 376 case clang::CodeGenOptions::DSH_SHA1: 377 llvm::toHex(llvm::SHA1::hash(Data), /*LowerCase=*/true, Checksum); 378 return llvm::DIFile::CSK_SHA1; 379 case clang::CodeGenOptions::DSH_SHA256: 380 llvm::toHex(llvm::SHA256::hash(Data), /*LowerCase=*/true, Checksum); 381 return llvm::DIFile::CSK_SHA256; 382 } 383 llvm_unreachable("Unhandled DebugSrcHashKind enum"); 384 } 385 386 std::optional<StringRef> CGDebugInfo::getSource(const SourceManager &SM, 387 FileID FID) { 388 if (!CGM.getCodeGenOpts().EmbedSource) 389 return std::nullopt; 390 391 bool SourceInvalid = false; 392 StringRef Source = SM.getBufferData(FID, &SourceInvalid); 393 394 if (SourceInvalid) 395 return std::nullopt; 396 397 return Source; 398 } 399 400 llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) { 401 SourceManager &SM = CGM.getContext().getSourceManager(); 402 StringRef FileName; 403 FileID FID; 404 std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo; 405 406 if (Loc.isInvalid()) { 407 // The DIFile used by the CU is distinct from the main source file. Call 408 // createFile() below for canonicalization if the source file was specified 409 // with an absolute path. 410 FileName = TheCU->getFile()->getFilename(); 411 CSInfo = TheCU->getFile()->getChecksum(); 412 } else { 413 PresumedLoc PLoc = SM.getPresumedLoc(Loc); 414 FileName = PLoc.getFilename(); 415 416 if (FileName.empty()) { 417 FileName = TheCU->getFile()->getFilename(); 418 } else { 419 FileName = PLoc.getFilename(); 420 } 421 FID = PLoc.getFileID(); 422 } 423 424 // Cache the results. 425 auto It = DIFileCache.find(FileName.data()); 426 if (It != DIFileCache.end()) { 427 // Verify that the information still exists. 428 if (llvm::Metadata *V = It->second) 429 return cast<llvm::DIFile>(V); 430 } 431 432 // Put Checksum at a scope where it will persist past the createFile call. 433 SmallString<64> Checksum; 434 if (!CSInfo) { 435 std::optional<llvm::DIFile::ChecksumKind> CSKind = 436 computeChecksum(FID, Checksum); 437 if (CSKind) 438 CSInfo.emplace(*CSKind, Checksum); 439 } 440 return createFile(FileName, CSInfo, getSource(SM, SM.getFileID(Loc))); 441 } 442 443 llvm::DIFile *CGDebugInfo::createFile( 444 StringRef FileName, 445 std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo, 446 std::optional<StringRef> Source) { 447 StringRef Dir; 448 StringRef File; 449 std::string RemappedFile = remapDIPath(FileName); 450 std::string CurDir = remapDIPath(getCurrentDirname()); 451 SmallString<128> DirBuf; 452 SmallString<128> FileBuf; 453 if (llvm::sys::path::is_absolute(RemappedFile)) { 454 // Strip the common prefix (if it is more than just "/" or "C:\") from 455 // current directory and FileName for a more space-efficient encoding. 456 auto FileIt = llvm::sys::path::begin(RemappedFile); 457 auto FileE = llvm::sys::path::end(RemappedFile); 458 auto CurDirIt = llvm::sys::path::begin(CurDir); 459 auto CurDirE = llvm::sys::path::end(CurDir); 460 for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt) 461 llvm::sys::path::append(DirBuf, *CurDirIt); 462 if (llvm::sys::path::root_path(DirBuf) == DirBuf) { 463 // Don't strip the common prefix if it is only the root ("/" or "C:\") 464 // since that would make LLVM diagnostic locations confusing. 465 Dir = {}; 466 File = RemappedFile; 467 } else { 468 for (; FileIt != FileE; ++FileIt) 469 llvm::sys::path::append(FileBuf, *FileIt); 470 Dir = DirBuf; 471 File = FileBuf; 472 } 473 } else { 474 if (!llvm::sys::path::is_absolute(FileName)) 475 Dir = CurDir; 476 File = RemappedFile; 477 } 478 llvm::DIFile *F = DBuilder.createFile(File, Dir, CSInfo, Source); 479 DIFileCache[FileName.data()].reset(F); 480 return F; 481 } 482 483 std::string CGDebugInfo::remapDIPath(StringRef Path) const { 484 SmallString<256> P = Path; 485 for (auto &[From, To] : llvm::reverse(CGM.getCodeGenOpts().DebugPrefixMap)) 486 if (llvm::sys::path::replace_path_prefix(P, From, To)) 487 break; 488 return P.str().str(); 489 } 490 491 unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) { 492 if (Loc.isInvalid()) 493 return 0; 494 SourceManager &SM = CGM.getContext().getSourceManager(); 495 return SM.getPresumedLoc(Loc).getLine(); 496 } 497 498 unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) { 499 // We may not want column information at all. 500 if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo) 501 return 0; 502 503 // If the location is invalid then use the current column. 504 if (Loc.isInvalid() && CurLoc.isInvalid()) 505 return 0; 506 SourceManager &SM = CGM.getContext().getSourceManager(); 507 PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 508 return PLoc.isValid() ? PLoc.getColumn() : 0; 509 } 510 511 StringRef CGDebugInfo::getCurrentDirname() { 512 if (!CGM.getCodeGenOpts().DebugCompilationDir.empty()) 513 return CGM.getCodeGenOpts().DebugCompilationDir; 514 515 if (!CWDName.empty()) 516 return CWDName; 517 llvm::ErrorOr<std::string> CWD = 518 CGM.getFileSystem()->getCurrentWorkingDirectory(); 519 if (!CWD) 520 return StringRef(); 521 return CWDName = internString(*CWD); 522 } 523 524 void CGDebugInfo::CreateCompileUnit() { 525 SmallString<64> Checksum; 526 std::optional<llvm::DIFile::ChecksumKind> CSKind; 527 std::optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo; 528 529 // Should we be asking the SourceManager for the main file name, instead of 530 // accepting it as an argument? This just causes the main file name to 531 // mismatch with source locations and create extra lexical scopes or 532 // mismatched debug info (a CU with a DW_AT_file of "-", because that's what 533 // the driver passed, but functions/other things have DW_AT_file of "<stdin>" 534 // because that's what the SourceManager says) 535 536 // Get absolute path name. 537 SourceManager &SM = CGM.getContext().getSourceManager(); 538 auto &CGO = CGM.getCodeGenOpts(); 539 const LangOptions &LO = CGM.getLangOpts(); 540 std::string MainFileName = CGO.MainFileName; 541 if (MainFileName.empty()) 542 MainFileName = "<stdin>"; 543 544 // The main file name provided via the "-main-file-name" option contains just 545 // the file name itself with no path information. This file name may have had 546 // a relative path, so we look into the actual file entry for the main 547 // file to determine the real absolute path for the file. 548 std::string MainFileDir; 549 if (OptionalFileEntryRef MainFile = 550 SM.getFileEntryRefForID(SM.getMainFileID())) { 551 MainFileDir = std::string(MainFile->getDir().getName()); 552 if (!llvm::sys::path::is_absolute(MainFileName)) { 553 llvm::SmallString<1024> MainFileDirSS(MainFileDir); 554 llvm::sys::path::Style Style = 555 LO.UseTargetPathSeparator 556 ? (CGM.getTarget().getTriple().isOSWindows() 557 ? llvm::sys::path::Style::windows_backslash 558 : llvm::sys::path::Style::posix) 559 : llvm::sys::path::Style::native; 560 llvm::sys::path::append(MainFileDirSS, Style, MainFileName); 561 MainFileName = std::string( 562 llvm::sys::path::remove_leading_dotslash(MainFileDirSS, Style)); 563 } 564 // If the main file name provided is identical to the input file name, and 565 // if the input file is a preprocessed source, use the module name for 566 // debug info. The module name comes from the name specified in the first 567 // linemarker if the input is a preprocessed source. In this case we don't 568 // know the content to compute a checksum. 569 if (MainFile->getName() == MainFileName && 570 FrontendOptions::getInputKindForExtension( 571 MainFile->getName().rsplit('.').second) 572 .isPreprocessed()) { 573 MainFileName = CGM.getModule().getName().str(); 574 } else { 575 CSKind = computeChecksum(SM.getMainFileID(), Checksum); 576 } 577 } 578 579 llvm::dwarf::SourceLanguage LangTag; 580 if (LO.CPlusPlus) { 581 if (LO.ObjC) 582 LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; 583 else if (CGO.DebugStrictDwarf && CGO.DwarfVersion < 5) 584 LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 585 else if (LO.CPlusPlus14) 586 LangTag = llvm::dwarf::DW_LANG_C_plus_plus_14; 587 else if (LO.CPlusPlus11) 588 LangTag = llvm::dwarf::DW_LANG_C_plus_plus_11; 589 else 590 LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 591 } else if (LO.ObjC) { 592 LangTag = llvm::dwarf::DW_LANG_ObjC; 593 } else if (LO.OpenCL && (!CGM.getCodeGenOpts().DebugStrictDwarf || 594 CGM.getCodeGenOpts().DwarfVersion >= 5)) { 595 LangTag = llvm::dwarf::DW_LANG_OpenCL; 596 } else if (LO.RenderScript) { 597 LangTag = llvm::dwarf::DW_LANG_GOOGLE_RenderScript; 598 } else if (LO.C11 && !(CGO.DebugStrictDwarf && CGO.DwarfVersion < 5)) { 599 LangTag = llvm::dwarf::DW_LANG_C11; 600 } else if (LO.C99) { 601 LangTag = llvm::dwarf::DW_LANG_C99; 602 } else { 603 LangTag = llvm::dwarf::DW_LANG_C89; 604 } 605 606 std::string Producer = getClangFullVersion(); 607 608 // Figure out which version of the ObjC runtime we have. 609 unsigned RuntimeVers = 0; 610 if (LO.ObjC) 611 RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1; 612 613 llvm::DICompileUnit::DebugEmissionKind EmissionKind; 614 switch (DebugKind) { 615 case llvm::codegenoptions::NoDebugInfo: 616 case llvm::codegenoptions::LocTrackingOnly: 617 EmissionKind = llvm::DICompileUnit::NoDebug; 618 break; 619 case llvm::codegenoptions::DebugLineTablesOnly: 620 EmissionKind = llvm::DICompileUnit::LineTablesOnly; 621 break; 622 case llvm::codegenoptions::DebugDirectivesOnly: 623 EmissionKind = llvm::DICompileUnit::DebugDirectivesOnly; 624 break; 625 case llvm::codegenoptions::DebugInfoConstructor: 626 case llvm::codegenoptions::LimitedDebugInfo: 627 case llvm::codegenoptions::FullDebugInfo: 628 case llvm::codegenoptions::UnusedTypeInfo: 629 EmissionKind = llvm::DICompileUnit::FullDebug; 630 break; 631 } 632 633 uint64_t DwoId = 0; 634 auto &CGOpts = CGM.getCodeGenOpts(); 635 // The DIFile used by the CU is distinct from the main source 636 // file. Its directory part specifies what becomes the 637 // DW_AT_comp_dir (the compilation directory), even if the source 638 // file was specified with an absolute path. 639 if (CSKind) 640 CSInfo.emplace(*CSKind, Checksum); 641 llvm::DIFile *CUFile = DBuilder.createFile( 642 remapDIPath(MainFileName), remapDIPath(getCurrentDirname()), CSInfo, 643 getSource(SM, SM.getMainFileID())); 644 645 StringRef Sysroot, SDK; 646 if (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB) { 647 Sysroot = CGM.getHeaderSearchOpts().Sysroot; 648 auto B = llvm::sys::path::rbegin(Sysroot); 649 auto E = llvm::sys::path::rend(Sysroot); 650 auto It = 651 std::find_if(B, E, [](auto SDK) { return SDK.ends_with(".sdk"); }); 652 if (It != E) 653 SDK = *It; 654 } 655 656 llvm::DICompileUnit::DebugNameTableKind NameTableKind = 657 static_cast<llvm::DICompileUnit::DebugNameTableKind>( 658 CGOpts.DebugNameTable); 659 if (CGM.getTarget().getTriple().isNVPTX()) 660 NameTableKind = llvm::DICompileUnit::DebugNameTableKind::None; 661 else if (CGM.getTarget().getTriple().getVendor() == llvm::Triple::Apple) 662 NameTableKind = llvm::DICompileUnit::DebugNameTableKind::Apple; 663 664 // Create new compile unit. 665 TheCU = DBuilder.createCompileUnit( 666 LangTag, CUFile, CGOpts.EmitVersionIdentMetadata ? Producer : "", 667 LO.Optimize || CGOpts.PrepareForLTO || CGOpts.PrepareForThinLTO, 668 CGOpts.DwarfDebugFlags, RuntimeVers, CGOpts.SplitDwarfFile, EmissionKind, 669 DwoId, CGOpts.SplitDwarfInlining, CGOpts.DebugInfoForProfiling, 670 NameTableKind, CGOpts.DebugRangesBaseAddress, remapDIPath(Sysroot), SDK); 671 } 672 673 llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) { 674 llvm::dwarf::TypeKind Encoding; 675 StringRef BTName; 676 switch (BT->getKind()) { 677 #define BUILTIN_TYPE(Id, SingletonId) 678 #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 679 #include "clang/AST/BuiltinTypes.def" 680 case BuiltinType::Dependent: 681 llvm_unreachable("Unexpected builtin type"); 682 case BuiltinType::NullPtr: 683 return DBuilder.createNullPtrType(); 684 case BuiltinType::Void: 685 return nullptr; 686 case BuiltinType::ObjCClass: 687 if (!ClassTy) 688 ClassTy = 689 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 690 "objc_class", TheCU, TheCU->getFile(), 0); 691 return ClassTy; 692 case BuiltinType::ObjCId: { 693 // typedef struct objc_class *Class; 694 // typedef struct objc_object { 695 // Class isa; 696 // } *id; 697 698 if (ObjTy) 699 return ObjTy; 700 701 if (!ClassTy) 702 ClassTy = 703 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 704 "objc_class", TheCU, TheCU->getFile(), 0); 705 706 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 707 708 auto *ISATy = DBuilder.createPointerType(ClassTy, Size); 709 710 ObjTy = DBuilder.createStructType(TheCU, "objc_object", TheCU->getFile(), 0, 711 0, 0, llvm::DINode::FlagZero, nullptr, 712 llvm::DINodeArray()); 713 714 DBuilder.replaceArrays( 715 ObjTy, DBuilder.getOrCreateArray(&*DBuilder.createMemberType( 716 ObjTy, "isa", TheCU->getFile(), 0, Size, 0, 0, 717 llvm::DINode::FlagZero, ISATy))); 718 return ObjTy; 719 } 720 case BuiltinType::ObjCSel: { 721 if (!SelTy) 722 SelTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 723 "objc_selector", TheCU, 724 TheCU->getFile(), 0); 725 return SelTy; 726 } 727 728 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 729 case BuiltinType::Id: \ 730 return getOrCreateStructPtrType("opencl_" #ImgType "_" #Suffix "_t", \ 731 SingletonId); 732 #include "clang/Basic/OpenCLImageTypes.def" 733 case BuiltinType::OCLSampler: 734 return getOrCreateStructPtrType("opencl_sampler_t", OCLSamplerDITy); 735 case BuiltinType::OCLEvent: 736 return getOrCreateStructPtrType("opencl_event_t", OCLEventDITy); 737 case BuiltinType::OCLClkEvent: 738 return getOrCreateStructPtrType("opencl_clk_event_t", OCLClkEventDITy); 739 case BuiltinType::OCLQueue: 740 return getOrCreateStructPtrType("opencl_queue_t", OCLQueueDITy); 741 case BuiltinType::OCLReserveID: 742 return getOrCreateStructPtrType("opencl_reserve_id_t", OCLReserveIDDITy); 743 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 744 case BuiltinType::Id: \ 745 return getOrCreateStructPtrType("opencl_" #ExtType, Id##Ty); 746 #include "clang/Basic/OpenCLExtensionTypes.def" 747 748 #define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 749 #include "clang/Basic/AArch64SVEACLETypes.def" 750 { 751 ASTContext::BuiltinVectorTypeInfo Info = 752 // For svcount_t, only the lower 2 bytes are relevant. 753 BT->getKind() == BuiltinType::SveCount 754 ? ASTContext::BuiltinVectorTypeInfo( 755 CGM.getContext().BoolTy, llvm::ElementCount::getFixed(16), 756 1) 757 : CGM.getContext().getBuiltinVectorTypeInfo(BT); 758 759 // A single vector of bytes may not suffice as the representation of 760 // svcount_t tuples because of the gap between the active 16bits of 761 // successive tuple members. Currently no such tuples are defined for 762 // svcount_t, so assert that NumVectors is 1. 763 assert((BT->getKind() != BuiltinType::SveCount || Info.NumVectors == 1) && 764 "Unsupported number of vectors for svcount_t"); 765 766 // Debuggers can't extract 1bit from a vector, so will display a 767 // bitpattern for predicates instead. 768 unsigned NumElems = Info.EC.getKnownMinValue() * Info.NumVectors; 769 if (Info.ElementType == CGM.getContext().BoolTy) { 770 NumElems /= 8; 771 Info.ElementType = CGM.getContext().UnsignedCharTy; 772 } 773 774 llvm::Metadata *LowerBound, *UpperBound; 775 LowerBound = llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned( 776 llvm::Type::getInt64Ty(CGM.getLLVMContext()), 0)); 777 if (Info.EC.isScalable()) { 778 unsigned NumElemsPerVG = NumElems / 2; 779 SmallVector<uint64_t, 9> Expr( 780 {llvm::dwarf::DW_OP_constu, NumElemsPerVG, llvm::dwarf::DW_OP_bregx, 781 /* AArch64::VG */ 46, 0, llvm::dwarf::DW_OP_mul, 782 llvm::dwarf::DW_OP_constu, 1, llvm::dwarf::DW_OP_minus}); 783 UpperBound = DBuilder.createExpression(Expr); 784 } else 785 UpperBound = llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned( 786 llvm::Type::getInt64Ty(CGM.getLLVMContext()), NumElems - 1)); 787 788 llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange( 789 /*count*/ nullptr, LowerBound, UpperBound, /*stride*/ nullptr); 790 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 791 llvm::DIType *ElemTy = 792 getOrCreateType(Info.ElementType, TheCU->getFile()); 793 auto Align = getTypeAlignIfRequired(BT, CGM.getContext()); 794 return DBuilder.createVectorType(/*Size*/ 0, Align, ElemTy, 795 SubscriptArray); 796 } 797 // It doesn't make sense to generate debug info for PowerPC MMA vector types. 798 // So we return a safe type here to avoid generating an error. 799 #define PPC_VECTOR_TYPE(Name, Id, size) \ 800 case BuiltinType::Id: 801 #include "clang/Basic/PPCTypes.def" 802 return CreateType(cast<const BuiltinType>(CGM.getContext().IntTy)); 803 804 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 805 #include "clang/Basic/RISCVVTypes.def" 806 { 807 ASTContext::BuiltinVectorTypeInfo Info = 808 CGM.getContext().getBuiltinVectorTypeInfo(BT); 809 810 unsigned ElementCount = Info.EC.getKnownMinValue(); 811 unsigned SEW = CGM.getContext().getTypeSize(Info.ElementType); 812 813 bool Fractional = false; 814 unsigned LMUL; 815 unsigned FixedSize = ElementCount * SEW; 816 if (Info.ElementType == CGM.getContext().BoolTy) { 817 // Mask type only occupies one vector register. 818 LMUL = 1; 819 } else if (FixedSize < 64) { 820 // In RVV scalable vector types, we encode 64 bits in the fixed part. 821 Fractional = true; 822 LMUL = 64 / FixedSize; 823 } else { 824 LMUL = FixedSize / 64; 825 } 826 827 // Element count = (VLENB / SEW) x LMUL 828 SmallVector<uint64_t, 12> Expr( 829 // The DW_OP_bregx operation has two operands: a register which is 830 // specified by an unsigned LEB128 number, followed by a signed LEB128 831 // offset. 832 {llvm::dwarf::DW_OP_bregx, // Read the contents of a register. 833 4096 + 0xC22, // RISC-V VLENB CSR register. 834 0, // Offset for DW_OP_bregx. It is dummy here. 835 llvm::dwarf::DW_OP_constu, 836 SEW / 8, // SEW is in bits. 837 llvm::dwarf::DW_OP_div, llvm::dwarf::DW_OP_constu, LMUL}); 838 if (Fractional) 839 Expr.push_back(llvm::dwarf::DW_OP_div); 840 else 841 Expr.push_back(llvm::dwarf::DW_OP_mul); 842 // Element max index = count - 1 843 Expr.append({llvm::dwarf::DW_OP_constu, 1, llvm::dwarf::DW_OP_minus}); 844 845 auto *LowerBound = 846 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned( 847 llvm::Type::getInt64Ty(CGM.getLLVMContext()), 0)); 848 auto *UpperBound = DBuilder.createExpression(Expr); 849 llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange( 850 /*count*/ nullptr, LowerBound, UpperBound, /*stride*/ nullptr); 851 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 852 llvm::DIType *ElemTy = 853 getOrCreateType(Info.ElementType, TheCU->getFile()); 854 855 auto Align = getTypeAlignIfRequired(BT, CGM.getContext()); 856 return DBuilder.createVectorType(/*Size=*/0, Align, ElemTy, 857 SubscriptArray); 858 } 859 860 #define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \ 861 case BuiltinType::Id: { \ 862 if (!SingletonId) \ 863 SingletonId = \ 864 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, \ 865 MangledName, TheCU, TheCU->getFile(), 0); \ 866 return SingletonId; \ 867 } 868 #include "clang/Basic/WebAssemblyReferenceTypes.def" 869 #define AMDGPU_OPAQUE_PTR_TYPE(Name, MangledName, AS, Width, Align, Id, \ 870 SingletonId) \ 871 case BuiltinType::Id: { \ 872 if (!SingletonId) \ 873 SingletonId = \ 874 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, \ 875 MangledName, TheCU, TheCU->getFile(), 0); \ 876 return SingletonId; \ 877 } 878 #include "clang/Basic/AMDGPUTypes.def" 879 case BuiltinType::UChar: 880 case BuiltinType::Char_U: 881 Encoding = llvm::dwarf::DW_ATE_unsigned_char; 882 break; 883 case BuiltinType::Char_S: 884 case BuiltinType::SChar: 885 Encoding = llvm::dwarf::DW_ATE_signed_char; 886 break; 887 case BuiltinType::Char8: 888 case BuiltinType::Char16: 889 case BuiltinType::Char32: 890 Encoding = llvm::dwarf::DW_ATE_UTF; 891 break; 892 case BuiltinType::UShort: 893 case BuiltinType::UInt: 894 case BuiltinType::UInt128: 895 case BuiltinType::ULong: 896 case BuiltinType::WChar_U: 897 case BuiltinType::ULongLong: 898 Encoding = llvm::dwarf::DW_ATE_unsigned; 899 break; 900 case BuiltinType::Short: 901 case BuiltinType::Int: 902 case BuiltinType::Int128: 903 case BuiltinType::Long: 904 case BuiltinType::WChar_S: 905 case BuiltinType::LongLong: 906 Encoding = llvm::dwarf::DW_ATE_signed; 907 break; 908 case BuiltinType::Bool: 909 Encoding = llvm::dwarf::DW_ATE_boolean; 910 break; 911 case BuiltinType::Half: 912 case BuiltinType::Float: 913 case BuiltinType::LongDouble: 914 case BuiltinType::Float16: 915 case BuiltinType::BFloat16: 916 case BuiltinType::Float128: 917 case BuiltinType::Double: 918 case BuiltinType::Ibm128: 919 // FIXME: For targets where long double, __ibm128 and __float128 have the 920 // same size, they are currently indistinguishable in the debugger without 921 // some special treatment. However, there is currently no consensus on 922 // encoding and this should be updated once a DWARF encoding exists for 923 // distinct floating point types of the same size. 924 Encoding = llvm::dwarf::DW_ATE_float; 925 break; 926 case BuiltinType::ShortAccum: 927 case BuiltinType::Accum: 928 case BuiltinType::LongAccum: 929 case BuiltinType::ShortFract: 930 case BuiltinType::Fract: 931 case BuiltinType::LongFract: 932 case BuiltinType::SatShortFract: 933 case BuiltinType::SatFract: 934 case BuiltinType::SatLongFract: 935 case BuiltinType::SatShortAccum: 936 case BuiltinType::SatAccum: 937 case BuiltinType::SatLongAccum: 938 Encoding = llvm::dwarf::DW_ATE_signed_fixed; 939 break; 940 case BuiltinType::UShortAccum: 941 case BuiltinType::UAccum: 942 case BuiltinType::ULongAccum: 943 case BuiltinType::UShortFract: 944 case BuiltinType::UFract: 945 case BuiltinType::ULongFract: 946 case BuiltinType::SatUShortAccum: 947 case BuiltinType::SatUAccum: 948 case BuiltinType::SatULongAccum: 949 case BuiltinType::SatUShortFract: 950 case BuiltinType::SatUFract: 951 case BuiltinType::SatULongFract: 952 Encoding = llvm::dwarf::DW_ATE_unsigned_fixed; 953 break; 954 } 955 956 BTName = BT->getName(CGM.getLangOpts()); 957 // Bit size and offset of the type. 958 uint64_t Size = CGM.getContext().getTypeSize(BT); 959 return DBuilder.createBasicType(BTName, Size, Encoding); 960 } 961 962 llvm::DIType *CGDebugInfo::CreateType(const BitIntType *Ty) { 963 964 StringRef Name = Ty->isUnsigned() ? "unsigned _BitInt" : "_BitInt"; 965 llvm::dwarf::TypeKind Encoding = Ty->isUnsigned() 966 ? llvm::dwarf::DW_ATE_unsigned 967 : llvm::dwarf::DW_ATE_signed; 968 969 return DBuilder.createBasicType(Name, CGM.getContext().getTypeSize(Ty), 970 Encoding); 971 } 972 973 llvm::DIType *CGDebugInfo::CreateType(const ComplexType *Ty) { 974 // Bit size and offset of the type. 975 llvm::dwarf::TypeKind Encoding = llvm::dwarf::DW_ATE_complex_float; 976 if (Ty->isComplexIntegerType()) 977 Encoding = llvm::dwarf::DW_ATE_lo_user; 978 979 uint64_t Size = CGM.getContext().getTypeSize(Ty); 980 return DBuilder.createBasicType("complex", Size, Encoding); 981 } 982 983 static void stripUnusedQualifiers(Qualifiers &Q) { 984 // Ignore these qualifiers for now. 985 Q.removeObjCGCAttr(); 986 Q.removeAddressSpace(); 987 Q.removeObjCLifetime(); 988 Q.removeUnaligned(); 989 } 990 991 static llvm::dwarf::Tag getNextQualifier(Qualifiers &Q) { 992 if (Q.hasConst()) { 993 Q.removeConst(); 994 return llvm::dwarf::DW_TAG_const_type; 995 } 996 if (Q.hasVolatile()) { 997 Q.removeVolatile(); 998 return llvm::dwarf::DW_TAG_volatile_type; 999 } 1000 if (Q.hasRestrict()) { 1001 Q.removeRestrict(); 1002 return llvm::dwarf::DW_TAG_restrict_type; 1003 } 1004 return (llvm::dwarf::Tag)0; 1005 } 1006 1007 llvm::DIType *CGDebugInfo::CreateQualifiedType(QualType Ty, 1008 llvm::DIFile *Unit) { 1009 QualifierCollector Qc; 1010 const Type *T = Qc.strip(Ty); 1011 1012 stripUnusedQualifiers(Qc); 1013 1014 // We will create one Derived type for one qualifier and recurse to handle any 1015 // additional ones. 1016 llvm::dwarf::Tag Tag = getNextQualifier(Qc); 1017 if (!Tag) { 1018 assert(Qc.empty() && "Unknown type qualifier for debug info"); 1019 return getOrCreateType(QualType(T, 0), Unit); 1020 } 1021 1022 auto *FromTy = getOrCreateType(Qc.apply(CGM.getContext(), T), Unit); 1023 1024 // No need to fill in the Name, Line, Size, Alignment, Offset in case of 1025 // CVR derived types. 1026 return DBuilder.createQualifiedType(Tag, FromTy); 1027 } 1028 1029 llvm::DIType *CGDebugInfo::CreateQualifiedType(const FunctionProtoType *F, 1030 llvm::DIFile *Unit) { 1031 FunctionProtoType::ExtProtoInfo EPI = F->getExtProtoInfo(); 1032 Qualifiers &Q = EPI.TypeQuals; 1033 stripUnusedQualifiers(Q); 1034 1035 // We will create one Derived type for one qualifier and recurse to handle any 1036 // additional ones. 1037 llvm::dwarf::Tag Tag = getNextQualifier(Q); 1038 if (!Tag) { 1039 assert(Q.empty() && "Unknown type qualifier for debug info"); 1040 return nullptr; 1041 } 1042 1043 auto *FromTy = 1044 getOrCreateType(CGM.getContext().getFunctionType(F->getReturnType(), 1045 F->getParamTypes(), EPI), 1046 Unit); 1047 1048 // No need to fill in the Name, Line, Size, Alignment, Offset in case of 1049 // CVR derived types. 1050 return DBuilder.createQualifiedType(Tag, FromTy); 1051 } 1052 1053 llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 1054 llvm::DIFile *Unit) { 1055 1056 // The frontend treats 'id' as a typedef to an ObjCObjectType, 1057 // whereas 'id<protocol>' is treated as an ObjCPointerType. For the 1058 // debug info, we want to emit 'id' in both cases. 1059 if (Ty->isObjCQualifiedIdType()) 1060 return getOrCreateType(CGM.getContext().getObjCIdType(), Unit); 1061 1062 return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 1063 Ty->getPointeeType(), Unit); 1064 } 1065 1066 llvm::DIType *CGDebugInfo::CreateType(const PointerType *Ty, 1067 llvm::DIFile *Unit) { 1068 return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 1069 Ty->getPointeeType(), Unit); 1070 } 1071 1072 /// \return whether a C++ mangling exists for the type defined by TD. 1073 static bool hasCXXMangling(const TagDecl *TD, llvm::DICompileUnit *TheCU) { 1074 switch (TheCU->getSourceLanguage()) { 1075 case llvm::dwarf::DW_LANG_C_plus_plus: 1076 case llvm::dwarf::DW_LANG_C_plus_plus_11: 1077 case llvm::dwarf::DW_LANG_C_plus_plus_14: 1078 return true; 1079 case llvm::dwarf::DW_LANG_ObjC_plus_plus: 1080 return isa<CXXRecordDecl>(TD) || isa<EnumDecl>(TD); 1081 default: 1082 return false; 1083 } 1084 } 1085 1086 // Determines if the debug info for this tag declaration needs a type 1087 // identifier. The purpose of the unique identifier is to deduplicate type 1088 // information for identical types across TUs. Because of the C++ one definition 1089 // rule (ODR), it is valid to assume that the type is defined the same way in 1090 // every TU and its debug info is equivalent. 1091 // 1092 // C does not have the ODR, and it is common for codebases to contain multiple 1093 // different definitions of a struct with the same name in different TUs. 1094 // Therefore, if the type doesn't have a C++ mangling, don't give it an 1095 // identifer. Type information in C is smaller and simpler than C++ type 1096 // information, so the increase in debug info size is negligible. 1097 // 1098 // If the type is not externally visible, it should be unique to the current TU, 1099 // and should not need an identifier to participate in type deduplication. 1100 // However, when emitting CodeView, the format internally uses these 1101 // unique type name identifers for references between debug info. For example, 1102 // the method of a class in an anonymous namespace uses the identifer to refer 1103 // to its parent class. The Microsoft C++ ABI attempts to provide unique names 1104 // for such types, so when emitting CodeView, always use identifiers for C++ 1105 // types. This may create problems when attempting to emit CodeView when the MS 1106 // C++ ABI is not in use. 1107 static bool needsTypeIdentifier(const TagDecl *TD, CodeGenModule &CGM, 1108 llvm::DICompileUnit *TheCU) { 1109 // We only add a type identifier for types with C++ name mangling. 1110 if (!hasCXXMangling(TD, TheCU)) 1111 return false; 1112 1113 // Externally visible types with C++ mangling need a type identifier. 1114 if (TD->isExternallyVisible()) 1115 return true; 1116 1117 // CodeView types with C++ mangling need a type identifier. 1118 if (CGM.getCodeGenOpts().EmitCodeView) 1119 return true; 1120 1121 return false; 1122 } 1123 1124 // Returns a unique type identifier string if one exists, or an empty string. 1125 static SmallString<256> getTypeIdentifier(const TagType *Ty, CodeGenModule &CGM, 1126 llvm::DICompileUnit *TheCU) { 1127 SmallString<256> Identifier; 1128 const TagDecl *TD = Ty->getDecl(); 1129 1130 if (!needsTypeIdentifier(TD, CGM, TheCU)) 1131 return Identifier; 1132 if (const auto *RD = dyn_cast<CXXRecordDecl>(TD)) 1133 if (RD->getDefinition()) 1134 if (RD->isDynamicClass() && 1135 CGM.getVTableLinkage(RD) == llvm::GlobalValue::ExternalLinkage) 1136 return Identifier; 1137 1138 // TODO: This is using the RTTI name. Is there a better way to get 1139 // a unique string for a type? 1140 llvm::raw_svector_ostream Out(Identifier); 1141 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(QualType(Ty, 0), Out); 1142 return Identifier; 1143 } 1144 1145 /// \return the appropriate DWARF tag for a composite type. 1146 static llvm::dwarf::Tag getTagForRecord(const RecordDecl *RD) { 1147 llvm::dwarf::Tag Tag; 1148 if (RD->isStruct() || RD->isInterface()) 1149 Tag = llvm::dwarf::DW_TAG_structure_type; 1150 else if (RD->isUnion()) 1151 Tag = llvm::dwarf::DW_TAG_union_type; 1152 else { 1153 // FIXME: This could be a struct type giving a default visibility different 1154 // than C++ class type, but needs llvm metadata changes first. 1155 assert(RD->isClass()); 1156 Tag = llvm::dwarf::DW_TAG_class_type; 1157 } 1158 return Tag; 1159 } 1160 1161 llvm::DICompositeType * 1162 CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty, 1163 llvm::DIScope *Ctx) { 1164 const RecordDecl *RD = Ty->getDecl(); 1165 if (llvm::DIType *T = getTypeOrNull(CGM.getContext().getRecordType(RD))) 1166 return cast<llvm::DICompositeType>(T); 1167 llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation()); 1168 const unsigned Line = 1169 getLineNumber(RD->getLocation().isValid() ? RD->getLocation() : CurLoc); 1170 StringRef RDName = getClassName(RD); 1171 1172 uint64_t Size = 0; 1173 uint32_t Align = 0; 1174 1175 const RecordDecl *D = RD->getDefinition(); 1176 if (D && D->isCompleteDefinition()) 1177 Size = CGM.getContext().getTypeSize(Ty); 1178 1179 llvm::DINode::DIFlags Flags = llvm::DINode::FlagFwdDecl; 1180 1181 // Add flag to nontrivial forward declarations. To be consistent with MSVC, 1182 // add the flag if a record has no definition because we don't know whether 1183 // it will be trivial or not. 1184 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) 1185 if (!CXXRD->hasDefinition() || 1186 (CXXRD->hasDefinition() && !CXXRD->isTrivial())) 1187 Flags |= llvm::DINode::FlagNonTrivial; 1188 1189 // Create the type. 1190 SmallString<256> Identifier; 1191 // Don't include a linkage name in line tables only. 1192 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) 1193 Identifier = getTypeIdentifier(Ty, CGM, TheCU); 1194 llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType( 1195 getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align, Flags, 1196 Identifier); 1197 if (CGM.getCodeGenOpts().DebugFwdTemplateParams) 1198 if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD)) 1199 DBuilder.replaceArrays(RetTy, llvm::DINodeArray(), 1200 CollectCXXTemplateParams(TSpecial, DefUnit)); 1201 ReplaceMap.emplace_back( 1202 std::piecewise_construct, std::make_tuple(Ty), 1203 std::make_tuple(static_cast<llvm::Metadata *>(RetTy))); 1204 return RetTy; 1205 } 1206 1207 llvm::DIType *CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag, 1208 const Type *Ty, 1209 QualType PointeeTy, 1210 llvm::DIFile *Unit) { 1211 // Bit size, align and offset of the type. 1212 // Size is always the size of a pointer. 1213 uint64_t Size = CGM.getContext().getTypeSize(Ty); 1214 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext()); 1215 std::optional<unsigned> DWARFAddressSpace = 1216 CGM.getTarget().getDWARFAddressSpace( 1217 CGM.getTypes().getTargetAddressSpace(PointeeTy)); 1218 1219 SmallVector<llvm::Metadata *, 4> Annots; 1220 auto *BTFAttrTy = dyn_cast<BTFTagAttributedType>(PointeeTy); 1221 while (BTFAttrTy) { 1222 StringRef Tag = BTFAttrTy->getAttr()->getBTFTypeTag(); 1223 if (!Tag.empty()) { 1224 llvm::Metadata *Ops[2] = { 1225 llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_type_tag")), 1226 llvm::MDString::get(CGM.getLLVMContext(), Tag)}; 1227 Annots.insert(Annots.begin(), 1228 llvm::MDNode::get(CGM.getLLVMContext(), Ops)); 1229 } 1230 BTFAttrTy = dyn_cast<BTFTagAttributedType>(BTFAttrTy->getWrappedType()); 1231 } 1232 1233 llvm::DINodeArray Annotations = nullptr; 1234 if (Annots.size() > 0) 1235 Annotations = DBuilder.getOrCreateArray(Annots); 1236 1237 if (Tag == llvm::dwarf::DW_TAG_reference_type || 1238 Tag == llvm::dwarf::DW_TAG_rvalue_reference_type) 1239 return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit), 1240 Size, Align, DWARFAddressSpace); 1241 else 1242 return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size, 1243 Align, DWARFAddressSpace, StringRef(), 1244 Annotations); 1245 } 1246 1247 llvm::DIType *CGDebugInfo::getOrCreateStructPtrType(StringRef Name, 1248 llvm::DIType *&Cache) { 1249 if (Cache) 1250 return Cache; 1251 Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name, 1252 TheCU, TheCU->getFile(), 0); 1253 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 1254 Cache = DBuilder.createPointerType(Cache, Size); 1255 return Cache; 1256 } 1257 1258 uint64_t CGDebugInfo::collectDefaultElementTypesForBlockPointer( 1259 const BlockPointerType *Ty, llvm::DIFile *Unit, llvm::DIDerivedType *DescTy, 1260 unsigned LineNo, SmallVectorImpl<llvm::Metadata *> &EltTys) { 1261 QualType FType; 1262 1263 // Advanced by calls to CreateMemberType in increments of FType, then 1264 // returned as the overall size of the default elements. 1265 uint64_t FieldOffset = 0; 1266 1267 // Blocks in OpenCL have unique constraints which make the standard fields 1268 // redundant while requiring size and align fields for enqueue_kernel. See 1269 // initializeForBlockHeader in CGBlocks.cpp 1270 if (CGM.getLangOpts().OpenCL) { 1271 FType = CGM.getContext().IntTy; 1272 EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 1273 EltTys.push_back(CreateMemberType(Unit, FType, "__align", &FieldOffset)); 1274 } else { 1275 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 1276 EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 1277 FType = CGM.getContext().IntTy; 1278 EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 1279 EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 1280 FType = CGM.getContext().getPointerType(Ty->getPointeeType()); 1281 EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 1282 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 1283 uint64_t FieldSize = CGM.getContext().getTypeSize(Ty); 1284 uint32_t FieldAlign = CGM.getContext().getTypeAlign(Ty); 1285 EltTys.push_back(DBuilder.createMemberType( 1286 Unit, "__descriptor", nullptr, LineNo, FieldSize, FieldAlign, 1287 FieldOffset, llvm::DINode::FlagZero, DescTy)); 1288 FieldOffset += FieldSize; 1289 } 1290 1291 return FieldOffset; 1292 } 1293 1294 llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty, 1295 llvm::DIFile *Unit) { 1296 SmallVector<llvm::Metadata *, 8> EltTys; 1297 QualType FType; 1298 uint64_t FieldOffset; 1299 llvm::DINodeArray Elements; 1300 1301 FieldOffset = 0; 1302 FType = CGM.getContext().UnsignedLongTy; 1303 EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 1304 EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 1305 1306 Elements = DBuilder.getOrCreateArray(EltTys); 1307 EltTys.clear(); 1308 1309 llvm::DINode::DIFlags Flags = llvm::DINode::FlagAppleBlock; 1310 1311 auto *EltTy = 1312 DBuilder.createStructType(Unit, "__block_descriptor", nullptr, 0, 1313 FieldOffset, 0, Flags, nullptr, Elements); 1314 1315 // Bit size, align and offset of the type. 1316 uint64_t Size = CGM.getContext().getTypeSize(Ty); 1317 1318 auto *DescTy = DBuilder.createPointerType(EltTy, Size); 1319 1320 FieldOffset = collectDefaultElementTypesForBlockPointer(Ty, Unit, DescTy, 1321 0, EltTys); 1322 1323 Elements = DBuilder.getOrCreateArray(EltTys); 1324 1325 // The __block_literal_generic structs are marked with a special 1326 // DW_AT_APPLE_BLOCK attribute and are an implementation detail only 1327 // the debugger needs to know about. To allow type uniquing, emit 1328 // them without a name or a location. 1329 EltTy = DBuilder.createStructType(Unit, "", nullptr, 0, FieldOffset, 0, 1330 Flags, nullptr, Elements); 1331 1332 return DBuilder.createPointerType(EltTy, Size); 1333 } 1334 1335 static llvm::SmallVector<TemplateArgument> 1336 GetTemplateArgs(const TemplateDecl *TD, const TemplateSpecializationType *Ty) { 1337 assert(Ty->isTypeAlias()); 1338 // TemplateSpecializationType doesn't know if its template args are 1339 // being substituted into a parameter pack. We can find out if that's 1340 // the case now by inspecting the TypeAliasTemplateDecl template 1341 // parameters. Insert Ty's template args into SpecArgs, bundling args 1342 // passed to a parameter pack into a TemplateArgument::Pack. It also 1343 // doesn't know the value of any defaulted args, so collect those now 1344 // too. 1345 SmallVector<TemplateArgument> SpecArgs; 1346 ArrayRef SubstArgs = Ty->template_arguments(); 1347 for (const NamedDecl *Param : TD->getTemplateParameters()->asArray()) { 1348 // If Param is a parameter pack, pack the remaining arguments. 1349 if (Param->isParameterPack()) { 1350 SpecArgs.push_back(TemplateArgument(SubstArgs)); 1351 break; 1352 } 1353 1354 // Skip defaulted args. 1355 // FIXME: Ideally, we wouldn't do this. We can read the default values 1356 // for each parameter. However, defaulted arguments which are dependent 1357 // values or dependent types can't (easily?) be resolved here. 1358 if (SubstArgs.empty()) { 1359 // If SubstArgs is now empty (we're taking from it each iteration) and 1360 // this template parameter isn't a pack, then that should mean we're 1361 // using default values for the remaining template parameters (after 1362 // which there may be an empty pack too which we will ignore). 1363 break; 1364 } 1365 1366 // Take the next argument. 1367 SpecArgs.push_back(SubstArgs.front()); 1368 SubstArgs = SubstArgs.drop_front(); 1369 } 1370 return SpecArgs; 1371 } 1372 1373 llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty, 1374 llvm::DIFile *Unit) { 1375 assert(Ty->isTypeAlias()); 1376 llvm::DIType *Src = getOrCreateType(Ty->getAliasedType(), Unit); 1377 1378 const TemplateDecl *TD = Ty->getTemplateName().getAsTemplateDecl(); 1379 if (isa<BuiltinTemplateDecl>(TD)) 1380 return Src; 1381 1382 const auto *AliasDecl = cast<TypeAliasTemplateDecl>(TD)->getTemplatedDecl(); 1383 if (AliasDecl->hasAttr<NoDebugAttr>()) 1384 return Src; 1385 1386 SmallString<128> NS; 1387 llvm::raw_svector_ostream OS(NS); 1388 1389 auto PP = getPrintingPolicy(); 1390 Ty->getTemplateName().print(OS, PP, TemplateName::Qualified::None); 1391 1392 SourceLocation Loc = AliasDecl->getLocation(); 1393 1394 if (CGM.getCodeGenOpts().DebugTemplateAlias && 1395 // FIXME: This is a workaround for the issue 1396 // https://github.com/llvm/llvm-project/issues/89774 1397 // The TemplateSpecializationType doesn't contain any instantiation 1398 // information; dependent template arguments can't be resolved. For now, 1399 // fall back to DW_TAG_typedefs for template aliases that are 1400 // instantiation dependent, e.g.: 1401 // ``` 1402 // template <int> 1403 // using A = int; 1404 // 1405 // template<int I> 1406 // struct S { 1407 // using AA = A<I>; // Instantiation dependent. 1408 // AA aa; 1409 // }; 1410 // 1411 // S<0> s; 1412 // ``` 1413 // S::AA's underlying type A<I> is dependent on I so will be emitted as a 1414 // DW_TAG_typedef. 1415 !Ty->isInstantiationDependentType()) { 1416 auto ArgVector = ::GetTemplateArgs(TD, Ty); 1417 TemplateArgs Args = {TD->getTemplateParameters(), ArgVector}; 1418 1419 // FIXME: Respect DebugTemplateNameKind::Mangled, e.g. by using GetName. 1420 // Note we can't use GetName without additional work: TypeAliasTemplateDecl 1421 // doesn't have instantiation information, so 1422 // TypeAliasTemplateDecl::getNameForDiagnostic wouldn't have access to the 1423 // template args. 1424 std::string Name; 1425 llvm::raw_string_ostream OS(Name); 1426 TD->getNameForDiagnostic(OS, PP, /*Qualified=*/false); 1427 if (CGM.getCodeGenOpts().getDebugSimpleTemplateNames() != 1428 llvm::codegenoptions::DebugTemplateNamesKind::Simple || 1429 !HasReconstitutableArgs(Args.Args)) 1430 printTemplateArgumentList(OS, Args.Args, PP); 1431 1432 llvm::DIDerivedType *AliasTy = DBuilder.createTemplateAlias( 1433 Src, Name, getOrCreateFile(Loc), getLineNumber(Loc), 1434 getDeclContextDescriptor(AliasDecl), CollectTemplateParams(Args, Unit)); 1435 return AliasTy; 1436 } 1437 1438 // Disable PrintCanonicalTypes here because we want 1439 // the DW_AT_name to benefit from the TypePrinter's ability 1440 // to skip defaulted template arguments. 1441 // 1442 // FIXME: Once -gsimple-template-names is enabled by default 1443 // and we attach template parameters to alias template DIEs 1444 // we don't need to worry about customizing the PrintingPolicy 1445 // here anymore. 1446 PP.PrintCanonicalTypes = false; 1447 printTemplateArgumentList(OS, Ty->template_arguments(), PP, 1448 TD->getTemplateParameters()); 1449 return DBuilder.createTypedef(Src, OS.str(), getOrCreateFile(Loc), 1450 getLineNumber(Loc), 1451 getDeclContextDescriptor(AliasDecl)); 1452 } 1453 1454 /// Convert an AccessSpecifier into the corresponding DINode flag. 1455 /// As an optimization, return 0 if the access specifier equals the 1456 /// default for the containing type. 1457 static llvm::DINode::DIFlags getAccessFlag(AccessSpecifier Access, 1458 const RecordDecl *RD) { 1459 AccessSpecifier Default = clang::AS_none; 1460 if (RD && RD->isClass()) 1461 Default = clang::AS_private; 1462 else if (RD && (RD->isStruct() || RD->isUnion())) 1463 Default = clang::AS_public; 1464 1465 if (Access == Default) 1466 return llvm::DINode::FlagZero; 1467 1468 switch (Access) { 1469 case clang::AS_private: 1470 return llvm::DINode::FlagPrivate; 1471 case clang::AS_protected: 1472 return llvm::DINode::FlagProtected; 1473 case clang::AS_public: 1474 return llvm::DINode::FlagPublic; 1475 case clang::AS_none: 1476 return llvm::DINode::FlagZero; 1477 } 1478 llvm_unreachable("unexpected access enumerator"); 1479 } 1480 1481 llvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty, 1482 llvm::DIFile *Unit) { 1483 llvm::DIType *Underlying = 1484 getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit); 1485 1486 if (Ty->getDecl()->hasAttr<NoDebugAttr>()) 1487 return Underlying; 1488 1489 // We don't set size information, but do specify where the typedef was 1490 // declared. 1491 SourceLocation Loc = Ty->getDecl()->getLocation(); 1492 1493 uint32_t Align = getDeclAlignIfRequired(Ty->getDecl(), CGM.getContext()); 1494 // Typedefs are derived from some other type. 1495 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(Ty->getDecl()); 1496 1497 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 1498 const DeclContext *DC = Ty->getDecl()->getDeclContext(); 1499 if (isa<RecordDecl>(DC)) 1500 Flags = getAccessFlag(Ty->getDecl()->getAccess(), cast<RecordDecl>(DC)); 1501 1502 return DBuilder.createTypedef(Underlying, Ty->getDecl()->getName(), 1503 getOrCreateFile(Loc), getLineNumber(Loc), 1504 getDeclContextDescriptor(Ty->getDecl()), Align, 1505 Flags, Annotations); 1506 } 1507 1508 static unsigned getDwarfCC(CallingConv CC) { 1509 switch (CC) { 1510 case CC_C: 1511 // Avoid emitting DW_AT_calling_convention if the C convention was used. 1512 return 0; 1513 1514 case CC_X86StdCall: 1515 return llvm::dwarf::DW_CC_BORLAND_stdcall; 1516 case CC_X86FastCall: 1517 return llvm::dwarf::DW_CC_BORLAND_msfastcall; 1518 case CC_X86ThisCall: 1519 return llvm::dwarf::DW_CC_BORLAND_thiscall; 1520 case CC_X86VectorCall: 1521 return llvm::dwarf::DW_CC_LLVM_vectorcall; 1522 case CC_X86Pascal: 1523 return llvm::dwarf::DW_CC_BORLAND_pascal; 1524 case CC_Win64: 1525 return llvm::dwarf::DW_CC_LLVM_Win64; 1526 case CC_X86_64SysV: 1527 return llvm::dwarf::DW_CC_LLVM_X86_64SysV; 1528 case CC_AAPCS: 1529 case CC_AArch64VectorCall: 1530 case CC_AArch64SVEPCS: 1531 return llvm::dwarf::DW_CC_LLVM_AAPCS; 1532 case CC_AAPCS_VFP: 1533 return llvm::dwarf::DW_CC_LLVM_AAPCS_VFP; 1534 case CC_IntelOclBicc: 1535 return llvm::dwarf::DW_CC_LLVM_IntelOclBicc; 1536 case CC_SpirFunction: 1537 return llvm::dwarf::DW_CC_LLVM_SpirFunction; 1538 case CC_OpenCLKernel: 1539 case CC_AMDGPUKernelCall: 1540 return llvm::dwarf::DW_CC_LLVM_OpenCLKernel; 1541 case CC_Swift: 1542 return llvm::dwarf::DW_CC_LLVM_Swift; 1543 case CC_SwiftAsync: 1544 return llvm::dwarf::DW_CC_LLVM_SwiftTail; 1545 case CC_PreserveMost: 1546 return llvm::dwarf::DW_CC_LLVM_PreserveMost; 1547 case CC_PreserveAll: 1548 return llvm::dwarf::DW_CC_LLVM_PreserveAll; 1549 case CC_X86RegCall: 1550 return llvm::dwarf::DW_CC_LLVM_X86RegCall; 1551 case CC_M68kRTD: 1552 return llvm::dwarf::DW_CC_LLVM_M68kRTD; 1553 case CC_PreserveNone: 1554 return llvm::dwarf::DW_CC_LLVM_PreserveNone; 1555 case CC_RISCVVectorCall: 1556 return llvm::dwarf::DW_CC_LLVM_RISCVVectorCall; 1557 } 1558 return 0; 1559 } 1560 1561 static llvm::DINode::DIFlags getRefFlags(const FunctionProtoType *Func) { 1562 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 1563 if (Func->getExtProtoInfo().RefQualifier == RQ_LValue) 1564 Flags |= llvm::DINode::FlagLValueReference; 1565 if (Func->getExtProtoInfo().RefQualifier == RQ_RValue) 1566 Flags |= llvm::DINode::FlagRValueReference; 1567 return Flags; 1568 } 1569 1570 llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty, 1571 llvm::DIFile *Unit) { 1572 const auto *FPT = dyn_cast<FunctionProtoType>(Ty); 1573 if (FPT) { 1574 if (llvm::DIType *QTy = CreateQualifiedType(FPT, Unit)) 1575 return QTy; 1576 } 1577 1578 // Create the type without any qualifiers 1579 1580 SmallVector<llvm::Metadata *, 16> EltTys; 1581 1582 // Add the result type at least. 1583 EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit)); 1584 1585 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 1586 // Set up remainder of arguments if there is a prototype. 1587 // otherwise emit it as a variadic function. 1588 if (!FPT) { 1589 EltTys.push_back(DBuilder.createUnspecifiedParameter()); 1590 } else { 1591 Flags = getRefFlags(FPT); 1592 for (const QualType &ParamType : FPT->param_types()) 1593 EltTys.push_back(getOrCreateType(ParamType, Unit)); 1594 if (FPT->isVariadic()) 1595 EltTys.push_back(DBuilder.createUnspecifiedParameter()); 1596 } 1597 1598 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys); 1599 llvm::DIType *F = DBuilder.createSubroutineType( 1600 EltTypeArray, Flags, getDwarfCC(Ty->getCallConv())); 1601 return F; 1602 } 1603 1604 llvm::DIDerivedType * 1605 CGDebugInfo::createBitFieldType(const FieldDecl *BitFieldDecl, 1606 llvm::DIScope *RecordTy, const RecordDecl *RD) { 1607 StringRef Name = BitFieldDecl->getName(); 1608 QualType Ty = BitFieldDecl->getType(); 1609 if (BitFieldDecl->hasAttr<PreferredTypeAttr>()) 1610 Ty = BitFieldDecl->getAttr<PreferredTypeAttr>()->getType(); 1611 SourceLocation Loc = BitFieldDecl->getLocation(); 1612 llvm::DIFile *VUnit = getOrCreateFile(Loc); 1613 llvm::DIType *DebugType = getOrCreateType(Ty, VUnit); 1614 1615 // Get the location for the field. 1616 llvm::DIFile *File = getOrCreateFile(Loc); 1617 unsigned Line = getLineNumber(Loc); 1618 1619 const CGBitFieldInfo &BitFieldInfo = 1620 CGM.getTypes().getCGRecordLayout(RD).getBitFieldInfo(BitFieldDecl); 1621 uint64_t SizeInBits = BitFieldInfo.Size; 1622 assert(SizeInBits > 0 && "found named 0-width bitfield"); 1623 uint64_t StorageOffsetInBits = 1624 CGM.getContext().toBits(BitFieldInfo.StorageOffset); 1625 uint64_t Offset = BitFieldInfo.Offset; 1626 // The bit offsets for big endian machines are reversed for big 1627 // endian target, compensate for that as the DIDerivedType requires 1628 // un-reversed offsets. 1629 if (CGM.getDataLayout().isBigEndian()) 1630 Offset = BitFieldInfo.StorageSize - BitFieldInfo.Size - Offset; 1631 uint64_t OffsetInBits = StorageOffsetInBits + Offset; 1632 llvm::DINode::DIFlags Flags = getAccessFlag(BitFieldDecl->getAccess(), RD); 1633 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(BitFieldDecl); 1634 return DBuilder.createBitFieldMemberType( 1635 RecordTy, Name, File, Line, SizeInBits, OffsetInBits, StorageOffsetInBits, 1636 Flags, DebugType, Annotations); 1637 } 1638 1639 llvm::DIDerivedType *CGDebugInfo::createBitFieldSeparatorIfNeeded( 1640 const FieldDecl *BitFieldDecl, const llvm::DIDerivedType *BitFieldDI, 1641 llvm::ArrayRef<llvm::Metadata *> PreviousFieldsDI, const RecordDecl *RD) { 1642 1643 if (!CGM.getTargetCodeGenInfo().shouldEmitDWARFBitFieldSeparators()) 1644 return nullptr; 1645 1646 /* 1647 Add a *single* zero-bitfield separator between two non-zero bitfields 1648 separated by one or more zero-bitfields. This is used to distinguish between 1649 structures such the ones below, where the memory layout is the same, but how 1650 the ABI assigns fields to registers differs. 1651 1652 struct foo { 1653 int space[4]; 1654 char a : 8; // on amdgpu, passed on v4 1655 char b : 8; 1656 char x : 8; 1657 char y : 8; 1658 }; 1659 struct bar { 1660 int space[4]; 1661 char a : 8; // on amdgpu, passed on v4 1662 char b : 8; 1663 char : 0; 1664 char x : 8; // passed on v5 1665 char y : 8; 1666 }; 1667 */ 1668 if (PreviousFieldsDI.empty()) 1669 return nullptr; 1670 1671 // If we already emitted metadata for a 0-length bitfield, nothing to do here. 1672 auto *PreviousMDEntry = 1673 PreviousFieldsDI.empty() ? nullptr : PreviousFieldsDI.back(); 1674 auto *PreviousMDField = 1675 dyn_cast_or_null<llvm::DIDerivedType>(PreviousMDEntry); 1676 if (!PreviousMDField || !PreviousMDField->isBitField() || 1677 PreviousMDField->getSizeInBits() == 0) 1678 return nullptr; 1679 1680 auto PreviousBitfield = RD->field_begin(); 1681 std::advance(PreviousBitfield, BitFieldDecl->getFieldIndex() - 1); 1682 1683 assert(PreviousBitfield->isBitField()); 1684 1685 ASTContext &Context = CGM.getContext(); 1686 if (!PreviousBitfield->isZeroLengthBitField(Context)) 1687 return nullptr; 1688 1689 QualType Ty = PreviousBitfield->getType(); 1690 SourceLocation Loc = PreviousBitfield->getLocation(); 1691 llvm::DIFile *VUnit = getOrCreateFile(Loc); 1692 llvm::DIType *DebugType = getOrCreateType(Ty, VUnit); 1693 llvm::DIScope *RecordTy = BitFieldDI->getScope(); 1694 1695 llvm::DIFile *File = getOrCreateFile(Loc); 1696 unsigned Line = getLineNumber(Loc); 1697 1698 uint64_t StorageOffsetInBits = 1699 cast<llvm::ConstantInt>(BitFieldDI->getStorageOffsetInBits()) 1700 ->getZExtValue(); 1701 1702 llvm::DINode::DIFlags Flags = 1703 getAccessFlag(PreviousBitfield->getAccess(), RD); 1704 llvm::DINodeArray Annotations = 1705 CollectBTFDeclTagAnnotations(*PreviousBitfield); 1706 return DBuilder.createBitFieldMemberType( 1707 RecordTy, "", File, Line, 0, StorageOffsetInBits, StorageOffsetInBits, 1708 Flags, DebugType, Annotations); 1709 } 1710 1711 llvm::DIType *CGDebugInfo::createFieldType( 1712 StringRef name, QualType type, SourceLocation loc, AccessSpecifier AS, 1713 uint64_t offsetInBits, uint32_t AlignInBits, llvm::DIFile *tunit, 1714 llvm::DIScope *scope, const RecordDecl *RD, llvm::DINodeArray Annotations) { 1715 llvm::DIType *debugType = getOrCreateType(type, tunit); 1716 1717 // Get the location for the field. 1718 llvm::DIFile *file = getOrCreateFile(loc); 1719 const unsigned line = getLineNumber(loc.isValid() ? loc : CurLoc); 1720 1721 uint64_t SizeInBits = 0; 1722 auto Align = AlignInBits; 1723 if (!type->isIncompleteArrayType()) { 1724 TypeInfo TI = CGM.getContext().getTypeInfo(type); 1725 SizeInBits = TI.Width; 1726 if (!Align) 1727 Align = getTypeAlignIfRequired(type, CGM.getContext()); 1728 } 1729 1730 llvm::DINode::DIFlags flags = getAccessFlag(AS, RD); 1731 return DBuilder.createMemberType(scope, name, file, line, SizeInBits, Align, 1732 offsetInBits, flags, debugType, Annotations); 1733 } 1734 1735 llvm::DISubprogram * 1736 CGDebugInfo::createInlinedTrapSubprogram(StringRef FuncName, 1737 llvm::DIFile *FileScope) { 1738 // We are caching the subprogram because we don't want to duplicate 1739 // subprograms with the same message. Note that `SPFlagDefinition` prevents 1740 // subprograms from being uniqued. 1741 llvm::DISubprogram *&SP = InlinedTrapFuncMap[FuncName]; 1742 1743 if (!SP) { 1744 llvm::DISubroutineType *DIFnTy = DBuilder.createSubroutineType(nullptr); 1745 SP = DBuilder.createFunction( 1746 /*Scope=*/FileScope, /*Name=*/FuncName, /*LinkageName=*/StringRef(), 1747 /*File=*/FileScope, /*LineNo=*/0, /*Ty=*/DIFnTy, 1748 /*ScopeLine=*/0, 1749 /*Flags=*/llvm::DINode::FlagArtificial, 1750 /*SPFlags=*/llvm::DISubprogram::SPFlagDefinition, 1751 /*TParams=*/nullptr, /*ThrownTypes=*/nullptr, /*Annotations=*/nullptr); 1752 } 1753 1754 return SP; 1755 } 1756 1757 void CGDebugInfo::CollectRecordLambdaFields( 1758 const CXXRecordDecl *CXXDecl, SmallVectorImpl<llvm::Metadata *> &elements, 1759 llvm::DIType *RecordTy) { 1760 // For C++11 Lambdas a Field will be the same as a Capture, but the Capture 1761 // has the name and the location of the variable so we should iterate over 1762 // both concurrently. 1763 const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl); 1764 RecordDecl::field_iterator Field = CXXDecl->field_begin(); 1765 unsigned fieldno = 0; 1766 for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), 1767 E = CXXDecl->captures_end(); 1768 I != E; ++I, ++Field, ++fieldno) { 1769 const LambdaCapture &C = *I; 1770 if (C.capturesVariable()) { 1771 SourceLocation Loc = C.getLocation(); 1772 assert(!Field->isBitField() && "lambdas don't have bitfield members!"); 1773 ValueDecl *V = C.getCapturedVar(); 1774 StringRef VName = V->getName(); 1775 llvm::DIFile *VUnit = getOrCreateFile(Loc); 1776 auto Align = getDeclAlignIfRequired(V, CGM.getContext()); 1777 llvm::DIType *FieldType = createFieldType( 1778 VName, Field->getType(), Loc, Field->getAccess(), 1779 layout.getFieldOffset(fieldno), Align, VUnit, RecordTy, CXXDecl); 1780 elements.push_back(FieldType); 1781 } else if (C.capturesThis()) { 1782 // TODO: Need to handle 'this' in some way by probably renaming the 1783 // this of the lambda class and having a field member of 'this' or 1784 // by using AT_object_pointer for the function and having that be 1785 // used as 'this' for semantic references. 1786 FieldDecl *f = *Field; 1787 llvm::DIFile *VUnit = getOrCreateFile(f->getLocation()); 1788 QualType type = f->getType(); 1789 StringRef ThisName = 1790 CGM.getCodeGenOpts().EmitCodeView ? "__this" : "this"; 1791 llvm::DIType *fieldType = createFieldType( 1792 ThisName, type, f->getLocation(), f->getAccess(), 1793 layout.getFieldOffset(fieldno), VUnit, RecordTy, CXXDecl); 1794 1795 elements.push_back(fieldType); 1796 } 1797 } 1798 } 1799 1800 llvm::DIDerivedType * 1801 CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy, 1802 const RecordDecl *RD) { 1803 // Create the descriptor for the static variable, with or without 1804 // constant initializers. 1805 Var = Var->getCanonicalDecl(); 1806 llvm::DIFile *VUnit = getOrCreateFile(Var->getLocation()); 1807 llvm::DIType *VTy = getOrCreateType(Var->getType(), VUnit); 1808 1809 unsigned LineNumber = getLineNumber(Var->getLocation()); 1810 StringRef VName = Var->getName(); 1811 1812 // FIXME: to avoid complications with type merging we should 1813 // emit the constant on the definition instead of the declaration. 1814 llvm::Constant *C = nullptr; 1815 if (Var->getInit()) { 1816 const APValue *Value = Var->evaluateValue(); 1817 if (Value) { 1818 if (Value->isInt()) 1819 C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); 1820 if (Value->isFloat()) 1821 C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); 1822 } 1823 } 1824 1825 llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD); 1826 auto Tag = CGM.getCodeGenOpts().DwarfVersion >= 5 1827 ? llvm::dwarf::DW_TAG_variable 1828 : llvm::dwarf::DW_TAG_member; 1829 auto Align = getDeclAlignIfRequired(Var, CGM.getContext()); 1830 llvm::DIDerivedType *GV = DBuilder.createStaticMemberType( 1831 RecordTy, VName, VUnit, LineNumber, VTy, Flags, C, Tag, Align); 1832 StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV); 1833 return GV; 1834 } 1835 1836 void CGDebugInfo::CollectRecordNormalField( 1837 const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile *tunit, 1838 SmallVectorImpl<llvm::Metadata *> &elements, llvm::DIType *RecordTy, 1839 const RecordDecl *RD) { 1840 StringRef name = field->getName(); 1841 QualType type = field->getType(); 1842 1843 // Ignore unnamed fields unless they're anonymous structs/unions. 1844 if (name.empty() && !type->isRecordType()) 1845 return; 1846 1847 llvm::DIType *FieldType; 1848 if (field->isBitField()) { 1849 llvm::DIDerivedType *BitFieldType; 1850 FieldType = BitFieldType = createBitFieldType(field, RecordTy, RD); 1851 if (llvm::DIType *Separator = 1852 createBitFieldSeparatorIfNeeded(field, BitFieldType, elements, RD)) 1853 elements.push_back(Separator); 1854 } else { 1855 auto Align = getDeclAlignIfRequired(field, CGM.getContext()); 1856 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(field); 1857 FieldType = 1858 createFieldType(name, type, field->getLocation(), field->getAccess(), 1859 OffsetInBits, Align, tunit, RecordTy, RD, Annotations); 1860 } 1861 1862 elements.push_back(FieldType); 1863 } 1864 1865 void CGDebugInfo::CollectRecordNestedType( 1866 const TypeDecl *TD, SmallVectorImpl<llvm::Metadata *> &elements) { 1867 QualType Ty = CGM.getContext().getTypeDeclType(TD); 1868 // Injected class names are not considered nested records. 1869 if (isa<InjectedClassNameType>(Ty)) 1870 return; 1871 SourceLocation Loc = TD->getLocation(); 1872 llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateFile(Loc)); 1873 elements.push_back(nestedType); 1874 } 1875 1876 void CGDebugInfo::CollectRecordFields( 1877 const RecordDecl *record, llvm::DIFile *tunit, 1878 SmallVectorImpl<llvm::Metadata *> &elements, 1879 llvm::DICompositeType *RecordTy) { 1880 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(record); 1881 1882 if (CXXDecl && CXXDecl->isLambda()) 1883 CollectRecordLambdaFields(CXXDecl, elements, RecordTy); 1884 else { 1885 const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); 1886 1887 // Field number for non-static fields. 1888 unsigned fieldNo = 0; 1889 1890 // Static and non-static members should appear in the same order as 1891 // the corresponding declarations in the source program. 1892 for (const auto *I : record->decls()) 1893 if (const auto *V = dyn_cast<VarDecl>(I)) { 1894 if (V->hasAttr<NoDebugAttr>()) 1895 continue; 1896 1897 // Skip variable template specializations when emitting CodeView. MSVC 1898 // doesn't emit them. 1899 if (CGM.getCodeGenOpts().EmitCodeView && 1900 isa<VarTemplateSpecializationDecl>(V)) 1901 continue; 1902 1903 if (isa<VarTemplatePartialSpecializationDecl>(V)) 1904 continue; 1905 1906 // Reuse the existing static member declaration if one exists 1907 auto MI = StaticDataMemberCache.find(V->getCanonicalDecl()); 1908 if (MI != StaticDataMemberCache.end()) { 1909 assert(MI->second && 1910 "Static data member declaration should still exist"); 1911 elements.push_back(MI->second); 1912 } else { 1913 auto Field = CreateRecordStaticField(V, RecordTy, record); 1914 elements.push_back(Field); 1915 } 1916 } else if (const auto *field = dyn_cast<FieldDecl>(I)) { 1917 CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), tunit, 1918 elements, RecordTy, record); 1919 1920 // Bump field number for next field. 1921 ++fieldNo; 1922 } else if (CGM.getCodeGenOpts().EmitCodeView) { 1923 // Debug info for nested types is included in the member list only for 1924 // CodeView. 1925 if (const auto *nestedType = dyn_cast<TypeDecl>(I)) { 1926 // MSVC doesn't generate nested type for anonymous struct/union. 1927 if (isa<RecordDecl>(I) && 1928 cast<RecordDecl>(I)->isAnonymousStructOrUnion()) 1929 continue; 1930 if (!nestedType->isImplicit() && 1931 nestedType->getDeclContext() == record) 1932 CollectRecordNestedType(nestedType, elements); 1933 } 1934 } 1935 } 1936 } 1937 1938 llvm::DISubroutineType * 1939 CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 1940 llvm::DIFile *Unit) { 1941 const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>(); 1942 if (Method->isStatic()) 1943 return cast_or_null<llvm::DISubroutineType>( 1944 getOrCreateType(QualType(Func, 0), Unit)); 1945 return getOrCreateInstanceMethodType(Method->getThisType(), Func, Unit); 1946 } 1947 1948 llvm::DISubroutineType *CGDebugInfo::getOrCreateInstanceMethodType( 1949 QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile *Unit) { 1950 FunctionProtoType::ExtProtoInfo EPI = Func->getExtProtoInfo(); 1951 Qualifiers &Qc = EPI.TypeQuals; 1952 Qc.removeConst(); 1953 Qc.removeVolatile(); 1954 Qc.removeRestrict(); 1955 Qc.removeUnaligned(); 1956 // Keep the removed qualifiers in sync with 1957 // CreateQualifiedType(const FunctionPrototype*, DIFile *Unit) 1958 // On a 'real' member function type, these qualifiers are carried on the type 1959 // of the first parameter, not as separate DW_TAG_const_type (etc) decorator 1960 // tags around them. (But, in the raw function types with qualifiers, they have 1961 // to use wrapper types.) 1962 1963 // Add "this" pointer. 1964 const auto *OriginalFunc = cast<llvm::DISubroutineType>( 1965 getOrCreateType(CGM.getContext().getFunctionType( 1966 Func->getReturnType(), Func->getParamTypes(), EPI), 1967 Unit)); 1968 llvm::DITypeRefArray Args = OriginalFunc->getTypeArray(); 1969 assert(Args.size() && "Invalid number of arguments!"); 1970 1971 SmallVector<llvm::Metadata *, 16> Elts; 1972 1973 // First element is always return type. For 'void' functions it is NULL. 1974 Elts.push_back(Args[0]); 1975 1976 // "this" pointer is always first argument. 1977 const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl(); 1978 if (isa<ClassTemplateSpecializationDecl>(RD)) { 1979 // Create pointer type directly in this case. 1980 const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr); 1981 uint64_t Size = CGM.getContext().getTypeSize(ThisPtrTy); 1982 auto Align = getTypeAlignIfRequired(ThisPtrTy, CGM.getContext()); 1983 llvm::DIType *PointeeType = 1984 getOrCreateType(ThisPtrTy->getPointeeType(), Unit); 1985 llvm::DIType *ThisPtrType = 1986 DBuilder.createPointerType(PointeeType, Size, Align); 1987 TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType); 1988 // TODO: This and the artificial type below are misleading, the 1989 // types aren't artificial the argument is, but the current 1990 // metadata doesn't represent that. 1991 ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 1992 Elts.push_back(ThisPtrType); 1993 } else { 1994 llvm::DIType *ThisPtrType = getOrCreateType(ThisPtr, Unit); 1995 TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType); 1996 ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 1997 Elts.push_back(ThisPtrType); 1998 } 1999 2000 // Copy rest of the arguments. 2001 for (unsigned i = 1, e = Args.size(); i != e; ++i) 2002 Elts.push_back(Args[i]); 2003 2004 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts); 2005 2006 return DBuilder.createSubroutineType(EltTypeArray, OriginalFunc->getFlags(), 2007 getDwarfCC(Func->getCallConv())); 2008 } 2009 2010 /// isFunctionLocalClass - Return true if CXXRecordDecl is defined 2011 /// inside a function. 2012 static bool isFunctionLocalClass(const CXXRecordDecl *RD) { 2013 if (const auto *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext())) 2014 return isFunctionLocalClass(NRD); 2015 if (isa<FunctionDecl>(RD->getDeclContext())) 2016 return true; 2017 return false; 2018 } 2019 2020 llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction( 2021 const CXXMethodDecl *Method, llvm::DIFile *Unit, llvm::DIType *RecordTy) { 2022 bool IsCtorOrDtor = 2023 isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 2024 2025 StringRef MethodName = getFunctionName(Method); 2026 llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit); 2027 2028 // Since a single ctor/dtor corresponds to multiple functions, it doesn't 2029 // make sense to give a single ctor/dtor a linkage name. 2030 StringRef MethodLinkageName; 2031 // FIXME: 'isFunctionLocalClass' seems like an arbitrary/unintentional 2032 // property to use here. It may've been intended to model "is non-external 2033 // type" but misses cases of non-function-local but non-external classes such 2034 // as those in anonymous namespaces as well as the reverse - external types 2035 // that are function local, such as those in (non-local) inline functions. 2036 if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent())) 2037 MethodLinkageName = CGM.getMangledName(Method); 2038 2039 // Get the location for the method. 2040 llvm::DIFile *MethodDefUnit = nullptr; 2041 unsigned MethodLine = 0; 2042 if (!Method->isImplicit()) { 2043 MethodDefUnit = getOrCreateFile(Method->getLocation()); 2044 MethodLine = getLineNumber(Method->getLocation()); 2045 } 2046 2047 // Collect virtual method info. 2048 llvm::DIType *ContainingType = nullptr; 2049 unsigned VIndex = 0; 2050 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 2051 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero; 2052 int ThisAdjustment = 0; 2053 2054 if (VTableContextBase::hasVtableSlot(Method)) { 2055 if (Method->isPureVirtual()) 2056 SPFlags |= llvm::DISubprogram::SPFlagPureVirtual; 2057 else 2058 SPFlags |= llvm::DISubprogram::SPFlagVirtual; 2059 2060 if (CGM.getTarget().getCXXABI().isItaniumFamily()) { 2061 // It doesn't make sense to give a virtual destructor a vtable index, 2062 // since a single destructor has two entries in the vtable. 2063 if (!isa<CXXDestructorDecl>(Method)) 2064 VIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(Method); 2065 } else { 2066 // Emit MS ABI vftable information. There is only one entry for the 2067 // deleting dtor. 2068 const auto *DD = dyn_cast<CXXDestructorDecl>(Method); 2069 GlobalDecl GD = DD ? GlobalDecl(DD, Dtor_Deleting) : GlobalDecl(Method); 2070 MethodVFTableLocation ML = 2071 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD); 2072 VIndex = ML.Index; 2073 2074 // CodeView only records the vftable offset in the class that introduces 2075 // the virtual method. This is possible because, unlike Itanium, the MS 2076 // C++ ABI does not include all virtual methods from non-primary bases in 2077 // the vtable for the most derived class. For example, if C inherits from 2078 // A and B, C's primary vftable will not include B's virtual methods. 2079 if (Method->size_overridden_methods() == 0) 2080 Flags |= llvm::DINode::FlagIntroducedVirtual; 2081 2082 // The 'this' adjustment accounts for both the virtual and non-virtual 2083 // portions of the adjustment. Presumably the debugger only uses it when 2084 // it knows the dynamic type of an object. 2085 ThisAdjustment = CGM.getCXXABI() 2086 .getVirtualFunctionPrologueThisAdjustment(GD) 2087 .getQuantity(); 2088 } 2089 ContainingType = RecordTy; 2090 } 2091 2092 if (Method->getCanonicalDecl()->isDeleted()) 2093 SPFlags |= llvm::DISubprogram::SPFlagDeleted; 2094 2095 if (Method->isNoReturn()) 2096 Flags |= llvm::DINode::FlagNoReturn; 2097 2098 if (Method->isStatic()) 2099 Flags |= llvm::DINode::FlagStaticMember; 2100 if (Method->isImplicit()) 2101 Flags |= llvm::DINode::FlagArtificial; 2102 Flags |= getAccessFlag(Method->getAccess(), Method->getParent()); 2103 if (const auto *CXXC = dyn_cast<CXXConstructorDecl>(Method)) { 2104 if (CXXC->isExplicit()) 2105 Flags |= llvm::DINode::FlagExplicit; 2106 } else if (const auto *CXXC = dyn_cast<CXXConversionDecl>(Method)) { 2107 if (CXXC->isExplicit()) 2108 Flags |= llvm::DINode::FlagExplicit; 2109 } 2110 if (Method->hasPrototype()) 2111 Flags |= llvm::DINode::FlagPrototyped; 2112 if (Method->getRefQualifier() == RQ_LValue) 2113 Flags |= llvm::DINode::FlagLValueReference; 2114 if (Method->getRefQualifier() == RQ_RValue) 2115 Flags |= llvm::DINode::FlagRValueReference; 2116 if (!Method->isExternallyVisible()) 2117 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit; 2118 if (CGM.getLangOpts().Optimize) 2119 SPFlags |= llvm::DISubprogram::SPFlagOptimized; 2120 2121 // In this debug mode, emit type info for a class when its constructor type 2122 // info is emitted. 2123 if (DebugKind == llvm::codegenoptions::DebugInfoConstructor) 2124 if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(Method)) 2125 completeUnusedClass(*CD->getParent()); 2126 2127 llvm::DINodeArray TParamsArray = CollectFunctionTemplateParams(Method, Unit); 2128 llvm::DISubprogram *SP = DBuilder.createMethod( 2129 RecordTy, MethodName, MethodLinkageName, MethodDefUnit, MethodLine, 2130 MethodTy, VIndex, ThisAdjustment, ContainingType, Flags, SPFlags, 2131 TParamsArray.get()); 2132 2133 SPCache[Method->getCanonicalDecl()].reset(SP); 2134 2135 return SP; 2136 } 2137 2138 void CGDebugInfo::CollectCXXMemberFunctions( 2139 const CXXRecordDecl *RD, llvm::DIFile *Unit, 2140 SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy) { 2141 2142 // Since we want more than just the individual member decls if we 2143 // have templated functions iterate over every declaration to gather 2144 // the functions. 2145 for (const auto *I : RD->decls()) { 2146 const auto *Method = dyn_cast<CXXMethodDecl>(I); 2147 // If the member is implicit, don't add it to the member list. This avoids 2148 // the member being added to type units by LLVM, while still allowing it 2149 // to be emitted into the type declaration/reference inside the compile 2150 // unit. 2151 // Ditto 'nodebug' methods, for consistency with CodeGenFunction.cpp. 2152 // FIXME: Handle Using(Shadow?)Decls here to create 2153 // DW_TAG_imported_declarations inside the class for base decls brought into 2154 // derived classes. GDB doesn't seem to notice/leverage these when I tried 2155 // it, so I'm not rushing to fix this. (GCC seems to produce them, if 2156 // referenced) 2157 if (!Method || Method->isImplicit() || Method->hasAttr<NoDebugAttr>()) 2158 continue; 2159 2160 if (Method->getType()->castAs<FunctionProtoType>()->getContainedAutoType()) 2161 continue; 2162 2163 // Reuse the existing member function declaration if it exists. 2164 // It may be associated with the declaration of the type & should be 2165 // reused as we're building the definition. 2166 // 2167 // This situation can arise in the vtable-based debug info reduction where 2168 // implicit members are emitted in a non-vtable TU. 2169 auto MI = SPCache.find(Method->getCanonicalDecl()); 2170 EltTys.push_back(MI == SPCache.end() 2171 ? CreateCXXMemberFunction(Method, Unit, RecordTy) 2172 : static_cast<llvm::Metadata *>(MI->second)); 2173 } 2174 } 2175 2176 void CGDebugInfo::CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile *Unit, 2177 SmallVectorImpl<llvm::Metadata *> &EltTys, 2178 llvm::DIType *RecordTy) { 2179 llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> SeenTypes; 2180 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->bases(), SeenTypes, 2181 llvm::DINode::FlagZero); 2182 2183 // If we are generating CodeView debug info, we also need to emit records for 2184 // indirect virtual base classes. 2185 if (CGM.getCodeGenOpts().EmitCodeView) { 2186 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->vbases(), SeenTypes, 2187 llvm::DINode::FlagIndirectVirtualBase); 2188 } 2189 } 2190 2191 void CGDebugInfo::CollectCXXBasesAux( 2192 const CXXRecordDecl *RD, llvm::DIFile *Unit, 2193 SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy, 2194 const CXXRecordDecl::base_class_const_range &Bases, 2195 llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> &SeenTypes, 2196 llvm::DINode::DIFlags StartingFlags) { 2197 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 2198 for (const auto &BI : Bases) { 2199 const auto *Base = 2200 cast<CXXRecordDecl>(BI.getType()->castAs<RecordType>()->getDecl()); 2201 if (!SeenTypes.insert(Base).second) 2202 continue; 2203 auto *BaseTy = getOrCreateType(BI.getType(), Unit); 2204 llvm::DINode::DIFlags BFlags = StartingFlags; 2205 uint64_t BaseOffset; 2206 uint32_t VBPtrOffset = 0; 2207 2208 if (BI.isVirtual()) { 2209 if (CGM.getTarget().getCXXABI().isItaniumFamily()) { 2210 // virtual base offset offset is -ve. The code generator emits dwarf 2211 // expression where it expects +ve number. 2212 BaseOffset = 0 - CGM.getItaniumVTableContext() 2213 .getVirtualBaseOffsetOffset(RD, Base) 2214 .getQuantity(); 2215 } else { 2216 // In the MS ABI, store the vbtable offset, which is analogous to the 2217 // vbase offset offset in Itanium. 2218 BaseOffset = 2219 4 * CGM.getMicrosoftVTableContext().getVBTableIndex(RD, Base); 2220 VBPtrOffset = CGM.getContext() 2221 .getASTRecordLayout(RD) 2222 .getVBPtrOffset() 2223 .getQuantity(); 2224 } 2225 BFlags |= llvm::DINode::FlagVirtual; 2226 } else 2227 BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base)); 2228 // FIXME: Inconsistent units for BaseOffset. It is in bytes when 2229 // BI->isVirtual() and bits when not. 2230 2231 BFlags |= getAccessFlag(BI.getAccessSpecifier(), RD); 2232 llvm::DIType *DTy = DBuilder.createInheritance(RecordTy, BaseTy, BaseOffset, 2233 VBPtrOffset, BFlags); 2234 EltTys.push_back(DTy); 2235 } 2236 } 2237 2238 llvm::DINodeArray 2239 CGDebugInfo::CollectTemplateParams(std::optional<TemplateArgs> OArgs, 2240 llvm::DIFile *Unit) { 2241 if (!OArgs) 2242 return llvm::DINodeArray(); 2243 TemplateArgs &Args = *OArgs; 2244 SmallVector<llvm::Metadata *, 16> TemplateParams; 2245 for (unsigned i = 0, e = Args.Args.size(); i != e; ++i) { 2246 const TemplateArgument &TA = Args.Args[i]; 2247 StringRef Name; 2248 const bool defaultParameter = TA.getIsDefaulted(); 2249 if (Args.TList) 2250 Name = Args.TList->getParam(i)->getName(); 2251 2252 switch (TA.getKind()) { 2253 case TemplateArgument::Type: { 2254 llvm::DIType *TTy = getOrCreateType(TA.getAsType(), Unit); 2255 TemplateParams.push_back(DBuilder.createTemplateTypeParameter( 2256 TheCU, Name, TTy, defaultParameter)); 2257 2258 } break; 2259 case TemplateArgument::Integral: { 2260 llvm::DIType *TTy = getOrCreateType(TA.getIntegralType(), Unit); 2261 TemplateParams.push_back(DBuilder.createTemplateValueParameter( 2262 TheCU, Name, TTy, defaultParameter, 2263 llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral()))); 2264 } break; 2265 case TemplateArgument::Declaration: { 2266 const ValueDecl *D = TA.getAsDecl(); 2267 QualType T = TA.getParamTypeForDecl().getDesugaredType(CGM.getContext()); 2268 llvm::DIType *TTy = getOrCreateType(T, Unit); 2269 llvm::Constant *V = nullptr; 2270 // Skip retrieve the value if that template parameter has cuda device 2271 // attribute, i.e. that value is not available at the host side. 2272 if (!CGM.getLangOpts().CUDA || CGM.getLangOpts().CUDAIsDevice || 2273 !D->hasAttr<CUDADeviceAttr>()) { 2274 // Variable pointer template parameters have a value that is the address 2275 // of the variable. 2276 if (const auto *VD = dyn_cast<VarDecl>(D)) 2277 V = CGM.GetAddrOfGlobalVar(VD); 2278 // Member function pointers have special support for building them, 2279 // though this is currently unsupported in LLVM CodeGen. 2280 else if (const auto *MD = dyn_cast<CXXMethodDecl>(D); 2281 MD && MD->isImplicitObjectMemberFunction()) 2282 V = CGM.getCXXABI().EmitMemberFunctionPointer(MD); 2283 else if (const auto *FD = dyn_cast<FunctionDecl>(D)) 2284 V = CGM.GetAddrOfFunction(FD); 2285 // Member data pointers have special handling too to compute the fixed 2286 // offset within the object. 2287 else if (const auto *MPT = 2288 dyn_cast<MemberPointerType>(T.getTypePtr())) { 2289 // These five lines (& possibly the above member function pointer 2290 // handling) might be able to be refactored to use similar code in 2291 // CodeGenModule::getMemberPointerConstant 2292 uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); 2293 CharUnits chars = 2294 CGM.getContext().toCharUnitsFromBits((int64_t)fieldOffset); 2295 V = CGM.getCXXABI().EmitMemberDataPointer(MPT, chars); 2296 } else if (const auto *GD = dyn_cast<MSGuidDecl>(D)) { 2297 V = CGM.GetAddrOfMSGuidDecl(GD).getPointer(); 2298 } else if (const auto *TPO = dyn_cast<TemplateParamObjectDecl>(D)) { 2299 if (T->isRecordType()) 2300 V = ConstantEmitter(CGM).emitAbstract( 2301 SourceLocation(), TPO->getValue(), TPO->getType()); 2302 else 2303 V = CGM.GetAddrOfTemplateParamObject(TPO).getPointer(); 2304 } 2305 assert(V && "Failed to find template parameter pointer"); 2306 V = V->stripPointerCasts(); 2307 } 2308 TemplateParams.push_back(DBuilder.createTemplateValueParameter( 2309 TheCU, Name, TTy, defaultParameter, cast_or_null<llvm::Constant>(V))); 2310 } break; 2311 case TemplateArgument::NullPtr: { 2312 QualType T = TA.getNullPtrType(); 2313 llvm::DIType *TTy = getOrCreateType(T, Unit); 2314 llvm::Constant *V = nullptr; 2315 // Special case member data pointer null values since they're actually -1 2316 // instead of zero. 2317 if (const auto *MPT = dyn_cast<MemberPointerType>(T.getTypePtr())) 2318 // But treat member function pointers as simple zero integers because 2319 // it's easier than having a special case in LLVM's CodeGen. If LLVM 2320 // CodeGen grows handling for values of non-null member function 2321 // pointers then perhaps we could remove this special case and rely on 2322 // EmitNullMemberPointer for member function pointers. 2323 if (MPT->isMemberDataPointer()) 2324 V = CGM.getCXXABI().EmitNullMemberPointer(MPT); 2325 if (!V) 2326 V = llvm::ConstantInt::get(CGM.Int8Ty, 0); 2327 TemplateParams.push_back(DBuilder.createTemplateValueParameter( 2328 TheCU, Name, TTy, defaultParameter, V)); 2329 } break; 2330 case TemplateArgument::StructuralValue: { 2331 QualType T = TA.getStructuralValueType(); 2332 llvm::DIType *TTy = getOrCreateType(T, Unit); 2333 llvm::Constant *V = ConstantEmitter(CGM).emitAbstract( 2334 SourceLocation(), TA.getAsStructuralValue(), T); 2335 TemplateParams.push_back(DBuilder.createTemplateValueParameter( 2336 TheCU, Name, TTy, defaultParameter, V)); 2337 } break; 2338 case TemplateArgument::Template: { 2339 std::string QualName; 2340 llvm::raw_string_ostream OS(QualName); 2341 TA.getAsTemplate().getAsTemplateDecl()->printQualifiedName( 2342 OS, getPrintingPolicy()); 2343 TemplateParams.push_back(DBuilder.createTemplateTemplateParameter( 2344 TheCU, Name, nullptr, OS.str(), defaultParameter)); 2345 break; 2346 } 2347 case TemplateArgument::Pack: 2348 TemplateParams.push_back(DBuilder.createTemplateParameterPack( 2349 TheCU, Name, nullptr, 2350 CollectTemplateParams({{nullptr, TA.getPackAsArray()}}, Unit))); 2351 break; 2352 case TemplateArgument::Expression: { 2353 const Expr *E = TA.getAsExpr(); 2354 QualType T = E->getType(); 2355 if (E->isGLValue()) 2356 T = CGM.getContext().getLValueReferenceType(T); 2357 llvm::Constant *V = ConstantEmitter(CGM).emitAbstract(E, T); 2358 assert(V && "Expression in template argument isn't constant"); 2359 llvm::DIType *TTy = getOrCreateType(T, Unit); 2360 TemplateParams.push_back(DBuilder.createTemplateValueParameter( 2361 TheCU, Name, TTy, defaultParameter, V->stripPointerCasts())); 2362 } break; 2363 // And the following should never occur: 2364 case TemplateArgument::TemplateExpansion: 2365 case TemplateArgument::Null: 2366 llvm_unreachable( 2367 "These argument types shouldn't exist in concrete types"); 2368 } 2369 } 2370 return DBuilder.getOrCreateArray(TemplateParams); 2371 } 2372 2373 std::optional<CGDebugInfo::TemplateArgs> 2374 CGDebugInfo::GetTemplateArgs(const FunctionDecl *FD) const { 2375 if (FD->getTemplatedKind() == 2376 FunctionDecl::TK_FunctionTemplateSpecialization) { 2377 const TemplateParameterList *TList = FD->getTemplateSpecializationInfo() 2378 ->getTemplate() 2379 ->getTemplateParameters(); 2380 return {{TList, FD->getTemplateSpecializationArgs()->asArray()}}; 2381 } 2382 return std::nullopt; 2383 } 2384 std::optional<CGDebugInfo::TemplateArgs> 2385 CGDebugInfo::GetTemplateArgs(const VarDecl *VD) const { 2386 // Always get the full list of parameters, not just the ones from the 2387 // specialization. A partial specialization may have fewer parameters than 2388 // there are arguments. 2389 auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VD); 2390 if (!TS) 2391 return std::nullopt; 2392 VarTemplateDecl *T = TS->getSpecializedTemplate(); 2393 const TemplateParameterList *TList = T->getTemplateParameters(); 2394 auto TA = TS->getTemplateArgs().asArray(); 2395 return {{TList, TA}}; 2396 } 2397 std::optional<CGDebugInfo::TemplateArgs> 2398 CGDebugInfo::GetTemplateArgs(const RecordDecl *RD) const { 2399 if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD)) { 2400 // Always get the full list of parameters, not just the ones from the 2401 // specialization. A partial specialization may have fewer parameters than 2402 // there are arguments. 2403 TemplateParameterList *TPList = 2404 TSpecial->getSpecializedTemplate()->getTemplateParameters(); 2405 const TemplateArgumentList &TAList = TSpecial->getTemplateArgs(); 2406 return {{TPList, TAList.asArray()}}; 2407 } 2408 return std::nullopt; 2409 } 2410 2411 llvm::DINodeArray 2412 CGDebugInfo::CollectFunctionTemplateParams(const FunctionDecl *FD, 2413 llvm::DIFile *Unit) { 2414 return CollectTemplateParams(GetTemplateArgs(FD), Unit); 2415 } 2416 2417 llvm::DINodeArray CGDebugInfo::CollectVarTemplateParams(const VarDecl *VL, 2418 llvm::DIFile *Unit) { 2419 return CollectTemplateParams(GetTemplateArgs(VL), Unit); 2420 } 2421 2422 llvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams(const RecordDecl *RD, 2423 llvm::DIFile *Unit) { 2424 return CollectTemplateParams(GetTemplateArgs(RD), Unit); 2425 } 2426 2427 llvm::DINodeArray CGDebugInfo::CollectBTFDeclTagAnnotations(const Decl *D) { 2428 if (!D->hasAttr<BTFDeclTagAttr>()) 2429 return nullptr; 2430 2431 SmallVector<llvm::Metadata *, 4> Annotations; 2432 for (const auto *I : D->specific_attrs<BTFDeclTagAttr>()) { 2433 llvm::Metadata *Ops[2] = { 2434 llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_decl_tag")), 2435 llvm::MDString::get(CGM.getLLVMContext(), I->getBTFDeclTag())}; 2436 Annotations.push_back(llvm::MDNode::get(CGM.getLLVMContext(), Ops)); 2437 } 2438 return DBuilder.getOrCreateArray(Annotations); 2439 } 2440 2441 llvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) { 2442 if (VTablePtrType) 2443 return VTablePtrType; 2444 2445 ASTContext &Context = CGM.getContext(); 2446 2447 /* Function type */ 2448 llvm::Metadata *STy = getOrCreateType(Context.IntTy, Unit); 2449 llvm::DITypeRefArray SElements = DBuilder.getOrCreateTypeArray(STy); 2450 llvm::DIType *SubTy = DBuilder.createSubroutineType(SElements); 2451 unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 2452 unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace(); 2453 std::optional<unsigned> DWARFAddressSpace = 2454 CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace); 2455 2456 llvm::DIType *vtbl_ptr_type = DBuilder.createPointerType( 2457 SubTy, Size, 0, DWARFAddressSpace, "__vtbl_ptr_type"); 2458 VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size); 2459 return VTablePtrType; 2460 } 2461 2462 StringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 2463 // Copy the gdb compatible name on the side and use its reference. 2464 return internString("_vptr$", RD->getNameAsString()); 2465 } 2466 2467 StringRef CGDebugInfo::getDynamicInitializerName(const VarDecl *VD, 2468 DynamicInitKind StubKind, 2469 llvm::Function *InitFn) { 2470 // If we're not emitting codeview, use the mangled name. For Itanium, this is 2471 // arbitrary. 2472 if (!CGM.getCodeGenOpts().EmitCodeView || 2473 StubKind == DynamicInitKind::GlobalArrayDestructor) 2474 return InitFn->getName(); 2475 2476 // Print the normal qualified name for the variable, then break off the last 2477 // NNS, and add the appropriate other text. Clang always prints the global 2478 // variable name without template arguments, so we can use rsplit("::") and 2479 // then recombine the pieces. 2480 SmallString<128> QualifiedGV; 2481 StringRef Quals; 2482 StringRef GVName; 2483 { 2484 llvm::raw_svector_ostream OS(QualifiedGV); 2485 VD->printQualifiedName(OS, getPrintingPolicy()); 2486 std::tie(Quals, GVName) = OS.str().rsplit("::"); 2487 if (GVName.empty()) 2488 std::swap(Quals, GVName); 2489 } 2490 2491 SmallString<128> InitName; 2492 llvm::raw_svector_ostream OS(InitName); 2493 if (!Quals.empty()) 2494 OS << Quals << "::"; 2495 2496 switch (StubKind) { 2497 case DynamicInitKind::NoStub: 2498 case DynamicInitKind::GlobalArrayDestructor: 2499 llvm_unreachable("not an initializer"); 2500 case DynamicInitKind::Initializer: 2501 OS << "`dynamic initializer for '"; 2502 break; 2503 case DynamicInitKind::AtExit: 2504 OS << "`dynamic atexit destructor for '"; 2505 break; 2506 } 2507 2508 OS << GVName; 2509 2510 // Add any template specialization args. 2511 if (const auto *VTpl = dyn_cast<VarTemplateSpecializationDecl>(VD)) { 2512 printTemplateArgumentList(OS, VTpl->getTemplateArgs().asArray(), 2513 getPrintingPolicy()); 2514 } 2515 2516 OS << '\''; 2517 2518 return internString(OS.str()); 2519 } 2520 2521 void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit, 2522 SmallVectorImpl<llvm::Metadata *> &EltTys) { 2523 // If this class is not dynamic then there is not any vtable info to collect. 2524 if (!RD->isDynamicClass()) 2525 return; 2526 2527 // Don't emit any vtable shape or vptr info if this class doesn't have an 2528 // extendable vfptr. This can happen if the class doesn't have virtual 2529 // methods, or in the MS ABI if those virtual methods only come from virtually 2530 // inherited bases. 2531 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 2532 if (!RL.hasExtendableVFPtr()) 2533 return; 2534 2535 // CodeView needs to know how large the vtable of every dynamic class is, so 2536 // emit a special named pointer type into the element list. The vptr type 2537 // points to this type as well. 2538 llvm::DIType *VPtrTy = nullptr; 2539 bool NeedVTableShape = CGM.getCodeGenOpts().EmitCodeView && 2540 CGM.getTarget().getCXXABI().isMicrosoft(); 2541 if (NeedVTableShape) { 2542 uint64_t PtrWidth = 2543 CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 2544 const VTableLayout &VFTLayout = 2545 CGM.getMicrosoftVTableContext().getVFTableLayout(RD, CharUnits::Zero()); 2546 unsigned VSlotCount = 2547 VFTLayout.vtable_components().size() - CGM.getLangOpts().RTTIData; 2548 unsigned VTableWidth = PtrWidth * VSlotCount; 2549 unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace(); 2550 std::optional<unsigned> DWARFAddressSpace = 2551 CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace); 2552 2553 // Create a very wide void* type and insert it directly in the element list. 2554 llvm::DIType *VTableType = DBuilder.createPointerType( 2555 nullptr, VTableWidth, 0, DWARFAddressSpace, "__vtbl_ptr_type"); 2556 EltTys.push_back(VTableType); 2557 2558 // The vptr is a pointer to this special vtable type. 2559 VPtrTy = DBuilder.createPointerType(VTableType, PtrWidth); 2560 } 2561 2562 // If there is a primary base then the artificial vptr member lives there. 2563 if (RL.getPrimaryBase()) 2564 return; 2565 2566 if (!VPtrTy) 2567 VPtrTy = getOrCreateVTablePtrType(Unit); 2568 2569 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 2570 llvm::DIType *VPtrMember = 2571 DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 0, Size, 0, 0, 2572 llvm::DINode::FlagArtificial, VPtrTy); 2573 EltTys.push_back(VPtrMember); 2574 } 2575 2576 llvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy, 2577 SourceLocation Loc) { 2578 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 2579 llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc)); 2580 return T; 2581 } 2582 2583 llvm::DIType *CGDebugInfo::getOrCreateInterfaceType(QualType D, 2584 SourceLocation Loc) { 2585 return getOrCreateStandaloneType(D, Loc); 2586 } 2587 2588 llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D, 2589 SourceLocation Loc) { 2590 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 2591 assert(!D.isNull() && "null type"); 2592 llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc)); 2593 assert(T && "could not create debug info for type"); 2594 2595 RetainedTypes.push_back(D.getAsOpaquePtr()); 2596 return T; 2597 } 2598 2599 void CGDebugInfo::addHeapAllocSiteMetadata(llvm::CallBase *CI, 2600 QualType AllocatedTy, 2601 SourceLocation Loc) { 2602 if (CGM.getCodeGenOpts().getDebugInfo() <= 2603 llvm::codegenoptions::DebugLineTablesOnly) 2604 return; 2605 llvm::MDNode *node; 2606 if (AllocatedTy->isVoidType()) 2607 node = llvm::MDNode::get(CGM.getLLVMContext(), std::nullopt); 2608 else 2609 node = getOrCreateType(AllocatedTy, getOrCreateFile(Loc)); 2610 2611 CI->setMetadata("heapallocsite", node); 2612 } 2613 2614 void CGDebugInfo::completeType(const EnumDecl *ED) { 2615 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly) 2616 return; 2617 QualType Ty = CGM.getContext().getEnumType(ED); 2618 void *TyPtr = Ty.getAsOpaquePtr(); 2619 auto I = TypeCache.find(TyPtr); 2620 if (I == TypeCache.end() || !cast<llvm::DIType>(I->second)->isForwardDecl()) 2621 return; 2622 llvm::DIType *Res = CreateTypeDefinition(Ty->castAs<EnumType>()); 2623 assert(!Res->isForwardDecl()); 2624 TypeCache[TyPtr].reset(Res); 2625 } 2626 2627 void CGDebugInfo::completeType(const RecordDecl *RD) { 2628 if (DebugKind > llvm::codegenoptions::LimitedDebugInfo || 2629 !CGM.getLangOpts().CPlusPlus) 2630 completeRequiredType(RD); 2631 } 2632 2633 /// Return true if the class or any of its methods are marked dllimport. 2634 static bool isClassOrMethodDLLImport(const CXXRecordDecl *RD) { 2635 if (RD->hasAttr<DLLImportAttr>()) 2636 return true; 2637 for (const CXXMethodDecl *MD : RD->methods()) 2638 if (MD->hasAttr<DLLImportAttr>()) 2639 return true; 2640 return false; 2641 } 2642 2643 /// Does a type definition exist in an imported clang module? 2644 static bool isDefinedInClangModule(const RecordDecl *RD) { 2645 // Only definitions that where imported from an AST file come from a module. 2646 if (!RD || !RD->isFromASTFile()) 2647 return false; 2648 // Anonymous entities cannot be addressed. Treat them as not from module. 2649 if (!RD->isExternallyVisible() && RD->getName().empty()) 2650 return false; 2651 if (auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) { 2652 if (!CXXDecl->isCompleteDefinition()) 2653 return false; 2654 // Check wether RD is a template. 2655 auto TemplateKind = CXXDecl->getTemplateSpecializationKind(); 2656 if (TemplateKind != TSK_Undeclared) { 2657 // Unfortunately getOwningModule() isn't accurate enough to find the 2658 // owning module of a ClassTemplateSpecializationDecl that is inside a 2659 // namespace spanning multiple modules. 2660 bool Explicit = false; 2661 if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(CXXDecl)) 2662 Explicit = TD->isExplicitInstantiationOrSpecialization(); 2663 if (!Explicit && CXXDecl->getEnclosingNamespaceContext()) 2664 return false; 2665 // This is a template, check the origin of the first member. 2666 if (CXXDecl->field_begin() == CXXDecl->field_end()) 2667 return TemplateKind == TSK_ExplicitInstantiationDeclaration; 2668 if (!CXXDecl->field_begin()->isFromASTFile()) 2669 return false; 2670 } 2671 } 2672 return true; 2673 } 2674 2675 void CGDebugInfo::completeClassData(const RecordDecl *RD) { 2676 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) 2677 if (CXXRD->isDynamicClass() && 2678 CGM.getVTableLinkage(CXXRD) == 2679 llvm::GlobalValue::AvailableExternallyLinkage && 2680 !isClassOrMethodDLLImport(CXXRD)) 2681 return; 2682 2683 if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition())) 2684 return; 2685 2686 completeClass(RD); 2687 } 2688 2689 void CGDebugInfo::completeClass(const RecordDecl *RD) { 2690 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly) 2691 return; 2692 QualType Ty = CGM.getContext().getRecordType(RD); 2693 void *TyPtr = Ty.getAsOpaquePtr(); 2694 auto I = TypeCache.find(TyPtr); 2695 if (I != TypeCache.end() && !cast<llvm::DIType>(I->second)->isForwardDecl()) 2696 return; 2697 2698 // We want the canonical definition of the structure to not 2699 // be the typedef. Since that would lead to circular typedef 2700 // metadata. 2701 auto [Res, PrefRes] = CreateTypeDefinition(Ty->castAs<RecordType>()); 2702 assert(!Res->isForwardDecl()); 2703 TypeCache[TyPtr].reset(Res); 2704 } 2705 2706 static bool hasExplicitMemberDefinition(CXXRecordDecl::method_iterator I, 2707 CXXRecordDecl::method_iterator End) { 2708 for (CXXMethodDecl *MD : llvm::make_range(I, End)) 2709 if (FunctionDecl *Tmpl = MD->getInstantiatedFromMemberFunction()) 2710 if (!Tmpl->isImplicit() && Tmpl->isThisDeclarationADefinition() && 2711 !MD->getMemberSpecializationInfo()->isExplicitSpecialization()) 2712 return true; 2713 return false; 2714 } 2715 2716 static bool canUseCtorHoming(const CXXRecordDecl *RD) { 2717 // Constructor homing can be used for classes that cannnot be constructed 2718 // without emitting code for one of their constructors. This is classes that 2719 // don't have trivial or constexpr constructors, or can be created from 2720 // aggregate initialization. Also skip lambda objects because they don't call 2721 // constructors. 2722 2723 // Skip this optimization if the class or any of its methods are marked 2724 // dllimport. 2725 if (isClassOrMethodDLLImport(RD)) 2726 return false; 2727 2728 if (RD->isLambda() || RD->isAggregate() || 2729 RD->hasTrivialDefaultConstructor() || 2730 RD->hasConstexprNonCopyMoveConstructor()) 2731 return false; 2732 2733 for (const CXXConstructorDecl *Ctor : RD->ctors()) { 2734 if (Ctor->isCopyOrMoveConstructor()) 2735 continue; 2736 if (!Ctor->isDeleted()) 2737 return true; 2738 } 2739 return false; 2740 } 2741 2742 static bool shouldOmitDefinition(llvm::codegenoptions::DebugInfoKind DebugKind, 2743 bool DebugTypeExtRefs, const RecordDecl *RD, 2744 const LangOptions &LangOpts) { 2745 if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition())) 2746 return true; 2747 2748 if (auto *ES = RD->getASTContext().getExternalSource()) 2749 if (ES->hasExternalDefinitions(RD) == ExternalASTSource::EK_Always) 2750 return true; 2751 2752 // Only emit forward declarations in line tables only to keep debug info size 2753 // small. This only applies to CodeView, since we don't emit types in DWARF 2754 // line tables only. 2755 if (DebugKind == llvm::codegenoptions::DebugLineTablesOnly) 2756 return true; 2757 2758 if (DebugKind > llvm::codegenoptions::LimitedDebugInfo || 2759 RD->hasAttr<StandaloneDebugAttr>()) 2760 return false; 2761 2762 if (!LangOpts.CPlusPlus) 2763 return false; 2764 2765 if (!RD->isCompleteDefinitionRequired()) 2766 return true; 2767 2768 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 2769 2770 if (!CXXDecl) 2771 return false; 2772 2773 // Only emit complete debug info for a dynamic class when its vtable is 2774 // emitted. However, Microsoft debuggers don't resolve type information 2775 // across DLL boundaries, so skip this optimization if the class or any of its 2776 // methods are marked dllimport. This isn't a complete solution, since objects 2777 // without any dllimport methods can be used in one DLL and constructed in 2778 // another, but it is the current behavior of LimitedDebugInfo. 2779 if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass() && 2780 !isClassOrMethodDLLImport(CXXDecl)) 2781 return true; 2782 2783 TemplateSpecializationKind Spec = TSK_Undeclared; 2784 if (const auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RD)) 2785 Spec = SD->getSpecializationKind(); 2786 2787 if (Spec == TSK_ExplicitInstantiationDeclaration && 2788 hasExplicitMemberDefinition(CXXDecl->method_begin(), 2789 CXXDecl->method_end())) 2790 return true; 2791 2792 // In constructor homing mode, only emit complete debug info for a class 2793 // when its constructor is emitted. 2794 if ((DebugKind == llvm::codegenoptions::DebugInfoConstructor) && 2795 canUseCtorHoming(CXXDecl)) 2796 return true; 2797 2798 return false; 2799 } 2800 2801 void CGDebugInfo::completeRequiredType(const RecordDecl *RD) { 2802 if (shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD, CGM.getLangOpts())) 2803 return; 2804 2805 QualType Ty = CGM.getContext().getRecordType(RD); 2806 llvm::DIType *T = getTypeOrNull(Ty); 2807 if (T && T->isForwardDecl()) 2808 completeClassData(RD); 2809 } 2810 2811 llvm::DIType *CGDebugInfo::CreateType(const RecordType *Ty) { 2812 RecordDecl *RD = Ty->getDecl(); 2813 llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(QualType(Ty, 0))); 2814 if (T || shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD, 2815 CGM.getLangOpts())) { 2816 if (!T) 2817 T = getOrCreateRecordFwdDecl(Ty, getDeclContextDescriptor(RD)); 2818 return T; 2819 } 2820 2821 auto [Def, Pref] = CreateTypeDefinition(Ty); 2822 2823 return Pref ? Pref : Def; 2824 } 2825 2826 llvm::DIType *CGDebugInfo::GetPreferredNameType(const CXXRecordDecl *RD, 2827 llvm::DIFile *Unit) { 2828 if (!RD) 2829 return nullptr; 2830 2831 auto const *PNA = RD->getAttr<PreferredNameAttr>(); 2832 if (!PNA) 2833 return nullptr; 2834 2835 return getOrCreateType(PNA->getTypedefType(), Unit); 2836 } 2837 2838 std::pair<llvm::DIType *, llvm::DIType *> 2839 CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) { 2840 RecordDecl *RD = Ty->getDecl(); 2841 2842 // Get overall information about the record type for the debug info. 2843 llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation()); 2844 2845 // Records and classes and unions can all be recursive. To handle them, we 2846 // first generate a debug descriptor for the struct as a forward declaration. 2847 // Then (if it is a definition) we go through and get debug info for all of 2848 // its members. Finally, we create a descriptor for the complete type (which 2849 // may refer to the forward decl if the struct is recursive) and replace all 2850 // uses of the forward declaration with the final definition. 2851 llvm::DICompositeType *FwdDecl = getOrCreateLimitedType(Ty); 2852 2853 const RecordDecl *D = RD->getDefinition(); 2854 if (!D || !D->isCompleteDefinition()) 2855 return {FwdDecl, nullptr}; 2856 2857 if (const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) 2858 CollectContainingType(CXXDecl, FwdDecl); 2859 2860 // Push the struct on region stack. 2861 LexicalBlockStack.emplace_back(&*FwdDecl); 2862 RegionMap[Ty->getDecl()].reset(FwdDecl); 2863 2864 // Convert all the elements. 2865 SmallVector<llvm::Metadata *, 16> EltTys; 2866 // what about nested types? 2867 2868 // Note: The split of CXXDecl information here is intentional, the 2869 // gdb tests will depend on a certain ordering at printout. The debug 2870 // information offsets are still correct if we merge them all together 2871 // though. 2872 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 2873 if (CXXDecl) { 2874 CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl); 2875 CollectVTableInfo(CXXDecl, DefUnit, EltTys); 2876 } 2877 2878 // Collect data fields (including static variables and any initializers). 2879 CollectRecordFields(RD, DefUnit, EltTys, FwdDecl); 2880 if (CXXDecl && !CGM.getCodeGenOpts().DebugOmitUnreferencedMethods) 2881 CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl); 2882 2883 LexicalBlockStack.pop_back(); 2884 RegionMap.erase(Ty->getDecl()); 2885 2886 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys); 2887 DBuilder.replaceArrays(FwdDecl, Elements); 2888 2889 if (FwdDecl->isTemporary()) 2890 FwdDecl = 2891 llvm::MDNode::replaceWithPermanent(llvm::TempDICompositeType(FwdDecl)); 2892 2893 RegionMap[Ty->getDecl()].reset(FwdDecl); 2894 2895 if (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB) 2896 if (auto *PrefDI = GetPreferredNameType(CXXDecl, DefUnit)) 2897 return {FwdDecl, PrefDI}; 2898 2899 return {FwdDecl, nullptr}; 2900 } 2901 2902 llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectType *Ty, 2903 llvm::DIFile *Unit) { 2904 // Ignore protocols. 2905 return getOrCreateType(Ty->getBaseType(), Unit); 2906 } 2907 2908 llvm::DIType *CGDebugInfo::CreateType(const ObjCTypeParamType *Ty, 2909 llvm::DIFile *Unit) { 2910 // Ignore protocols. 2911 SourceLocation Loc = Ty->getDecl()->getLocation(); 2912 2913 // Use Typedefs to represent ObjCTypeParamType. 2914 return DBuilder.createTypedef( 2915 getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit), 2916 Ty->getDecl()->getName(), getOrCreateFile(Loc), getLineNumber(Loc), 2917 getDeclContextDescriptor(Ty->getDecl())); 2918 } 2919 2920 /// \return true if Getter has the default name for the property PD. 2921 static bool hasDefaultGetterName(const ObjCPropertyDecl *PD, 2922 const ObjCMethodDecl *Getter) { 2923 assert(PD); 2924 if (!Getter) 2925 return true; 2926 2927 assert(Getter->getDeclName().isObjCZeroArgSelector()); 2928 return PD->getName() == 2929 Getter->getDeclName().getObjCSelector().getNameForSlot(0); 2930 } 2931 2932 /// \return true if Setter has the default name for the property PD. 2933 static bool hasDefaultSetterName(const ObjCPropertyDecl *PD, 2934 const ObjCMethodDecl *Setter) { 2935 assert(PD); 2936 if (!Setter) 2937 return true; 2938 2939 assert(Setter->getDeclName().isObjCOneArgSelector()); 2940 return SelectorTable::constructSetterName(PD->getName()) == 2941 Setter->getDeclName().getObjCSelector().getNameForSlot(0); 2942 } 2943 2944 llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 2945 llvm::DIFile *Unit) { 2946 ObjCInterfaceDecl *ID = Ty->getDecl(); 2947 if (!ID) 2948 return nullptr; 2949 2950 // Return a forward declaration if this type was imported from a clang module, 2951 // and this is not the compile unit with the implementation of the type (which 2952 // may contain hidden ivars). 2953 if (DebugTypeExtRefs && ID->isFromASTFile() && ID->getDefinition() && 2954 !ID->getImplementation()) 2955 return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 2956 ID->getName(), 2957 getDeclContextDescriptor(ID), Unit, 0); 2958 2959 // Get overall information about the record type for the debug info. 2960 llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation()); 2961 unsigned Line = getLineNumber(ID->getLocation()); 2962 auto RuntimeLang = 2963 static_cast<llvm::dwarf::SourceLanguage>(TheCU->getSourceLanguage()); 2964 2965 // If this is just a forward declaration return a special forward-declaration 2966 // debug type since we won't be able to lay out the entire type. 2967 ObjCInterfaceDecl *Def = ID->getDefinition(); 2968 if (!Def || !Def->getImplementation()) { 2969 llvm::DIScope *Mod = getParentModuleOrNull(ID); 2970 llvm::DIType *FwdDecl = DBuilder.createReplaceableCompositeType( 2971 llvm::dwarf::DW_TAG_structure_type, ID->getName(), Mod ? Mod : TheCU, 2972 DefUnit, Line, RuntimeLang); 2973 ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit)); 2974 return FwdDecl; 2975 } 2976 2977 return CreateTypeDefinition(Ty, Unit); 2978 } 2979 2980 llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod, 2981 bool CreateSkeletonCU) { 2982 // Use the Module pointer as the key into the cache. This is a 2983 // nullptr if the "Module" is a PCH, which is safe because we don't 2984 // support chained PCH debug info, so there can only be a single PCH. 2985 const Module *M = Mod.getModuleOrNull(); 2986 auto ModRef = ModuleCache.find(M); 2987 if (ModRef != ModuleCache.end()) 2988 return cast<llvm::DIModule>(ModRef->second); 2989 2990 // Macro definitions that were defined with "-D" on the command line. 2991 SmallString<128> ConfigMacros; 2992 { 2993 llvm::raw_svector_ostream OS(ConfigMacros); 2994 const auto &PPOpts = CGM.getPreprocessorOpts(); 2995 unsigned I = 0; 2996 // Translate the macro definitions back into a command line. 2997 for (auto &M : PPOpts.Macros) { 2998 if (++I > 1) 2999 OS << " "; 3000 const std::string &Macro = M.first; 3001 bool Undef = M.second; 3002 OS << "\"-" << (Undef ? 'U' : 'D'); 3003 for (char c : Macro) 3004 switch (c) { 3005 case '\\': 3006 OS << "\\\\"; 3007 break; 3008 case '"': 3009 OS << "\\\""; 3010 break; 3011 default: 3012 OS << c; 3013 } 3014 OS << '\"'; 3015 } 3016 } 3017 3018 bool IsRootModule = M ? !M->Parent : true; 3019 // When a module name is specified as -fmodule-name, that module gets a 3020 // clang::Module object, but it won't actually be built or imported; it will 3021 // be textual. 3022 if (CreateSkeletonCU && IsRootModule && Mod.getASTFile().empty() && M) 3023 assert(StringRef(M->Name).starts_with(CGM.getLangOpts().ModuleName) && 3024 "clang module without ASTFile must be specified by -fmodule-name"); 3025 3026 // Return a StringRef to the remapped Path. 3027 auto RemapPath = [this](StringRef Path) -> std::string { 3028 std::string Remapped = remapDIPath(Path); 3029 StringRef Relative(Remapped); 3030 StringRef CompDir = TheCU->getDirectory(); 3031 if (Relative.consume_front(CompDir)) 3032 Relative.consume_front(llvm::sys::path::get_separator()); 3033 3034 return Relative.str(); 3035 }; 3036 3037 if (CreateSkeletonCU && IsRootModule && !Mod.getASTFile().empty()) { 3038 // PCH files don't have a signature field in the control block, 3039 // but LLVM detects skeleton CUs by looking for a non-zero DWO id. 3040 // We use the lower 64 bits for debug info. 3041 3042 uint64_t Signature = 0; 3043 if (const auto &ModSig = Mod.getSignature()) 3044 Signature = ModSig.truncatedValue(); 3045 else 3046 Signature = ~1ULL; 3047 3048 llvm::DIBuilder DIB(CGM.getModule()); 3049 SmallString<0> PCM; 3050 if (!llvm::sys::path::is_absolute(Mod.getASTFile())) { 3051 if (CGM.getHeaderSearchOpts().ModuleFileHomeIsCwd) 3052 PCM = getCurrentDirname(); 3053 else 3054 PCM = Mod.getPath(); 3055 } 3056 llvm::sys::path::append(PCM, Mod.getASTFile()); 3057 DIB.createCompileUnit( 3058 TheCU->getSourceLanguage(), 3059 // TODO: Support "Source" from external AST providers? 3060 DIB.createFile(Mod.getModuleName(), TheCU->getDirectory()), 3061 TheCU->getProducer(), false, StringRef(), 0, RemapPath(PCM), 3062 llvm::DICompileUnit::FullDebug, Signature); 3063 DIB.finalize(); 3064 } 3065 3066 llvm::DIModule *Parent = 3067 IsRootModule ? nullptr 3068 : getOrCreateModuleRef(ASTSourceDescriptor(*M->Parent), 3069 CreateSkeletonCU); 3070 std::string IncludePath = Mod.getPath().str(); 3071 llvm::DIModule *DIMod = 3072 DBuilder.createModule(Parent, Mod.getModuleName(), ConfigMacros, 3073 RemapPath(IncludePath)); 3074 ModuleCache[M].reset(DIMod); 3075 return DIMod; 3076 } 3077 3078 llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty, 3079 llvm::DIFile *Unit) { 3080 ObjCInterfaceDecl *ID = Ty->getDecl(); 3081 llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation()); 3082 unsigned Line = getLineNumber(ID->getLocation()); 3083 unsigned RuntimeLang = TheCU->getSourceLanguage(); 3084 3085 // Bit size, align and offset of the type. 3086 uint64_t Size = CGM.getContext().getTypeSize(Ty); 3087 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext()); 3088 3089 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 3090 if (ID->getImplementation()) 3091 Flags |= llvm::DINode::FlagObjcClassComplete; 3092 3093 llvm::DIScope *Mod = getParentModuleOrNull(ID); 3094 llvm::DICompositeType *RealDecl = DBuilder.createStructType( 3095 Mod ? Mod : Unit, ID->getName(), DefUnit, Line, Size, Align, Flags, 3096 nullptr, llvm::DINodeArray(), RuntimeLang); 3097 3098 QualType QTy(Ty, 0); 3099 TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl); 3100 3101 // Push the struct on region stack. 3102 LexicalBlockStack.emplace_back(RealDecl); 3103 RegionMap[Ty->getDecl()].reset(RealDecl); 3104 3105 // Convert all the elements. 3106 SmallVector<llvm::Metadata *, 16> EltTys; 3107 3108 ObjCInterfaceDecl *SClass = ID->getSuperClass(); 3109 if (SClass) { 3110 llvm::DIType *SClassTy = 3111 getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 3112 if (!SClassTy) 3113 return nullptr; 3114 3115 llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0, 0, 3116 llvm::DINode::FlagZero); 3117 EltTys.push_back(InhTag); 3118 } 3119 3120 // Create entries for all of the properties. 3121 auto AddProperty = [&](const ObjCPropertyDecl *PD) { 3122 SourceLocation Loc = PD->getLocation(); 3123 llvm::DIFile *PUnit = getOrCreateFile(Loc); 3124 unsigned PLine = getLineNumber(Loc); 3125 ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 3126 ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 3127 llvm::MDNode *PropertyNode = DBuilder.createObjCProperty( 3128 PD->getName(), PUnit, PLine, 3129 hasDefaultGetterName(PD, Getter) ? "" 3130 : getSelectorName(PD->getGetterName()), 3131 hasDefaultSetterName(PD, Setter) ? "" 3132 : getSelectorName(PD->getSetterName()), 3133 PD->getPropertyAttributes(), getOrCreateType(PD->getType(), PUnit)); 3134 EltTys.push_back(PropertyNode); 3135 }; 3136 { 3137 // Use 'char' for the isClassProperty bit as DenseSet requires space for 3138 // empty/tombstone keys in the data type (and bool is too small for that). 3139 typedef std::pair<char, const IdentifierInfo *> IsClassAndIdent; 3140 /// List of already emitted properties. Two distinct class and instance 3141 /// properties can share the same identifier (but not two instance 3142 /// properties or two class properties). 3143 llvm::DenseSet<IsClassAndIdent> PropertySet; 3144 /// Returns the IsClassAndIdent key for the given property. 3145 auto GetIsClassAndIdent = [](const ObjCPropertyDecl *PD) { 3146 return std::make_pair(PD->isClassProperty(), PD->getIdentifier()); 3147 }; 3148 for (const ObjCCategoryDecl *ClassExt : ID->known_extensions()) 3149 for (auto *PD : ClassExt->properties()) { 3150 PropertySet.insert(GetIsClassAndIdent(PD)); 3151 AddProperty(PD); 3152 } 3153 for (const auto *PD : ID->properties()) { 3154 // Don't emit duplicate metadata for properties that were already in a 3155 // class extension. 3156 if (!PropertySet.insert(GetIsClassAndIdent(PD)).second) 3157 continue; 3158 AddProperty(PD); 3159 } 3160 } 3161 3162 const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 3163 unsigned FieldNo = 0; 3164 for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field; 3165 Field = Field->getNextIvar(), ++FieldNo) { 3166 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit); 3167 if (!FieldTy) 3168 return nullptr; 3169 3170 StringRef FieldName = Field->getName(); 3171 3172 // Ignore unnamed fields. 3173 if (FieldName.empty()) 3174 continue; 3175 3176 // Get the location for the field. 3177 llvm::DIFile *FieldDefUnit = getOrCreateFile(Field->getLocation()); 3178 unsigned FieldLine = getLineNumber(Field->getLocation()); 3179 QualType FType = Field->getType(); 3180 uint64_t FieldSize = 0; 3181 uint32_t FieldAlign = 0; 3182 3183 if (!FType->isIncompleteArrayType()) { 3184 3185 // Bit size, align and offset of the type. 3186 FieldSize = Field->isBitField() 3187 ? Field->getBitWidthValue(CGM.getContext()) 3188 : CGM.getContext().getTypeSize(FType); 3189 FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext()); 3190 } 3191 3192 uint64_t FieldOffset; 3193 if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { 3194 // We don't know the runtime offset of an ivar if we're using the 3195 // non-fragile ABI. For bitfields, use the bit offset into the first 3196 // byte of storage of the bitfield. For other fields, use zero. 3197 if (Field->isBitField()) { 3198 FieldOffset = 3199 CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field); 3200 FieldOffset %= CGM.getContext().getCharWidth(); 3201 } else { 3202 FieldOffset = 0; 3203 } 3204 } else { 3205 FieldOffset = RL.getFieldOffset(FieldNo); 3206 } 3207 3208 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 3209 if (Field->getAccessControl() == ObjCIvarDecl::Protected) 3210 Flags = llvm::DINode::FlagProtected; 3211 else if (Field->getAccessControl() == ObjCIvarDecl::Private) 3212 Flags = llvm::DINode::FlagPrivate; 3213 else if (Field->getAccessControl() == ObjCIvarDecl::Public) 3214 Flags = llvm::DINode::FlagPublic; 3215 3216 if (Field->isBitField()) 3217 Flags |= llvm::DINode::FlagBitField; 3218 3219 llvm::MDNode *PropertyNode = nullptr; 3220 if (ObjCImplementationDecl *ImpD = ID->getImplementation()) { 3221 if (ObjCPropertyImplDecl *PImpD = 3222 ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) { 3223 if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) { 3224 SourceLocation Loc = PD->getLocation(); 3225 llvm::DIFile *PUnit = getOrCreateFile(Loc); 3226 unsigned PLine = getLineNumber(Loc); 3227 ObjCMethodDecl *Getter = PImpD->getGetterMethodDecl(); 3228 ObjCMethodDecl *Setter = PImpD->getSetterMethodDecl(); 3229 PropertyNode = DBuilder.createObjCProperty( 3230 PD->getName(), PUnit, PLine, 3231 hasDefaultGetterName(PD, Getter) 3232 ? "" 3233 : getSelectorName(PD->getGetterName()), 3234 hasDefaultSetterName(PD, Setter) 3235 ? "" 3236 : getSelectorName(PD->getSetterName()), 3237 PD->getPropertyAttributes(), 3238 getOrCreateType(PD->getType(), PUnit)); 3239 } 3240 } 3241 } 3242 FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, FieldLine, 3243 FieldSize, FieldAlign, FieldOffset, Flags, 3244 FieldTy, PropertyNode); 3245 EltTys.push_back(FieldTy); 3246 } 3247 3248 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys); 3249 DBuilder.replaceArrays(RealDecl, Elements); 3250 3251 LexicalBlockStack.pop_back(); 3252 return RealDecl; 3253 } 3254 3255 llvm::DIType *CGDebugInfo::CreateType(const VectorType *Ty, 3256 llvm::DIFile *Unit) { 3257 if (Ty->isExtVectorBoolType()) { 3258 // Boolean ext_vector_type(N) are special because their real element type 3259 // (bits of bit size) is not their Clang element type (_Bool of size byte). 3260 // For now, we pretend the boolean vector were actually a vector of bytes 3261 // (where each byte represents 8 bits of the actual vector). 3262 // FIXME Debug info should actually represent this proper as a vector mask 3263 // type. 3264 auto &Ctx = CGM.getContext(); 3265 uint64_t Size = CGM.getContext().getTypeSize(Ty); 3266 uint64_t NumVectorBytes = Size / Ctx.getCharWidth(); 3267 3268 // Construct the vector of 'char' type. 3269 QualType CharVecTy = 3270 Ctx.getVectorType(Ctx.CharTy, NumVectorBytes, VectorKind::Generic); 3271 return CreateType(CharVecTy->getAs<VectorType>(), Unit); 3272 } 3273 3274 llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit); 3275 int64_t Count = Ty->getNumElements(); 3276 3277 llvm::Metadata *Subscript; 3278 QualType QTy(Ty, 0); 3279 auto SizeExpr = SizeExprCache.find(QTy); 3280 if (SizeExpr != SizeExprCache.end()) 3281 Subscript = DBuilder.getOrCreateSubrange( 3282 SizeExpr->getSecond() /*count*/, nullptr /*lowerBound*/, 3283 nullptr /*upperBound*/, nullptr /*stride*/); 3284 else { 3285 auto *CountNode = 3286 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned( 3287 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Count ? Count : -1)); 3288 Subscript = DBuilder.getOrCreateSubrange( 3289 CountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/, 3290 nullptr /*stride*/); 3291 } 3292 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 3293 3294 uint64_t Size = CGM.getContext().getTypeSize(Ty); 3295 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext()); 3296 3297 return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray); 3298 } 3299 3300 llvm::DIType *CGDebugInfo::CreateType(const ConstantMatrixType *Ty, 3301 llvm::DIFile *Unit) { 3302 // FIXME: Create another debug type for matrices 3303 // For the time being, it treats it like a nested ArrayType. 3304 3305 llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit); 3306 uint64_t Size = CGM.getContext().getTypeSize(Ty); 3307 uint32_t Align = getTypeAlignIfRequired(Ty, CGM.getContext()); 3308 3309 // Create ranges for both dimensions. 3310 llvm::SmallVector<llvm::Metadata *, 2> Subscripts; 3311 auto *ColumnCountNode = 3312 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned( 3313 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Ty->getNumColumns())); 3314 auto *RowCountNode = 3315 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned( 3316 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Ty->getNumRows())); 3317 Subscripts.push_back(DBuilder.getOrCreateSubrange( 3318 ColumnCountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/, 3319 nullptr /*stride*/)); 3320 Subscripts.push_back(DBuilder.getOrCreateSubrange( 3321 RowCountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/, 3322 nullptr /*stride*/)); 3323 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 3324 return DBuilder.createArrayType(Size, Align, ElementTy, SubscriptArray); 3325 } 3326 3327 llvm::DIType *CGDebugInfo::CreateType(const ArrayType *Ty, llvm::DIFile *Unit) { 3328 uint64_t Size; 3329 uint32_t Align; 3330 3331 // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 3332 if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) { 3333 Size = 0; 3334 Align = getTypeAlignIfRequired(CGM.getContext().getBaseElementType(VAT), 3335 CGM.getContext()); 3336 } else if (Ty->isIncompleteArrayType()) { 3337 Size = 0; 3338 if (Ty->getElementType()->isIncompleteType()) 3339 Align = 0; 3340 else 3341 Align = getTypeAlignIfRequired(Ty->getElementType(), CGM.getContext()); 3342 } else if (Ty->isIncompleteType()) { 3343 Size = 0; 3344 Align = 0; 3345 } else { 3346 // Size and align of the whole array, not the element type. 3347 Size = CGM.getContext().getTypeSize(Ty); 3348 Align = getTypeAlignIfRequired(Ty, CGM.getContext()); 3349 } 3350 3351 // Add the dimensions of the array. FIXME: This loses CV qualifiers from 3352 // interior arrays, do we care? Why aren't nested arrays represented the 3353 // obvious/recursive way? 3354 SmallVector<llvm::Metadata *, 8> Subscripts; 3355 QualType EltTy(Ty, 0); 3356 while ((Ty = dyn_cast<ArrayType>(EltTy))) { 3357 // If the number of elements is known, then count is that number. Otherwise, 3358 // it's -1. This allows us to represent a subrange with an array of 0 3359 // elements, like this: 3360 // 3361 // struct foo { 3362 // int x[0]; 3363 // }; 3364 int64_t Count = -1; // Count == -1 is an unbounded array. 3365 if (const auto *CAT = dyn_cast<ConstantArrayType>(Ty)) 3366 Count = CAT->getZExtSize(); 3367 else if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) { 3368 if (Expr *Size = VAT->getSizeExpr()) { 3369 Expr::EvalResult Result; 3370 if (Size->EvaluateAsInt(Result, CGM.getContext())) 3371 Count = Result.Val.getInt().getExtValue(); 3372 } 3373 } 3374 3375 auto SizeNode = SizeExprCache.find(EltTy); 3376 if (SizeNode != SizeExprCache.end()) 3377 Subscripts.push_back(DBuilder.getOrCreateSubrange( 3378 SizeNode->getSecond() /*count*/, nullptr /*lowerBound*/, 3379 nullptr /*upperBound*/, nullptr /*stride*/)); 3380 else { 3381 auto *CountNode = 3382 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned( 3383 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Count)); 3384 Subscripts.push_back(DBuilder.getOrCreateSubrange( 3385 CountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/, 3386 nullptr /*stride*/)); 3387 } 3388 EltTy = Ty->getElementType(); 3389 } 3390 3391 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 3392 3393 return DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit), 3394 SubscriptArray); 3395 } 3396 3397 llvm::DIType *CGDebugInfo::CreateType(const LValueReferenceType *Ty, 3398 llvm::DIFile *Unit) { 3399 return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, Ty, 3400 Ty->getPointeeType(), Unit); 3401 } 3402 3403 llvm::DIType *CGDebugInfo::CreateType(const RValueReferenceType *Ty, 3404 llvm::DIFile *Unit) { 3405 llvm::dwarf::Tag Tag = llvm::dwarf::DW_TAG_rvalue_reference_type; 3406 // DW_TAG_rvalue_reference_type was introduced in DWARF 4. 3407 if (CGM.getCodeGenOpts().DebugStrictDwarf && 3408 CGM.getCodeGenOpts().DwarfVersion < 4) 3409 Tag = llvm::dwarf::DW_TAG_reference_type; 3410 3411 return CreatePointerLikeType(Tag, Ty, Ty->getPointeeType(), Unit); 3412 } 3413 3414 llvm::DIType *CGDebugInfo::CreateType(const MemberPointerType *Ty, 3415 llvm::DIFile *U) { 3416 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 3417 uint64_t Size = 0; 3418 3419 if (!Ty->isIncompleteType()) { 3420 Size = CGM.getContext().getTypeSize(Ty); 3421 3422 // Set the MS inheritance model. There is no flag for the unspecified model. 3423 if (CGM.getTarget().getCXXABI().isMicrosoft()) { 3424 switch (Ty->getMostRecentCXXRecordDecl()->getMSInheritanceModel()) { 3425 case MSInheritanceModel::Single: 3426 Flags |= llvm::DINode::FlagSingleInheritance; 3427 break; 3428 case MSInheritanceModel::Multiple: 3429 Flags |= llvm::DINode::FlagMultipleInheritance; 3430 break; 3431 case MSInheritanceModel::Virtual: 3432 Flags |= llvm::DINode::FlagVirtualInheritance; 3433 break; 3434 case MSInheritanceModel::Unspecified: 3435 break; 3436 } 3437 } 3438 } 3439 3440 llvm::DIType *ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U); 3441 if (Ty->isMemberDataPointerType()) 3442 return DBuilder.createMemberPointerType( 3443 getOrCreateType(Ty->getPointeeType(), U), ClassType, Size, /*Align=*/0, 3444 Flags); 3445 3446 const FunctionProtoType *FPT = 3447 Ty->getPointeeType()->castAs<FunctionProtoType>(); 3448 return DBuilder.createMemberPointerType( 3449 getOrCreateInstanceMethodType( 3450 CXXMethodDecl::getThisType(FPT, Ty->getMostRecentCXXRecordDecl()), 3451 FPT, U), 3452 ClassType, Size, /*Align=*/0, Flags); 3453 } 3454 3455 llvm::DIType *CGDebugInfo::CreateType(const AtomicType *Ty, llvm::DIFile *U) { 3456 auto *FromTy = getOrCreateType(Ty->getValueType(), U); 3457 return DBuilder.createQualifiedType(llvm::dwarf::DW_TAG_atomic_type, FromTy); 3458 } 3459 3460 llvm::DIType *CGDebugInfo::CreateType(const PipeType *Ty, llvm::DIFile *U) { 3461 return getOrCreateType(Ty->getElementType(), U); 3462 } 3463 3464 llvm::DIType *CGDebugInfo::CreateEnumType(const EnumType *Ty) { 3465 const EnumDecl *ED = Ty->getDecl(); 3466 3467 uint64_t Size = 0; 3468 uint32_t Align = 0; 3469 if (!ED->getTypeForDecl()->isIncompleteType()) { 3470 Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 3471 Align = getDeclAlignIfRequired(ED, CGM.getContext()); 3472 } 3473 3474 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU); 3475 3476 bool isImportedFromModule = 3477 DebugTypeExtRefs && ED->isFromASTFile() && ED->getDefinition(); 3478 3479 // If this is just a forward declaration, construct an appropriately 3480 // marked node and just return it. 3481 if (isImportedFromModule || !ED->getDefinition()) { 3482 // Note that it is possible for enums to be created as part of 3483 // their own declcontext. In this case a FwdDecl will be created 3484 // twice. This doesn't cause a problem because both FwdDecls are 3485 // entered into the ReplaceMap: finalize() will replace the first 3486 // FwdDecl with the second and then replace the second with 3487 // complete type. 3488 llvm::DIScope *EDContext = getDeclContextDescriptor(ED); 3489 llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation()); 3490 llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType( 3491 llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit, 0)); 3492 3493 unsigned Line = getLineNumber(ED->getLocation()); 3494 StringRef EDName = ED->getName(); 3495 llvm::DIType *RetTy = DBuilder.createReplaceableCompositeType( 3496 llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line, 3497 0, Size, Align, llvm::DINode::FlagFwdDecl, Identifier); 3498 3499 ReplaceMap.emplace_back( 3500 std::piecewise_construct, std::make_tuple(Ty), 3501 std::make_tuple(static_cast<llvm::Metadata *>(RetTy))); 3502 return RetTy; 3503 } 3504 3505 return CreateTypeDefinition(Ty); 3506 } 3507 3508 llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) { 3509 const EnumDecl *ED = Ty->getDecl(); 3510 uint64_t Size = 0; 3511 uint32_t Align = 0; 3512 if (!ED->getTypeForDecl()->isIncompleteType()) { 3513 Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 3514 Align = getDeclAlignIfRequired(ED, CGM.getContext()); 3515 } 3516 3517 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU); 3518 3519 SmallVector<llvm::Metadata *, 16> Enumerators; 3520 ED = ED->getDefinition(); 3521 for (const auto *Enum : ED->enumerators()) { 3522 Enumerators.push_back( 3523 DBuilder.createEnumerator(Enum->getName(), Enum->getInitVal())); 3524 } 3525 3526 // Return a CompositeType for the enum itself. 3527 llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators); 3528 3529 llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation()); 3530 unsigned Line = getLineNumber(ED->getLocation()); 3531 llvm::DIScope *EnumContext = getDeclContextDescriptor(ED); 3532 llvm::DIType *ClassTy = getOrCreateType(ED->getIntegerType(), DefUnit); 3533 return DBuilder.createEnumerationType( 3534 EnumContext, ED->getName(), DefUnit, Line, Size, Align, EltArray, ClassTy, 3535 /*RunTimeLang=*/0, Identifier, ED->isScoped()); 3536 } 3537 3538 llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent, 3539 unsigned MType, SourceLocation LineLoc, 3540 StringRef Name, StringRef Value) { 3541 unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc); 3542 return DBuilder.createMacro(Parent, Line, MType, Name, Value); 3543 } 3544 3545 llvm::DIMacroFile *CGDebugInfo::CreateTempMacroFile(llvm::DIMacroFile *Parent, 3546 SourceLocation LineLoc, 3547 SourceLocation FileLoc) { 3548 llvm::DIFile *FName = getOrCreateFile(FileLoc); 3549 unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc); 3550 return DBuilder.createTempMacroFile(Parent, Line, FName); 3551 } 3552 3553 llvm::DILocation *CGDebugInfo::CreateTrapFailureMessageFor( 3554 llvm::DebugLoc TrapLocation, StringRef Category, StringRef FailureMsg) { 3555 // Create a debug location from `TrapLocation` that adds an artificial inline 3556 // frame. 3557 SmallString<64> FuncName(ClangTrapPrefix); 3558 3559 FuncName += "$"; 3560 FuncName += Category; 3561 FuncName += "$"; 3562 FuncName += FailureMsg; 3563 3564 llvm::DISubprogram *TrapSP = 3565 createInlinedTrapSubprogram(FuncName, TrapLocation->getFile()); 3566 return llvm::DILocation::get(CGM.getLLVMContext(), /*Line=*/0, /*Column=*/0, 3567 /*Scope=*/TrapSP, /*InlinedAt=*/TrapLocation); 3568 } 3569 3570 static QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) { 3571 Qualifiers Quals; 3572 do { 3573 Qualifiers InnerQuals = T.getLocalQualifiers(); 3574 // Qualifiers::operator+() doesn't like it if you add a Qualifier 3575 // that is already there. 3576 Quals += Qualifiers::removeCommonQualifiers(Quals, InnerQuals); 3577 Quals += InnerQuals; 3578 QualType LastT = T; 3579 switch (T->getTypeClass()) { 3580 default: 3581 return C.getQualifiedType(T.getTypePtr(), Quals); 3582 case Type::TemplateSpecialization: { 3583 const auto *Spec = cast<TemplateSpecializationType>(T); 3584 if (Spec->isTypeAlias()) 3585 return C.getQualifiedType(T.getTypePtr(), Quals); 3586 T = Spec->desugar(); 3587 break; 3588 } 3589 case Type::TypeOfExpr: 3590 T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); 3591 break; 3592 case Type::TypeOf: 3593 T = cast<TypeOfType>(T)->getUnmodifiedType(); 3594 break; 3595 case Type::Decltype: 3596 T = cast<DecltypeType>(T)->getUnderlyingType(); 3597 break; 3598 case Type::UnaryTransform: 3599 T = cast<UnaryTransformType>(T)->getUnderlyingType(); 3600 break; 3601 case Type::Attributed: 3602 T = cast<AttributedType>(T)->getEquivalentType(); 3603 break; 3604 case Type::BTFTagAttributed: 3605 T = cast<BTFTagAttributedType>(T)->getWrappedType(); 3606 break; 3607 case Type::CountAttributed: 3608 T = cast<CountAttributedType>(T)->desugar(); 3609 break; 3610 case Type::Elaborated: 3611 T = cast<ElaboratedType>(T)->getNamedType(); 3612 break; 3613 case Type::Using: 3614 T = cast<UsingType>(T)->getUnderlyingType(); 3615 break; 3616 case Type::Paren: 3617 T = cast<ParenType>(T)->getInnerType(); 3618 break; 3619 case Type::MacroQualified: 3620 T = cast<MacroQualifiedType>(T)->getUnderlyingType(); 3621 break; 3622 case Type::SubstTemplateTypeParm: 3623 T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 3624 break; 3625 case Type::Auto: 3626 case Type::DeducedTemplateSpecialization: { 3627 QualType DT = cast<DeducedType>(T)->getDeducedType(); 3628 assert(!DT.isNull() && "Undeduced types shouldn't reach here."); 3629 T = DT; 3630 break; 3631 } 3632 case Type::PackIndexing: { 3633 T = cast<PackIndexingType>(T)->getSelectedType(); 3634 break; 3635 } 3636 case Type::Adjusted: 3637 case Type::Decayed: 3638 // Decayed and adjusted types use the adjusted type in LLVM and DWARF. 3639 T = cast<AdjustedType>(T)->getAdjustedType(); 3640 break; 3641 } 3642 3643 assert(T != LastT && "Type unwrapping failed to unwrap!"); 3644 (void)LastT; 3645 } while (true); 3646 } 3647 3648 llvm::DIType *CGDebugInfo::getTypeOrNull(QualType Ty) { 3649 assert(Ty == UnwrapTypeForDebugInfo(Ty, CGM.getContext())); 3650 auto It = TypeCache.find(Ty.getAsOpaquePtr()); 3651 if (It != TypeCache.end()) { 3652 // Verify that the debug info still exists. 3653 if (llvm::Metadata *V = It->second) 3654 return cast<llvm::DIType>(V); 3655 } 3656 3657 return nullptr; 3658 } 3659 3660 void CGDebugInfo::completeTemplateDefinition( 3661 const ClassTemplateSpecializationDecl &SD) { 3662 completeUnusedClass(SD); 3663 } 3664 3665 void CGDebugInfo::completeUnusedClass(const CXXRecordDecl &D) { 3666 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly || 3667 D.isDynamicClass()) 3668 return; 3669 3670 completeClassData(&D); 3671 // In case this type has no member function definitions being emitted, ensure 3672 // it is retained 3673 RetainedTypes.push_back(CGM.getContext().getRecordType(&D).getAsOpaquePtr()); 3674 } 3675 3676 llvm::DIType *CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile *Unit) { 3677 if (Ty.isNull()) 3678 return nullptr; 3679 3680 llvm::TimeTraceScope TimeScope("DebugType", [&]() { 3681 std::string Name; 3682 llvm::raw_string_ostream OS(Name); 3683 Ty.print(OS, getPrintingPolicy()); 3684 return Name; 3685 }); 3686 3687 // Unwrap the type as needed for debug information. 3688 Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 3689 3690 if (auto *T = getTypeOrNull(Ty)) 3691 return T; 3692 3693 llvm::DIType *Res = CreateTypeNode(Ty, Unit); 3694 void *TyPtr = Ty.getAsOpaquePtr(); 3695 3696 // And update the type cache. 3697 TypeCache[TyPtr].reset(Res); 3698 3699 return Res; 3700 } 3701 3702 llvm::DIModule *CGDebugInfo::getParentModuleOrNull(const Decl *D) { 3703 // A forward declaration inside a module header does not belong to the module. 3704 if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->getDefinition()) 3705 return nullptr; 3706 if (DebugTypeExtRefs && D->isFromASTFile()) { 3707 // Record a reference to an imported clang module or precompiled header. 3708 auto *Reader = CGM.getContext().getExternalSource(); 3709 auto Idx = D->getOwningModuleID(); 3710 auto Info = Reader->getSourceDescriptor(Idx); 3711 if (Info) 3712 return getOrCreateModuleRef(*Info, /*SkeletonCU=*/true); 3713 } else if (ClangModuleMap) { 3714 // We are building a clang module or a precompiled header. 3715 // 3716 // TODO: When D is a CXXRecordDecl or a C++ Enum, the ODR applies 3717 // and it wouldn't be necessary to specify the parent scope 3718 // because the type is already unique by definition (it would look 3719 // like the output of -fno-standalone-debug). On the other hand, 3720 // the parent scope helps a consumer to quickly locate the object 3721 // file where the type's definition is located, so it might be 3722 // best to make this behavior a command line or debugger tuning 3723 // option. 3724 if (Module *M = D->getOwningModule()) { 3725 // This is a (sub-)module. 3726 auto Info = ASTSourceDescriptor(*M); 3727 return getOrCreateModuleRef(Info, /*SkeletonCU=*/false); 3728 } else { 3729 // This the precompiled header being built. 3730 return getOrCreateModuleRef(PCHDescriptor, /*SkeletonCU=*/false); 3731 } 3732 } 3733 3734 return nullptr; 3735 } 3736 3737 llvm::DIType *CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile *Unit) { 3738 // Handle qualifiers, which recursively handles what they refer to. 3739 if (Ty.hasLocalQualifiers()) 3740 return CreateQualifiedType(Ty, Unit); 3741 3742 // Work out details of type. 3743 switch (Ty->getTypeClass()) { 3744 #define TYPE(Class, Base) 3745 #define ABSTRACT_TYPE(Class, Base) 3746 #define NON_CANONICAL_TYPE(Class, Base) 3747 #define DEPENDENT_TYPE(Class, Base) case Type::Class: 3748 #include "clang/AST/TypeNodes.inc" 3749 llvm_unreachable("Dependent types cannot show up in debug information"); 3750 3751 case Type::ExtVector: 3752 case Type::Vector: 3753 return CreateType(cast<VectorType>(Ty), Unit); 3754 case Type::ConstantMatrix: 3755 return CreateType(cast<ConstantMatrixType>(Ty), Unit); 3756 case Type::ObjCObjectPointer: 3757 return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 3758 case Type::ObjCObject: 3759 return CreateType(cast<ObjCObjectType>(Ty), Unit); 3760 case Type::ObjCTypeParam: 3761 return CreateType(cast<ObjCTypeParamType>(Ty), Unit); 3762 case Type::ObjCInterface: 3763 return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 3764 case Type::Builtin: 3765 return CreateType(cast<BuiltinType>(Ty)); 3766 case Type::Complex: 3767 return CreateType(cast<ComplexType>(Ty)); 3768 case Type::Pointer: 3769 return CreateType(cast<PointerType>(Ty), Unit); 3770 case Type::BlockPointer: 3771 return CreateType(cast<BlockPointerType>(Ty), Unit); 3772 case Type::Typedef: 3773 return CreateType(cast<TypedefType>(Ty), Unit); 3774 case Type::Record: 3775 return CreateType(cast<RecordType>(Ty)); 3776 case Type::Enum: 3777 return CreateEnumType(cast<EnumType>(Ty)); 3778 case Type::FunctionProto: 3779 case Type::FunctionNoProto: 3780 return CreateType(cast<FunctionType>(Ty), Unit); 3781 case Type::ConstantArray: 3782 case Type::VariableArray: 3783 case Type::IncompleteArray: 3784 case Type::ArrayParameter: 3785 return CreateType(cast<ArrayType>(Ty), Unit); 3786 3787 case Type::LValueReference: 3788 return CreateType(cast<LValueReferenceType>(Ty), Unit); 3789 case Type::RValueReference: 3790 return CreateType(cast<RValueReferenceType>(Ty), Unit); 3791 3792 case Type::MemberPointer: 3793 return CreateType(cast<MemberPointerType>(Ty), Unit); 3794 3795 case Type::Atomic: 3796 return CreateType(cast<AtomicType>(Ty), Unit); 3797 3798 case Type::BitInt: 3799 return CreateType(cast<BitIntType>(Ty)); 3800 case Type::Pipe: 3801 return CreateType(cast<PipeType>(Ty), Unit); 3802 3803 case Type::TemplateSpecialization: 3804 return CreateType(cast<TemplateSpecializationType>(Ty), Unit); 3805 3806 case Type::CountAttributed: 3807 case Type::Auto: 3808 case Type::Attributed: 3809 case Type::BTFTagAttributed: 3810 case Type::Adjusted: 3811 case Type::Decayed: 3812 case Type::DeducedTemplateSpecialization: 3813 case Type::Elaborated: 3814 case Type::Using: 3815 case Type::Paren: 3816 case Type::MacroQualified: 3817 case Type::SubstTemplateTypeParm: 3818 case Type::TypeOfExpr: 3819 case Type::TypeOf: 3820 case Type::Decltype: 3821 case Type::PackIndexing: 3822 case Type::UnaryTransform: 3823 break; 3824 } 3825 3826 llvm_unreachable("type should have been unwrapped!"); 3827 } 3828 3829 llvm::DICompositeType * 3830 CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty) { 3831 QualType QTy(Ty, 0); 3832 3833 auto *T = cast_or_null<llvm::DICompositeType>(getTypeOrNull(QTy)); 3834 3835 // We may have cached a forward decl when we could have created 3836 // a non-forward decl. Go ahead and create a non-forward decl 3837 // now. 3838 if (T && !T->isForwardDecl()) 3839 return T; 3840 3841 // Otherwise create the type. 3842 llvm::DICompositeType *Res = CreateLimitedType(Ty); 3843 3844 // Propagate members from the declaration to the definition 3845 // CreateType(const RecordType*) will overwrite this with the members in the 3846 // correct order if the full type is needed. 3847 DBuilder.replaceArrays(Res, T ? T->getElements() : llvm::DINodeArray()); 3848 3849 // And update the type cache. 3850 TypeCache[QTy.getAsOpaquePtr()].reset(Res); 3851 return Res; 3852 } 3853 3854 // TODO: Currently used for context chains when limiting debug info. 3855 llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) { 3856 RecordDecl *RD = Ty->getDecl(); 3857 3858 // Get overall information about the record type for the debug info. 3859 StringRef RDName = getClassName(RD); 3860 const SourceLocation Loc = RD->getLocation(); 3861 llvm::DIFile *DefUnit = nullptr; 3862 unsigned Line = 0; 3863 if (Loc.isValid()) { 3864 DefUnit = getOrCreateFile(Loc); 3865 Line = getLineNumber(Loc); 3866 } 3867 3868 llvm::DIScope *RDContext = getDeclContextDescriptor(RD); 3869 3870 // If we ended up creating the type during the context chain construction, 3871 // just return that. 3872 auto *T = cast_or_null<llvm::DICompositeType>( 3873 getTypeOrNull(CGM.getContext().getRecordType(RD))); 3874 if (T && (!T->isForwardDecl() || !RD->getDefinition())) 3875 return T; 3876 3877 // If this is just a forward or incomplete declaration, construct an 3878 // appropriately marked node and just return it. 3879 const RecordDecl *D = RD->getDefinition(); 3880 if (!D || !D->isCompleteDefinition()) 3881 return getOrCreateRecordFwdDecl(Ty, RDContext); 3882 3883 uint64_t Size = CGM.getContext().getTypeSize(Ty); 3884 // __attribute__((aligned)) can increase or decrease alignment *except* on a 3885 // struct or struct member, where it only increases alignment unless 'packed' 3886 // is also specified. To handle this case, the `getTypeAlignIfRequired` needs 3887 // to be used. 3888 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext()); 3889 3890 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU); 3891 3892 // Explicitly record the calling convention and export symbols for C++ 3893 // records. 3894 auto Flags = llvm::DINode::FlagZero; 3895 if (auto CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 3896 if (CGM.getCXXABI().getRecordArgABI(CXXRD) == CGCXXABI::RAA_Indirect) 3897 Flags |= llvm::DINode::FlagTypePassByReference; 3898 else 3899 Flags |= llvm::DINode::FlagTypePassByValue; 3900 3901 // Record if a C++ record is non-trivial type. 3902 if (!CXXRD->isTrivial()) 3903 Flags |= llvm::DINode::FlagNonTrivial; 3904 3905 // Record exports it symbols to the containing structure. 3906 if (CXXRD->isAnonymousStructOrUnion()) 3907 Flags |= llvm::DINode::FlagExportSymbols; 3908 3909 Flags |= getAccessFlag(CXXRD->getAccess(), 3910 dyn_cast<CXXRecordDecl>(CXXRD->getDeclContext())); 3911 } 3912 3913 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D); 3914 llvm::DICompositeType *RealDecl = DBuilder.createReplaceableCompositeType( 3915 getTagForRecord(RD), RDName, RDContext, DefUnit, Line, 0, Size, Align, 3916 Flags, Identifier, Annotations); 3917 3918 // Elements of composite types usually have back to the type, creating 3919 // uniquing cycles. Distinct nodes are more efficient. 3920 switch (RealDecl->getTag()) { 3921 default: 3922 llvm_unreachable("invalid composite type tag"); 3923 3924 case llvm::dwarf::DW_TAG_array_type: 3925 case llvm::dwarf::DW_TAG_enumeration_type: 3926 // Array elements and most enumeration elements don't have back references, 3927 // so they don't tend to be involved in uniquing cycles and there is some 3928 // chance of merging them when linking together two modules. Only make 3929 // them distinct if they are ODR-uniqued. 3930 if (Identifier.empty()) 3931 break; 3932 [[fallthrough]]; 3933 3934 case llvm::dwarf::DW_TAG_structure_type: 3935 case llvm::dwarf::DW_TAG_union_type: 3936 case llvm::dwarf::DW_TAG_class_type: 3937 // Immediately resolve to a distinct node. 3938 RealDecl = 3939 llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl)); 3940 break; 3941 } 3942 3943 RegionMap[Ty->getDecl()].reset(RealDecl); 3944 TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl); 3945 3946 if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD)) 3947 DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(), 3948 CollectCXXTemplateParams(TSpecial, DefUnit)); 3949 return RealDecl; 3950 } 3951 3952 void CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD, 3953 llvm::DICompositeType *RealDecl) { 3954 // A class's primary base or the class itself contains the vtable. 3955 llvm::DIType *ContainingType = nullptr; 3956 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 3957 if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) { 3958 // Seek non-virtual primary base root. 3959 while (true) { 3960 const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase); 3961 const CXXRecordDecl *PBT = BRL.getPrimaryBase(); 3962 if (PBT && !BRL.isPrimaryBaseVirtual()) 3963 PBase = PBT; 3964 else 3965 break; 3966 } 3967 ContainingType = getOrCreateType(QualType(PBase->getTypeForDecl(), 0), 3968 getOrCreateFile(RD->getLocation())); 3969 } else if (RD->isDynamicClass()) 3970 ContainingType = RealDecl; 3971 3972 DBuilder.replaceVTableHolder(RealDecl, ContainingType); 3973 } 3974 3975 llvm::DIType *CGDebugInfo::CreateMemberType(llvm::DIFile *Unit, QualType FType, 3976 StringRef Name, uint64_t *Offset) { 3977 llvm::DIType *FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 3978 uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 3979 auto FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext()); 3980 llvm::DIType *Ty = 3981 DBuilder.createMemberType(Unit, Name, Unit, 0, FieldSize, FieldAlign, 3982 *Offset, llvm::DINode::FlagZero, FieldTy); 3983 *Offset += FieldSize; 3984 return Ty; 3985 } 3986 3987 void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit, 3988 StringRef &Name, 3989 StringRef &LinkageName, 3990 llvm::DIScope *&FDContext, 3991 llvm::DINodeArray &TParamsArray, 3992 llvm::DINode::DIFlags &Flags) { 3993 const auto *FD = cast<FunctionDecl>(GD.getCanonicalDecl().getDecl()); 3994 Name = getFunctionName(FD); 3995 // Use mangled name as linkage name for C/C++ functions. 3996 if (FD->getType()->getAs<FunctionProtoType>()) 3997 LinkageName = CGM.getMangledName(GD); 3998 if (FD->hasPrototype()) 3999 Flags |= llvm::DINode::FlagPrototyped; 4000 // No need to replicate the linkage name if it isn't different from the 4001 // subprogram name, no need to have it at all unless coverage is enabled or 4002 // debug is set to more than just line tables or extra debug info is needed. 4003 if (LinkageName == Name || 4004 (CGM.getCodeGenOpts().CoverageNotesFile.empty() && 4005 CGM.getCodeGenOpts().CoverageDataFile.empty() && 4006 !CGM.getCodeGenOpts().DebugInfoForProfiling && 4007 !CGM.getCodeGenOpts().PseudoProbeForProfiling && 4008 DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)) 4009 LinkageName = StringRef(); 4010 4011 // Emit the function scope in line tables only mode (if CodeView) to 4012 // differentiate between function names. 4013 if (CGM.getCodeGenOpts().hasReducedDebugInfo() || 4014 (DebugKind == llvm::codegenoptions::DebugLineTablesOnly && 4015 CGM.getCodeGenOpts().EmitCodeView)) { 4016 if (const NamespaceDecl *NSDecl = 4017 dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) 4018 FDContext = getOrCreateNamespace(NSDecl); 4019 else if (const RecordDecl *RDecl = 4020 dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) { 4021 llvm::DIScope *Mod = getParentModuleOrNull(RDecl); 4022 FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU); 4023 } 4024 } 4025 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) { 4026 // Check if it is a noreturn-marked function 4027 if (FD->isNoReturn()) 4028 Flags |= llvm::DINode::FlagNoReturn; 4029 // Collect template parameters. 4030 TParamsArray = CollectFunctionTemplateParams(FD, Unit); 4031 } 4032 } 4033 4034 void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit, 4035 unsigned &LineNo, QualType &T, 4036 StringRef &Name, StringRef &LinkageName, 4037 llvm::MDTuple *&TemplateParameters, 4038 llvm::DIScope *&VDContext) { 4039 Unit = getOrCreateFile(VD->getLocation()); 4040 LineNo = getLineNumber(VD->getLocation()); 4041 4042 setLocation(VD->getLocation()); 4043 4044 T = VD->getType(); 4045 if (T->isIncompleteArrayType()) { 4046 // CodeGen turns int[] into int[1] so we'll do the same here. 4047 llvm::APInt ConstVal(32, 1); 4048 QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 4049 4050 T = CGM.getContext().getConstantArrayType(ET, ConstVal, nullptr, 4051 ArraySizeModifier::Normal, 0); 4052 } 4053 4054 Name = VD->getName(); 4055 if (VD->getDeclContext() && !isa<FunctionDecl>(VD->getDeclContext()) && 4056 !isa<ObjCMethodDecl>(VD->getDeclContext())) 4057 LinkageName = CGM.getMangledName(VD); 4058 if (LinkageName == Name) 4059 LinkageName = StringRef(); 4060 4061 if (isa<VarTemplateSpecializationDecl>(VD)) { 4062 llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VD, &*Unit); 4063 TemplateParameters = parameterNodes.get(); 4064 } else { 4065 TemplateParameters = nullptr; 4066 } 4067 4068 // Since we emit declarations (DW_AT_members) for static members, place the 4069 // definition of those static members in the namespace they were declared in 4070 // in the source code (the lexical decl context). 4071 // FIXME: Generalize this for even non-member global variables where the 4072 // declaration and definition may have different lexical decl contexts, once 4073 // we have support for emitting declarations of (non-member) global variables. 4074 const DeclContext *DC = VD->isStaticDataMember() ? VD->getLexicalDeclContext() 4075 : VD->getDeclContext(); 4076 // When a record type contains an in-line initialization of a static data 4077 // member, and the record type is marked as __declspec(dllexport), an implicit 4078 // definition of the member will be created in the record context. DWARF 4079 // doesn't seem to have a nice way to describe this in a form that consumers 4080 // are likely to understand, so fake the "normal" situation of a definition 4081 // outside the class by putting it in the global scope. 4082 if (DC->isRecord()) 4083 DC = CGM.getContext().getTranslationUnitDecl(); 4084 4085 llvm::DIScope *Mod = getParentModuleOrNull(VD); 4086 VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU); 4087 } 4088 4089 llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD, 4090 bool Stub) { 4091 llvm::DINodeArray TParamsArray; 4092 StringRef Name, LinkageName; 4093 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 4094 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero; 4095 SourceLocation Loc = GD.getDecl()->getLocation(); 4096 llvm::DIFile *Unit = getOrCreateFile(Loc); 4097 llvm::DIScope *DContext = Unit; 4098 unsigned Line = getLineNumber(Loc); 4099 collectFunctionDeclProps(GD, Unit, Name, LinkageName, DContext, TParamsArray, 4100 Flags); 4101 auto *FD = cast<FunctionDecl>(GD.getDecl()); 4102 4103 // Build function type. 4104 SmallVector<QualType, 16> ArgTypes; 4105 for (const ParmVarDecl *Parm : FD->parameters()) 4106 ArgTypes.push_back(Parm->getType()); 4107 4108 CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); 4109 QualType FnType = CGM.getContext().getFunctionType( 4110 FD->getReturnType(), ArgTypes, FunctionProtoType::ExtProtoInfo(CC)); 4111 if (!FD->isExternallyVisible()) 4112 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit; 4113 if (CGM.getLangOpts().Optimize) 4114 SPFlags |= llvm::DISubprogram::SPFlagOptimized; 4115 4116 if (Stub) { 4117 Flags |= getCallSiteRelatedAttrs(); 4118 SPFlags |= llvm::DISubprogram::SPFlagDefinition; 4119 return DBuilder.createFunction( 4120 DContext, Name, LinkageName, Unit, Line, 4121 getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags, 4122 TParamsArray.get(), getFunctionDeclaration(FD)); 4123 } 4124 4125 llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl( 4126 DContext, Name, LinkageName, Unit, Line, 4127 getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags, 4128 TParamsArray.get(), getFunctionDeclaration(FD)); 4129 const FunctionDecl *CanonDecl = FD->getCanonicalDecl(); 4130 FwdDeclReplaceMap.emplace_back(std::piecewise_construct, 4131 std::make_tuple(CanonDecl), 4132 std::make_tuple(SP)); 4133 return SP; 4134 } 4135 4136 llvm::DISubprogram *CGDebugInfo::getFunctionForwardDeclaration(GlobalDecl GD) { 4137 return getFunctionFwdDeclOrStub(GD, /* Stub = */ false); 4138 } 4139 4140 llvm::DISubprogram *CGDebugInfo::getFunctionStub(GlobalDecl GD) { 4141 return getFunctionFwdDeclOrStub(GD, /* Stub = */ true); 4142 } 4143 4144 llvm::DIGlobalVariable * 4145 CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) { 4146 QualType T; 4147 StringRef Name, LinkageName; 4148 SourceLocation Loc = VD->getLocation(); 4149 llvm::DIFile *Unit = getOrCreateFile(Loc); 4150 llvm::DIScope *DContext = Unit; 4151 unsigned Line = getLineNumber(Loc); 4152 llvm::MDTuple *TemplateParameters = nullptr; 4153 4154 collectVarDeclProps(VD, Unit, Line, T, Name, LinkageName, TemplateParameters, 4155 DContext); 4156 auto Align = getDeclAlignIfRequired(VD, CGM.getContext()); 4157 auto *GV = DBuilder.createTempGlobalVariableFwdDecl( 4158 DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit), 4159 !VD->isExternallyVisible(), nullptr, TemplateParameters, Align); 4160 FwdDeclReplaceMap.emplace_back( 4161 std::piecewise_construct, 4162 std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())), 4163 std::make_tuple(static_cast<llvm::Metadata *>(GV))); 4164 return GV; 4165 } 4166 4167 llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { 4168 // We only need a declaration (not a definition) of the type - so use whatever 4169 // we would otherwise do to get a type for a pointee. (forward declarations in 4170 // limited debug info, full definitions (if the type definition is available) 4171 // in unlimited debug info) 4172 if (const auto *TD = dyn_cast<TypeDecl>(D)) 4173 return getOrCreateType(CGM.getContext().getTypeDeclType(TD), 4174 getOrCreateFile(TD->getLocation())); 4175 auto I = DeclCache.find(D->getCanonicalDecl()); 4176 4177 if (I != DeclCache.end()) { 4178 auto N = I->second; 4179 if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(N)) 4180 return GVE->getVariable(); 4181 return cast<llvm::DINode>(N); 4182 } 4183 4184 // Search imported declaration cache if it is already defined 4185 // as imported declaration. 4186 auto IE = ImportedDeclCache.find(D->getCanonicalDecl()); 4187 4188 if (IE != ImportedDeclCache.end()) { 4189 auto N = IE->second; 4190 if (auto *GVE = dyn_cast_or_null<llvm::DIImportedEntity>(N)) 4191 return cast<llvm::DINode>(GVE); 4192 return dyn_cast_or_null<llvm::DINode>(N); 4193 } 4194 4195 // No definition for now. Emit a forward definition that might be 4196 // merged with a potential upcoming definition. 4197 if (const auto *FD = dyn_cast<FunctionDecl>(D)) 4198 return getFunctionForwardDeclaration(FD); 4199 else if (const auto *VD = dyn_cast<VarDecl>(D)) 4200 return getGlobalVariableForwardDeclaration(VD); 4201 4202 return nullptr; 4203 } 4204 4205 llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) { 4206 if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly) 4207 return nullptr; 4208 4209 const auto *FD = dyn_cast<FunctionDecl>(D); 4210 if (!FD) 4211 return nullptr; 4212 4213 // Setup context. 4214 auto *S = getDeclContextDescriptor(D); 4215 4216 auto MI = SPCache.find(FD->getCanonicalDecl()); 4217 if (MI == SPCache.end()) { 4218 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) { 4219 return CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()), 4220 cast<llvm::DICompositeType>(S)); 4221 } 4222 } 4223 if (MI != SPCache.end()) { 4224 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second); 4225 if (SP && !SP->isDefinition()) 4226 return SP; 4227 } 4228 4229 for (auto *NextFD : FD->redecls()) { 4230 auto MI = SPCache.find(NextFD->getCanonicalDecl()); 4231 if (MI != SPCache.end()) { 4232 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second); 4233 if (SP && !SP->isDefinition()) 4234 return SP; 4235 } 4236 } 4237 return nullptr; 4238 } 4239 4240 llvm::DISubprogram *CGDebugInfo::getObjCMethodDeclaration( 4241 const Decl *D, llvm::DISubroutineType *FnType, unsigned LineNo, 4242 llvm::DINode::DIFlags Flags, llvm::DISubprogram::DISPFlags SPFlags) { 4243 if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly) 4244 return nullptr; 4245 4246 const auto *OMD = dyn_cast<ObjCMethodDecl>(D); 4247 if (!OMD) 4248 return nullptr; 4249 4250 if (CGM.getCodeGenOpts().DwarfVersion < 5 && !OMD->isDirectMethod()) 4251 return nullptr; 4252 4253 if (OMD->isDirectMethod()) 4254 SPFlags |= llvm::DISubprogram::SPFlagObjCDirect; 4255 4256 // Starting with DWARF V5 method declarations are emitted as children of 4257 // the interface type. 4258 auto *ID = dyn_cast_or_null<ObjCInterfaceDecl>(D->getDeclContext()); 4259 if (!ID) 4260 ID = OMD->getClassInterface(); 4261 if (!ID) 4262 return nullptr; 4263 QualType QTy(ID->getTypeForDecl(), 0); 4264 auto It = TypeCache.find(QTy.getAsOpaquePtr()); 4265 if (It == TypeCache.end()) 4266 return nullptr; 4267 auto *InterfaceType = cast<llvm::DICompositeType>(It->second); 4268 llvm::DISubprogram *FD = DBuilder.createFunction( 4269 InterfaceType, getObjCMethodName(OMD), StringRef(), 4270 InterfaceType->getFile(), LineNo, FnType, LineNo, Flags, SPFlags); 4271 DBuilder.finalizeSubprogram(FD); 4272 ObjCMethodCache[ID].push_back({FD, OMD->isDirectMethod()}); 4273 return FD; 4274 } 4275 4276 // getOrCreateFunctionType - Construct type. If it is a c++ method, include 4277 // implicit parameter "this". 4278 llvm::DISubroutineType *CGDebugInfo::getOrCreateFunctionType(const Decl *D, 4279 QualType FnType, 4280 llvm::DIFile *F) { 4281 // In CodeView, we emit the function types in line tables only because the 4282 // only way to distinguish between functions is by display name and type. 4283 if (!D || (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly && 4284 !CGM.getCodeGenOpts().EmitCodeView)) 4285 // Create fake but valid subroutine type. Otherwise -verify would fail, and 4286 // subprogram DIE will miss DW_AT_decl_file and DW_AT_decl_line fields. 4287 return DBuilder.createSubroutineType( 4288 DBuilder.getOrCreateTypeArray(std::nullopt)); 4289 4290 if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) 4291 return getOrCreateMethodType(Method, F); 4292 4293 const auto *FTy = FnType->getAs<FunctionType>(); 4294 CallingConv CC = FTy ? FTy->getCallConv() : CallingConv::CC_C; 4295 4296 if (const auto *OMethod = dyn_cast<ObjCMethodDecl>(D)) { 4297 // Add "self" and "_cmd" 4298 SmallVector<llvm::Metadata *, 16> Elts; 4299 4300 // First element is always return type. For 'void' functions it is NULL. 4301 QualType ResultTy = OMethod->getReturnType(); 4302 4303 // Replace the instancetype keyword with the actual type. 4304 if (ResultTy == CGM.getContext().getObjCInstanceType()) 4305 ResultTy = CGM.getContext().getPointerType( 4306 QualType(OMethod->getClassInterface()->getTypeForDecl(), 0)); 4307 4308 Elts.push_back(getOrCreateType(ResultTy, F)); 4309 // "self" pointer is always first argument. 4310 QualType SelfDeclTy; 4311 if (auto *SelfDecl = OMethod->getSelfDecl()) 4312 SelfDeclTy = SelfDecl->getType(); 4313 else if (auto *FPT = dyn_cast<FunctionProtoType>(FnType)) 4314 if (FPT->getNumParams() > 1) 4315 SelfDeclTy = FPT->getParamType(0); 4316 if (!SelfDeclTy.isNull()) 4317 Elts.push_back( 4318 CreateSelfType(SelfDeclTy, getOrCreateType(SelfDeclTy, F))); 4319 // "_cmd" pointer is always second argument. 4320 Elts.push_back(DBuilder.createArtificialType( 4321 getOrCreateType(CGM.getContext().getObjCSelType(), F))); 4322 // Get rest of the arguments. 4323 for (const auto *PI : OMethod->parameters()) 4324 Elts.push_back(getOrCreateType(PI->getType(), F)); 4325 // Variadic methods need a special marker at the end of the type list. 4326 if (OMethod->isVariadic()) 4327 Elts.push_back(DBuilder.createUnspecifiedParameter()); 4328 4329 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts); 4330 return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero, 4331 getDwarfCC(CC)); 4332 } 4333 4334 // Handle variadic function types; they need an additional 4335 // unspecified parameter. 4336 if (const auto *FD = dyn_cast<FunctionDecl>(D)) 4337 if (FD->isVariadic()) { 4338 SmallVector<llvm::Metadata *, 16> EltTys; 4339 EltTys.push_back(getOrCreateType(FD->getReturnType(), F)); 4340 if (const auto *FPT = dyn_cast<FunctionProtoType>(FnType)) 4341 for (QualType ParamType : FPT->param_types()) 4342 EltTys.push_back(getOrCreateType(ParamType, F)); 4343 EltTys.push_back(DBuilder.createUnspecifiedParameter()); 4344 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys); 4345 return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero, 4346 getDwarfCC(CC)); 4347 } 4348 4349 return cast<llvm::DISubroutineType>(getOrCreateType(FnType, F)); 4350 } 4351 4352 QualType 4353 CGDebugInfo::getFunctionType(const FunctionDecl *FD, QualType RetTy, 4354 const SmallVectorImpl<const VarDecl *> &Args) { 4355 CallingConv CC = CallingConv::CC_C; 4356 if (FD) 4357 if (const auto *SrcFnTy = FD->getType()->getAs<FunctionType>()) 4358 CC = SrcFnTy->getCallConv(); 4359 SmallVector<QualType, 16> ArgTypes; 4360 for (const VarDecl *VD : Args) 4361 ArgTypes.push_back(VD->getType()); 4362 return CGM.getContext().getFunctionType(RetTy, ArgTypes, 4363 FunctionProtoType::ExtProtoInfo(CC)); 4364 } 4365 4366 void CGDebugInfo::emitFunctionStart(GlobalDecl GD, SourceLocation Loc, 4367 SourceLocation ScopeLoc, QualType FnType, 4368 llvm::Function *Fn, bool CurFuncIsThunk) { 4369 StringRef Name; 4370 StringRef LinkageName; 4371 4372 FnBeginRegionCount.push_back(LexicalBlockStack.size()); 4373 4374 const Decl *D = GD.getDecl(); 4375 bool HasDecl = (D != nullptr); 4376 4377 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 4378 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero; 4379 llvm::DIFile *Unit = getOrCreateFile(Loc); 4380 llvm::DIScope *FDContext = Unit; 4381 llvm::DINodeArray TParamsArray; 4382 if (!HasDecl) { 4383 // Use llvm function name. 4384 LinkageName = Fn->getName(); 4385 } else if (const auto *FD = dyn_cast<FunctionDecl>(D)) { 4386 // If there is a subprogram for this function available then use it. 4387 auto FI = SPCache.find(FD->getCanonicalDecl()); 4388 if (FI != SPCache.end()) { 4389 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second); 4390 if (SP && SP->isDefinition()) { 4391 LexicalBlockStack.emplace_back(SP); 4392 RegionMap[D].reset(SP); 4393 return; 4394 } 4395 } 4396 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext, 4397 TParamsArray, Flags); 4398 } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) { 4399 Name = getObjCMethodName(OMD); 4400 Flags |= llvm::DINode::FlagPrototyped; 4401 } else if (isa<VarDecl>(D) && 4402 GD.getDynamicInitKind() != DynamicInitKind::NoStub) { 4403 // This is a global initializer or atexit destructor for a global variable. 4404 Name = getDynamicInitializerName(cast<VarDecl>(D), GD.getDynamicInitKind(), 4405 Fn); 4406 } else { 4407 Name = Fn->getName(); 4408 4409 if (isa<BlockDecl>(D)) 4410 LinkageName = Name; 4411 4412 Flags |= llvm::DINode::FlagPrototyped; 4413 } 4414 if (Name.starts_with("\01")) 4415 Name = Name.substr(1); 4416 4417 assert((!D || !isa<VarDecl>(D) || 4418 GD.getDynamicInitKind() != DynamicInitKind::NoStub) && 4419 "Unexpected DynamicInitKind !"); 4420 4421 if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() || 4422 isa<VarDecl>(D) || isa<CapturedDecl>(D)) { 4423 Flags |= llvm::DINode::FlagArtificial; 4424 // Artificial functions should not silently reuse CurLoc. 4425 CurLoc = SourceLocation(); 4426 } 4427 4428 if (CurFuncIsThunk) 4429 Flags |= llvm::DINode::FlagThunk; 4430 4431 if (Fn->hasLocalLinkage()) 4432 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit; 4433 if (CGM.getLangOpts().Optimize) 4434 SPFlags |= llvm::DISubprogram::SPFlagOptimized; 4435 4436 llvm::DINode::DIFlags FlagsForDef = Flags | getCallSiteRelatedAttrs(); 4437 llvm::DISubprogram::DISPFlags SPFlagsForDef = 4438 SPFlags | llvm::DISubprogram::SPFlagDefinition; 4439 4440 const unsigned LineNo = getLineNumber(Loc.isValid() ? Loc : CurLoc); 4441 unsigned ScopeLine = getLineNumber(ScopeLoc); 4442 llvm::DISubroutineType *DIFnType = getOrCreateFunctionType(D, FnType, Unit); 4443 llvm::DISubprogram *Decl = nullptr; 4444 llvm::DINodeArray Annotations = nullptr; 4445 if (D) { 4446 Decl = isa<ObjCMethodDecl>(D) 4447 ? getObjCMethodDeclaration(D, DIFnType, LineNo, Flags, SPFlags) 4448 : getFunctionDeclaration(D); 4449 Annotations = CollectBTFDeclTagAnnotations(D); 4450 } 4451 4452 // FIXME: The function declaration we're constructing here is mostly reusing 4453 // declarations from CXXMethodDecl and not constructing new ones for arbitrary 4454 // FunctionDecls. When/if we fix this we can have FDContext be TheCU/null for 4455 // all subprograms instead of the actual context since subprogram definitions 4456 // are emitted as CU level entities by the backend. 4457 llvm::DISubprogram *SP = DBuilder.createFunction( 4458 FDContext, Name, LinkageName, Unit, LineNo, DIFnType, ScopeLine, 4459 FlagsForDef, SPFlagsForDef, TParamsArray.get(), Decl, nullptr, 4460 Annotations); 4461 Fn->setSubprogram(SP); 4462 // We might get here with a VarDecl in the case we're generating 4463 // code for the initialization of globals. Do not record these decls 4464 // as they will overwrite the actual VarDecl Decl in the cache. 4465 if (HasDecl && isa<FunctionDecl>(D)) 4466 DeclCache[D->getCanonicalDecl()].reset(SP); 4467 4468 // Push the function onto the lexical block stack. 4469 LexicalBlockStack.emplace_back(SP); 4470 4471 if (HasDecl) 4472 RegionMap[D].reset(SP); 4473 } 4474 4475 void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc, 4476 QualType FnType, llvm::Function *Fn) { 4477 StringRef Name; 4478 StringRef LinkageName; 4479 4480 const Decl *D = GD.getDecl(); 4481 if (!D) 4482 return; 4483 4484 llvm::TimeTraceScope TimeScope("DebugFunction", [&]() { 4485 return GetName(D, true); 4486 }); 4487 4488 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 4489 llvm::DIFile *Unit = getOrCreateFile(Loc); 4490 bool IsDeclForCallSite = Fn ? true : false; 4491 llvm::DIScope *FDContext = 4492 IsDeclForCallSite ? Unit : getDeclContextDescriptor(D); 4493 llvm::DINodeArray TParamsArray; 4494 if (isa<FunctionDecl>(D)) { 4495 // If there is a DISubprogram for this function available then use it. 4496 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext, 4497 TParamsArray, Flags); 4498 } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) { 4499 Name = getObjCMethodName(OMD); 4500 Flags |= llvm::DINode::FlagPrototyped; 4501 } else { 4502 llvm_unreachable("not a function or ObjC method"); 4503 } 4504 if (!Name.empty() && Name[0] == '\01') 4505 Name = Name.substr(1); 4506 4507 if (D->isImplicit()) { 4508 Flags |= llvm::DINode::FlagArtificial; 4509 // Artificial functions without a location should not silently reuse CurLoc. 4510 if (Loc.isInvalid()) 4511 CurLoc = SourceLocation(); 4512 } 4513 unsigned LineNo = getLineNumber(Loc); 4514 unsigned ScopeLine = 0; 4515 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero; 4516 if (CGM.getLangOpts().Optimize) 4517 SPFlags |= llvm::DISubprogram::SPFlagOptimized; 4518 4519 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D); 4520 llvm::DISubroutineType *STy = getOrCreateFunctionType(D, FnType, Unit); 4521 llvm::DISubprogram *SP = DBuilder.createFunction( 4522 FDContext, Name, LinkageName, Unit, LineNo, STy, ScopeLine, Flags, 4523 SPFlags, TParamsArray.get(), nullptr, nullptr, Annotations); 4524 4525 // Preserve btf_decl_tag attributes for parameters of extern functions 4526 // for BPF target. The parameters created in this loop are attached as 4527 // DISubprogram's retainedNodes in the subsequent finalizeSubprogram call. 4528 if (IsDeclForCallSite && CGM.getTarget().getTriple().isBPF()) { 4529 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 4530 llvm::DITypeRefArray ParamTypes = STy->getTypeArray(); 4531 unsigned ArgNo = 1; 4532 for (ParmVarDecl *PD : FD->parameters()) { 4533 llvm::DINodeArray ParamAnnotations = CollectBTFDeclTagAnnotations(PD); 4534 DBuilder.createParameterVariable( 4535 SP, PD->getName(), ArgNo, Unit, LineNo, ParamTypes[ArgNo], true, 4536 llvm::DINode::FlagZero, ParamAnnotations); 4537 ++ArgNo; 4538 } 4539 } 4540 } 4541 4542 if (IsDeclForCallSite) 4543 Fn->setSubprogram(SP); 4544 4545 DBuilder.finalizeSubprogram(SP); 4546 } 4547 4548 void CGDebugInfo::EmitFuncDeclForCallSite(llvm::CallBase *CallOrInvoke, 4549 QualType CalleeType, 4550 const FunctionDecl *CalleeDecl) { 4551 if (!CallOrInvoke) 4552 return; 4553 auto *Func = CallOrInvoke->getCalledFunction(); 4554 if (!Func) 4555 return; 4556 if (Func->getSubprogram()) 4557 return; 4558 4559 // Do not emit a declaration subprogram for a function with nodebug 4560 // attribute, or if call site info isn't required. 4561 if (CalleeDecl->hasAttr<NoDebugAttr>() || 4562 getCallSiteRelatedAttrs() == llvm::DINode::FlagZero) 4563 return; 4564 4565 // If there is no DISubprogram attached to the function being called, 4566 // create the one describing the function in order to have complete 4567 // call site debug info. 4568 if (!CalleeDecl->isStatic() && !CalleeDecl->isInlined()) 4569 EmitFunctionDecl(CalleeDecl, CalleeDecl->getLocation(), CalleeType, Func); 4570 } 4571 4572 void CGDebugInfo::EmitInlineFunctionStart(CGBuilderTy &Builder, GlobalDecl GD) { 4573 const auto *FD = cast<FunctionDecl>(GD.getDecl()); 4574 // If there is a subprogram for this function available then use it. 4575 auto FI = SPCache.find(FD->getCanonicalDecl()); 4576 llvm::DISubprogram *SP = nullptr; 4577 if (FI != SPCache.end()) 4578 SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second); 4579 if (!SP || !SP->isDefinition()) 4580 SP = getFunctionStub(GD); 4581 FnBeginRegionCount.push_back(LexicalBlockStack.size()); 4582 LexicalBlockStack.emplace_back(SP); 4583 setInlinedAt(Builder.getCurrentDebugLocation()); 4584 EmitLocation(Builder, FD->getLocation()); 4585 } 4586 4587 void CGDebugInfo::EmitInlineFunctionEnd(CGBuilderTy &Builder) { 4588 assert(CurInlinedAt && "unbalanced inline scope stack"); 4589 EmitFunctionEnd(Builder, nullptr); 4590 setInlinedAt(llvm::DebugLoc(CurInlinedAt).getInlinedAt()); 4591 } 4592 4593 void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) { 4594 // Update our current location 4595 setLocation(Loc); 4596 4597 if (CurLoc.isInvalid() || CurLoc.isMacroID() || LexicalBlockStack.empty()) 4598 return; 4599 4600 llvm::MDNode *Scope = LexicalBlockStack.back(); 4601 Builder.SetCurrentDebugLocation( 4602 llvm::DILocation::get(CGM.getLLVMContext(), getLineNumber(CurLoc), 4603 getColumnNumber(CurLoc), Scope, CurInlinedAt)); 4604 } 4605 4606 void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { 4607 llvm::MDNode *Back = nullptr; 4608 if (!LexicalBlockStack.empty()) 4609 Back = LexicalBlockStack.back().get(); 4610 LexicalBlockStack.emplace_back(DBuilder.createLexicalBlock( 4611 cast<llvm::DIScope>(Back), getOrCreateFile(CurLoc), getLineNumber(CurLoc), 4612 getColumnNumber(CurLoc))); 4613 } 4614 4615 void CGDebugInfo::AppendAddressSpaceXDeref( 4616 unsigned AddressSpace, SmallVectorImpl<uint64_t> &Expr) const { 4617 std::optional<unsigned> DWARFAddressSpace = 4618 CGM.getTarget().getDWARFAddressSpace(AddressSpace); 4619 if (!DWARFAddressSpace) 4620 return; 4621 4622 Expr.push_back(llvm::dwarf::DW_OP_constu); 4623 Expr.push_back(*DWARFAddressSpace); 4624 Expr.push_back(llvm::dwarf::DW_OP_swap); 4625 Expr.push_back(llvm::dwarf::DW_OP_xderef); 4626 } 4627 4628 void CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, 4629 SourceLocation Loc) { 4630 // Set our current location. 4631 setLocation(Loc); 4632 4633 // Emit a line table change for the current location inside the new scope. 4634 Builder.SetCurrentDebugLocation(llvm::DILocation::get( 4635 CGM.getLLVMContext(), getLineNumber(Loc), getColumnNumber(Loc), 4636 LexicalBlockStack.back(), CurInlinedAt)); 4637 4638 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly) 4639 return; 4640 4641 // Create a new lexical block and push it on the stack. 4642 CreateLexicalBlock(Loc); 4643 } 4644 4645 void CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, 4646 SourceLocation Loc) { 4647 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 4648 4649 // Provide an entry in the line table for the end of the block. 4650 EmitLocation(Builder, Loc); 4651 4652 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly) 4653 return; 4654 4655 LexicalBlockStack.pop_back(); 4656 } 4657 4658 void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder, llvm::Function *Fn) { 4659 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 4660 unsigned RCount = FnBeginRegionCount.back(); 4661 assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch"); 4662 4663 // Pop all regions for this function. 4664 while (LexicalBlockStack.size() != RCount) { 4665 // Provide an entry in the line table for the end of the block. 4666 EmitLocation(Builder, CurLoc); 4667 LexicalBlockStack.pop_back(); 4668 } 4669 FnBeginRegionCount.pop_back(); 4670 4671 if (Fn && Fn->getSubprogram()) 4672 DBuilder.finalizeSubprogram(Fn->getSubprogram()); 4673 } 4674 4675 CGDebugInfo::BlockByRefType 4676 CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD, 4677 uint64_t *XOffset) { 4678 SmallVector<llvm::Metadata *, 5> EltTys; 4679 QualType FType; 4680 uint64_t FieldSize, FieldOffset; 4681 uint32_t FieldAlign; 4682 4683 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation()); 4684 QualType Type = VD->getType(); 4685 4686 FieldOffset = 0; 4687 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 4688 EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 4689 EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 4690 FType = CGM.getContext().IntTy; 4691 EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 4692 EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 4693 4694 bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD); 4695 if (HasCopyAndDispose) { 4696 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 4697 EltTys.push_back( 4698 CreateMemberType(Unit, FType, "__copy_helper", &FieldOffset)); 4699 EltTys.push_back( 4700 CreateMemberType(Unit, FType, "__destroy_helper", &FieldOffset)); 4701 } 4702 bool HasByrefExtendedLayout; 4703 Qualifiers::ObjCLifetime Lifetime; 4704 if (CGM.getContext().getByrefLifetime(Type, Lifetime, 4705 HasByrefExtendedLayout) && 4706 HasByrefExtendedLayout) { 4707 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 4708 EltTys.push_back( 4709 CreateMemberType(Unit, FType, "__byref_variable_layout", &FieldOffset)); 4710 } 4711 4712 CharUnits Align = CGM.getContext().getDeclAlign(VD); 4713 if (Align > CGM.getContext().toCharUnitsFromBits( 4714 CGM.getTarget().getPointerAlign(LangAS::Default))) { 4715 CharUnits FieldOffsetInBytes = 4716 CGM.getContext().toCharUnitsFromBits(FieldOffset); 4717 CharUnits AlignedOffsetInBytes = FieldOffsetInBytes.alignTo(Align); 4718 CharUnits NumPaddingBytes = AlignedOffsetInBytes - FieldOffsetInBytes; 4719 4720 if (NumPaddingBytes.isPositive()) { 4721 llvm::APInt pad(32, NumPaddingBytes.getQuantity()); 4722 FType = CGM.getContext().getConstantArrayType( 4723 CGM.getContext().CharTy, pad, nullptr, ArraySizeModifier::Normal, 0); 4724 EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 4725 } 4726 } 4727 4728 FType = Type; 4729 llvm::DIType *WrappedTy = getOrCreateType(FType, Unit); 4730 FieldSize = CGM.getContext().getTypeSize(FType); 4731 FieldAlign = CGM.getContext().toBits(Align); 4732 4733 *XOffset = FieldOffset; 4734 llvm::DIType *FieldTy = DBuilder.createMemberType( 4735 Unit, VD->getName(), Unit, 0, FieldSize, FieldAlign, FieldOffset, 4736 llvm::DINode::FlagZero, WrappedTy); 4737 EltTys.push_back(FieldTy); 4738 FieldOffset += FieldSize; 4739 4740 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys); 4741 return {DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, 4742 llvm::DINode::FlagZero, nullptr, Elements), 4743 WrappedTy}; 4744 } 4745 4746 llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD, 4747 llvm::Value *Storage, 4748 std::optional<unsigned> ArgNo, 4749 CGBuilderTy &Builder, 4750 const bool UsePointerValue) { 4751 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 4752 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 4753 if (VD->hasAttr<NoDebugAttr>()) 4754 return nullptr; 4755 4756 bool Unwritten = 4757 VD->isImplicit() || (isa<Decl>(VD->getDeclContext()) && 4758 cast<Decl>(VD->getDeclContext())->isImplicit()); 4759 llvm::DIFile *Unit = nullptr; 4760 if (!Unwritten) 4761 Unit = getOrCreateFile(VD->getLocation()); 4762 llvm::DIType *Ty; 4763 uint64_t XOffset = 0; 4764 if (VD->hasAttr<BlocksAttr>()) 4765 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType; 4766 else 4767 Ty = getOrCreateType(VD->getType(), Unit); 4768 4769 // If there is no debug info for this type then do not emit debug info 4770 // for this variable. 4771 if (!Ty) 4772 return nullptr; 4773 4774 // Get location information. 4775 unsigned Line = 0; 4776 unsigned Column = 0; 4777 if (!Unwritten) { 4778 Line = getLineNumber(VD->getLocation()); 4779 Column = getColumnNumber(VD->getLocation()); 4780 } 4781 SmallVector<uint64_t, 13> Expr; 4782 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; 4783 if (VD->isImplicit()) 4784 Flags |= llvm::DINode::FlagArtificial; 4785 4786 auto Align = getDeclAlignIfRequired(VD, CGM.getContext()); 4787 4788 unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(VD->getType()); 4789 AppendAddressSpaceXDeref(AddressSpace, Expr); 4790 4791 // If this is implicit parameter of CXXThis or ObjCSelf kind, then give it an 4792 // object pointer flag. 4793 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD)) { 4794 if (IPD->getParameterKind() == ImplicitParamKind::CXXThis || 4795 IPD->getParameterKind() == ImplicitParamKind::ObjCSelf) 4796 Flags |= llvm::DINode::FlagObjectPointer; 4797 } 4798 4799 // Note: Older versions of clang used to emit byval references with an extra 4800 // DW_OP_deref, because they referenced the IR arg directly instead of 4801 // referencing an alloca. Newer versions of LLVM don't treat allocas 4802 // differently from other function arguments when used in a dbg.declare. 4803 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back()); 4804 StringRef Name = VD->getName(); 4805 if (!Name.empty()) { 4806 // __block vars are stored on the heap if they are captured by a block that 4807 // can escape the local scope. 4808 if (VD->isEscapingByref()) { 4809 // Here, we need an offset *into* the alloca. 4810 CharUnits offset = CharUnits::fromQuantity(32); 4811 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst); 4812 // offset of __forwarding field 4813 offset = CGM.getContext().toCharUnitsFromBits( 4814 CGM.getTarget().getPointerWidth(LangAS::Default)); 4815 Expr.push_back(offset.getQuantity()); 4816 Expr.push_back(llvm::dwarf::DW_OP_deref); 4817 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst); 4818 // offset of x field 4819 offset = CGM.getContext().toCharUnitsFromBits(XOffset); 4820 Expr.push_back(offset.getQuantity()); 4821 } 4822 } else if (const auto *RT = dyn_cast<RecordType>(VD->getType())) { 4823 // If VD is an anonymous union then Storage represents value for 4824 // all union fields. 4825 const RecordDecl *RD = RT->getDecl(); 4826 if (RD->isUnion() && RD->isAnonymousStructOrUnion()) { 4827 // GDB has trouble finding local variables in anonymous unions, so we emit 4828 // artificial local variables for each of the members. 4829 // 4830 // FIXME: Remove this code as soon as GDB supports this. 4831 // The debug info verifier in LLVM operates based on the assumption that a 4832 // variable has the same size as its storage and we had to disable the 4833 // check for artificial variables. 4834 for (const auto *Field : RD->fields()) { 4835 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit); 4836 StringRef FieldName = Field->getName(); 4837 4838 // Ignore unnamed fields. Do not ignore unnamed records. 4839 if (FieldName.empty() && !isa<RecordType>(Field->getType())) 4840 continue; 4841 4842 // Use VarDecl's Tag, Scope and Line number. 4843 auto FieldAlign = getDeclAlignIfRequired(Field, CGM.getContext()); 4844 auto *D = DBuilder.createAutoVariable( 4845 Scope, FieldName, Unit, Line, FieldTy, CGM.getLangOpts().Optimize, 4846 Flags | llvm::DINode::FlagArtificial, FieldAlign); 4847 4848 // Insert an llvm.dbg.declare into the current block. 4849 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), 4850 llvm::DILocation::get(CGM.getLLVMContext(), Line, 4851 Column, Scope, 4852 CurInlinedAt), 4853 Builder.GetInsertBlock()); 4854 } 4855 } 4856 } 4857 4858 // Clang stores the sret pointer provided by the caller in a static alloca. 4859 // Use DW_OP_deref to tell the debugger to load the pointer and treat it as 4860 // the address of the variable. 4861 if (UsePointerValue) { 4862 assert(!llvm::is_contained(Expr, llvm::dwarf::DW_OP_deref) && 4863 "Debug info already contains DW_OP_deref."); 4864 Expr.push_back(llvm::dwarf::DW_OP_deref); 4865 } 4866 4867 // Create the descriptor for the variable. 4868 llvm::DILocalVariable *D = nullptr; 4869 if (ArgNo) { 4870 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(VD); 4871 D = DBuilder.createParameterVariable(Scope, Name, *ArgNo, Unit, Line, Ty, 4872 CGM.getLangOpts().Optimize, Flags, 4873 Annotations); 4874 } else { 4875 // For normal local variable, we will try to find out whether 'VD' is the 4876 // copy parameter of coroutine. 4877 // If yes, we are going to use DIVariable of the origin parameter instead 4878 // of creating the new one. 4879 // If no, it might be a normal alloc, we just create a new one for it. 4880 4881 // Check whether the VD is move parameters. 4882 auto RemapCoroArgToLocalVar = [&]() -> llvm::DILocalVariable * { 4883 // The scope of parameter and move-parameter should be distinct 4884 // DISubprogram. 4885 if (!isa<llvm::DISubprogram>(Scope) || !Scope->isDistinct()) 4886 return nullptr; 4887 4888 auto Iter = llvm::find_if(CoroutineParameterMappings, [&](auto &Pair) { 4889 Stmt *StmtPtr = const_cast<Stmt *>(Pair.second); 4890 if (DeclStmt *DeclStmtPtr = dyn_cast<DeclStmt>(StmtPtr)) { 4891 DeclGroupRef DeclGroup = DeclStmtPtr->getDeclGroup(); 4892 Decl *Decl = DeclGroup.getSingleDecl(); 4893 if (VD == dyn_cast_or_null<VarDecl>(Decl)) 4894 return true; 4895 } 4896 return false; 4897 }); 4898 4899 if (Iter != CoroutineParameterMappings.end()) { 4900 ParmVarDecl *PD = const_cast<ParmVarDecl *>(Iter->first); 4901 auto Iter2 = llvm::find_if(ParamDbgMappings, [&](auto &DbgPair) { 4902 return DbgPair.first == PD && DbgPair.second->getScope() == Scope; 4903 }); 4904 if (Iter2 != ParamDbgMappings.end()) 4905 return const_cast<llvm::DILocalVariable *>(Iter2->second); 4906 } 4907 return nullptr; 4908 }; 4909 4910 // If we couldn't find a move param DIVariable, create a new one. 4911 D = RemapCoroArgToLocalVar(); 4912 // Or we will create a new DIVariable for this Decl if D dose not exists. 4913 if (!D) 4914 D = DBuilder.createAutoVariable(Scope, Name, Unit, Line, Ty, 4915 CGM.getLangOpts().Optimize, Flags, Align); 4916 } 4917 // Insert an llvm.dbg.declare into the current block. 4918 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), 4919 llvm::DILocation::get(CGM.getLLVMContext(), Line, 4920 Column, Scope, CurInlinedAt), 4921 Builder.GetInsertBlock()); 4922 4923 return D; 4924 } 4925 4926 llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const BindingDecl *BD, 4927 llvm::Value *Storage, 4928 std::optional<unsigned> ArgNo, 4929 CGBuilderTy &Builder, 4930 const bool UsePointerValue) { 4931 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 4932 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 4933 if (BD->hasAttr<NoDebugAttr>()) 4934 return nullptr; 4935 4936 // Skip the tuple like case, we don't handle that here 4937 if (isa<DeclRefExpr>(BD->getBinding())) 4938 return nullptr; 4939 4940 llvm::DIFile *Unit = getOrCreateFile(BD->getLocation()); 4941 llvm::DIType *Ty = getOrCreateType(BD->getType(), Unit); 4942 4943 // If there is no debug info for this type then do not emit debug info 4944 // for this variable. 4945 if (!Ty) 4946 return nullptr; 4947 4948 auto Align = getDeclAlignIfRequired(BD, CGM.getContext()); 4949 unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(BD->getType()); 4950 4951 SmallVector<uint64_t, 3> Expr; 4952 AppendAddressSpaceXDeref(AddressSpace, Expr); 4953 4954 // Clang stores the sret pointer provided by the caller in a static alloca. 4955 // Use DW_OP_deref to tell the debugger to load the pointer and treat it as 4956 // the address of the variable. 4957 if (UsePointerValue) { 4958 assert(!llvm::is_contained(Expr, llvm::dwarf::DW_OP_deref) && 4959 "Debug info already contains DW_OP_deref."); 4960 Expr.push_back(llvm::dwarf::DW_OP_deref); 4961 } 4962 4963 unsigned Line = getLineNumber(BD->getLocation()); 4964 unsigned Column = getColumnNumber(BD->getLocation()); 4965 StringRef Name = BD->getName(); 4966 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back()); 4967 // Create the descriptor for the variable. 4968 llvm::DILocalVariable *D = DBuilder.createAutoVariable( 4969 Scope, Name, Unit, Line, Ty, CGM.getLangOpts().Optimize, 4970 llvm::DINode::FlagZero, Align); 4971 4972 if (const MemberExpr *ME = dyn_cast<MemberExpr>(BD->getBinding())) { 4973 if (const FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) { 4974 const unsigned fieldIndex = FD->getFieldIndex(); 4975 const clang::CXXRecordDecl *parent = 4976 (const CXXRecordDecl *)FD->getParent(); 4977 const ASTRecordLayout &layout = 4978 CGM.getContext().getASTRecordLayout(parent); 4979 const uint64_t fieldOffset = layout.getFieldOffset(fieldIndex); 4980 if (FD->isBitField()) { 4981 const CGRecordLayout &RL = 4982 CGM.getTypes().getCGRecordLayout(FD->getParent()); 4983 const CGBitFieldInfo &Info = RL.getBitFieldInfo(FD); 4984 // Use DW_OP_plus_uconst to adjust to the start of the bitfield 4985 // storage. 4986 if (!Info.StorageOffset.isZero()) { 4987 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst); 4988 Expr.push_back(Info.StorageOffset.getQuantity()); 4989 } 4990 // Use LLVM_extract_bits to extract the appropriate bits from this 4991 // bitfield. 4992 Expr.push_back(Info.IsSigned 4993 ? llvm::dwarf::DW_OP_LLVM_extract_bits_sext 4994 : llvm::dwarf::DW_OP_LLVM_extract_bits_zext); 4995 Expr.push_back(Info.Offset); 4996 // If we have an oversized bitfield then the value won't be more than 4997 // the size of the type. 4998 const uint64_t TypeSize = CGM.getContext().getTypeSize(BD->getType()); 4999 Expr.push_back(std::min((uint64_t)Info.Size, TypeSize)); 5000 } else if (fieldOffset != 0) { 5001 assert(fieldOffset % CGM.getContext().getCharWidth() == 0 && 5002 "Unexpected non-bitfield with non-byte-aligned offset"); 5003 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst); 5004 Expr.push_back( 5005 CGM.getContext().toCharUnitsFromBits(fieldOffset).getQuantity()); 5006 } 5007 } 5008 } else if (const ArraySubscriptExpr *ASE = 5009 dyn_cast<ArraySubscriptExpr>(BD->getBinding())) { 5010 if (const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(ASE->getIdx())) { 5011 const uint64_t value = IL->getValue().getZExtValue(); 5012 const uint64_t typeSize = CGM.getContext().getTypeSize(BD->getType()); 5013 5014 if (value != 0) { 5015 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst); 5016 Expr.push_back(CGM.getContext() 5017 .toCharUnitsFromBits(value * typeSize) 5018 .getQuantity()); 5019 } 5020 } 5021 } 5022 5023 // Insert an llvm.dbg.declare into the current block. 5024 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), 5025 llvm::DILocation::get(CGM.getLLVMContext(), Line, 5026 Column, Scope, CurInlinedAt), 5027 Builder.GetInsertBlock()); 5028 5029 return D; 5030 } 5031 5032 llvm::DILocalVariable * 5033 CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, llvm::Value *Storage, 5034 CGBuilderTy &Builder, 5035 const bool UsePointerValue) { 5036 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5037 5038 if (auto *DD = dyn_cast<DecompositionDecl>(VD)) { 5039 for (auto *B : DD->bindings()) { 5040 EmitDeclare(B, Storage, std::nullopt, Builder, 5041 VD->getType()->isReferenceType()); 5042 } 5043 // Don't emit an llvm.dbg.declare for the composite storage as it doesn't 5044 // correspond to a user variable. 5045 return nullptr; 5046 } 5047 5048 return EmitDeclare(VD, Storage, std::nullopt, Builder, UsePointerValue); 5049 } 5050 5051 void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) { 5052 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5053 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 5054 5055 if (D->hasAttr<NoDebugAttr>()) 5056 return; 5057 5058 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back()); 5059 llvm::DIFile *Unit = getOrCreateFile(D->getLocation()); 5060 5061 // Get location information. 5062 unsigned Line = getLineNumber(D->getLocation()); 5063 unsigned Column = getColumnNumber(D->getLocation()); 5064 5065 StringRef Name = D->getName(); 5066 5067 // Create the descriptor for the label. 5068 auto *L = 5069 DBuilder.createLabel(Scope, Name, Unit, Line, CGM.getLangOpts().Optimize); 5070 5071 // Insert an llvm.dbg.label into the current block. 5072 DBuilder.insertLabel(L, 5073 llvm::DILocation::get(CGM.getLLVMContext(), Line, Column, 5074 Scope, CurInlinedAt), 5075 Builder.GetInsertBlock()); 5076 } 5077 5078 llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy, 5079 llvm::DIType *Ty) { 5080 llvm::DIType *CachedTy = getTypeOrNull(QualTy); 5081 if (CachedTy) 5082 Ty = CachedTy; 5083 return DBuilder.createObjectPointerType(Ty); 5084 } 5085 5086 void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable( 5087 const VarDecl *VD, llvm::Value *Storage, CGBuilderTy &Builder, 5088 const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) { 5089 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5090 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 5091 5092 if (Builder.GetInsertBlock() == nullptr) 5093 return; 5094 if (VD->hasAttr<NoDebugAttr>()) 5095 return; 5096 5097 bool isByRef = VD->hasAttr<BlocksAttr>(); 5098 5099 uint64_t XOffset = 0; 5100 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation()); 5101 llvm::DIType *Ty; 5102 if (isByRef) 5103 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType; 5104 else 5105 Ty = getOrCreateType(VD->getType(), Unit); 5106 5107 // Self is passed along as an implicit non-arg variable in a 5108 // block. Mark it as the object pointer. 5109 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD)) 5110 if (IPD->getParameterKind() == ImplicitParamKind::ObjCSelf) 5111 Ty = CreateSelfType(VD->getType(), Ty); 5112 5113 // Get location information. 5114 const unsigned Line = 5115 getLineNumber(VD->getLocation().isValid() ? VD->getLocation() : CurLoc); 5116 unsigned Column = getColumnNumber(VD->getLocation()); 5117 5118 const llvm::DataLayout &target = CGM.getDataLayout(); 5119 5120 CharUnits offset = CharUnits::fromQuantity( 5121 target.getStructLayout(blockInfo.StructureType) 5122 ->getElementOffset(blockInfo.getCapture(VD).getIndex())); 5123 5124 SmallVector<uint64_t, 9> addr; 5125 addr.push_back(llvm::dwarf::DW_OP_deref); 5126 addr.push_back(llvm::dwarf::DW_OP_plus_uconst); 5127 addr.push_back(offset.getQuantity()); 5128 if (isByRef) { 5129 addr.push_back(llvm::dwarf::DW_OP_deref); 5130 addr.push_back(llvm::dwarf::DW_OP_plus_uconst); 5131 // offset of __forwarding field 5132 offset = 5133 CGM.getContext().toCharUnitsFromBits(target.getPointerSizeInBits(0)); 5134 addr.push_back(offset.getQuantity()); 5135 addr.push_back(llvm::dwarf::DW_OP_deref); 5136 addr.push_back(llvm::dwarf::DW_OP_plus_uconst); 5137 // offset of x field 5138 offset = CGM.getContext().toCharUnitsFromBits(XOffset); 5139 addr.push_back(offset.getQuantity()); 5140 } 5141 5142 // Create the descriptor for the variable. 5143 auto Align = getDeclAlignIfRequired(VD, CGM.getContext()); 5144 auto *D = DBuilder.createAutoVariable( 5145 cast<llvm::DILocalScope>(LexicalBlockStack.back()), VD->getName(), Unit, 5146 Line, Ty, false, llvm::DINode::FlagZero, Align); 5147 5148 // Insert an llvm.dbg.declare into the current block. 5149 auto DL = llvm::DILocation::get(CGM.getLLVMContext(), Line, Column, 5150 LexicalBlockStack.back(), CurInlinedAt); 5151 auto *Expr = DBuilder.createExpression(addr); 5152 if (InsertPoint) 5153 DBuilder.insertDeclare(Storage, D, Expr, DL, InsertPoint); 5154 else 5155 DBuilder.insertDeclare(Storage, D, Expr, DL, Builder.GetInsertBlock()); 5156 } 5157 5158 llvm::DILocalVariable * 5159 CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 5160 unsigned ArgNo, CGBuilderTy &Builder, 5161 bool UsePointerValue) { 5162 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5163 return EmitDeclare(VD, AI, ArgNo, Builder, UsePointerValue); 5164 } 5165 5166 namespace { 5167 struct BlockLayoutChunk { 5168 uint64_t OffsetInBits; 5169 const BlockDecl::Capture *Capture; 5170 }; 5171 bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) { 5172 return l.OffsetInBits < r.OffsetInBits; 5173 } 5174 } // namespace 5175 5176 void CGDebugInfo::collectDefaultFieldsForBlockLiteralDeclare( 5177 const CGBlockInfo &Block, const ASTContext &Context, SourceLocation Loc, 5178 const llvm::StructLayout &BlockLayout, llvm::DIFile *Unit, 5179 SmallVectorImpl<llvm::Metadata *> &Fields) { 5180 // Blocks in OpenCL have unique constraints which make the standard fields 5181 // redundant while requiring size and align fields for enqueue_kernel. See 5182 // initializeForBlockHeader in CGBlocks.cpp 5183 if (CGM.getLangOpts().OpenCL) { 5184 Fields.push_back(createFieldType("__size", Context.IntTy, Loc, AS_public, 5185 BlockLayout.getElementOffsetInBits(0), 5186 Unit, Unit)); 5187 Fields.push_back(createFieldType("__align", Context.IntTy, Loc, AS_public, 5188 BlockLayout.getElementOffsetInBits(1), 5189 Unit, Unit)); 5190 } else { 5191 Fields.push_back(createFieldType("__isa", Context.VoidPtrTy, Loc, AS_public, 5192 BlockLayout.getElementOffsetInBits(0), 5193 Unit, Unit)); 5194 Fields.push_back(createFieldType("__flags", Context.IntTy, Loc, AS_public, 5195 BlockLayout.getElementOffsetInBits(1), 5196 Unit, Unit)); 5197 Fields.push_back( 5198 createFieldType("__reserved", Context.IntTy, Loc, AS_public, 5199 BlockLayout.getElementOffsetInBits(2), Unit, Unit)); 5200 auto *FnTy = Block.getBlockExpr()->getFunctionType(); 5201 auto FnPtrType = CGM.getContext().getPointerType(FnTy->desugar()); 5202 Fields.push_back(createFieldType("__FuncPtr", FnPtrType, Loc, AS_public, 5203 BlockLayout.getElementOffsetInBits(3), 5204 Unit, Unit)); 5205 Fields.push_back(createFieldType( 5206 "__descriptor", 5207 Context.getPointerType(Block.NeedsCopyDispose 5208 ? Context.getBlockDescriptorExtendedType() 5209 : Context.getBlockDescriptorType()), 5210 Loc, AS_public, BlockLayout.getElementOffsetInBits(4), Unit, Unit)); 5211 } 5212 } 5213 5214 void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, 5215 StringRef Name, 5216 unsigned ArgNo, 5217 llvm::AllocaInst *Alloca, 5218 CGBuilderTy &Builder) { 5219 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5220 ASTContext &C = CGM.getContext(); 5221 const BlockDecl *blockDecl = block.getBlockDecl(); 5222 5223 // Collect some general information about the block's location. 5224 SourceLocation loc = blockDecl->getCaretLocation(); 5225 llvm::DIFile *tunit = getOrCreateFile(loc); 5226 unsigned line = getLineNumber(loc); 5227 unsigned column = getColumnNumber(loc); 5228 5229 // Build the debug-info type for the block literal. 5230 getDeclContextDescriptor(blockDecl); 5231 5232 const llvm::StructLayout *blockLayout = 5233 CGM.getDataLayout().getStructLayout(block.StructureType); 5234 5235 SmallVector<llvm::Metadata *, 16> fields; 5236 collectDefaultFieldsForBlockLiteralDeclare(block, C, loc, *blockLayout, tunit, 5237 fields); 5238 5239 // We want to sort the captures by offset, not because DWARF 5240 // requires this, but because we're paranoid about debuggers. 5241 SmallVector<BlockLayoutChunk, 8> chunks; 5242 5243 // 'this' capture. 5244 if (blockDecl->capturesCXXThis()) { 5245 BlockLayoutChunk chunk; 5246 chunk.OffsetInBits = 5247 blockLayout->getElementOffsetInBits(block.CXXThisIndex); 5248 chunk.Capture = nullptr; 5249 chunks.push_back(chunk); 5250 } 5251 5252 // Variable captures. 5253 for (const auto &capture : blockDecl->captures()) { 5254 const VarDecl *variable = capture.getVariable(); 5255 const CGBlockInfo::Capture &captureInfo = block.getCapture(variable); 5256 5257 // Ignore constant captures. 5258 if (captureInfo.isConstant()) 5259 continue; 5260 5261 BlockLayoutChunk chunk; 5262 chunk.OffsetInBits = 5263 blockLayout->getElementOffsetInBits(captureInfo.getIndex()); 5264 chunk.Capture = &capture; 5265 chunks.push_back(chunk); 5266 } 5267 5268 // Sort by offset. 5269 llvm::array_pod_sort(chunks.begin(), chunks.end()); 5270 5271 for (const BlockLayoutChunk &Chunk : chunks) { 5272 uint64_t offsetInBits = Chunk.OffsetInBits; 5273 const BlockDecl::Capture *capture = Chunk.Capture; 5274 5275 // If we have a null capture, this must be the C++ 'this' capture. 5276 if (!capture) { 5277 QualType type; 5278 if (auto *Method = 5279 cast_or_null<CXXMethodDecl>(blockDecl->getNonClosureContext())) 5280 type = Method->getThisType(); 5281 else if (auto *RDecl = dyn_cast<CXXRecordDecl>(blockDecl->getParent())) 5282 type = QualType(RDecl->getTypeForDecl(), 0); 5283 else 5284 llvm_unreachable("unexpected block declcontext"); 5285 5286 fields.push_back(createFieldType("this", type, loc, AS_public, 5287 offsetInBits, tunit, tunit)); 5288 continue; 5289 } 5290 5291 const VarDecl *variable = capture->getVariable(); 5292 StringRef name = variable->getName(); 5293 5294 llvm::DIType *fieldType; 5295 if (capture->isByRef()) { 5296 TypeInfo PtrInfo = C.getTypeInfo(C.VoidPtrTy); 5297 auto Align = PtrInfo.isAlignRequired() ? PtrInfo.Align : 0; 5298 // FIXME: This recomputes the layout of the BlockByRefWrapper. 5299 uint64_t xoffset; 5300 fieldType = 5301 EmitTypeForVarWithBlocksAttr(variable, &xoffset).BlockByRefWrapper; 5302 fieldType = DBuilder.createPointerType(fieldType, PtrInfo.Width); 5303 fieldType = DBuilder.createMemberType(tunit, name, tunit, line, 5304 PtrInfo.Width, Align, offsetInBits, 5305 llvm::DINode::FlagZero, fieldType); 5306 } else { 5307 auto Align = getDeclAlignIfRequired(variable, CGM.getContext()); 5308 fieldType = createFieldType(name, variable->getType(), loc, AS_public, 5309 offsetInBits, Align, tunit, tunit); 5310 } 5311 fields.push_back(fieldType); 5312 } 5313 5314 SmallString<36> typeName; 5315 llvm::raw_svector_ostream(typeName) 5316 << "__block_literal_" << CGM.getUniqueBlockCount(); 5317 5318 llvm::DINodeArray fieldsArray = DBuilder.getOrCreateArray(fields); 5319 5320 llvm::DIType *type = 5321 DBuilder.createStructType(tunit, typeName.str(), tunit, line, 5322 CGM.getContext().toBits(block.BlockSize), 0, 5323 llvm::DINode::FlagZero, nullptr, fieldsArray); 5324 type = DBuilder.createPointerType(type, CGM.PointerWidthInBits); 5325 5326 // Get overall information about the block. 5327 llvm::DINode::DIFlags flags = llvm::DINode::FlagArtificial; 5328 auto *scope = cast<llvm::DILocalScope>(LexicalBlockStack.back()); 5329 5330 // Create the descriptor for the parameter. 5331 auto *debugVar = DBuilder.createParameterVariable( 5332 scope, Name, ArgNo, tunit, line, type, CGM.getLangOpts().Optimize, flags); 5333 5334 // Insert an llvm.dbg.declare into the current block. 5335 DBuilder.insertDeclare(Alloca, debugVar, DBuilder.createExpression(), 5336 llvm::DILocation::get(CGM.getLLVMContext(), line, 5337 column, scope, CurInlinedAt), 5338 Builder.GetInsertBlock()); 5339 } 5340 5341 llvm::DIDerivedType * 5342 CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) { 5343 if (!D || !D->isStaticDataMember()) 5344 return nullptr; 5345 5346 auto MI = StaticDataMemberCache.find(D->getCanonicalDecl()); 5347 if (MI != StaticDataMemberCache.end()) { 5348 assert(MI->second && "Static data member declaration should still exist"); 5349 return MI->second; 5350 } 5351 5352 // If the member wasn't found in the cache, lazily construct and add it to the 5353 // type (used when a limited form of the type is emitted). 5354 auto DC = D->getDeclContext(); 5355 auto *Ctxt = cast<llvm::DICompositeType>(getDeclContextDescriptor(D)); 5356 return CreateRecordStaticField(D, Ctxt, cast<RecordDecl>(DC)); 5357 } 5358 5359 llvm::DIGlobalVariableExpression *CGDebugInfo::CollectAnonRecordDecls( 5360 const RecordDecl *RD, llvm::DIFile *Unit, unsigned LineNo, 5361 StringRef LinkageName, llvm::GlobalVariable *Var, llvm::DIScope *DContext) { 5362 llvm::DIGlobalVariableExpression *GVE = nullptr; 5363 5364 for (const auto *Field : RD->fields()) { 5365 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit); 5366 StringRef FieldName = Field->getName(); 5367 5368 // Ignore unnamed fields, but recurse into anonymous records. 5369 if (FieldName.empty()) { 5370 if (const auto *RT = dyn_cast<RecordType>(Field->getType())) 5371 GVE = CollectAnonRecordDecls(RT->getDecl(), Unit, LineNo, LinkageName, 5372 Var, DContext); 5373 continue; 5374 } 5375 // Use VarDecl's Tag, Scope and Line number. 5376 GVE = DBuilder.createGlobalVariableExpression( 5377 DContext, FieldName, LinkageName, Unit, LineNo, FieldTy, 5378 Var->hasLocalLinkage()); 5379 Var->addDebugInfo(GVE); 5380 } 5381 return GVE; 5382 } 5383 5384 static bool ReferencesAnonymousEntity(ArrayRef<TemplateArgument> Args); 5385 static bool ReferencesAnonymousEntity(RecordType *RT) { 5386 // Unnamed classes/lambdas can't be reconstituted due to a lack of column 5387 // info we produce in the DWARF, so we can't get Clang's full name back. 5388 // But so long as it's not one of those, it doesn't matter if some sub-type 5389 // of the record (a template parameter) can't be reconstituted - because the 5390 // un-reconstitutable type itself will carry its own name. 5391 const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()); 5392 if (!RD) 5393 return false; 5394 if (!RD->getIdentifier()) 5395 return true; 5396 auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD); 5397 if (!TSpecial) 5398 return false; 5399 return ReferencesAnonymousEntity(TSpecial->getTemplateArgs().asArray()); 5400 } 5401 static bool ReferencesAnonymousEntity(ArrayRef<TemplateArgument> Args) { 5402 return llvm::any_of(Args, [&](const TemplateArgument &TA) { 5403 switch (TA.getKind()) { 5404 case TemplateArgument::Pack: 5405 return ReferencesAnonymousEntity(TA.getPackAsArray()); 5406 case TemplateArgument::Type: { 5407 struct ReferencesAnonymous 5408 : public RecursiveASTVisitor<ReferencesAnonymous> { 5409 bool RefAnon = false; 5410 bool VisitRecordType(RecordType *RT) { 5411 if (ReferencesAnonymousEntity(RT)) { 5412 RefAnon = true; 5413 return false; 5414 } 5415 return true; 5416 } 5417 }; 5418 ReferencesAnonymous RT; 5419 RT.TraverseType(TA.getAsType()); 5420 if (RT.RefAnon) 5421 return true; 5422 break; 5423 } 5424 default: 5425 break; 5426 } 5427 return false; 5428 }); 5429 } 5430 namespace { 5431 struct ReconstitutableType : public RecursiveASTVisitor<ReconstitutableType> { 5432 bool Reconstitutable = true; 5433 bool VisitVectorType(VectorType *FT) { 5434 Reconstitutable = false; 5435 return false; 5436 } 5437 bool VisitAtomicType(AtomicType *FT) { 5438 Reconstitutable = false; 5439 return false; 5440 } 5441 bool VisitType(Type *T) { 5442 // _BitInt(N) isn't reconstitutable because the bit width isn't encoded in 5443 // the DWARF, only the byte width. 5444 if (T->isBitIntType()) { 5445 Reconstitutable = false; 5446 return false; 5447 } 5448 return true; 5449 } 5450 bool TraverseEnumType(EnumType *ET) { 5451 // Unnamed enums can't be reconstituted due to a lack of column info we 5452 // produce in the DWARF, so we can't get Clang's full name back. 5453 if (const auto *ED = dyn_cast<EnumDecl>(ET->getDecl())) { 5454 if (!ED->getIdentifier()) { 5455 Reconstitutable = false; 5456 return false; 5457 } 5458 if (!ED->isExternallyVisible()) { 5459 Reconstitutable = false; 5460 return false; 5461 } 5462 } 5463 return true; 5464 } 5465 bool VisitFunctionProtoType(FunctionProtoType *FT) { 5466 // noexcept is not encoded in DWARF, so the reversi 5467 Reconstitutable &= !isNoexceptExceptionSpec(FT->getExceptionSpecType()); 5468 Reconstitutable &= !FT->getNoReturnAttr(); 5469 return Reconstitutable; 5470 } 5471 bool VisitRecordType(RecordType *RT) { 5472 if (ReferencesAnonymousEntity(RT)) { 5473 Reconstitutable = false; 5474 return false; 5475 } 5476 return true; 5477 } 5478 }; 5479 } // anonymous namespace 5480 5481 // Test whether a type name could be rebuilt from emitted debug info. 5482 static bool IsReconstitutableType(QualType QT) { 5483 ReconstitutableType T; 5484 T.TraverseType(QT); 5485 return T.Reconstitutable; 5486 } 5487 5488 bool CGDebugInfo::HasReconstitutableArgs( 5489 ArrayRef<TemplateArgument> Args) const { 5490 return llvm::all_of(Args, [&](const TemplateArgument &TA) { 5491 switch (TA.getKind()) { 5492 case TemplateArgument::Template: 5493 // Easy to reconstitute - the value of the parameter in the debug 5494 // info is the string name of the template. The template name 5495 // itself won't benefit from any name rebuilding, but that's a 5496 // representational limitation - maybe DWARF could be 5497 // changed/improved to use some more structural representation. 5498 return true; 5499 case TemplateArgument::Declaration: 5500 // Reference and pointer non-type template parameters point to 5501 // variables, functions, etc and their value is, at best (for 5502 // variables) represented as an address - not a reference to the 5503 // DWARF describing the variable/function/etc. This makes it hard, 5504 // possibly impossible to rebuild the original name - looking up 5505 // the address in the executable file's symbol table would be 5506 // needed. 5507 return false; 5508 case TemplateArgument::NullPtr: 5509 // These could be rebuilt, but figured they're close enough to the 5510 // declaration case, and not worth rebuilding. 5511 return false; 5512 case TemplateArgument::Pack: 5513 // A pack is invalid if any of the elements of the pack are 5514 // invalid. 5515 return HasReconstitutableArgs(TA.getPackAsArray()); 5516 case TemplateArgument::Integral: 5517 // Larger integers get encoded as DWARF blocks which are a bit 5518 // harder to parse back into a large integer, etc - so punting on 5519 // this for now. Re-parsing the integers back into APInt is 5520 // probably feasible some day. 5521 return TA.getAsIntegral().getBitWidth() <= 64 && 5522 IsReconstitutableType(TA.getIntegralType()); 5523 case TemplateArgument::StructuralValue: 5524 return false; 5525 case TemplateArgument::Type: 5526 return IsReconstitutableType(TA.getAsType()); 5527 case TemplateArgument::Expression: 5528 return IsReconstitutableType(TA.getAsExpr()->getType()); 5529 default: 5530 llvm_unreachable("Other, unresolved, template arguments should " 5531 "not be seen here"); 5532 } 5533 }); 5534 } 5535 5536 std::string CGDebugInfo::GetName(const Decl *D, bool Qualified) const { 5537 std::string Name; 5538 llvm::raw_string_ostream OS(Name); 5539 const NamedDecl *ND = dyn_cast<NamedDecl>(D); 5540 if (!ND) 5541 return Name; 5542 llvm::codegenoptions::DebugTemplateNamesKind TemplateNamesKind = 5543 CGM.getCodeGenOpts().getDebugSimpleTemplateNames(); 5544 5545 if (!CGM.getCodeGenOpts().hasReducedDebugInfo()) 5546 TemplateNamesKind = llvm::codegenoptions::DebugTemplateNamesKind::Full; 5547 5548 std::optional<TemplateArgs> Args; 5549 5550 bool IsOperatorOverload = false; // isa<CXXConversionDecl>(ND); 5551 if (auto *RD = dyn_cast<CXXRecordDecl>(ND)) { 5552 Args = GetTemplateArgs(RD); 5553 } else if (auto *FD = dyn_cast<FunctionDecl>(ND)) { 5554 Args = GetTemplateArgs(FD); 5555 auto NameKind = ND->getDeclName().getNameKind(); 5556 IsOperatorOverload |= 5557 NameKind == DeclarationName::CXXOperatorName || 5558 NameKind == DeclarationName::CXXConversionFunctionName; 5559 } else if (auto *VD = dyn_cast<VarDecl>(ND)) { 5560 Args = GetTemplateArgs(VD); 5561 } 5562 5563 // A conversion operator presents complications/ambiguity if there's a 5564 // conversion to class template that is itself a template, eg: 5565 // template<typename T> 5566 // operator ns::t1<T, int>(); 5567 // This should be named, eg: "operator ns::t1<float, int><float>" 5568 // (ignoring clang bug that means this is currently "operator t1<float>") 5569 // but if the arguments were stripped, the consumer couldn't differentiate 5570 // whether the template argument list for the conversion type was the 5571 // function's argument list (& no reconstitution was needed) or not. 5572 // This could be handled if reconstitutable names had a separate attribute 5573 // annotating them as such - this would remove the ambiguity. 5574 // 5575 // Alternatively the template argument list could be parsed enough to check 5576 // whether there's one list or two, then compare that with the DWARF 5577 // description of the return type and the template argument lists to determine 5578 // how many lists there should be and if one is missing it could be assumed(?) 5579 // to be the function's template argument list & then be rebuilt. 5580 // 5581 // Other operator overloads that aren't conversion operators could be 5582 // reconstituted but would require a bit more nuance about detecting the 5583 // difference between these different operators during that rebuilding. 5584 bool Reconstitutable = 5585 Args && HasReconstitutableArgs(Args->Args) && !IsOperatorOverload; 5586 5587 PrintingPolicy PP = getPrintingPolicy(); 5588 5589 if (TemplateNamesKind == llvm::codegenoptions::DebugTemplateNamesKind::Full || 5590 !Reconstitutable) { 5591 ND->getNameForDiagnostic(OS, PP, Qualified); 5592 } else { 5593 bool Mangled = TemplateNamesKind == 5594 llvm::codegenoptions::DebugTemplateNamesKind::Mangled; 5595 // check if it's a template 5596 if (Mangled) 5597 OS << "_STN|"; 5598 5599 OS << ND->getDeclName(); 5600 std::string EncodedOriginalName; 5601 llvm::raw_string_ostream EncodedOriginalNameOS(EncodedOriginalName); 5602 EncodedOriginalNameOS << ND->getDeclName(); 5603 5604 if (Mangled) { 5605 OS << "|"; 5606 printTemplateArgumentList(OS, Args->Args, PP); 5607 printTemplateArgumentList(EncodedOriginalNameOS, Args->Args, PP); 5608 #ifndef NDEBUG 5609 std::string CanonicalOriginalName; 5610 llvm::raw_string_ostream OriginalOS(CanonicalOriginalName); 5611 ND->getNameForDiagnostic(OriginalOS, PP, Qualified); 5612 assert(EncodedOriginalNameOS.str() == OriginalOS.str()); 5613 #endif 5614 } 5615 } 5616 return Name; 5617 } 5618 5619 void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 5620 const VarDecl *D) { 5621 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5622 if (D->hasAttr<NoDebugAttr>()) 5623 return; 5624 5625 llvm::TimeTraceScope TimeScope("DebugGlobalVariable", [&]() { 5626 return GetName(D, true); 5627 }); 5628 5629 // If we already created a DIGlobalVariable for this declaration, just attach 5630 // it to the llvm::GlobalVariable. 5631 auto Cached = DeclCache.find(D->getCanonicalDecl()); 5632 if (Cached != DeclCache.end()) 5633 return Var->addDebugInfo( 5634 cast<llvm::DIGlobalVariableExpression>(Cached->second)); 5635 5636 // Create global variable debug descriptor. 5637 llvm::DIFile *Unit = nullptr; 5638 llvm::DIScope *DContext = nullptr; 5639 unsigned LineNo; 5640 StringRef DeclName, LinkageName; 5641 QualType T; 5642 llvm::MDTuple *TemplateParameters = nullptr; 5643 collectVarDeclProps(D, Unit, LineNo, T, DeclName, LinkageName, 5644 TemplateParameters, DContext); 5645 5646 // Attempt to store one global variable for the declaration - even if we 5647 // emit a lot of fields. 5648 llvm::DIGlobalVariableExpression *GVE = nullptr; 5649 5650 // If this is an anonymous union then we'll want to emit a global 5651 // variable for each member of the anonymous union so that it's possible 5652 // to find the name of any field in the union. 5653 if (T->isUnionType() && DeclName.empty()) { 5654 const RecordDecl *RD = T->castAs<RecordType>()->getDecl(); 5655 assert(RD->isAnonymousStructOrUnion() && 5656 "unnamed non-anonymous struct or union?"); 5657 GVE = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext); 5658 } else { 5659 auto Align = getDeclAlignIfRequired(D, CGM.getContext()); 5660 5661 SmallVector<uint64_t, 4> Expr; 5662 unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(D->getType()); 5663 if (CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) { 5664 if (D->hasAttr<CUDASharedAttr>()) 5665 AddressSpace = 5666 CGM.getContext().getTargetAddressSpace(LangAS::cuda_shared); 5667 else if (D->hasAttr<CUDAConstantAttr>()) 5668 AddressSpace = 5669 CGM.getContext().getTargetAddressSpace(LangAS::cuda_constant); 5670 } 5671 AppendAddressSpaceXDeref(AddressSpace, Expr); 5672 5673 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D); 5674 GVE = DBuilder.createGlobalVariableExpression( 5675 DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit), 5676 Var->hasLocalLinkage(), true, 5677 Expr.empty() ? nullptr : DBuilder.createExpression(Expr), 5678 getOrCreateStaticDataMemberDeclarationOrNull(D), TemplateParameters, 5679 Align, Annotations); 5680 Var->addDebugInfo(GVE); 5681 } 5682 DeclCache[D->getCanonicalDecl()].reset(GVE); 5683 } 5684 5685 void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) { 5686 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5687 if (VD->hasAttr<NoDebugAttr>()) 5688 return; 5689 llvm::TimeTraceScope TimeScope("DebugConstGlobalVariable", [&]() { 5690 return GetName(VD, true); 5691 }); 5692 5693 auto Align = getDeclAlignIfRequired(VD, CGM.getContext()); 5694 // Create the descriptor for the variable. 5695 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation()); 5696 StringRef Name = VD->getName(); 5697 llvm::DIType *Ty = getOrCreateType(VD->getType(), Unit); 5698 5699 if (const auto *ECD = dyn_cast<EnumConstantDecl>(VD)) { 5700 const auto *ED = cast<EnumDecl>(ECD->getDeclContext()); 5701 assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); 5702 5703 if (CGM.getCodeGenOpts().EmitCodeView) { 5704 // If CodeView, emit enums as global variables, unless they are defined 5705 // inside a class. We do this because MSVC doesn't emit S_CONSTANTs for 5706 // enums in classes, and because it is difficult to attach this scope 5707 // information to the global variable. 5708 if (isa<RecordDecl>(ED->getDeclContext())) 5709 return; 5710 } else { 5711 // If not CodeView, emit DW_TAG_enumeration_type if necessary. For 5712 // example: for "enum { ZERO };", a DW_TAG_enumeration_type is created the 5713 // first time `ZERO` is referenced in a function. 5714 llvm::DIType *EDTy = 5715 getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); 5716 assert (EDTy->getTag() == llvm::dwarf::DW_TAG_enumeration_type); 5717 (void)EDTy; 5718 return; 5719 } 5720 } 5721 5722 // Do not emit separate definitions for function local consts. 5723 if (isa<FunctionDecl>(VD->getDeclContext())) 5724 return; 5725 5726 VD = cast<ValueDecl>(VD->getCanonicalDecl()); 5727 auto *VarD = dyn_cast<VarDecl>(VD); 5728 if (VarD && VarD->isStaticDataMember()) { 5729 auto *RD = cast<RecordDecl>(VarD->getDeclContext()); 5730 getDeclContextDescriptor(VarD); 5731 // Ensure that the type is retained even though it's otherwise unreferenced. 5732 // 5733 // FIXME: This is probably unnecessary, since Ty should reference RD 5734 // through its scope. 5735 RetainedTypes.push_back( 5736 CGM.getContext().getRecordType(RD).getAsOpaquePtr()); 5737 5738 return; 5739 } 5740 llvm::DIScope *DContext = getDeclContextDescriptor(VD); 5741 5742 auto &GV = DeclCache[VD]; 5743 if (GV) 5744 return; 5745 5746 llvm::DIExpression *InitExpr = createConstantValueExpression(VD, Init); 5747 llvm::MDTuple *TemplateParameters = nullptr; 5748 5749 if (isa<VarTemplateSpecializationDecl>(VD)) 5750 if (VarD) { 5751 llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VarD, &*Unit); 5752 TemplateParameters = parameterNodes.get(); 5753 } 5754 5755 GV.reset(DBuilder.createGlobalVariableExpression( 5756 DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty, 5757 true, true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD), 5758 TemplateParameters, Align)); 5759 } 5760 5761 void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var, 5762 const VarDecl *D) { 5763 assert(CGM.getCodeGenOpts().hasReducedDebugInfo()); 5764 if (D->hasAttr<NoDebugAttr>()) 5765 return; 5766 5767 auto Align = getDeclAlignIfRequired(D, CGM.getContext()); 5768 llvm::DIFile *Unit = getOrCreateFile(D->getLocation()); 5769 StringRef Name = D->getName(); 5770 llvm::DIType *Ty = getOrCreateType(D->getType(), Unit); 5771 5772 llvm::DIScope *DContext = getDeclContextDescriptor(D); 5773 llvm::DIGlobalVariableExpression *GVE = 5774 DBuilder.createGlobalVariableExpression( 5775 DContext, Name, StringRef(), Unit, getLineNumber(D->getLocation()), 5776 Ty, false, false, nullptr, nullptr, nullptr, Align); 5777 Var->addDebugInfo(GVE); 5778 } 5779 5780 void CGDebugInfo::EmitPseudoVariable(CGBuilderTy &Builder, 5781 llvm::Instruction *Value, QualType Ty) { 5782 // Only when -g2 or above is specified, debug info for variables will be 5783 // generated. 5784 if (CGM.getCodeGenOpts().getDebugInfo() <= 5785 llvm::codegenoptions::DebugLineTablesOnly) 5786 return; 5787 5788 llvm::DILocation *DIL = Value->getDebugLoc().get(); 5789 if (!DIL) 5790 return; 5791 5792 llvm::DIFile *Unit = DIL->getFile(); 5793 llvm::DIType *Type = getOrCreateType(Ty, Unit); 5794 5795 // Check if Value is already a declared variable and has debug info, in this 5796 // case we have nothing to do. Clang emits a declared variable as alloca, and 5797 // it is loaded upon use, so we identify such pattern here. 5798 if (llvm::LoadInst *Load = dyn_cast<llvm::LoadInst>(Value)) { 5799 llvm::Value *Var = Load->getPointerOperand(); 5800 // There can be implicit type cast applied on a variable if it is an opaque 5801 // ptr, in this case its debug info may not match the actual type of object 5802 // being used as in the next instruction, so we will need to emit a pseudo 5803 // variable for type-casted value. 5804 auto DeclareTypeMatches = [&](auto *DbgDeclare) { 5805 return DbgDeclare->getVariable()->getType() == Type; 5806 }; 5807 if (any_of(llvm::findDbgDeclares(Var), DeclareTypeMatches) || 5808 any_of(llvm::findDVRDeclares(Var), DeclareTypeMatches)) 5809 return; 5810 } 5811 5812 llvm::DILocalVariable *D = 5813 DBuilder.createAutoVariable(LexicalBlockStack.back(), "", nullptr, 0, 5814 Type, false, llvm::DINode::FlagArtificial); 5815 5816 if (auto InsertPoint = Value->getInsertionPointAfterDef()) { 5817 DBuilder.insertDbgValueIntrinsic(Value, D, DBuilder.createExpression(), DIL, 5818 &**InsertPoint); 5819 } 5820 } 5821 5822 void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV, 5823 const GlobalDecl GD) { 5824 5825 assert(GV); 5826 5827 if (!CGM.getCodeGenOpts().hasReducedDebugInfo()) 5828 return; 5829 5830 const auto *D = cast<ValueDecl>(GD.getDecl()); 5831 if (D->hasAttr<NoDebugAttr>()) 5832 return; 5833 5834 auto AliaseeDecl = CGM.getMangledNameDecl(GV->getName()); 5835 llvm::DINode *DI; 5836 5837 if (!AliaseeDecl) 5838 // FIXME: Aliasee not declared yet - possibly declared later 5839 // For example, 5840 // 5841 // 1 extern int newname __attribute__((alias("oldname"))); 5842 // 2 int oldname = 1; 5843 // 5844 // No debug info would be generated for 'newname' in this case. 5845 // 5846 // Fix compiler to generate "newname" as imported_declaration 5847 // pointing to the DIE of "oldname". 5848 return; 5849 if (!(DI = getDeclarationOrDefinition( 5850 AliaseeDecl.getCanonicalDecl().getDecl()))) 5851 return; 5852 5853 llvm::DIScope *DContext = getDeclContextDescriptor(D); 5854 auto Loc = D->getLocation(); 5855 5856 llvm::DIImportedEntity *ImportDI = DBuilder.createImportedDeclaration( 5857 DContext, DI, getOrCreateFile(Loc), getLineNumber(Loc), D->getName()); 5858 5859 // Record this DIE in the cache for nested declaration reference. 5860 ImportedDeclCache[GD.getCanonicalDecl().getDecl()].reset(ImportDI); 5861 } 5862 5863 void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV, 5864 const StringLiteral *S) { 5865 SourceLocation Loc = S->getStrTokenLoc(0); 5866 PresumedLoc PLoc = CGM.getContext().getSourceManager().getPresumedLoc(Loc); 5867 if (!PLoc.isValid()) 5868 return; 5869 5870 llvm::DIFile *File = getOrCreateFile(Loc); 5871 llvm::DIGlobalVariableExpression *Debug = 5872 DBuilder.createGlobalVariableExpression( 5873 nullptr, StringRef(), StringRef(), getOrCreateFile(Loc), 5874 getLineNumber(Loc), getOrCreateType(S->getType(), File), true); 5875 GV->addDebugInfo(Debug); 5876 } 5877 5878 llvm::DIScope *CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { 5879 if (!LexicalBlockStack.empty()) 5880 return LexicalBlockStack.back(); 5881 llvm::DIScope *Mod = getParentModuleOrNull(D); 5882 return getContextDescriptor(D, Mod ? Mod : TheCU); 5883 } 5884 5885 void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { 5886 if (!CGM.getCodeGenOpts().hasReducedDebugInfo()) 5887 return; 5888 const NamespaceDecl *NSDecl = UD.getNominatedNamespace(); 5889 if (!NSDecl->isAnonymousNamespace() || 5890 CGM.getCodeGenOpts().DebugExplicitImport) { 5891 auto Loc = UD.getLocation(); 5892 if (!Loc.isValid()) 5893 Loc = CurLoc; 5894 DBuilder.createImportedModule( 5895 getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), 5896 getOrCreateNamespace(NSDecl), getOrCreateFile(Loc), getLineNumber(Loc)); 5897 } 5898 } 5899 5900 void CGDebugInfo::EmitUsingShadowDecl(const UsingShadowDecl &USD) { 5901 if (llvm::DINode *Target = 5902 getDeclarationOrDefinition(USD.getUnderlyingDecl())) { 5903 auto Loc = USD.getLocation(); 5904 DBuilder.createImportedDeclaration( 5905 getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, 5906 getOrCreateFile(Loc), getLineNumber(Loc)); 5907 } 5908 } 5909 5910 void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { 5911 if (!CGM.getCodeGenOpts().hasReducedDebugInfo()) 5912 return; 5913 assert(UD.shadow_size() && 5914 "We shouldn't be codegening an invalid UsingDecl containing no decls"); 5915 5916 for (const auto *USD : UD.shadows()) { 5917 // FIXME: Skip functions with undeduced auto return type for now since we 5918 // don't currently have the plumbing for separate declarations & definitions 5919 // of free functions and mismatched types (auto in the declaration, concrete 5920 // return type in the definition) 5921 if (const auto *FD = dyn_cast<FunctionDecl>(USD->getUnderlyingDecl())) 5922 if (const auto *AT = FD->getType() 5923 ->castAs<FunctionProtoType>() 5924 ->getContainedAutoType()) 5925 if (AT->getDeducedType().isNull()) 5926 continue; 5927 5928 EmitUsingShadowDecl(*USD); 5929 // Emitting one decl is sufficient - debuggers can detect that this is an 5930 // overloaded name & provide lookup for all the overloads. 5931 break; 5932 } 5933 } 5934 5935 void CGDebugInfo::EmitUsingEnumDecl(const UsingEnumDecl &UD) { 5936 if (!CGM.getCodeGenOpts().hasReducedDebugInfo()) 5937 return; 5938 assert(UD.shadow_size() && 5939 "We shouldn't be codegening an invalid UsingEnumDecl" 5940 " containing no decls"); 5941 5942 for (const auto *USD : UD.shadows()) 5943 EmitUsingShadowDecl(*USD); 5944 } 5945 5946 void CGDebugInfo::EmitImportDecl(const ImportDecl &ID) { 5947 if (CGM.getCodeGenOpts().getDebuggerTuning() != llvm::DebuggerKind::LLDB) 5948 return; 5949 if (Module *M = ID.getImportedModule()) { 5950 auto Info = ASTSourceDescriptor(*M); 5951 auto Loc = ID.getLocation(); 5952 DBuilder.createImportedDeclaration( 5953 getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())), 5954 getOrCreateModuleRef(Info, DebugTypeExtRefs), getOrCreateFile(Loc), 5955 getLineNumber(Loc)); 5956 } 5957 } 5958 5959 llvm::DIImportedEntity * 5960 CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) { 5961 if (!CGM.getCodeGenOpts().hasReducedDebugInfo()) 5962 return nullptr; 5963 auto &VH = NamespaceAliasCache[&NA]; 5964 if (VH) 5965 return cast<llvm::DIImportedEntity>(VH); 5966 llvm::DIImportedEntity *R; 5967 auto Loc = NA.getLocation(); 5968 if (const auto *Underlying = 5969 dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace())) 5970 // This could cache & dedup here rather than relying on metadata deduping. 5971 R = DBuilder.createImportedDeclaration( 5972 getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 5973 EmitNamespaceAlias(*Underlying), getOrCreateFile(Loc), 5974 getLineNumber(Loc), NA.getName()); 5975 else 5976 R = DBuilder.createImportedDeclaration( 5977 getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 5978 getOrCreateNamespace(cast<NamespaceDecl>(NA.getAliasedNamespace())), 5979 getOrCreateFile(Loc), getLineNumber(Loc), NA.getName()); 5980 VH.reset(R); 5981 return R; 5982 } 5983 5984 llvm::DINamespace * 5985 CGDebugInfo::getOrCreateNamespace(const NamespaceDecl *NSDecl) { 5986 // Don't canonicalize the NamespaceDecl here: The DINamespace will be uniqued 5987 // if necessary, and this way multiple declarations of the same namespace in 5988 // different parent modules stay distinct. 5989 auto I = NamespaceCache.find(NSDecl); 5990 if (I != NamespaceCache.end()) 5991 return cast<llvm::DINamespace>(I->second); 5992 5993 llvm::DIScope *Context = getDeclContextDescriptor(NSDecl); 5994 // Don't trust the context if it is a DIModule (see comment above). 5995 llvm::DINamespace *NS = 5996 DBuilder.createNameSpace(Context, NSDecl->getName(), NSDecl->isInline()); 5997 NamespaceCache[NSDecl].reset(NS); 5998 return NS; 5999 } 6000 6001 void CGDebugInfo::setDwoId(uint64_t Signature) { 6002 assert(TheCU && "no main compile unit"); 6003 TheCU->setDWOId(Signature); 6004 } 6005 6006 void CGDebugInfo::finalize() { 6007 // Creating types might create further types - invalidating the current 6008 // element and the size(), so don't cache/reference them. 6009 for (size_t i = 0; i != ObjCInterfaceCache.size(); ++i) { 6010 ObjCInterfaceCacheEntry E = ObjCInterfaceCache[i]; 6011 llvm::DIType *Ty = E.Type->getDecl()->getDefinition() 6012 ? CreateTypeDefinition(E.Type, E.Unit) 6013 : E.Decl; 6014 DBuilder.replaceTemporary(llvm::TempDIType(E.Decl), Ty); 6015 } 6016 6017 // Add methods to interface. 6018 for (const auto &P : ObjCMethodCache) { 6019 if (P.second.empty()) 6020 continue; 6021 6022 QualType QTy(P.first->getTypeForDecl(), 0); 6023 auto It = TypeCache.find(QTy.getAsOpaquePtr()); 6024 assert(It != TypeCache.end()); 6025 6026 llvm::DICompositeType *InterfaceDecl = 6027 cast<llvm::DICompositeType>(It->second); 6028 6029 auto CurElts = InterfaceDecl->getElements(); 6030 SmallVector<llvm::Metadata *, 16> EltTys(CurElts.begin(), CurElts.end()); 6031 6032 // For DWARF v4 or earlier, only add objc_direct methods. 6033 for (auto &SubprogramDirect : P.second) 6034 if (CGM.getCodeGenOpts().DwarfVersion >= 5 || SubprogramDirect.getInt()) 6035 EltTys.push_back(SubprogramDirect.getPointer()); 6036 6037 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys); 6038 DBuilder.replaceArrays(InterfaceDecl, Elements); 6039 } 6040 6041 for (const auto &P : ReplaceMap) { 6042 assert(P.second); 6043 auto *Ty = cast<llvm::DIType>(P.second); 6044 assert(Ty->isForwardDecl()); 6045 6046 auto It = TypeCache.find(P.first); 6047 assert(It != TypeCache.end()); 6048 assert(It->second); 6049 6050 DBuilder.replaceTemporary(llvm::TempDIType(Ty), 6051 cast<llvm::DIType>(It->second)); 6052 } 6053 6054 for (const auto &P : FwdDeclReplaceMap) { 6055 assert(P.second); 6056 llvm::TempMDNode FwdDecl(cast<llvm::MDNode>(P.second)); 6057 llvm::Metadata *Repl; 6058 6059 auto It = DeclCache.find(P.first); 6060 // If there has been no definition for the declaration, call RAUW 6061 // with ourselves, that will destroy the temporary MDNode and 6062 // replace it with a standard one, avoiding leaking memory. 6063 if (It == DeclCache.end()) 6064 Repl = P.second; 6065 else 6066 Repl = It->second; 6067 6068 if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(Repl)) 6069 Repl = GVE->getVariable(); 6070 DBuilder.replaceTemporary(std::move(FwdDecl), cast<llvm::MDNode>(Repl)); 6071 } 6072 6073 // We keep our own list of retained types, because we need to look 6074 // up the final type in the type cache. 6075 for (auto &RT : RetainedTypes) 6076 if (auto MD = TypeCache[RT]) 6077 DBuilder.retainType(cast<llvm::DIType>(MD)); 6078 6079 DBuilder.finalize(); 6080 } 6081 6082 // Don't ignore in case of explicit cast where it is referenced indirectly. 6083 void CGDebugInfo::EmitExplicitCastType(QualType Ty) { 6084 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) 6085 if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile())) 6086 DBuilder.retainType(DieTy); 6087 } 6088 6089 void CGDebugInfo::EmitAndRetainType(QualType Ty) { 6090 if (CGM.getCodeGenOpts().hasMaybeUnusedDebugInfo()) 6091 if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile())) 6092 DBuilder.retainType(DieTy); 6093 } 6094 6095 llvm::DebugLoc CGDebugInfo::SourceLocToDebugLoc(SourceLocation Loc) { 6096 if (LexicalBlockStack.empty()) 6097 return llvm::DebugLoc(); 6098 6099 llvm::MDNode *Scope = LexicalBlockStack.back(); 6100 return llvm::DILocation::get(CGM.getLLVMContext(), getLineNumber(Loc), 6101 getColumnNumber(Loc), Scope); 6102 } 6103 6104 llvm::DINode::DIFlags CGDebugInfo::getCallSiteRelatedAttrs() const { 6105 // Call site-related attributes are only useful in optimized programs, and 6106 // when there's a possibility of debugging backtraces. 6107 if (!CGM.getLangOpts().Optimize || 6108 DebugKind == llvm::codegenoptions::NoDebugInfo || 6109 DebugKind == llvm::codegenoptions::LocTrackingOnly) 6110 return llvm::DINode::FlagZero; 6111 6112 // Call site-related attributes are available in DWARF v5. Some debuggers, 6113 // while not fully DWARF v5-compliant, may accept these attributes as if they 6114 // were part of DWARF v4. 6115 bool SupportsDWARFv4Ext = 6116 CGM.getCodeGenOpts().DwarfVersion == 4 && 6117 (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB || 6118 CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::GDB); 6119 6120 if (!SupportsDWARFv4Ext && CGM.getCodeGenOpts().DwarfVersion < 5) 6121 return llvm::DINode::FlagZero; 6122 6123 return llvm::DINode::FlagAllCallsDescribed; 6124 } 6125 6126 llvm::DIExpression * 6127 CGDebugInfo::createConstantValueExpression(const clang::ValueDecl *VD, 6128 const APValue &Val) { 6129 // FIXME: Add a representation for integer constants wider than 64 bits. 6130 if (CGM.getContext().getTypeSize(VD->getType()) > 64) 6131 return nullptr; 6132 6133 if (Val.isFloat()) 6134 return DBuilder.createConstantValueExpression( 6135 Val.getFloat().bitcastToAPInt().getZExtValue()); 6136 6137 if (!Val.isInt()) 6138 return nullptr; 6139 6140 llvm::APSInt const &ValInt = Val.getInt(); 6141 std::optional<uint64_t> ValIntOpt; 6142 if (ValInt.isUnsigned()) 6143 ValIntOpt = ValInt.tryZExtValue(); 6144 else if (auto tmp = ValInt.trySExtValue()) 6145 // Transform a signed optional to unsigned optional. When cpp 23 comes, 6146 // use std::optional::transform 6147 ValIntOpt = static_cast<uint64_t>(*tmp); 6148 6149 if (ValIntOpt) 6150 return DBuilder.createConstantValueExpression(ValIntOpt.value()); 6151 6152 return nullptr; 6153 } 6154