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