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