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