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, const llvm::Triple &T) {
1797 switch (CC) {
1798 case CC_C:
1799 // On SPIR/SPIR-V, CC_C is the target default calling convention and lowers
1800 // to spir_func, so describe it that way.
1801 if (T.isSPIROrSPIRV())
1802 return llvm::dwarf::DW_CC_LLVM_SpirFunction;
1803 // Avoid emitting DW_AT_calling_convention if the C convention was used.
1804 return 0;
1805
1806 case CC_X86StdCall:
1807 return llvm::dwarf::DW_CC_BORLAND_stdcall;
1808 case CC_X86FastCall:
1809 return llvm::dwarf::DW_CC_BORLAND_msfastcall;
1810 case CC_X86ThisCall:
1811 return llvm::dwarf::DW_CC_BORLAND_thiscall;
1812 case CC_X86VectorCall:
1813 return llvm::dwarf::DW_CC_LLVM_vectorcall;
1814 case CC_X86Pascal:
1815 return llvm::dwarf::DW_CC_BORLAND_pascal;
1816 case CC_Win64:
1817 return llvm::dwarf::DW_CC_LLVM_Win64;
1818 case CC_X86_64SysV:
1819 return llvm::dwarf::DW_CC_LLVM_X86_64SysV;
1820 case CC_AAPCS:
1822 case CC_AArch64SVEPCS:
1823 return llvm::dwarf::DW_CC_LLVM_AAPCS;
1824 case CC_AAPCS_VFP:
1825 return llvm::dwarf::DW_CC_LLVM_AAPCS_VFP;
1826 case CC_IntelOclBicc:
1827 return llvm::dwarf::DW_CC_LLVM_IntelOclBicc;
1828 case CC_DeviceKernel:
1829 return llvm::dwarf::DW_CC_LLVM_DeviceKernel;
1830 case CC_Swift:
1831 return llvm::dwarf::DW_CC_LLVM_Swift;
1832 case CC_SwiftAsync:
1833 return llvm::dwarf::DW_CC_LLVM_SwiftTail;
1834 case CC_PreserveMost:
1835 return llvm::dwarf::DW_CC_LLVM_PreserveMost;
1836 case CC_PreserveAll:
1837 return llvm::dwarf::DW_CC_LLVM_PreserveAll;
1838 case CC_X86RegCall:
1839 return llvm::dwarf::DW_CC_LLVM_X86RegCall;
1840 case CC_M68kRTD:
1841 return llvm::dwarf::DW_CC_LLVM_M68kRTD;
1842 case CC_PreserveNone:
1843 return llvm::dwarf::DW_CC_LLVM_PreserveNone;
1844 case CC_RISCVVectorCall:
1845 return llvm::dwarf::DW_CC_LLVM_RISCVVectorCall;
1846#define CC_VLS_CASE(ABI_VLEN) case CC_RISCVVLSCall_##ABI_VLEN:
1847 CC_VLS_CASE(32)
1848 CC_VLS_CASE(64)
1849 CC_VLS_CASE(128)
1850 CC_VLS_CASE(256)
1851 CC_VLS_CASE(512)
1852 CC_VLS_CASE(1024)
1853 CC_VLS_CASE(2048)
1854 CC_VLS_CASE(4096)
1855 CC_VLS_CASE(8192)
1856 CC_VLS_CASE(16384)
1857 CC_VLS_CASE(32768)
1858 CC_VLS_CASE(65536)
1859#undef CC_VLS_CASE
1860 return llvm::dwarf::DW_CC_LLVM_RISCVVLSCall;
1861 }
1862 return 0;
1863}
1864
1865static llvm::DINode::DIFlags getRefFlags(const FunctionProtoType *Func) {
1866 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1867 if (Func->getExtProtoInfo().RefQualifier == RQ_LValue)
1868 Flags |= llvm::DINode::FlagLValueReference;
1869 if (Func->getExtProtoInfo().RefQualifier == RQ_RValue)
1870 Flags |= llvm::DINode::FlagRValueReference;
1871 return Flags;
1872}
1873
1874llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty,
1875 llvm::DIFile *Unit) {
1876 const auto *FPT = dyn_cast<FunctionProtoType>(Ty);
1877 if (FPT) {
1878 if (llvm::DIType *QTy = CreateQualifiedType(FPT, Unit))
1879 return QTy;
1880 }
1881
1882 // Create the type without any qualifiers
1883
1884 SmallVector<llvm::Metadata *, 16> EltTys;
1885
1886 // Add the result type at least.
1887 EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit));
1888
1889 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1890 // Set up remainder of arguments if there is a prototype.
1891 // otherwise emit it as a variadic function.
1892 if (!FPT) {
1893 EltTys.push_back(DBuilder.createUnspecifiedParameter());
1894 } else {
1895 Flags = getRefFlags(FPT);
1896 for (const QualType &ParamType : FPT->param_types())
1897 EltTys.push_back(getOrCreateType(ParamType, Unit));
1898 if (FPT->isVariadic())
1899 EltTys.push_back(DBuilder.createUnspecifiedParameter());
1900 }
1901
1902 llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
1903 llvm::DIType *F = DBuilder.createSubroutineType(
1904 EltTypeArray, Flags,
1905 getDwarfCC(Ty->getCallConv(), CGM.getTarget().getTriple()));
1906 return F;
1907}
1908
1909llvm::DIDerivedType *
1910CGDebugInfo::createBitFieldType(const FieldDecl *BitFieldDecl,
1911 llvm::DIScope *RecordTy, const RecordDecl *RD) {
1912 StringRef Name = BitFieldDecl->getName();
1913 QualType Ty = BitFieldDecl->getType();
1914 if (BitFieldDecl->hasAttr<PreferredTypeAttr>())
1915 Ty = BitFieldDecl->getAttr<PreferredTypeAttr>()->getType();
1916 SourceLocation Loc = BitFieldDecl->getLocation();
1917 llvm::DIFile *VUnit = getOrCreateFile(Loc);
1918 llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
1919
1920 // Get the location for the field.
1921 llvm::DIFile *File = getOrCreateFile(Loc);
1922 unsigned Line = getLineNumber(Loc);
1923
1924 const CGBitFieldInfo &BitFieldInfo =
1925 CGM.getTypes().getCGRecordLayout(RD).getBitFieldInfo(BitFieldDecl);
1926 uint64_t SizeInBits = BitFieldInfo.Size;
1927 assert(SizeInBits > 0 && "found named 0-width bitfield");
1928 uint64_t StorageOffsetInBits =
1929 CGM.getContext().toBits(BitFieldInfo.StorageOffset);
1930 uint64_t Offset = BitFieldInfo.Offset;
1931 // The bit offsets for big endian machines are reversed for big
1932 // endian target, compensate for that as the DIDerivedType requires
1933 // un-reversed offsets.
1934 if (CGM.getDataLayout().isBigEndian())
1935 Offset = BitFieldInfo.StorageSize - BitFieldInfo.Size - Offset;
1936 uint64_t OffsetInBits = StorageOffsetInBits + Offset;
1937 llvm::DINode::DIFlags Flags = getAccessFlag(BitFieldDecl->getAccess(), RD);
1938 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(BitFieldDecl);
1939 return DBuilder.createBitFieldMemberType(
1940 RecordTy, Name, File, Line, SizeInBits, OffsetInBits, StorageOffsetInBits,
1941 Flags, DebugType, Annotations);
1942}
1943
1944llvm::DIDerivedType *CGDebugInfo::createBitFieldSeparatorIfNeeded(
1945 const FieldDecl *BitFieldDecl, const llvm::DIDerivedType *BitFieldDI,
1946 llvm::ArrayRef<llvm::Metadata *> PreviousFieldsDI, const RecordDecl *RD) {
1947
1948 if (!CGM.getTargetCodeGenInfo().shouldEmitDWARFBitFieldSeparators())
1949 return nullptr;
1950
1951 /*
1952 Add a *single* zero-bitfield separator between two non-zero bitfields
1953 separated by one or more zero-bitfields. This is used to distinguish between
1954 structures such the ones below, where the memory layout is the same, but how
1955 the ABI assigns fields to registers differs.
1956
1957 struct foo {
1958 int space[4];
1959 char a : 8; // on amdgpu, passed on v4
1960 char b : 8;
1961 char x : 8;
1962 char y : 8;
1963 };
1964 struct bar {
1965 int space[4];
1966 char a : 8; // on amdgpu, passed on v4
1967 char b : 8;
1968 char : 0;
1969 char x : 8; // passed on v5
1970 char y : 8;
1971 };
1972 */
1973 if (PreviousFieldsDI.empty())
1974 return nullptr;
1975
1976 // If we already emitted metadata for a 0-length bitfield, nothing to do here.
1977 auto *PreviousMDEntry =
1978 PreviousFieldsDI.empty() ? nullptr : PreviousFieldsDI.back();
1979 auto *PreviousMDField =
1980 dyn_cast_or_null<llvm::DIDerivedType>(PreviousMDEntry);
1981 if (!PreviousMDField || !PreviousMDField->isBitField() ||
1982 PreviousMDField->getSizeInBits() == 0)
1983 return nullptr;
1984
1985 auto PreviousBitfield = RD->field_begin();
1986 std::advance(PreviousBitfield, BitFieldDecl->getFieldIndex() - 1);
1987
1988 assert(PreviousBitfield->isBitField());
1989
1990 if (!PreviousBitfield->isZeroLengthBitField())
1991 return nullptr;
1992
1993 QualType Ty = PreviousBitfield->getType();
1994 SourceLocation Loc = PreviousBitfield->getLocation();
1995 llvm::DIFile *VUnit = getOrCreateFile(Loc);
1996 llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
1997 llvm::DIScope *RecordTy = BitFieldDI->getScope();
1998
1999 llvm::DIFile *File = getOrCreateFile(Loc);
2000 unsigned Line = getLineNumber(Loc);
2001
2002 uint64_t StorageOffsetInBits =
2003 cast<llvm::ConstantInt>(BitFieldDI->getStorageOffsetInBits())
2004 ->getZExtValue();
2005
2006 llvm::DINode::DIFlags Flags =
2007 getAccessFlag(PreviousBitfield->getAccess(), RD);
2008 llvm::DINodeArray Annotations =
2009 CollectBTFDeclTagAnnotations(*PreviousBitfield);
2010 return DBuilder.createBitFieldMemberType(
2011 RecordTy, "", File, Line, 0, StorageOffsetInBits, StorageOffsetInBits,
2012 Flags, DebugType, Annotations);
2013}
2014
2015llvm::DIType *CGDebugInfo::createFieldType(
2016 StringRef name, QualType type, SourceLocation loc, AccessSpecifier AS,
2017 uint64_t offsetInBits, uint32_t AlignInBits, llvm::DIFile *tunit,
2018 llvm::DIScope *scope, const RecordDecl *RD, llvm::DINodeArray Annotations) {
2019 llvm::DIType *debugType = getOrCreateType(type, tunit);
2020
2021 // Get the location for the field.
2022 llvm::DIFile *file = getOrCreateFile(loc);
2023 const unsigned line = getLineNumber(loc.isValid() ? loc : CurLoc);
2024
2025 uint64_t SizeInBits = 0;
2026 auto Align = AlignInBits;
2027 if (!type->isIncompleteArrayType()) {
2028 TypeInfo TI = CGM.getContext().getTypeInfo(type);
2029 SizeInBits = TI.Width;
2030 if (!Align)
2031 Align = getTypeAlignIfRequired(type, CGM.getContext());
2032 }
2033
2034 llvm::DINode::DIFlags flags = getAccessFlag(AS, RD);
2035 return DBuilder.createMemberType(scope, name, file, line, SizeInBits, Align,
2036 offsetInBits, flags, debugType, Annotations);
2037}
2038
2039llvm::DISubprogram *
2040CGDebugInfo::createInlinedSubprogram(StringRef FuncName,
2041 llvm::DIFile *FileScope) {
2042 // We are caching the subprogram because we don't want to duplicate
2043 // subprograms with the same message. Note that `SPFlagDefinition` prevents
2044 // subprograms from being uniqued.
2045 llvm::DISubprogram *&SP = InlinedSubprogramMap[FuncName];
2046
2047 if (!SP) {
2048 llvm::DISubroutineType *DIFnTy = DBuilder.createSubroutineType(nullptr);
2049 SP = DBuilder.createFunction(
2050 /*Scope=*/FileScope, /*Name=*/FuncName, /*LinkageName=*/StringRef(),
2051 /*File=*/FileScope, /*LineNo=*/0, /*Ty=*/DIFnTy,
2052 /*ScopeLine=*/0,
2053 /*Flags=*/llvm::DINode::FlagArtificial,
2054 /*SPFlags=*/llvm::DISubprogram::SPFlagDefinition,
2055 /*TParams=*/nullptr, /*Decl=*/nullptr, /*ThrownTypes=*/nullptr,
2056 /*Annotations=*/nullptr, /*TargetFuncName=*/StringRef(),
2057 /*UseKeyInstructions=*/CGM.getCodeGenOpts().DebugKeyInstructions);
2058 }
2059
2060 return SP;
2061}
2062
2063llvm::StringRef
2064CGDebugInfo::GetLambdaCaptureName(const LambdaCapture &Capture) {
2065 if (Capture.capturesThis())
2066 return CGM.getCodeGenOpts().EmitCodeView ? "__this" : "this";
2067
2068 assert(Capture.capturesVariable());
2069
2070 const ValueDecl *CaptureDecl = Capture.getCapturedVar();
2071 assert(CaptureDecl && "Expected valid decl for captured variable.");
2072
2073 return CaptureDecl->getName();
2074}
2075
2076void CGDebugInfo::CollectRecordLambdaFields(
2077 const CXXRecordDecl *CXXDecl, SmallVectorImpl<llvm::Metadata *> &elements,
2078 llvm::DIType *RecordTy) {
2079 // For C++11 Lambdas a Field will be the same as a Capture, but the Capture
2080 // has the name and the location of the variable so we should iterate over
2081 // both concurrently.
2083 unsigned fieldno = 0;
2085 E = CXXDecl->captures_end();
2086 I != E; ++I, ++Field, ++fieldno) {
2087 const LambdaCapture &Capture = *I;
2088 const uint64_t FieldOffset =
2089 CGM.getContext().getASTRecordLayout(CXXDecl).getFieldOffset(fieldno);
2090
2091 assert(!Field->isBitField() && "lambdas don't have bitfield members!");
2092
2093 SourceLocation Loc;
2094 uint32_t Align = 0;
2095
2096 if (Capture.capturesThis()) {
2097 // TODO: Need to handle 'this' in some way by probably renaming the
2098 // this of the lambda class and having a field member of 'this' or
2099 // by using AT_object_pointer for the function and having that be
2100 // used as 'this' for semantic references.
2101 Loc = Field->getLocation();
2102 } else if (Capture.capturesVariable()) {
2103 Loc = Capture.getLocation();
2104
2105 const ValueDecl *CaptureDecl = Capture.getCapturedVar();
2106 assert(CaptureDecl && "Expected valid decl for captured variable.");
2107
2108 Align = getDeclAlignIfRequired(CaptureDecl, CGM.getContext());
2109 } else {
2110 continue;
2111 }
2112
2113 llvm::DIFile *VUnit = getOrCreateFile(Loc);
2114
2115 elements.push_back(createFieldType(
2116 GetLambdaCaptureName(Capture), Field->getType(), Loc,
2117 Field->getAccess(), FieldOffset, Align, VUnit, RecordTy, CXXDecl));
2118 }
2119}
2120
2121/// Build an llvm::ConstantDataArray from the initialized elements of an
2122/// APValue array, using the narrowest integer type that fits the element width.
2123template <typename T>
2124static llvm::Constant *
2125buildConstantDataArrayFromElements(llvm::LLVMContext &Ctx, const APValue &Arr) {
2126 const unsigned NumElts = Arr.getArraySize();
2127 SmallVector<T, 64> Vals(
2128 NumElts,
2129 Arr.hasArrayFiller()
2130 ? static_cast<T>(Arr.getArrayFiller().getInt().getZExtValue())
2131 : 0);
2132 for (unsigned I : llvm::seq(Arr.getArrayInitializedElts()))
2133 Vals[I] =
2134 static_cast<T>(Arr.getArrayInitializedElt(I).getInt().getZExtValue());
2135 return llvm::ConstantDataArray::get(Ctx, Vals);
2136}
2137
2138/// Try to create an llvm::Constant for a constexpr array of integer elements.
2139/// Handles arrays of char, short, int, long with element width up to 64 bits.
2140/// Returns nullptr if the array cannot be represented.
2142 const VarDecl *Var,
2143 const APValue *Value) {
2144 const auto *ArrayTy = CGM.getContext().getAsConstantArrayType(Var->getType());
2145 if (!ArrayTy)
2146 return nullptr;
2147
2148 const QualType ElemQTy = ArrayTy->getElementType();
2149 if (ElemQTy.isNull() || !ElemQTy->isIntegerType())
2150 return nullptr;
2151
2152 const uint64_t ElemBitWidth = CGM.getContext().getTypeSize(ElemQTy);
2153
2154 llvm::LLVMContext &Ctx = CGM.getLLVMContext();
2155 switch (ElemBitWidth) {
2156 case 8:
2158 case 16:
2160 case 32:
2162 case 64:
2164 default:
2165 // ConstantDataArray only supports 8/16/32/64-bit elements.
2166 // Wider types (e.g. __int128) are not representable.
2167 return nullptr;
2168 }
2169}
2170
2171llvm::DIDerivedType *
2172CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy,
2173 const RecordDecl *RD) {
2174 // Create the descriptor for the static variable, with or without
2175 // constant initializers.
2176 Var = Var->getCanonicalDecl();
2177 llvm::DIFile *VUnit = getOrCreateFile(Var->getLocation());
2178 llvm::DIType *VTy = getOrCreateType(Var->getType(), VUnit);
2179
2180 unsigned LineNumber = getLineNumber(Var->getLocation());
2181 StringRef VName = Var->getName();
2182
2183 // FIXME: to avoid complications with type merging we should
2184 // emit the constant on the definition instead of the declaration.
2185 llvm::Constant *C = nullptr;
2186 if (Var->getInit()) {
2187 const APValue *Value = Var->evaluateValue();
2188 if (Value) {
2189 if (Value->isInt())
2190 C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt());
2191 if (Value->isFloat())
2192 C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat());
2193 if (Value->isArray())
2195 }
2196 }
2197
2198 llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD);
2199 auto Tag = CGM.getCodeGenOpts().DwarfVersion >= 5
2200 ? llvm::dwarf::DW_TAG_variable
2201 : llvm::dwarf::DW_TAG_member;
2202 auto Align = getDeclAlignIfRequired(Var, CGM.getContext());
2203 llvm::DIDerivedType *GV = DBuilder.createStaticMemberType(
2204 RecordTy, VName, VUnit, LineNumber, VTy, Flags, C, Tag, Align);
2205 StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV);
2206 return GV;
2207}
2208
2209void CGDebugInfo::CollectRecordNormalField(
2210 const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile *tunit,
2211 SmallVectorImpl<llvm::Metadata *> &elements, llvm::DIType *RecordTy,
2212 const RecordDecl *RD) {
2213 StringRef name = field->getName();
2214 QualType type = field->getType();
2215
2216 // Ignore unnamed fields unless they're anonymous structs/unions.
2217 if (name.empty() && !type->isRecordType())
2218 return;
2219
2220 llvm::DIType *FieldType;
2221 if (field->isBitField()) {
2222 llvm::DIDerivedType *BitFieldType;
2223 FieldType = BitFieldType = createBitFieldType(field, RecordTy, RD);
2224 if (llvm::DIType *Separator =
2225 createBitFieldSeparatorIfNeeded(field, BitFieldType, elements, RD))
2226 elements.push_back(Separator);
2227 } else {
2228 auto Align = getDeclAlignIfRequired(field, CGM.getContext());
2229 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(field);
2230 FieldType =
2231 createFieldType(name, type, field->getLocation(), field->getAccess(),
2232 OffsetInBits, Align, tunit, RecordTy, RD, Annotations);
2233 }
2234
2235 elements.push_back(FieldType);
2236}
2237
2238void CGDebugInfo::CollectRecordNestedType(
2239 const TypeDecl *TD, SmallVectorImpl<llvm::Metadata *> &elements) {
2240 QualType Ty = CGM.getContext().getTypeDeclType(TD);
2241 // Injected class names are not considered nested records.
2242 // FIXME: Is this supposed to be testing for injected class name declarations
2243 // instead?
2245 return;
2246 SourceLocation Loc = TD->getLocation();
2247 if (llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateFile(Loc)))
2248 elements.push_back(nestedType);
2249}
2250
2251void CGDebugInfo::CollectRecordFields(
2252 const RecordDecl *record, llvm::DIFile *tunit,
2253 SmallVectorImpl<llvm::Metadata *> &elements,
2254 llvm::DICompositeType *RecordTy) {
2255 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(record);
2256
2257 if (CXXDecl && CXXDecl->isLambda())
2258 CollectRecordLambdaFields(CXXDecl, elements, RecordTy);
2259 else {
2260 const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record);
2261
2262 // Field number for non-static fields.
2263 unsigned fieldNo = 0;
2264
2265 // Static and non-static members should appear in the same order as
2266 // the corresponding declarations in the source program.
2267 for (const auto *I : record->decls())
2268 if (const auto *V = dyn_cast<VarDecl>(I)) {
2269 if (V->hasAttr<NoDebugAttr>())
2270 continue;
2271
2272 // Skip variable template specializations when emitting CodeView. MSVC
2273 // doesn't emit them.
2274 if (CGM.getCodeGenOpts().EmitCodeView &&
2276 continue;
2277
2279 continue;
2280
2281 // Reuse the existing static member declaration if one exists
2282 auto MI = StaticDataMemberCache.find(V->getCanonicalDecl());
2283 if (MI != StaticDataMemberCache.end()) {
2284 assert(MI->second &&
2285 "Static data member declaration should still exist");
2286 elements.push_back(MI->second);
2287 } else {
2288 auto Field = CreateRecordStaticField(V, RecordTy, record);
2289 elements.push_back(Field);
2290 }
2291 } else if (const auto *field = dyn_cast<FieldDecl>(I)) {
2292 CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), tunit,
2293 elements, RecordTy, record);
2294
2295 // Bump field number for next field.
2296 ++fieldNo;
2297 } else if (CGM.getCodeGenOpts().EmitCodeView) {
2298 // Debug info for nested types is included in the member list only for
2299 // CodeView.
2300 if (const auto *nestedType = dyn_cast<TypeDecl>(I)) {
2301 // MSVC doesn't generate nested type for anonymous struct/union.
2302 if (isa<RecordDecl>(I) &&
2303 cast<RecordDecl>(I)->isAnonymousStructOrUnion())
2304 continue;
2305 if (!nestedType->isImplicit() &&
2306 nestedType->getDeclContext() == record)
2307 CollectRecordNestedType(nestedType, elements);
2308 }
2309 }
2310 }
2311}
2312
2313llvm::DISubroutineType *
2314CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method,
2315 llvm::DIFile *Unit) {
2316 const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>();
2317 if (Method->isStatic())
2318 return cast_or_null<llvm::DISubroutineType>(
2319 getOrCreateType(QualType(Func, 0), Unit));
2320
2321 QualType ThisType;
2322 if (!Method->hasCXXExplicitFunctionObjectParameter())
2323 ThisType = Method->getThisType();
2324
2325 return getOrCreateInstanceMethodType(ThisType, Func, Unit);
2326}
2327
2328llvm::DISubroutineType *CGDebugInfo::getOrCreateMethodTypeForDestructor(
2329 const CXXMethodDecl *Method, llvm::DIFile *Unit, QualType FNType) {
2330 const FunctionProtoType *Func = FNType->getAs<FunctionProtoType>();
2331 // skip the first param since it is also this
2332 return getOrCreateInstanceMethodType(Method->getThisType(), Func, Unit, true);
2333}
2334
2335llvm::DISubroutineType *
2336CGDebugInfo::getOrCreateInstanceMethodType(QualType ThisPtr,
2337 const FunctionProtoType *Func,
2338 llvm::DIFile *Unit, bool SkipFirst) {
2339 FunctionProtoType::ExtProtoInfo EPI = Func->getExtProtoInfo();
2340 Qualifiers &Qc = EPI.TypeQuals;
2341 Qc.removeConst();
2342 Qc.removeVolatile();
2343 Qc.removeRestrict();
2344 Qc.removeUnaligned();
2345 // Keep the removed qualifiers in sync with
2346 // CreateQualifiedType(const FunctionPrototype*, DIFile *Unit)
2347 // On a 'real' member function type, these qualifiers are carried on the type
2348 // of the first parameter, not as separate DW_TAG_const_type (etc) decorator
2349 // tags around them. (But, in the raw function types with qualifiers, they have
2350 // to use wrapper types.)
2351
2352 // Add "this" pointer.
2353 const auto *OriginalFunc = cast<llvm::DISubroutineType>(
2354 getOrCreateType(CGM.getContext().getFunctionType(
2355 Func->getReturnType(), Func->getParamTypes(), EPI),
2356 Unit));
2357 llvm::DITypeArray Args = OriginalFunc->getTypeArray();
2358 assert(Args.size() && "Invalid number of arguments!");
2359
2360 SmallVector<llvm::Metadata *, 16> Elts;
2361
2362 // First element is always return type. For 'void' functions it is NULL.
2363 Elts.push_back(Args[0]);
2364
2365 const bool HasExplicitObjectParameter = ThisPtr.isNull();
2366
2367 // "this" pointer is always first argument. For explicit "this"
2368 // parameters, it will already be in Args[1].
2369 if (!HasExplicitObjectParameter) {
2370 llvm::DIType *ThisPtrType = getOrCreateType(ThisPtr, Unit);
2371 TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType);
2372 ThisPtrType =
2373 DBuilder.createObjectPointerType(ThisPtrType, /*Implicit=*/true);
2374 Elts.push_back(ThisPtrType);
2375 }
2376
2377 // Copy rest of the arguments.
2378 for (unsigned i = (SkipFirst ? 2 : 1), e = Args.size(); i < e; ++i)
2379 Elts.push_back(Args[i]);
2380
2381 // Attach FlagObjectPointer to the explicit "this" parameter.
2382 if (HasExplicitObjectParameter) {
2383 assert(Elts.size() >= 2 && Args.size() >= 2 &&
2384 "Expected at least return type and object parameter.");
2385 Elts[1] = DBuilder.createObjectPointerType(Args[1], /*Implicit=*/false);
2386 }
2387
2388 llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
2389
2390 return DBuilder.createSubroutineType(
2391 EltTypeArray, OriginalFunc->getFlags(),
2392 getDwarfCC(Func->getCallConv(), CGM.getTarget().getTriple()));
2393}
2394
2395/// isFunctionLocalClass - Return true if CXXRecordDecl is defined
2396/// inside a function.
2397static bool isFunctionLocalClass(const CXXRecordDecl *RD) {
2398 if (const auto *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext()))
2399 return isFunctionLocalClass(NRD);
2401 return true;
2402 return false;
2403}
2404
2405llvm::StringRef
2406CGDebugInfo::GetMethodLinkageName(const CXXMethodDecl *Method) const {
2407 assert(Method);
2408
2409 const bool IsCtorOrDtor =
2411
2412 if (IsCtorOrDtor && !CGM.getCodeGenOpts().DebugStructorDeclLinkageNames)
2413 return {};
2414
2415 // In some ABIs (particularly Itanium) a single ctor/dtor
2416 // corresponds to multiple functions. Attach a "unified"
2417 // linkage name for those (which is the convention GCC uses).
2418 // Otherwise, attach no linkage name.
2419 if (IsCtorOrDtor && !CGM.getTarget().getCXXABI().hasConstructorVariants())
2420 return {};
2421
2422 if (const auto *Ctor = llvm::dyn_cast<CXXConstructorDecl>(Method))
2423 return CGM.getMangledName(GlobalDecl(Ctor, CXXCtorType::Ctor_Unified));
2424
2425 if (const auto *Dtor = llvm::dyn_cast<CXXDestructorDecl>(Method))
2426 return CGM.getMangledName(GlobalDecl(Dtor, CXXDtorType::Dtor_Unified));
2427
2428 return CGM.getMangledName(Method);
2429}
2430
2431bool CGDebugInfo::shouldGenerateVirtualCallSite() const {
2432 // Check general conditions for call site generation.
2433 return ((getCallSiteRelatedAttrs() != llvm::DINode::FlagZero) &&
2434 (CGM.getCodeGenOpts().DwarfVersion >= 5));
2435}
2436
2437llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
2438 const CXXMethodDecl *Method, llvm::DIFile *Unit, llvm::DIType *RecordTy) {
2439 assert(Method);
2440
2441 StringRef MethodName = getFunctionName(Method);
2442 llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit);
2443
2444 StringRef MethodLinkageName;
2445 // FIXME: 'isFunctionLocalClass' seems like an arbitrary/unintentional
2446 // property to use here. It may've been intended to model "is non-external
2447 // type" but misses cases of non-function-local but non-external classes such
2448 // as those in anonymous namespaces as well as the reverse - external types
2449 // that are function local, such as those in (non-local) inline functions.
2450 if (!isFunctionLocalClass(Method->getParent()))
2451 MethodLinkageName = GetMethodLinkageName(Method);
2452
2453 // Get the location for the method.
2454 llvm::DIFile *MethodDefUnit = nullptr;
2455 unsigned MethodLine = 0;
2456 if (!Method->isImplicit()) {
2457 MethodDefUnit = getOrCreateFile(Method->getLocation());
2458 MethodLine = getLineNumber(Method->getLocation());
2459 }
2460
2461 // Collect virtual method info.
2462 llvm::DIType *ContainingType = nullptr;
2463 unsigned VIndex = 0;
2464 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
2465 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
2466 int ThisAdjustment = 0;
2467
2469 if (Method->isPureVirtual())
2470 SPFlags |= llvm::DISubprogram::SPFlagPureVirtual;
2471 else
2472 SPFlags |= llvm::DISubprogram::SPFlagVirtual;
2473
2474 if (CGM.getTarget().getCXXABI().isItaniumFamily()) {
2475 // It doesn't make sense to give a virtual destructor a vtable index,
2476 // since a single destructor has two entries in the vtable.
2478 VIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(Method);
2479 } else {
2480 // Emit MS ABI vftable information. There is only one entry for the
2481 // deleting dtor.
2482 const auto *DD = dyn_cast<CXXDestructorDecl>(Method);
2483 GlobalDecl GD =
2484 DD ? GlobalDecl(
2485 DD, CGM.getContext().getTargetInfo().emitVectorDeletingDtors(
2486 CGM.getContext().getLangOpts())
2488 : Dtor_Deleting)
2489 : GlobalDecl(Method);
2490 MethodVFTableLocation ML =
2491 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD);
2492 VIndex = ML.Index;
2493
2494 // CodeView only records the vftable offset in the class that introduces
2495 // the virtual method. This is possible because, unlike Itanium, the MS
2496 // C++ ABI does not include all virtual methods from non-primary bases in
2497 // the vtable for the most derived class. For example, if C inherits from
2498 // A and B, C's primary vftable will not include B's virtual methods.
2499 if (Method->size_overridden_methods() == 0)
2500 Flags |= llvm::DINode::FlagIntroducedVirtual;
2501
2502 // The 'this' adjustment accounts for both the virtual and non-virtual
2503 // portions of the adjustment. Presumably the debugger only uses it when
2504 // it knows the dynamic type of an object.
2505 ThisAdjustment = CGM.getCXXABI()
2506 .getVirtualFunctionPrologueThisAdjustment(GD)
2507 .getQuantity();
2508 }
2509 ContainingType = RecordTy;
2510 }
2511
2512 if (Method->getCanonicalDecl()->isDeleted())
2513 SPFlags |= llvm::DISubprogram::SPFlagDeleted;
2514
2515 if (Method->isNoReturn())
2516 Flags |= llvm::DINode::FlagNoReturn;
2517
2518 if (Method->isStatic())
2519 Flags |= llvm::DINode::FlagStaticMember;
2520 if (Method->isImplicit())
2521 Flags |= llvm::DINode::FlagArtificial;
2522 Flags |= getAccessFlag(Method->getAccess(), Method->getParent());
2523 if (const auto *CXXC = dyn_cast<CXXConstructorDecl>(Method)) {
2524 if (CXXC->isExplicit())
2525 Flags |= llvm::DINode::FlagExplicit;
2526 } else if (const auto *CXXC = dyn_cast<CXXConversionDecl>(Method)) {
2527 if (CXXC->isExplicit())
2528 Flags |= llvm::DINode::FlagExplicit;
2529 }
2530 if (Method->hasPrototype())
2531 Flags |= llvm::DINode::FlagPrototyped;
2532 if (Method->getRefQualifier() == RQ_LValue)
2533 Flags |= llvm::DINode::FlagLValueReference;
2534 if (Method->getRefQualifier() == RQ_RValue)
2535 Flags |= llvm::DINode::FlagRValueReference;
2536 if (!Method->isExternallyVisible())
2537 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
2538 if (CGM.getCodeGenOpts().OptimizationLevel != 0)
2539 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
2540
2541 // In this debug mode, emit type info for a class when its constructor type
2542 // info is emitted.
2543 if (DebugKind == llvm::codegenoptions::DebugInfoConstructor)
2544 if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(Method))
2545 completeUnusedClass(*CD->getParent());
2546
2547 llvm::DINodeArray TParamsArray = CollectFunctionTemplateParams(Method, Unit);
2548 llvm::DISubprogram *SP = DBuilder.createMethod(
2549 RecordTy, MethodName, MethodLinkageName, MethodDefUnit, MethodLine,
2550 MethodTy, VIndex, ThisAdjustment, ContainingType, Flags, SPFlags,
2551 TParamsArray.get(), /*ThrownTypes*/ nullptr,
2552 CGM.getCodeGenOpts().DebugKeyInstructions);
2553
2554 SPCache[Method->getCanonicalDecl()].reset(SP);
2555
2556 return SP;
2557}
2558
2559void CGDebugInfo::CollectCXXMemberFunctions(
2560 const CXXRecordDecl *RD, llvm::DIFile *Unit,
2561 SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy) {
2562
2563 // Since we want more than just the individual member decls if we
2564 // have templated functions iterate over every declaration to gather
2565 // the functions.
2566 for (const auto *I : RD->decls()) {
2567 const auto *Method = dyn_cast<CXXMethodDecl>(I);
2568 // If the member is implicit, don't add it to the member list. This avoids
2569 // the member being added to type units by LLVM, while still allowing it
2570 // to be emitted into the type declaration/reference inside the compile
2571 // unit.
2572 // Ditto 'nodebug' methods, for consistency with CodeGenFunction.cpp.
2573 // FIXME: Handle Using(Shadow?)Decls here to create
2574 // DW_TAG_imported_declarations inside the class for base decls brought into
2575 // derived classes. GDB doesn't seem to notice/leverage these when I tried
2576 // it, so I'm not rushing to fix this. (GCC seems to produce them, if
2577 // referenced)
2578 if (!Method || Method->isImplicit() || Method->hasAttr<NoDebugAttr>())
2579 continue;
2580
2581 if (Method->getType()->castAs<FunctionProtoType>()->getContainedAutoType())
2582 continue;
2583
2584 // Reuse the existing member function declaration if it exists.
2585 // It may be associated with the declaration of the type & should be
2586 // reused as we're building the definition.
2587 //
2588 // This situation can arise in the vtable-based debug info reduction where
2589 // implicit members are emitted in a non-vtable TU.
2590 auto MI = SPCache.find(Method->getCanonicalDecl());
2591 EltTys.push_back(MI == SPCache.end()
2592 ? CreateCXXMemberFunction(Method, Unit, RecordTy)
2593 : static_cast<llvm::Metadata *>(MI->second));
2594 }
2595}
2596
2597void CGDebugInfo::CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile *Unit,
2598 SmallVectorImpl<llvm::Metadata *> &EltTys,
2599 llvm::DIType *RecordTy) {
2600 llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> SeenTypes;
2601 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->bases(), SeenTypes,
2602 llvm::DINode::FlagZero);
2603
2604 // If we are generating CodeView debug info, we also need to emit records for
2605 // indirect virtual base classes.
2606 if (CGM.getCodeGenOpts().EmitCodeView) {
2607 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->vbases(), SeenTypes,
2608 llvm::DINode::FlagIndirectVirtualBase);
2609 }
2610}
2611
2612void CGDebugInfo::CollectCXXBasesAux(
2613 const CXXRecordDecl *RD, llvm::DIFile *Unit,
2614 SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy,
2616 llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> &SeenTypes,
2617 llvm::DINode::DIFlags StartingFlags) {
2618 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
2619 for (const auto &BI : Bases) {
2620 const auto *Base =
2622 BI.getType()->castAsCanonical<RecordType>()->getDecl())
2623 ->getDefinition();
2624 if (!SeenTypes.insert(Base).second)
2625 continue;
2626 auto *BaseTy = getOrCreateType(BI.getType(), Unit);
2627 llvm::DINode::DIFlags BFlags = StartingFlags;
2628 uint64_t BaseOffset;
2629 uint32_t VBPtrOffset = 0;
2630
2631 if (BI.isVirtual()) {
2632 if (CGM.getTarget().getCXXABI().isItaniumFamily()) {
2633 // virtual base offset offset is -ve. The code generator emits dwarf
2634 // expression where it expects +ve number.
2635 BaseOffset = 0 - CGM.getItaniumVTableContext()
2636 .getVirtualBaseOffsetOffset(RD, Base)
2637 .getQuantity();
2638 } else {
2639 // In the MS ABI, store the vbtable offset, which is analogous to the
2640 // vbase offset offset in Itanium.
2641 BaseOffset =
2642 4 * CGM.getMicrosoftVTableContext().getVBTableIndex(RD, Base);
2643 VBPtrOffset = CGM.getContext()
2644 .getASTRecordLayout(RD)
2645 .getVBPtrOffset()
2646 .getQuantity();
2647 }
2648 BFlags |= llvm::DINode::FlagVirtual;
2649 } else
2650 BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base));
2651 // FIXME: Inconsistent units for BaseOffset. It is in bytes when
2652 // BI->isVirtual() and bits when not.
2653
2654 BFlags |= getAccessFlag(BI.getAccessSpecifier(), RD);
2655 llvm::DIType *DTy = DBuilder.createInheritance(RecordTy, BaseTy, BaseOffset,
2656 VBPtrOffset, BFlags);
2657 EltTys.push_back(DTy);
2658 }
2659}
2660
2661llvm::DINodeArray
2662CGDebugInfo::CollectTemplateParams(std::optional<TemplateArgs> OArgs,
2663 llvm::DIFile *Unit) {
2664 if (!OArgs)
2665 return llvm::DINodeArray();
2666 TemplateArgs &Args = *OArgs;
2667 SmallVector<llvm::Metadata *, 16> TemplateParams;
2668 for (unsigned i = 0, e = Args.Args.size(); i != e; ++i) {
2669 const TemplateArgument &TA = Args.Args[i];
2670 StringRef Name;
2671 const bool defaultParameter = TA.getIsDefaulted();
2672 if (Args.TList)
2673 Name = Args.TList->getParam(i)->getName();
2674
2675 switch (TA.getKind()) {
2677 llvm::DIType *TTy = getOrCreateType(TA.getAsType(), Unit);
2678 TemplateParams.push_back(DBuilder.createTemplateTypeParameter(
2679 TheCU, Name, TTy, defaultParameter));
2680
2681 } break;
2683 llvm::DIType *TTy = getOrCreateType(TA.getIntegralType(), Unit);
2684 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2685 TheCU, Name, TTy, defaultParameter,
2686 llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())));
2687 } break;
2689 const ValueDecl *D = TA.getAsDecl();
2690 QualType T = TA.getParamTypeForDecl().getDesugaredType(CGM.getContext());
2691 llvm::DIType *TTy = getOrCreateType(T, Unit);
2692 llvm::Constant *V = nullptr;
2693 // Skip retrieve the value if that template parameter has cuda device
2694 // attribute, i.e. that value is not available at the host side.
2695 if (!CGM.getLangOpts().CUDA || CGM.getLangOpts().CUDAIsDevice ||
2696 !D->hasAttr<CUDADeviceAttr>()) {
2697 // Variable pointer template parameters have a value that is the address
2698 // of the variable.
2699 if (const auto *VD = dyn_cast<VarDecl>(D))
2700 V = CGM.GetAddrOfGlobalVar(VD);
2701 // Member function pointers have special support for building them,
2702 // though this is currently unsupported in LLVM CodeGen.
2703 else if (const auto *MD = dyn_cast<CXXMethodDecl>(D);
2704 MD && MD->isImplicitObjectMemberFunction())
2705 V = CGM.getCXXABI().EmitMemberFunctionPointer(MD);
2706 else if (const auto *FD = dyn_cast<FunctionDecl>(D))
2707 V = CGM.GetAddrOfFunction(FD);
2708 // Member data pointers have special handling too to compute the fixed
2709 // offset within the object.
2710 else if (const auto *MPT =
2711 dyn_cast<MemberPointerType>(T.getTypePtr())) {
2712 // These five lines (& possibly the above member function pointer
2713 // handling) might be able to be refactored to use similar code in
2714 // CodeGenModule::getMemberPointerConstant
2715 uint64_t fieldOffset = CGM.getContext().getFieldOffset(D);
2716 CharUnits chars =
2717 CGM.getContext().toCharUnitsFromBits((int64_t)fieldOffset);
2718 V = CGM.getCXXABI().EmitMemberDataPointer(MPT, chars);
2719 } else if (const auto *GD = dyn_cast<MSGuidDecl>(D)) {
2720 V = CGM.GetAddrOfMSGuidDecl(GD).getPointer();
2721 } else if (const auto *TPO = dyn_cast<TemplateParamObjectDecl>(D)) {
2722 if (T->isRecordType())
2723 V = ConstantEmitter(CGM).emitAbstract(
2724 SourceLocation(), TPO->getValue(), TPO->getType());
2725 else
2726 V = CGM.GetAddrOfTemplateParamObject(TPO).getPointer();
2727 }
2728 assert(V && "Failed to find template parameter pointer");
2729 V = V->stripPointerCasts();
2730 }
2731 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2732 TheCU, Name, TTy, defaultParameter, cast_or_null<llvm::Constant>(V)));
2733 } break;
2735 QualType T = TA.getNullPtrType();
2736 llvm::DIType *TTy = getOrCreateType(T, Unit);
2737 llvm::Constant *V = nullptr;
2738 // Special case member data pointer null values since they're actually -1
2739 // instead of zero.
2740 if (const auto *MPT = dyn_cast<MemberPointerType>(T.getTypePtr()))
2741 // But treat member function pointers as simple zero integers because
2742 // it's easier than having a special case in LLVM's CodeGen. If LLVM
2743 // CodeGen grows handling for values of non-null member function
2744 // pointers then perhaps we could remove this special case and rely on
2745 // EmitNullMemberPointer for member function pointers.
2746 if (MPT->isMemberDataPointer())
2747 V = CGM.getCXXABI().EmitNullMemberPointer(MPT);
2748 if (!V)
2749 V = llvm::ConstantInt::get(CGM.Int8Ty, 0);
2750 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2751 TheCU, Name, TTy, defaultParameter, V));
2752 } break;
2754 QualType T = TA.getStructuralValueType();
2755 llvm::DIType *TTy = getOrCreateType(T, Unit);
2756 llvm::Constant *V = ConstantEmitter(CGM).emitAbstract(
2757 SourceLocation(), TA.getAsStructuralValue(), T);
2758 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2759 TheCU, Name, TTy, defaultParameter, V));
2760 } break;
2762 std::string QualName;
2763 llvm::raw_string_ostream OS(QualName);
2765 OS, getPrintingPolicy());
2766 TemplateParams.push_back(DBuilder.createTemplateTemplateParameter(
2767 TheCU, Name, nullptr, QualName, defaultParameter));
2768 break;
2769 }
2771 TemplateParams.push_back(DBuilder.createTemplateParameterPack(
2772 TheCU, Name, nullptr,
2773 CollectTemplateParams({{nullptr, TA.getPackAsArray()}}, Unit)));
2774 break;
2776 const Expr *E = TA.getAsExpr();
2777 QualType T = E->getType();
2778 if (E->isGLValue())
2779 T = CGM.getContext().getLValueReferenceType(T);
2780 llvm::Constant *V = ConstantEmitter(CGM).emitAbstract(E, T);
2781 assert(V && "Expression in template argument isn't constant");
2782 llvm::DIType *TTy = getOrCreateType(T, Unit);
2783 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
2784 TheCU, Name, TTy, defaultParameter, V->stripPointerCasts()));
2785 } break;
2786 // And the following should never occur:
2789 llvm_unreachable(
2790 "These argument types shouldn't exist in concrete types");
2791 }
2792 }
2793 return DBuilder.getOrCreateArray(TemplateParams);
2794}
2795
2796std::optional<CGDebugInfo::TemplateArgs>
2797CGDebugInfo::GetTemplateArgs(const FunctionDecl *FD) const {
2798 if (FD->getTemplatedKind() ==
2800 const TemplateParameterList *TList = FD->getTemplateSpecializationInfo()
2801 ->getTemplate()
2803 return {{TList, FD->getTemplateSpecializationArgs()->asArray()}};
2804 }
2805 return std::nullopt;
2806}
2807std::optional<CGDebugInfo::TemplateArgs>
2808CGDebugInfo::GetTemplateArgs(const VarDecl *VD) const {
2809 // Always get the full list of parameters, not just the ones from the
2810 // specialization. A partial specialization may have fewer parameters than
2811 // there are arguments.
2812 auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VD);
2813 if (!TS)
2814 return std::nullopt;
2815 VarTemplateDecl *T = TS->getSpecializedTemplate();
2816 const TemplateParameterList *TList = T->getTemplateParameters();
2817 auto TA = TS->getTemplateArgs().asArray();
2818 return {{TList, TA}};
2819}
2820std::optional<CGDebugInfo::TemplateArgs>
2821CGDebugInfo::GetTemplateArgs(const RecordDecl *RD) const {
2822 if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
2823 // Always get the full list of parameters, not just the ones from the
2824 // specialization. A partial specialization may have fewer parameters than
2825 // there are arguments.
2826 TemplateParameterList *TPList =
2827 TSpecial->getSpecializedTemplate()->getTemplateParameters();
2828 const TemplateArgumentList &TAList = TSpecial->getTemplateArgs();
2829 return {{TPList, TAList.asArray()}};
2830 }
2831 return std::nullopt;
2832}
2833
2834llvm::DINodeArray
2835CGDebugInfo::CollectFunctionTemplateParams(const FunctionDecl *FD,
2836 llvm::DIFile *Unit) {
2837 return CollectTemplateParams(GetTemplateArgs(FD), Unit);
2838}
2839
2840llvm::DINodeArray CGDebugInfo::CollectVarTemplateParams(const VarDecl *VL,
2841 llvm::DIFile *Unit) {
2842 return CollectTemplateParams(GetTemplateArgs(VL), Unit);
2843}
2844
2845llvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams(const RecordDecl *RD,
2846 llvm::DIFile *Unit) {
2847 return CollectTemplateParams(GetTemplateArgs(RD), Unit);
2848}
2849
2850void CGDebugInfo::CollectBTFDeclTagAnnotations(
2851 const Decl *D, SmallVectorImpl<llvm::Metadata *> &Annotations) {
2852 for (const auto *I : D->specific_attrs<BTFDeclTagAttr>()) {
2853 llvm::Metadata *Ops[2] = {
2854 llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_decl_tag")),
2855 llvm::MDString::get(CGM.getLLVMContext(), I->getBTFDeclTag())};
2856 Annotations.push_back(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
2857 }
2858}
2859
2860llvm::DINodeArray CGDebugInfo::CollectBTFDeclTagAnnotations(const Decl *D) {
2861 if (!D->hasAttr<BTFDeclTagAttr>())
2862 return nullptr;
2863
2864 SmallVector<llvm::Metadata *, 4> Annotations;
2865 CollectBTFDeclTagAnnotations(D, Annotations);
2866 return DBuilder.getOrCreateArray(Annotations);
2867}
2868
2869void CGDebugInfo::CollectBTFTypeTagAnnotations(
2870 QualType Ty, SmallVectorImpl<llvm::Metadata *> &Annotations) {
2871 const BTFTagAttributedType *BTFAttrTy;
2872 if (auto *Atomic = Ty->getAs<AtomicType>())
2873 BTFAttrTy = dyn_cast<BTFTagAttributedType>(Atomic->getValueType());
2874 else
2875 BTFAttrTy = dyn_cast<BTFTagAttributedType>(Ty);
2876
2877 while (BTFAttrTy) {
2878 StringRef Tag = BTFAttrTy->getAttr()->getBTFTypeTag();
2879 if (!Tag.empty()) {
2880 llvm::Metadata *Ops[2] = {
2881 llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_type_tag")),
2882 llvm::MDString::get(CGM.getLLVMContext(), Tag)};
2883 Annotations.insert(Annotations.begin(),
2884 llvm::MDNode::get(CGM.getLLVMContext(), Ops));
2885 }
2886 BTFAttrTy = dyn_cast<BTFTagAttributedType>(BTFAttrTy->getWrappedType());
2887 }
2888}
2889
2890llvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) {
2891 if (VTablePtrType)
2892 return VTablePtrType;
2893
2894 ASTContext &Context = CGM.getContext();
2895
2896 /* Function type */
2897 llvm::Metadata *STy = getOrCreateType(Context.IntTy, Unit);
2898 llvm::DITypeArray SElements = DBuilder.getOrCreateTypeArray(STy);
2899 llvm::DIType *SubTy = DBuilder.createSubroutineType(SElements);
2900 unsigned Size = Context.getTypeSize(Context.VoidPtrTy);
2901 unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace();
2902 std::optional<unsigned> DWARFAddressSpace =
2903 CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace);
2904
2905 llvm::DIType *vtbl_ptr_type = DBuilder.createPointerType(
2906 SubTy, Size, 0, DWARFAddressSpace, "__vtbl_ptr_type");
2907 VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size);
2908 return VTablePtrType;
2909}
2910
2911StringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) {
2912 // Copy the gdb compatible name on the side and use its reference.
2913 return internString("_vptr$", RD->getNameAsString());
2914}
2915
2916// Emit symbol for the debugger that points to the vtable address for
2917// the given class. The symbol is named as '__clang_vtable'.
2918// The debugger does not need to know any details about the contents of the
2919// vtable as it can work this out using its knowledge of the ABI and the
2920// existing information in the DWARF. The type is assumed to be 'void *'.
2921void CGDebugInfo::emitVTableSymbol(llvm::GlobalVariable *VTable,
2922 const CXXRecordDecl *RD) {
2923 if (!CGM.getTarget().getCXXABI().isItaniumFamily())
2924 return;
2925 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
2926 return;
2927
2928 // On COFF platform, we shouldn't emit a reference to an external entity (i.e.
2929 // VTable) into debug info, which is constructed within a discardable section.
2930 // If that entity ends up implicitly dllimported from another DLL, the linker
2931 // may produce a runtime pseudo-relocation for it (BFD-ld only. LLD prohibits
2932 // to emit such relocation). If the debug section is stripped, the runtime
2933 // pseudo-relocation points to memory space outside of the module, causing an
2934 // access violation.
2935 if (CGM.getTarget().getTriple().isOSBinFormatCOFF() &&
2936 VTable->isDeclarationForLinker())
2937 return;
2938
2939 ASTContext &Context = CGM.getContext();
2940 StringRef SymbolName = "__clang_vtable";
2941 SourceLocation Loc;
2942 QualType VoidPtr = Context.getPointerType(Context.VoidTy);
2943
2944 // We deal with two different contexts:
2945 // - The type for the variable, which is part of the class that has the
2946 // vtable, is placed in the context of the DICompositeType metadata.
2947 // - The DIGlobalVariable for the vtable is put in the DICompileUnitScope.
2948
2949 // The created non-member should be mark as 'artificial'. It will be
2950 // placed inside the scope of the C++ class/structure.
2951 llvm::DIScope *DContext = getContextDescriptor(RD, TheCU);
2952 auto *Ctxt = cast<llvm::DICompositeType>(DContext);
2953 llvm::DIFile *Unit = getOrCreateFile(Loc);
2954 llvm::DIType *VTy = getOrCreateType(VoidPtr, Unit);
2955 llvm::DINode::DIFlags Flags = getAccessFlag(AccessSpecifier::AS_private, RD) |
2956 llvm::DINode::FlagArtificial;
2957 auto Tag = CGM.getCodeGenOpts().DwarfVersion >= 5
2958 ? llvm::dwarf::DW_TAG_variable
2959 : llvm::dwarf::DW_TAG_member;
2960 llvm::DIDerivedType *DT = DBuilder.createStaticMemberType(
2961 Ctxt, SymbolName, Unit, /*LineNumber=*/0, VTy, Flags,
2962 /*Val=*/nullptr, Tag);
2963
2964 // Use the same vtable pointer to global alignment for the symbol.
2965 unsigned PAlign = CGM.getVtableGlobalVarAlignment();
2966
2967 // The global variable is in the CU scope, and links back to the type it's
2968 // "within" via the declaration field.
2969 llvm::DIGlobalVariableExpression *GVE =
2970 DBuilder.createGlobalVariableExpression(
2971 TheCU, SymbolName, VTable->getName(), Unit, /*LineNo=*/0,
2972 getOrCreateType(VoidPtr, Unit), VTable->hasLocalLinkage(),
2973 /*isDefined=*/true, nullptr, DT, /*TemplateParameters=*/nullptr,
2974 PAlign);
2975 VTable->addDebugInfo(GVE);
2976}
2977
2978StringRef CGDebugInfo::getDynamicInitializerName(const VarDecl *VD,
2979 DynamicInitKind StubKind,
2980 llvm::Function *InitFn) {
2981 // If we're not emitting codeview, use the mangled name. For Itanium, this is
2982 // arbitrary.
2983 if (!CGM.getCodeGenOpts().EmitCodeView ||
2985 return InitFn->getName();
2986
2987 // Print the normal qualified name for the variable, then break off the last
2988 // NNS, and add the appropriate other text. Clang always prints the global
2989 // variable name without template arguments, so we can use rsplit("::") and
2990 // then recombine the pieces.
2991 SmallString<128> QualifiedGV;
2992 StringRef Quals;
2993 StringRef GVName;
2994 {
2995 llvm::raw_svector_ostream OS(QualifiedGV);
2996 VD->printQualifiedName(OS, getPrintingPolicy());
2997 std::tie(Quals, GVName) = OS.str().rsplit("::");
2998 if (GVName.empty())
2999 std::swap(Quals, GVName);
3000 }
3001
3002 SmallString<128> InitName;
3003 llvm::raw_svector_ostream OS(InitName);
3004 if (!Quals.empty())
3005 OS << Quals << "::";
3006
3007 switch (StubKind) {
3010 llvm_unreachable("not an initializer");
3012 OS << "`dynamic initializer for '";
3013 break;
3015 OS << "`dynamic atexit destructor for '";
3016 break;
3017 }
3018
3019 OS << GVName;
3020
3021 // Add any template specialization args.
3022 if (const auto *VTpl = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
3023 printTemplateArgumentList(OS, VTpl->getTemplateArgs().asArray(),
3024 getPrintingPolicy());
3025 }
3026
3027 OS << '\'';
3028
3029 return internString(OS.str());
3030}
3031
3032void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,
3033 SmallVectorImpl<llvm::Metadata *> &EltTys) {
3034 // If this class is not dynamic then there is not any vtable info to collect.
3035 if (!RD->isDynamicClass())
3036 return;
3037
3038 // Don't emit any vtable shape or vptr info if this class doesn't have an
3039 // extendable vfptr. This can happen if the class doesn't have virtual
3040 // methods, or in the MS ABI if those virtual methods only come from virtually
3041 // inherited bases.
3042 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
3043 if (!RL.hasExtendableVFPtr())
3044 return;
3045
3046 // CodeView needs to know how large the vtable of every dynamic class is, so
3047 // emit a special named pointer type into the element list. The vptr type
3048 // points to this type as well.
3049 llvm::DIType *VPtrTy = nullptr;
3050 bool NeedVTableShape = CGM.getCodeGenOpts().EmitCodeView &&
3051 CGM.getTarget().getCXXABI().isMicrosoft();
3052 if (NeedVTableShape) {
3053 uint64_t PtrWidth =
3054 CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
3055 const VTableLayout &VFTLayout =
3056 CGM.getMicrosoftVTableContext().getVFTableLayout(RD, CharUnits::Zero());
3057 unsigned VSlotCount =
3058 VFTLayout.vtable_components().size() - CGM.getLangOpts().RTTIData;
3059 unsigned VTableWidth = PtrWidth * VSlotCount;
3060 unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace();
3061 std::optional<unsigned> DWARFAddressSpace =
3062 CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace);
3063
3064 // Create a very wide void* type and insert it directly in the element list.
3065 llvm::DIType *VTableType = DBuilder.createPointerType(
3066 nullptr, VTableWidth, 0, DWARFAddressSpace, "__vtbl_ptr_type");
3067 EltTys.push_back(VTableType);
3068
3069 // The vptr is a pointer to this special vtable type.
3070 VPtrTy = DBuilder.createPointerType(VTableType, PtrWidth);
3071 }
3072
3073 // If there is a primary base then the artificial vptr member lives there.
3074 if (RL.getPrimaryBase())
3075 return;
3076
3077 if (!VPtrTy)
3078 VPtrTy = getOrCreateVTablePtrType(Unit);
3079
3080 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
3081 llvm::DIType *VPtrMember =
3082 DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 0, Size, 0, 0,
3083 llvm::DINode::FlagArtificial, VPtrTy);
3084 EltTys.push_back(VPtrMember);
3085}
3086
3088 SourceLocation Loc) {
3089 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
3090 llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc));
3091 return T;
3092}
3093
3095 SourceLocation Loc) {
3096 return getOrCreateStandaloneType(D, Loc);
3097}
3098
3100 SourceLocation Loc) {
3101 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
3102 assert(!D.isNull() && "null type");
3103 llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
3104 assert(T && "could not create debug info for type");
3105
3106 RetainedTypes.push_back(D.getAsOpaquePtr());
3107 return T;
3108}
3109
3111 QualType AllocatedTy,
3112 SourceLocation Loc) {
3113 if (CGM.getCodeGenOpts().getDebugInfo() <=
3114 llvm::codegenoptions::DebugLineTablesOnly)
3115 return;
3116 llvm::MDNode *node;
3117 if (AllocatedTy->isVoidType())
3118 node = llvm::MDNode::get(CGM.getLLVMContext(), {});
3119 else
3120 node = getOrCreateType(AllocatedTy, getOrCreateFile(Loc));
3121
3122 CI->setMetadata("heapallocsite", node);
3123}
3124
3126 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
3127 return;
3128 CanQualType Ty = CGM.getContext().getCanonicalTagType(ED);
3129 void *TyPtr = Ty.getAsOpaquePtr();
3130 auto I = TypeCache.find(TyPtr);
3131 if (I == TypeCache.end() || !cast<llvm::DIType>(I->second)->isForwardDecl())
3132 return;
3133 llvm::DIType *Res = CreateTypeDefinition(dyn_cast<EnumType>(Ty));
3134 assert(!Res->isForwardDecl());
3135 TypeCache[TyPtr].reset(Res);
3136}
3137
3139 if (DebugKind > llvm::codegenoptions::LimitedDebugInfo ||
3140 !CGM.getLangOpts().CPlusPlus)
3142}
3143
3144/// Return true if the class or any of its methods are marked dllimport.
3146 if (RD->hasAttr<DLLImportAttr>())
3147 return true;
3148 for (const CXXMethodDecl *MD : RD->methods())
3149 if (MD->hasAttr<DLLImportAttr>())
3150 return true;
3151 return false;
3152}
3153
3154/// Does a type definition exist in an imported clang module?
3155static bool isDefinedInClangModule(const RecordDecl *RD) {
3156 // Only definitions that where imported from an AST file come from a module.
3157 if (!RD || !RD->isFromASTFile())
3158 return false;
3159 // Anonymous entities cannot be addressed. Treat them as not from module.
3160 if (!RD->isExternallyVisible() && RD->getName().empty())
3161 return false;
3162 if (auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) {
3163 if (!CXXDecl->isCompleteDefinition())
3164 return false;
3165 // Check wether RD is a template.
3166 auto TemplateKind = CXXDecl->getTemplateSpecializationKind();
3167 if (TemplateKind != TSK_Undeclared) {
3168 // Unfortunately getOwningModule() isn't accurate enough to find the
3169 // owning module of a ClassTemplateSpecializationDecl that is inside a
3170 // namespace spanning multiple modules.
3171 bool Explicit = false;
3172 if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(CXXDecl))
3173 Explicit = TD->isExplicitInstantiationOrSpecialization();
3174 if (!Explicit && CXXDecl->getEnclosingNamespaceContext())
3175 return false;
3176 // This is a template, check the origin of the first member.
3177 if (CXXDecl->fields().empty())
3178 return TemplateKind == TSK_ExplicitInstantiationDeclaration;
3179 if (!CXXDecl->field_begin()->isFromASTFile())
3180 return false;
3181 }
3182 }
3183 return true;
3184}
3185
3187 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3188 if (CXXRD->isDynamicClass() &&
3189 CGM.getVTableLinkage(CXXRD) ==
3190 llvm::GlobalValue::AvailableExternallyLinkage &&
3192 return;
3193
3194 if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition()))
3195 return;
3196
3197 completeClass(RD);
3198}
3199
3201 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
3202 return;
3203 CanQualType Ty = CGM.getContext().getCanonicalTagType(RD);
3204 void *TyPtr = Ty.getAsOpaquePtr();
3205 auto I = TypeCache.find(TyPtr);
3206 if (I != TypeCache.end() && !cast<llvm::DIType>(I->second)->isForwardDecl())
3207 return;
3208
3209 // We want the canonical definition of the structure to not
3210 // be the typedef. Since that would lead to circular typedef
3211 // metadata.
3212 auto [Res, PrefRes] = CreateTypeDefinition(dyn_cast<RecordType>(Ty));
3213 assert(!Res->isForwardDecl());
3214 TypeCache[TyPtr].reset(Res);
3215}
3216
3219 for (CXXMethodDecl *MD : llvm::make_range(I, End))
3221 if (!Tmpl->isImplicit() && Tmpl->isThisDeclarationADefinition() &&
3222 !MD->getMemberSpecializationInfo()->isExplicitSpecialization())
3223 return true;
3224 return false;
3225}
3226
3227static bool canUseCtorHoming(const CXXRecordDecl *RD) {
3228 // Constructor homing can be used for classes that cannnot be constructed
3229 // without emitting code for one of their constructors. This is classes that
3230 // don't have trivial or constexpr constructors, or can be created from
3231 // aggregate initialization. Also skip lambda objects because they don't call
3232 // constructors.
3233
3234 // Skip this optimization if the class or any of its methods are marked
3235 // dllimport.
3237 return false;
3238
3239 if (RD->isLambda() || RD->isAggregate() ||
3242 return false;
3243
3244 for (const CXXConstructorDecl *Ctor : RD->ctors()) {
3245 if (Ctor->isCopyOrMoveConstructor())
3246 continue;
3247 if (!Ctor->isDeleted())
3248 return true;
3249 }
3250 return false;
3251}
3252
3253static bool shouldOmitDefinition(llvm::codegenoptions::DebugInfoKind DebugKind,
3254 bool DebugTypeExtRefs, const RecordDecl *RD,
3255 const LangOptions &LangOpts) {
3256 if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition()))
3257 return true;
3258
3259 if (auto *ES = RD->getASTContext().getExternalSource())
3260 if (ES->hasExternalDefinitions(RD) == ExternalASTSource::EK_Always)
3261 return true;
3262
3263 // Only emit forward declarations in line tables only to keep debug info size
3264 // small. This only applies to CodeView, since we don't emit types in DWARF
3265 // line tables only.
3266 if (DebugKind == llvm::codegenoptions::DebugLineTablesOnly)
3267 return true;
3268
3269 if (DebugKind > llvm::codegenoptions::LimitedDebugInfo ||
3270 RD->hasAttr<StandaloneDebugAttr>())
3271 return false;
3272
3273 if (!LangOpts.CPlusPlus)
3274 return false;
3275
3277 return true;
3278
3279 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
3280
3281 if (!CXXDecl)
3282 return false;
3283
3284 // Only emit complete debug info for a dynamic class when its vtable is
3285 // emitted. However, Microsoft debuggers don't resolve type information
3286 // across DLL boundaries, so skip this optimization if the class or any of its
3287 // methods are marked dllimport. This isn't a complete solution, since objects
3288 // without any dllimport methods can be used in one DLL and constructed in
3289 // another, but it is the current behavior of LimitedDebugInfo.
3290 if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass() &&
3291 !isClassOrMethodDLLImport(CXXDecl) && !CXXDecl->hasAttr<MSNoVTableAttr>())
3292 return true;
3293
3295 if (const auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
3296 Spec = SD->getSpecializationKind();
3297
3300 CXXDecl->method_end()))
3301 return true;
3302
3303 // In constructor homing mode, only emit complete debug info for a class
3304 // when its constructor is emitted.
3305 if ((DebugKind == llvm::codegenoptions::DebugInfoConstructor) &&
3306 canUseCtorHoming(CXXDecl))
3307 return true;
3308
3309 return false;
3310}
3311
3313 if (shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD, CGM.getLangOpts()))
3314 return;
3315
3316 CanQualType Ty = CGM.getContext().getCanonicalTagType(RD);
3317 llvm::DIType *T = getTypeOrNull(Ty);
3318 if (T && T->isForwardDecl())
3320}
3321
3322llvm::DIType *CGDebugInfo::CreateType(const RecordType *Ty) {
3323 RecordDecl *RD = Ty->getDecl()->getDefinitionOrSelf();
3324 llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(QualType(Ty, 0)));
3325 if (T || shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD,
3326 CGM.getLangOpts())) {
3327 if (!T)
3328 T = getOrCreateRecordFwdDecl(Ty, getDeclContextDescriptor(RD));
3329 return T;
3330 }
3331
3332 auto [Def, Pref] = CreateTypeDefinition(Ty);
3333
3334 return Pref ? Pref : Def;
3335}
3336
3337llvm::DIType *CGDebugInfo::GetPreferredNameType(const CXXRecordDecl *RD,
3338 llvm::DIFile *Unit) {
3339 if (!RD)
3340 return nullptr;
3341
3342 auto const *PNA = RD->getAttr<PreferredNameAttr>();
3343 if (!PNA)
3344 return nullptr;
3345
3346 return getOrCreateType(PNA->getTypedefType(), Unit);
3347}
3348
3349std::pair<llvm::DIType *, llvm::DIType *>
3350CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) {
3351 RecordDecl *RD = Ty->getDecl()->getDefinitionOrSelf();
3352
3353 // Get overall information about the record type for the debug info.
3354 llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
3355
3356 // Records and classes and unions can all be recursive. To handle them, we
3357 // first generate a debug descriptor for the struct as a forward declaration.
3358 // Then (if it is a definition) we go through and get debug info for all of
3359 // its members. Finally, we create a descriptor for the complete type (which
3360 // may refer to the forward decl if the struct is recursive) and replace all
3361 // uses of the forward declaration with the final definition.
3362 llvm::DICompositeType *FwdDecl = getOrCreateLimitedType(Ty);
3363
3364 const RecordDecl *D = RD->getDefinition();
3365 if (!D || !D->isCompleteDefinition())
3366 return {FwdDecl, nullptr};
3367
3368 if (const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD))
3369 CollectContainingType(CXXDecl, FwdDecl);
3370
3371 // Push the struct on region stack.
3372 LexicalBlockStack.emplace_back(&*FwdDecl);
3373 RegionMap[RD].reset(FwdDecl);
3374
3375 // Convert all the elements.
3376 SmallVector<llvm::Metadata *, 16> EltTys;
3377 // what about nested types?
3378
3379 // Note: The split of CXXDecl information here is intentional, the
3380 // gdb tests will depend on a certain ordering at printout. The debug
3381 // information offsets are still correct if we merge them all together
3382 // though.
3383 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
3384 if (CXXDecl) {
3385 CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl);
3386 CollectVTableInfo(CXXDecl, DefUnit, EltTys);
3387 }
3388
3389 // Collect data fields (including static variables and any initializers).
3390 CollectRecordFields(RD, DefUnit, EltTys, FwdDecl);
3391 if (CXXDecl && !CGM.getCodeGenOpts().DebugOmitUnreferencedMethods)
3392 CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl);
3393
3394 LexicalBlockStack.pop_back();
3395 RegionMap.erase(RD);
3396
3397 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
3398 DBuilder.replaceArrays(FwdDecl, Elements);
3399
3400 if (FwdDecl->isTemporary())
3401 FwdDecl =
3402 llvm::MDNode::replaceWithPermanent(llvm::TempDICompositeType(FwdDecl));
3403
3404 RegionMap[RD].reset(FwdDecl);
3405
3406 if (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB)
3407 if (auto *PrefDI = GetPreferredNameType(CXXDecl, DefUnit))
3408 return {FwdDecl, PrefDI};
3409
3410 return {FwdDecl, nullptr};
3411}
3412
3413llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectType *Ty,
3414 llvm::DIFile *Unit) {
3415 // Ignore protocols.
3416 return getOrCreateType(Ty->getBaseType(), Unit);
3417}
3418
3419llvm::DIType *CGDebugInfo::CreateType(const ObjCTypeParamType *Ty,
3420 llvm::DIFile *Unit) {
3421 // Ignore protocols.
3422 SourceLocation Loc = Ty->getDecl()->getLocation();
3423
3424 // Use Typedefs to represent ObjCTypeParamType.
3425 return DBuilder.createTypedef(
3426 getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit),
3427 Ty->getDecl()->getName(), getOrCreateFile(Loc), getLineNumber(Loc),
3428 getDeclContextDescriptor(Ty->getDecl()));
3429}
3430
3431/// \return true if Getter has the default name for the property PD.
3433 const ObjCMethodDecl *Getter) {
3434 assert(PD);
3435 if (!Getter)
3436 return true;
3437
3438 assert(Getter->getDeclName().isObjCZeroArgSelector());
3439 return PD->getName() ==
3441}
3442
3443/// \return true if Setter has the default name for the property PD.
3445 const ObjCMethodDecl *Setter) {
3446 assert(PD);
3447 if (!Setter)
3448 return true;
3449
3450 assert(Setter->getDeclName().isObjCOneArgSelector());
3453}
3454
3455llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
3456 llvm::DIFile *Unit) {
3457 ObjCInterfaceDecl *ID = Ty->getDecl();
3458 if (!ID)
3459 return nullptr;
3460
3461 auto RuntimeLang = static_cast<llvm::dwarf::SourceLanguage>(
3462 TheCU->getSourceLanguage().getUnversionedName());
3463
3464 // Return a forward declaration if this type was imported from a clang module,
3465 // and this is not the compile unit with the implementation of the type (which
3466 // may contain hidden ivars).
3467 if (DebugTypeExtRefs && ID->isFromASTFile() && ID->getDefinition() &&
3468 !ID->getImplementation())
3469 return DBuilder.createForwardDecl(
3470 llvm::dwarf::DW_TAG_structure_type, ID->getName(),
3471 getDeclContextDescriptor(ID), Unit, 0, RuntimeLang);
3472
3473 // Get overall information about the record type for the debug info.
3474 llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
3475 unsigned Line = getLineNumber(ID->getLocation());
3476
3477 // If this is just a forward declaration return a special forward-declaration
3478 // debug type since we won't be able to lay out the entire type.
3479 ObjCInterfaceDecl *Def = ID->getDefinition();
3480 if (!Def || !Def->getImplementation()) {
3481 llvm::DIScope *Mod = getParentModuleOrNull(ID);
3482 llvm::DIType *FwdDecl = DBuilder.createReplaceableCompositeType(
3483 llvm::dwarf::DW_TAG_structure_type, ID->getName(), Mod ? Mod : TheCU,
3484 DefUnit, Line, RuntimeLang);
3485 ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit));
3486 return FwdDecl;
3487 }
3488
3489 return CreateTypeDefinition(Ty, Unit);
3490}
3491
3492llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod,
3493 bool CreateSkeletonCU) {
3494 // Use the Module pointer as the key into the cache. This is a
3495 // nullptr if the "Module" is a PCH, which is safe because we don't
3496 // support chained PCH debug info, so there can only be a single PCH.
3497 const Module *M = Mod.getModuleOrNull();
3498 auto ModRef = ModuleCache.find(M);
3499 if (ModRef != ModuleCache.end())
3500 return cast<llvm::DIModule>(ModRef->second);
3501
3502 // Macro definitions that were defined with "-D" on the command line.
3503 SmallString<128> ConfigMacros;
3504 {
3505 llvm::raw_svector_ostream OS(ConfigMacros);
3506 const auto &PPOpts = CGM.getPreprocessorOpts();
3507 unsigned I = 0;
3508 // Translate the macro definitions back into a command line.
3509 for (auto &M : PPOpts.Macros) {
3510 if (++I > 1)
3511 OS << " ";
3512 const std::string &Macro = M.first;
3513 bool Undef = M.second;
3514 OS << "\"-" << (Undef ? 'U' : 'D');
3515 for (char c : Macro)
3516 switch (c) {
3517 case '\\':
3518 OS << "\\\\";
3519 break;
3520 case '"':
3521 OS << "\\\"";
3522 break;
3523 default:
3524 OS << c;
3525 }
3526 OS << '\"';
3527 }
3528 }
3529
3530 bool IsRootModule = M ? !M->Parent : true;
3531 // When a module name is specified as -fmodule-name, that module gets a
3532 // clang::Module object, but it won't actually be built or imported; it will
3533 // be textual.
3534 if (CreateSkeletonCU && IsRootModule && Mod.getASTFile().empty() && M)
3535 assert(StringRef(M->Name).starts_with(CGM.getLangOpts().ModuleName) &&
3536 "clang module without ASTFile must be specified by -fmodule-name");
3537
3538 // Return a StringRef to the remapped Path.
3539 auto RemapPath = [this](StringRef Path) -> std::string {
3540 std::string Remapped = remapDIPath(Path);
3541 StringRef Relative(Remapped);
3542 StringRef CompDir = TheCU->getDirectory();
3543 if (CompDir.empty())
3544 return Remapped;
3545
3546 if (Relative.consume_front(CompDir))
3547 Relative.consume_front(llvm::sys::path::get_separator());
3548
3549 return Relative.str();
3550 };
3551
3552 if (CreateSkeletonCU && IsRootModule && !Mod.getASTFile().empty()) {
3553 // PCH files don't have a signature field in the control block,
3554 // but LLVM detects skeleton CUs by looking for a non-zero DWO id.
3555 // We use the lower 64 bits for debug info.
3556
3557 uint64_t Signature = 0;
3558 if (const auto &ModSig = Mod.getSignature())
3559 Signature = ModSig.truncatedValue();
3560 else
3561 Signature = ~1ULL;
3562
3563 llvm::DIBuilder DIB(CGM.getModule());
3564 SmallString<0> PCM;
3565 if (!llvm::sys::path::is_absolute(Mod.getASTFile())) {
3566 if (CGM.getHeaderSearchOpts().ModuleFileHomeIsCwd)
3567 PCM = getCurrentDirname();
3568 else
3569 PCM = Mod.getPath();
3570 }
3571 llvm::sys::path::append(PCM, Mod.getASTFile());
3572 DIB.createCompileUnit(
3573 TheCU->getSourceLanguage(),
3574 // TODO: Support "Source" from external AST providers?
3575 DIB.createFile(Mod.getModuleName(), TheCU->getDirectory()),
3576 TheCU->getProducer(), false, StringRef(), 0, RemapPath(PCM),
3577 llvm::DICompileUnit::FullDebug, Signature);
3578 DIB.finalize();
3579 }
3580
3581 llvm::DIModule *Parent =
3582 IsRootModule ? nullptr
3583 : getOrCreateModuleRef(ASTSourceDescriptor(*M->Parent),
3584 CreateSkeletonCU);
3585 StringRef IncludePath = Mod.getPath();
3586 if (!CGM.getCodeGenOpts().DebugRecordSysroot) {
3587 StringRef Sysroot = CGM.getHeaderSearchOpts().Sysroot;
3588 if (!Sysroot.empty() && IncludePath.starts_with(Sysroot))
3589 IncludePath = "";
3590 }
3591 llvm::DIModule *DIMod =
3592 DBuilder.createModule(Parent, Mod.getModuleName(), ConfigMacros,
3593 RemapPath(IncludePath));
3594 ModuleCache[M].reset(DIMod);
3595 return DIMod;
3596}
3597
3598llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
3599 llvm::DIFile *Unit) {
3600 ObjCInterfaceDecl *ID = Ty->getDecl();
3601 llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
3602 unsigned Line = getLineNumber(ID->getLocation());
3603
3604 unsigned RuntimeLang = TheCU->getSourceLanguage().getUnversionedName();
3605
3606 // Bit size, align and offset of the type.
3607 uint64_t Size = CGM.getContext().getTypeSize(Ty);
3608 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
3609
3610 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3611 if (ID->getImplementation())
3612 Flags |= llvm::DINode::FlagObjcClassComplete;
3613
3614 llvm::DIScope *Mod = getParentModuleOrNull(ID);
3615 llvm::DICompositeType *RealDecl = DBuilder.createStructType(
3616 Mod ? Mod : Unit, ID->getName(), DefUnit, Line, Size, Align, Flags,
3617 nullptr, llvm::DINodeArray(), RuntimeLang);
3618
3619 QualType QTy(Ty, 0);
3620 TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl);
3621
3622 // Push the struct on region stack.
3623 LexicalBlockStack.emplace_back(RealDecl);
3624 RegionMap[Ty->getDecl()].reset(RealDecl);
3625
3626 // Convert all the elements.
3627 SmallVector<llvm::Metadata *, 16> EltTys;
3628
3629 ObjCInterfaceDecl *SClass = ID->getSuperClass();
3630 if (SClass) {
3631 llvm::DIType *SClassTy =
3632 getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit);
3633 if (!SClassTy)
3634 return nullptr;
3635
3636 llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0, 0,
3637 llvm::DINode::FlagZero);
3638 EltTys.push_back(InhTag);
3639 }
3640
3641 // Create entries for all of the properties.
3642 auto AddProperty = [&](const ObjCPropertyDecl *PD) {
3643 SourceLocation Loc = PD->getLocation();
3644 llvm::DIFile *PUnit = getOrCreateFile(Loc);
3645 unsigned PLine = getLineNumber(Loc);
3646 ObjCMethodDecl *Getter = PD->getGetterMethodDecl();
3647 ObjCMethodDecl *Setter = PD->getSetterMethodDecl();
3648 llvm::MDNode *PropertyNode = DBuilder.createObjCProperty(
3649 PD->getName(), PUnit, PLine,
3650 hasDefaultGetterName(PD, Getter) ? ""
3651 : getSelectorName(PD->getGetterName()),
3652 hasDefaultSetterName(PD, Setter) ? ""
3653 : getSelectorName(PD->getSetterName()),
3654 PD->getPropertyAttributes(), getOrCreateType(PD->getType(), PUnit));
3655 EltTys.push_back(PropertyNode);
3656 };
3657 {
3658 // Use 'char' for the isClassProperty bit as DenseSet requires space for
3659 // the empty key in the data type (and bool is too small for that).
3660 typedef std::pair<char, const IdentifierInfo *> IsClassAndIdent;
3661 /// List of already emitted properties. Two distinct class and instance
3662 /// properties can share the same identifier (but not two instance
3663 /// properties or two class properties).
3664 llvm::DenseSet<IsClassAndIdent> PropertySet;
3665 /// Returns the IsClassAndIdent key for the given property.
3666 auto GetIsClassAndIdent = [](const ObjCPropertyDecl *PD) {
3667 return std::make_pair(PD->isClassProperty(), PD->getIdentifier());
3668 };
3669 for (const ObjCCategoryDecl *ClassExt : ID->known_extensions())
3670 for (auto *PD : ClassExt->properties()) {
3671 PropertySet.insert(GetIsClassAndIdent(PD));
3672 AddProperty(PD);
3673 }
3674 for (const auto *PD : ID->properties()) {
3675 // Don't emit duplicate metadata for properties that were already in a
3676 // class extension.
3677 if (!PropertySet.insert(GetIsClassAndIdent(PD)).second)
3678 continue;
3679 AddProperty(PD);
3680 }
3681 }
3682
3683 const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID);
3684 unsigned FieldNo = 0;
3685 for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field;
3686 Field = Field->getNextIvar(), ++FieldNo) {
3687 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
3688 if (!FieldTy)
3689 return nullptr;
3690
3691 StringRef FieldName = Field->getName();
3692
3693 // Ignore unnamed fields.
3694 if (FieldName.empty())
3695 continue;
3696
3697 // Get the location for the field.
3698 llvm::DIFile *FieldDefUnit = getOrCreateFile(Field->getLocation());
3699 unsigned FieldLine = getLineNumber(Field->getLocation());
3700 QualType FType = Field->getType();
3701 uint64_t FieldSize = 0;
3702 uint32_t FieldAlign = 0;
3703
3704 if (!FType->isIncompleteArrayType()) {
3705
3706 // Bit size, align and offset of the type.
3707 FieldSize = Field->isBitField() ? Field->getBitWidthValue()
3708 : CGM.getContext().getTypeSize(FType);
3709 FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext());
3710 }
3711
3712 uint64_t FieldOffset;
3713 if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) {
3714 // We don't know the runtime offset of an ivar if we're using the
3715 // non-fragile ABI. For bitfields, use the bit offset into the first
3716 // byte of storage of the bitfield. For other fields, use zero.
3717 if (Field->isBitField()) {
3718 FieldOffset =
3719 CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field);
3720 FieldOffset %= CGM.getContext().getCharWidth();
3721 } else {
3722 FieldOffset = 0;
3723 }
3724 } else {
3725 FieldOffset = RL.getFieldOffset(FieldNo);
3726 }
3727
3728 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3729 if (Field->getAccessControl() == ObjCIvarDecl::Protected)
3730 Flags = llvm::DINode::FlagProtected;
3731 else if (Field->getAccessControl() == ObjCIvarDecl::Private)
3732 Flags = llvm::DINode::FlagPrivate;
3733 else if (Field->getAccessControl() == ObjCIvarDecl::Public)
3734 Flags = llvm::DINode::FlagPublic;
3735
3736 if (Field->isBitField())
3737 Flags |= llvm::DINode::FlagBitField;
3738
3739 llvm::MDNode *PropertyNode = nullptr;
3740 if (ObjCImplementationDecl *ImpD = ID->getImplementation()) {
3741 if (ObjCPropertyImplDecl *PImpD =
3742 ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) {
3743 if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) {
3744 SourceLocation Loc = PD->getLocation();
3745 llvm::DIFile *PUnit = getOrCreateFile(Loc);
3746 unsigned PLine = getLineNumber(Loc);
3747 ObjCMethodDecl *Getter = PImpD->getGetterMethodDecl();
3748 ObjCMethodDecl *Setter = PImpD->getSetterMethodDecl();
3749 PropertyNode = DBuilder.createObjCProperty(
3750 PD->getName(), PUnit, PLine,
3751 hasDefaultGetterName(PD, Getter)
3752 ? ""
3753 : getSelectorName(PD->getGetterName()),
3754 hasDefaultSetterName(PD, Setter)
3755 ? ""
3756 : getSelectorName(PD->getSetterName()),
3757 PD->getPropertyAttributes(),
3758 getOrCreateType(PD->getType(), PUnit));
3759 }
3760 }
3761 }
3762 FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, FieldLine,
3763 FieldSize, FieldAlign, FieldOffset, Flags,
3764 FieldTy, PropertyNode);
3765 EltTys.push_back(FieldTy);
3766 }
3767
3768 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
3769 DBuilder.replaceArrays(RealDecl, Elements);
3770
3771 LexicalBlockStack.pop_back();
3772 return RealDecl;
3773}
3774
3775llvm::DIType *CGDebugInfo::CreateType(const VectorType *Ty,
3776 llvm::DIFile *Unit) {
3777 if (Ty->isPackedVectorBoolType(CGM.getContext())) {
3778 // Boolean ext_vector_type(N) are special because their real element type
3779 // (bits of bit size) is not their Clang element type (_Bool of size byte).
3780 // For now, we pretend the boolean vector were actually a vector of bytes
3781 // (where each byte represents 8 bits of the actual vector).
3782 // FIXME Debug info should actually represent this proper as a vector mask
3783 // type.
3784 auto &Ctx = CGM.getContext();
3785 uint64_t Size = CGM.getContext().getTypeSize(Ty);
3786 uint64_t NumVectorBytes = Size / Ctx.getCharWidth();
3787
3788 // Construct the vector of 'char' type.
3789 QualType CharVecTy =
3790 Ctx.getVectorType(Ctx.CharTy, NumVectorBytes, VectorKind::Generic);
3791 return CreateType(CharVecTy->getAs<VectorType>(), Unit);
3792 }
3793
3794 llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit);
3795 int64_t Count = Ty->getNumElements();
3796
3797 llvm::Metadata *Subscript;
3798 QualType QTy(Ty, 0);
3799 auto SizeExpr = SizeExprCache.find(QTy);
3800 if (SizeExpr != SizeExprCache.end())
3801 Subscript = DBuilder.getOrCreateSubrange(
3802 SizeExpr->getSecond() /*count*/, nullptr /*lowerBound*/,
3803 nullptr /*upperBound*/, nullptr /*stride*/);
3804 else {
3805 auto *CountNode =
3806 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3807 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Count ? Count : -1));
3808 Subscript = DBuilder.getOrCreateSubrange(
3809 CountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
3810 nullptr /*stride*/);
3811 }
3812 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
3813
3814 uint64_t Size = CGM.getContext().getTypeSize(Ty);
3815 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
3816
3817 return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray);
3818}
3819
3820llvm::DIType *CGDebugInfo::CreateType(const ConstantMatrixType *Ty,
3821 llvm::DIFile *Unit) {
3822 // FIXME: Create another debug type for matrices
3823 // For the time being, it treats it like a nested ArrayType.
3824
3825 llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit);
3826 uint64_t Size = CGM.getContext().getTypeSize(Ty);
3827 uint32_t Align = getTypeAlignIfRequired(Ty, CGM.getContext());
3828
3829 // Create ranges for both dimensions.
3830 llvm::SmallVector<llvm::Metadata *, 2> Subscripts;
3831 auto *ColumnCountNode =
3832 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3833 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Ty->getNumColumns()));
3834 auto *RowCountNode =
3835 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3836 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Ty->getNumRows()));
3837 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3838 ColumnCountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
3839 nullptr /*stride*/));
3840 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3841 RowCountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
3842 nullptr /*stride*/));
3843 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);
3844 return DBuilder.createArrayType(Size, Align, ElementTy, SubscriptArray);
3845}
3846
3847llvm::DIType *CGDebugInfo::CreateType(const ArrayType *Ty, llvm::DIFile *Unit) {
3848 uint64_t Size;
3849 uint32_t Align;
3850
3851 // FIXME: make getTypeAlign() aware of VLAs and incomplete array types
3852 if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
3853 Size = 0;
3854 Align = getTypeAlignIfRequired(CGM.getContext().getBaseElementType(VAT),
3855 CGM.getContext());
3856 } else if (Ty->isIncompleteArrayType()) {
3857 Size = 0;
3858 if (Ty->getElementType()->isIncompleteType())
3859 Align = 0;
3860 else
3861 Align = getTypeAlignIfRequired(Ty->getElementType(), CGM.getContext());
3862 } else if (Ty->isIncompleteType()) {
3863 Size = 0;
3864 Align = 0;
3865 } else {
3866 // Size and align of the whole array, not the element type.
3867 Size = CGM.getContext().getTypeSize(Ty);
3868 Align = getTypeAlignIfRequired(Ty, CGM.getContext());
3869 }
3870
3871 // Add the dimensions of the array. FIXME: This loses CV qualifiers from
3872 // interior arrays, do we care? Why aren't nested arrays represented the
3873 // obvious/recursive way?
3874 SmallVector<llvm::Metadata *, 8> Subscripts;
3875 QualType EltTy(Ty, 0);
3876 while ((Ty = dyn_cast<ArrayType>(EltTy))) {
3877 // If the number of elements is known, then count is that number. Otherwise,
3878 // it's -1. This allows us to represent a subrange with an array of 0
3879 // elements, like this:
3880 //
3881 // struct foo {
3882 // int x[0];
3883 // };
3884 int64_t Count = -1; // Count == -1 is an unbounded array.
3885 if (const auto *CAT = dyn_cast<ConstantArrayType>(Ty))
3886 Count = CAT->getZExtSize();
3887 else if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
3888 if (Expr *Size = VAT->getSizeExpr()) {
3889 Expr::EvalResult Result;
3890 if (Size->EvaluateAsInt(Result, CGM.getContext()))
3891 Count = Result.Val.getInt().getExtValue();
3892 }
3893 }
3894
3895 auto SizeNode = SizeExprCache.find(EltTy);
3896 if (SizeNode != SizeExprCache.end())
3897 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3898 SizeNode->getSecond() /*count*/, nullptr /*lowerBound*/,
3899 nullptr /*upperBound*/, nullptr /*stride*/));
3900 else {
3901 auto *CountNode =
3902 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
3903 llvm::Type::getInt64Ty(CGM.getLLVMContext()), Count));
3904 Subscripts.push_back(DBuilder.getOrCreateSubrange(
3905 CountNode /*count*/, nullptr /*lowerBound*/, nullptr /*upperBound*/,
3906 nullptr /*stride*/));
3907 }
3908 EltTy = Ty->getElementType();
3909 }
3910
3911 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);
3912
3913 return DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit),
3914 SubscriptArray);
3915}
3916
3917llvm::DIType *CGDebugInfo::CreateType(const LValueReferenceType *Ty,
3918 llvm::DIFile *Unit) {
3919 return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, Ty,
3920 Ty->getPointeeType(), Unit);
3921}
3922
3923llvm::DIType *CGDebugInfo::CreateType(const RValueReferenceType *Ty,
3924 llvm::DIFile *Unit) {
3925 llvm::dwarf::Tag Tag = llvm::dwarf::DW_TAG_rvalue_reference_type;
3926 // DW_TAG_rvalue_reference_type was introduced in DWARF 4.
3927 if (CGM.getCodeGenOpts().DebugStrictDwarf &&
3928 CGM.getCodeGenOpts().DwarfVersion < 4)
3929 Tag = llvm::dwarf::DW_TAG_reference_type;
3930
3931 return CreatePointerLikeType(Tag, Ty, Ty->getPointeeType(), Unit);
3932}
3933
3934llvm::DIType *CGDebugInfo::CreateType(const MemberPointerType *Ty,
3935 llvm::DIFile *U) {
3936 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3937 uint64_t Size = 0;
3938
3939 if (!Ty->isIncompleteType()) {
3940 Size = CGM.getContext().getTypeSize(Ty);
3941
3942 // Set the MS inheritance model. There is no flag for the unspecified model.
3943 if (CGM.getTarget().getCXXABI().isMicrosoft()) {
3946 Flags |= llvm::DINode::FlagSingleInheritance;
3947 break;
3949 Flags |= llvm::DINode::FlagMultipleInheritance;
3950 break;
3952 Flags |= llvm::DINode::FlagVirtualInheritance;
3953 break;
3955 break;
3956 }
3957 }
3958 }
3959
3960 CanQualType T =
3961 CGM.getContext().getCanonicalTagType(Ty->getMostRecentCXXRecordDecl());
3962 llvm::DIType *ClassType = getOrCreateType(T, U);
3963 if (Ty->isMemberDataPointerType())
3964 return DBuilder.createMemberPointerType(
3965 getOrCreateType(Ty->getPointeeType(), U), ClassType, Size, /*Align=*/0,
3966 Flags);
3967
3968 const FunctionProtoType *FPT =
3969 Ty->getPointeeType()->castAs<FunctionProtoType>();
3970 return DBuilder.createMemberPointerType(
3971 getOrCreateInstanceMethodType(
3973 FPT, U),
3974 ClassType, Size, /*Align=*/0, Flags);
3975}
3976
3977llvm::DIType *CGDebugInfo::CreateType(const AtomicType *Ty, llvm::DIFile *U) {
3978 auto *FromTy = getOrCreateType(Ty->getValueType(), U);
3979 return DBuilder.createQualifiedType(llvm::dwarf::DW_TAG_atomic_type, FromTy);
3980}
3981
3982llvm::DIType *CGDebugInfo::CreateType(const PipeType *Ty, llvm::DIFile *U) {
3983 return getOrCreateType(Ty->getElementType(), U);
3984}
3985
3986llvm::DIType *CGDebugInfo::CreateType(const HLSLAttributedResourceType *Ty,
3987 llvm::DIFile *U) {
3988 return getOrCreateType(Ty->getWrappedType(), U);
3989}
3990
3991llvm::DIType *CGDebugInfo::CreateType(const HLSLInlineSpirvType *Ty,
3992 llvm::DIFile *U) {
3993 // Debug information unneeded.
3994 return nullptr;
3995}
3996
3997static auto getEnumInfo(CodeGenModule &CGM, llvm::DICompileUnit *TheCU,
3998 const EnumType *Ty) {
3999 const EnumDecl *ED = Ty->getDecl()->getDefinitionOrSelf();
4000
4001 uint64_t Size = 0;
4002 uint32_t Align = 0;
4003 if (ED->isComplete()) {
4004 Size = CGM.getContext().getTypeSize(QualType(Ty, 0));
4005 Align = getDeclAlignIfRequired(ED, CGM.getContext());
4006 }
4007 return std::make_tuple(ED, Size, Align, getTypeIdentifier(Ty, CGM, TheCU));
4008}
4009
4010llvm::DIType *CGDebugInfo::CreateEnumType(const EnumType *Ty) {
4011 auto [ED, Size, Align, Identifier] = getEnumInfo(CGM, TheCU, Ty);
4012
4013 bool isImportedFromModule =
4014 DebugTypeExtRefs && ED->isFromASTFile() && ED->getDefinition();
4015
4016 // If this is just a forward declaration, construct an appropriately
4017 // marked node and just return it.
4018 if (isImportedFromModule || !ED->getDefinition()) {
4019 // Note that it is possible for enums to be created as part of
4020 // their own declcontext. In this case a FwdDecl will be created
4021 // twice. This doesn't cause a problem because both FwdDecls are
4022 // entered into the ReplaceMap: finalize() will replace the first
4023 // FwdDecl with the second and then replace the second with
4024 // complete type.
4025 llvm::DIScope *EDContext = getDeclContextDescriptor(ED);
4026 llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
4027 llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType(
4028 llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit, 0));
4029
4030 unsigned Line = getLineNumber(ED->getLocation());
4031 StringRef EDName = ED->getName();
4032 llvm::DIType *RetTy = DBuilder.createReplaceableCompositeType(
4033 llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line,
4034 0, Size, Align, llvm::DINode::FlagFwdDecl, Identifier);
4035
4036 ReplaceMap.emplace_back(
4037 std::piecewise_construct, std::make_tuple(Ty),
4038 std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
4039 return RetTy;
4040 }
4041
4042 return CreateTypeDefinition(Ty);
4043}
4044
4045llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
4046 auto [ED, Size, Align, Identifier] = getEnumInfo(CGM, TheCU, Ty);
4047
4048 SmallVector<llvm::Metadata *, 16> Enumerators;
4049 ED = ED->getDefinition();
4050 assert(ED && "An enumeration definition is required");
4051 for (const auto *Enum : ED->enumerators()) {
4052 Enumerators.push_back(
4053 DBuilder.createEnumerator(Enum->getName(), Enum->getInitVal()));
4054 }
4055
4056 std::optional<EnumExtensibilityAttr::Kind> EnumKind;
4057 if (auto *Attr = ED->getAttr<EnumExtensibilityAttr>())
4058 EnumKind = Attr->getExtensibility();
4059
4060 // Return a CompositeType for the enum itself.
4061 llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
4062
4063 llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
4064 unsigned Line = getLineNumber(ED->getLocation());
4065 llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
4066 llvm::DIType *ClassTy = getOrCreateType(ED->getIntegerType(), DefUnit);
4067 return DBuilder.createEnumerationType(
4068 EnumContext, ED->getName(), DefUnit, Line, Size, Align, EltArray, ClassTy,
4069 /*RunTimeLang=*/0, Identifier, ED->isScoped(), EnumKind);
4070}
4071
4072llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
4073 unsigned MType, SourceLocation LineLoc,
4074 StringRef Name, StringRef Value) {
4075 unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
4076 return DBuilder.createMacro(Parent, Line, MType, Name, Value);
4077}
4078
4079llvm::DIMacroFile *CGDebugInfo::CreateTempMacroFile(llvm::DIMacroFile *Parent,
4080 SourceLocation LineLoc,
4081 SourceLocation FileLoc) {
4082 llvm::DIFile *FName = getOrCreateFile(FileLoc);
4083 unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
4084 return DBuilder.createTempMacroFile(Parent, Line, FName);
4085}
4086
4087llvm::DILocation *
4088CGDebugInfo::CreateSyntheticInlineAt(llvm::DebugLoc ParentLocation,
4089 llvm::DISubprogram *SynthSubprogram) {
4090 return llvm::DILocation::get(CGM.getLLVMContext(), /*Line=*/0, /*Column=*/0,
4091 SynthSubprogram, ParentLocation);
4092}
4093
4094llvm::DILocation *
4095CGDebugInfo::CreateSyntheticInlineAt(llvm::DebugLoc ParentLocation,
4096 StringRef SynthFuncName,
4097 llvm::DIFile *SynthFile) {
4098 llvm::DISubprogram *SP = createInlinedSubprogram(SynthFuncName, SynthFile);
4099 return CreateSyntheticInlineAt(ParentLocation, SP);
4100}
4101
4103 llvm::DebugLoc TrapLocation, StringRef Category, StringRef FailureMsg) {
4104 // Create a debug location from `TrapLocation` that adds an artificial inline
4105 // frame.
4107
4108 FuncName += "$";
4109 FuncName += Category;
4110 FuncName += "$";
4111 FuncName += FailureMsg;
4112
4113 return CreateSyntheticInlineAt(TrapLocation, FuncName,
4114 TrapLocation->getFile());
4115}
4116
4118 Qualifiers Quals;
4119 do {
4120 Qualifiers InnerQuals = T.getLocalQualifiers();
4121 // Qualifiers::operator+() doesn't like it if you add a Qualifier
4122 // that is already there.
4123 Quals += Qualifiers::removeCommonQualifiers(Quals, InnerQuals);
4124 Quals += InnerQuals;
4125 QualType LastT = T;
4126 switch (T->getTypeClass()) {
4127 default:
4128 return C.getQualifiedType(T.getTypePtr(), Quals);
4129 case Type::Enum:
4130 case Type::Record:
4131 case Type::InjectedClassName:
4132 return C.getQualifiedType(T->getCanonicalTypeUnqualified().getTypePtr(),
4133 Quals);
4134 case Type::TemplateSpecialization: {
4135 const auto *Spec = cast<TemplateSpecializationType>(T);
4136 if (Spec->isTypeAlias())
4137 return C.getQualifiedType(T.getTypePtr(), Quals);
4138 T = Spec->desugar();
4139 break;
4140 }
4141 case Type::TypeOfExpr:
4142 T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType();
4143 break;
4144 case Type::TypeOf:
4145 T = cast<TypeOfType>(T)->getUnmodifiedType();
4146 break;
4147 case Type::Decltype:
4148 T = cast<DecltypeType>(T)->getUnderlyingType();
4149 break;
4150 case Type::UnaryTransform:
4151 T = cast<UnaryTransformType>(T)->getUnderlyingType();
4152 break;
4153 case Type::Attributed:
4154 T = cast<AttributedType>(T)->getEquivalentType();
4155 break;
4156 case Type::BTFTagAttributed:
4157 T = cast<BTFTagAttributedType>(T)->getWrappedType();
4158 break;
4159 case Type::CountAttributed:
4160 T = cast<CountAttributedType>(T)->desugar();
4161 break;
4162 case Type::Using:
4163 T = cast<UsingType>(T)->desugar();
4164 break;
4165 case Type::Paren:
4166 T = cast<ParenType>(T)->getInnerType();
4167 break;
4168 case Type::MacroQualified:
4169 T = cast<MacroQualifiedType>(T)->getUnderlyingType();
4170 break;
4171 case Type::SubstTemplateTypeParm:
4172 T = cast<SubstTemplateTypeParmType>(T)->getReplacementType();
4173 break;
4174 case Type::Auto:
4175 case Type::DeducedTemplateSpecialization: {
4176 QualType DT = cast<DeducedType>(T)->getDeducedType();
4177 assert(!DT.isNull() && "Undeduced types shouldn't reach here.");
4178 T = DT;
4179 break;
4180 }
4181 case Type::PackIndexing: {
4182 T = cast<PackIndexingType>(T)->getSelectedType();
4183 break;
4184 }
4185 case Type::Adjusted:
4186 case Type::Decayed:
4187 // Decayed and adjusted types use the adjusted type in LLVM and DWARF.
4188 T = cast<AdjustedType>(T)->getAdjustedType();
4189 break;
4190 }
4191
4192 assert(T != LastT && "Type unwrapping failed to unwrap!");
4193 (void)LastT;
4194 } while (true);
4195}
4196
4197llvm::DIType *CGDebugInfo::getTypeOrNull(QualType Ty) {
4198 assert(Ty == UnwrapTypeForDebugInfo(Ty, CGM.getContext()));
4199 auto It = TypeCache.find(Ty.getAsOpaquePtr());
4200 if (It != TypeCache.end()) {
4201 // Verify that the debug info still exists.
4202 if (llvm::Metadata *V = It->second)
4203 return cast<llvm::DIType>(V);
4204 }
4205
4206 return nullptr;
4207}
4208
4213
4215 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly ||
4216 D.isDynamicClass())
4217 return;
4218
4220 // In case this type has no member function definitions being emitted, ensure
4221 // it is retained
4222 RetainedTypes.push_back(
4223 CGM.getContext().getCanonicalTagType(&D).getAsOpaquePtr());
4224}
4225
4226llvm::DIType *CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile *Unit) {
4227 if (Ty.isNull())
4228 return nullptr;
4229
4230 llvm::TimeTraceScope TimeScope("DebugType", [&]() {
4231 std::string Name;
4232 llvm::raw_string_ostream OS(Name);
4233 Ty.print(OS, getPrintingPolicy());
4234 return Name;
4235 });
4236
4237 // Unwrap the type as needed for debug information.
4238 Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext());
4239
4240 if (auto *T = getTypeOrNull(Ty))
4241 return T;
4242
4243 llvm::DIType *Res = CreateTypeNode(Ty, Unit);
4244 void *TyPtr = Ty.getAsOpaquePtr();
4245
4246 // And update the type cache.
4247 TypeCache[TyPtr].reset(Res);
4248
4249 return Res;
4250}
4251
4252llvm::DIModule *CGDebugInfo::getParentModuleOrNull(const Decl *D) {
4253 // A forward declaration inside a module header does not belong to the module.
4255 return nullptr;
4256 if (DebugTypeExtRefs && D->isFromASTFile()) {
4257 // Record a reference to an imported clang module or precompiled header.
4258 auto *Reader = CGM.getContext().getExternalSource();
4259 auto Idx = D->getOwningModuleID();
4260 auto Info = Reader->getSourceDescriptor(Idx);
4261 if (Info)
4262 return getOrCreateModuleRef(*Info, /*SkeletonCU=*/true);
4263 } else if (ClangModuleMap) {
4264 // We are building a clang module or a precompiled header.
4265 //
4266 // TODO: When D is a CXXRecordDecl or a C++ Enum, the ODR applies
4267 // and it wouldn't be necessary to specify the parent scope
4268 // because the type is already unique by definition (it would look
4269 // like the output of -fno-standalone-debug). On the other hand,
4270 // the parent scope helps a consumer to quickly locate the object
4271 // file where the type's definition is located, so it might be
4272 // best to make this behavior a command line or debugger tuning
4273 // option.
4274 if (Module *M = D->getOwningModule()) {
4275 // This is a (sub-)module.
4276 auto Info = ASTSourceDescriptor(*M);
4277 return getOrCreateModuleRef(Info, /*SkeletonCU=*/false);
4278 } else {
4279 // This the precompiled header being built.
4280 return getOrCreateModuleRef(PCHDescriptor, /*SkeletonCU=*/false);
4281 }
4282 }
4283
4284 return nullptr;
4285}
4286
4287llvm::DIType *CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile *Unit) {
4288 // Handle qualifiers, which recursively handles what they refer to.
4289 if (Ty.hasLocalQualifiers())
4290 return CreateQualifiedType(Ty, Unit);
4291
4292 // Work out details of type.
4293 switch (Ty->getTypeClass()) {
4294#define TYPE(Class, Base)
4295#define ABSTRACT_TYPE(Class, Base)
4296#define NON_CANONICAL_TYPE(Class, Base)
4297#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4298#include "clang/AST/TypeNodes.inc"
4299 llvm_unreachable("Dependent types cannot show up in debug information");
4300
4301 case Type::ExtVector:
4302 case Type::Vector:
4303 return CreateType(cast<VectorType>(Ty), Unit);
4304 case Type::ConstantMatrix:
4305 return CreateType(cast<ConstantMatrixType>(Ty), Unit);
4306 case Type::ObjCObjectPointer:
4307 return CreateType(cast<ObjCObjectPointerType>(Ty), Unit);
4308 case Type::ObjCObject:
4309 return CreateType(cast<ObjCObjectType>(Ty), Unit);
4310 case Type::ObjCTypeParam:
4311 return CreateType(cast<ObjCTypeParamType>(Ty), Unit);
4312 case Type::ObjCInterface:
4313 return CreateType(cast<ObjCInterfaceType>(Ty), Unit);
4314 case Type::Builtin:
4315 return CreateType(cast<BuiltinType>(Ty));
4316 case Type::Complex:
4317 return CreateType(cast<ComplexType>(Ty));
4318 case Type::Pointer:
4319 return CreateType(cast<PointerType>(Ty), Unit);
4320 case Type::BlockPointer:
4321 return CreateType(cast<BlockPointerType>(Ty), Unit);
4322 case Type::Typedef:
4323 return CreateType(cast<TypedefType>(Ty), Unit);
4324 case Type::Record:
4325 return CreateType(cast<RecordType>(Ty));
4326 case Type::Enum:
4327 return CreateEnumType(cast<EnumType>(Ty));
4328 case Type::FunctionProto:
4329 case Type::FunctionNoProto:
4330 return CreateType(cast<FunctionType>(Ty), Unit);
4331 case Type::ConstantArray:
4332 case Type::VariableArray:
4333 case Type::IncompleteArray:
4334 case Type::ArrayParameter:
4335 return CreateType(cast<ArrayType>(Ty), Unit);
4336
4337 case Type::LValueReference:
4338 return CreateType(cast<LValueReferenceType>(Ty), Unit);
4339 case Type::RValueReference:
4340 return CreateType(cast<RValueReferenceType>(Ty), Unit);
4341
4342 case Type::MemberPointer:
4343 return CreateType(cast<MemberPointerType>(Ty), Unit);
4344
4345 case Type::Atomic:
4346 return CreateType(cast<AtomicType>(Ty), Unit);
4347
4348 case Type::BitInt:
4349 return CreateType(cast<BitIntType>(Ty));
4350 case Type::OverflowBehavior:
4351 return CreateType(cast<OverflowBehaviorType>(Ty), Unit);
4352 case Type::Pipe:
4353 return CreateType(cast<PipeType>(Ty), Unit);
4354
4355 case Type::TemplateSpecialization:
4356 return CreateType(cast<TemplateSpecializationType>(Ty), Unit);
4357 case Type::HLSLAttributedResource:
4358 return CreateType(cast<HLSLAttributedResourceType>(Ty), Unit);
4359 case Type::HLSLInlineSpirv:
4360 return CreateType(cast<HLSLInlineSpirvType>(Ty), Unit);
4361 case Type::PredefinedSugar:
4362 return getOrCreateType(cast<PredefinedSugarType>(Ty)->desugar(), Unit);
4363 case Type::CountAttributed:
4364 case Type::LateParsedAttr:
4365 case Type::Auto:
4366 case Type::Attributed:
4367 case Type::BTFTagAttributed:
4368 case Type::Adjusted:
4369 case Type::Decayed:
4370 case Type::DeducedTemplateSpecialization:
4371 case Type::Using:
4372 case Type::Paren:
4373 case Type::MacroQualified:
4374 case Type::SubstTemplateTypeParm:
4375 case Type::TypeOfExpr:
4376 case Type::TypeOf:
4377 case Type::Decltype:
4378 case Type::PackIndexing:
4379 case Type::UnaryTransform:
4380 break;
4381 }
4382
4383 llvm_unreachable("type should have been unwrapped!");
4384}
4385
4386llvm::DICompositeType *
4387CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty) {
4388 QualType QTy(Ty, 0);
4389
4390 auto *T = cast_or_null<llvm::DICompositeType>(getTypeOrNull(QTy));
4391
4392 // We may have cached a forward decl when we could have created
4393 // a non-forward decl. Go ahead and create a non-forward decl
4394 // now.
4395 if (T && !T->isForwardDecl())
4396 return T;
4397
4398 // Otherwise create the type.
4399 llvm::DICompositeType *Res = CreateLimitedType(Ty);
4400
4401 // Propagate members from the declaration to the definition
4402 // CreateType(const RecordType*) will overwrite this with the members in the
4403 // correct order if the full type is needed.
4404 DBuilder.replaceArrays(Res, T ? T->getElements() : llvm::DINodeArray());
4405
4406 // And update the type cache.
4407 TypeCache[QTy.getAsOpaquePtr()].reset(Res);
4408 return Res;
4409}
4410
4411// TODO: Currently used for context chains when limiting debug info.
4412llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
4413 RecordDecl *RD = Ty->getDecl()->getDefinitionOrSelf();
4414 bool NameIsSimplified = false;
4415
4416 // Get overall information about the record type for the debug info.
4417 StringRef RDName = getClassName(RD, &NameIsSimplified);
4418 const SourceLocation Loc = RD->getLocation();
4419 llvm::DIFile *DefUnit = nullptr;
4420 unsigned Line = 0;
4421 if (Loc.isValid()) {
4422 DefUnit = getOrCreateFile(Loc);
4423 Line = getLineNumber(Loc);
4424 }
4425
4426 llvm::DIScope *RDContext = getDeclContextDescriptor(RD);
4427
4428 // If we ended up creating the type during the context chain construction,
4429 // just return that.
4430 auto *T = cast_or_null<llvm::DICompositeType>(
4431 getTypeOrNull(CGM.getContext().getCanonicalTagType(RD)));
4432 if (T && (!T->isForwardDecl() || !RD->getDefinition()))
4433 return T;
4434
4435 // If this is just a forward or incomplete declaration, construct an
4436 // appropriately marked node and just return it.
4437 const RecordDecl *D = RD->getDefinition();
4438 if (!D || !D->isCompleteDefinition())
4439 return getOrCreateRecordFwdDecl(Ty, RDContext);
4440
4441 uint64_t Size = CGM.getContext().getTypeSize(Ty);
4442 // __attribute__((aligned)) can increase or decrease alignment *except* on a
4443 // struct or struct member, where it only increases alignment unless 'packed'
4444 // is also specified. To handle this case, the `getTypeAlignIfRequired` needs
4445 // to be used.
4446 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
4447
4448 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
4449
4450 // Explicitly record the calling convention and export symbols for C++
4451 // records.
4452 auto Flags = llvm::DINode::FlagZero;
4453 if (NameIsSimplified)
4454 Flags |= llvm::DINode::FlagNameIsSimplified;
4455 if (auto CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
4456 if (CGM.getCXXABI().getRecordArgABI(CXXRD) == CGCXXABI::RAA_Indirect)
4457 Flags |= llvm::DINode::FlagTypePassByReference;
4458 else
4459 Flags |= llvm::DINode::FlagTypePassByValue;
4460
4461 // Record if a C++ record is non-trivial type.
4462 if (!CXXRD->isTrivial())
4463 Flags |= llvm::DINode::FlagNonTrivial;
4464
4465 // Record exports it symbols to the containing structure.
4466 if (CXXRD->isAnonymousStructOrUnion())
4467 Flags |= llvm::DINode::FlagExportSymbols;
4468
4469 Flags |= getAccessFlag(CXXRD->getAccess(),
4470 dyn_cast<CXXRecordDecl>(CXXRD->getDeclContext()));
4471 }
4472
4473 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
4474 llvm::DICompositeType *RealDecl = DBuilder.createReplaceableCompositeType(
4475 getTagForRecord(RD), RDName, RDContext, DefUnit, Line, 0, Size, Align,
4476 Flags, Identifier, Annotations);
4477
4478 // Elements of composite types usually have back to the type, creating
4479 // uniquing cycles. Distinct nodes are more efficient.
4480 switch (RealDecl->getTag()) {
4481 default:
4482 llvm_unreachable("invalid composite type tag");
4483
4484 case llvm::dwarf::DW_TAG_array_type:
4485 case llvm::dwarf::DW_TAG_enumeration_type:
4486 // Array elements and most enumeration elements don't have back references,
4487 // so they don't tend to be involved in uniquing cycles and there is some
4488 // chance of merging them when linking together two modules. Only make
4489 // them distinct if they are ODR-uniqued.
4490 if (Identifier.empty())
4491 break;
4492 [[fallthrough]];
4493
4494 case llvm::dwarf::DW_TAG_structure_type:
4495 case llvm::dwarf::DW_TAG_union_type:
4496 case llvm::dwarf::DW_TAG_class_type:
4497 // Immediately resolve to a distinct node.
4498 RealDecl =
4499 llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
4500 break;
4501 }
4502
4503 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getDecl())) {
4504 CXXRecordDecl *TemplateDecl =
4505 CTSD->getSpecializedTemplate()->getTemplatedDecl();
4506 RegionMap[TemplateDecl].reset(RealDecl);
4507 } else {
4508 RegionMap[RD].reset(RealDecl);
4509 }
4510 TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
4511
4512 if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
4513 DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(),
4514 CollectCXXTemplateParams(TSpecial, DefUnit));
4515 return RealDecl;
4516}
4517
4518void CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD,
4519 llvm::DICompositeType *RealDecl) {
4520 // A class's primary base or the class itself contains the vtable.
4521 llvm::DIType *ContainingType = nullptr;
4522 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
4523 if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) {
4524 // Seek non-virtual primary base root.
4525 while (true) {
4526 const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase);
4527 const CXXRecordDecl *PBT = BRL.getPrimaryBase();
4528 if (PBT && !BRL.isPrimaryBaseVirtual())
4529 PBase = PBT;
4530 else
4531 break;
4532 }
4533 CanQualType T = CGM.getContext().getCanonicalTagType(PBase);
4534 ContainingType = getOrCreateType(T, getOrCreateFile(RD->getLocation()));
4535 } else if (RD->isDynamicClass())
4536 ContainingType = RealDecl;
4537
4538 DBuilder.replaceVTableHolder(RealDecl, ContainingType);
4539}
4540
4541llvm::DIType *CGDebugInfo::CreateMemberType(llvm::DIFile *Unit, QualType FType,
4542 StringRef Name, uint64_t *Offset) {
4543 llvm::DIType *FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
4544 uint64_t FieldSize = CGM.getContext().getTypeSize(FType);
4545 auto FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext());
4546 llvm::DIType *Ty =
4547 DBuilder.createMemberType(Unit, Name, Unit, 0, FieldSize, FieldAlign,
4548 *Offset, llvm::DINode::FlagZero, FieldTy);
4549 *Offset += FieldSize;
4550 return Ty;
4551}
4552
4553void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit,
4554 StringRef &Name,
4555 StringRef &LinkageName,
4556 llvm::DIScope *&FDContext,
4557 llvm::DINodeArray &TParamsArray,
4558 llvm::DINode::DIFlags &Flags) {
4559 const auto *FD = cast<FunctionDecl>(GD.getCanonicalDecl().getDecl());
4560 bool NameIsSimplified = false;
4561 Name = getFunctionName(FD, &NameIsSimplified);
4562 if (NameIsSimplified)
4563 Flags |= llvm::DINode::FlagNameIsSimplified;
4564 Name = getFunctionName(FD);
4565 // Use mangled name as linkage name for C/C++ functions.
4566 if (FD->getType()->getAs<FunctionProtoType>())
4567 LinkageName = CGM.getMangledName(GD);
4568 if (FD->hasPrototype())
4569 Flags |= llvm::DINode::FlagPrototyped;
4570 // No need to replicate the linkage name if it isn't different from the
4571 // subprogram name, no need to have it at all unless coverage is enabled or
4572 // debug is set to more than just line tables or extra debug info is needed.
4573 if (LinkageName == Name ||
4574 (CGM.getCodeGenOpts().CoverageNotesFile.empty() &&
4575 CGM.getCodeGenOpts().CoverageDataFile.empty() &&
4576 !CGM.getCodeGenOpts().DebugInfoForProfiling &&
4577 !CGM.getCodeGenOpts().PseudoProbeForProfiling &&
4578 DebugKind <= llvm::codegenoptions::DebugLineTablesOnly))
4579 LinkageName = StringRef();
4580
4581 // Emit the function scope in line tables only mode (if CodeView) to
4582 // differentiate between function names.
4583 if (CGM.getCodeGenOpts().hasReducedDebugInfo() ||
4584 (DebugKind == llvm::codegenoptions::DebugLineTablesOnly &&
4585 CGM.getCodeGenOpts().EmitCodeView)) {
4586 if (const NamespaceDecl *NSDecl =
4587 dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
4588 FDContext = getOrCreateNamespace(NSDecl);
4589 else if (const RecordDecl *RDecl =
4590 dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) {
4591 llvm::DIScope *Mod = getParentModuleOrNull(RDecl);
4592 FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU);
4593 }
4594 }
4595 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
4596 // Check if it is a noreturn-marked function
4597 if (FD->isNoReturn())
4598 Flags |= llvm::DINode::FlagNoReturn;
4599 // Collect template parameters.
4600 TParamsArray = CollectFunctionTemplateParams(FD, Unit);
4601 }
4602}
4603
4604void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit,
4605 unsigned &LineNo, QualType &T,
4606 StringRef &Name, StringRef &LinkageName,
4607 llvm::MDTuple *&TemplateParameters,
4608 llvm::DIScope *&VDContext) {
4609 Unit = getOrCreateFile(VD->getLocation());
4610 LineNo = getLineNumber(VD->getLocation());
4611
4612 setLocation(VD->getLocation());
4613
4614 T = VD->getType();
4615 if (T->isIncompleteArrayType()) {
4616 // CodeGen turns int[] into int[1] so we'll do the same here.
4617 llvm::APInt ConstVal(32, 1);
4618 QualType ET = CGM.getContext().getAsArrayType(T)->getElementType();
4619
4620 T = CGM.getContext().getConstantArrayType(ET, ConstVal, nullptr,
4622 }
4623
4624 Name = VD->getName();
4625 if (VD->getDeclContext() && !isa<FunctionDecl>(VD->getDeclContext()) &&
4627 LinkageName = CGM.getMangledName(VD);
4628 if (LinkageName == Name)
4629 LinkageName = StringRef();
4630
4632 llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VD, &*Unit);
4633 TemplateParameters = parameterNodes.get();
4634 } else {
4635 TemplateParameters = nullptr;
4636 }
4637
4638 // Get context for static locals (that are technically globals) the same way
4639 // we do for "local" locals -- by using current lexical block.
4640 if (VD->isStaticLocal()) {
4641 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
4642 VDContext = LexicalBlockStack.back();
4643 return;
4644 }
4645
4646 // Since we emit declarations (DW_AT_members) for static members, place the
4647 // definition of those static members in the namespace they were declared in
4648 // in the source code (the lexical decl context).
4649 // FIXME: Generalize this for even non-member global variables where the
4650 // declaration and definition may have different lexical decl contexts, once
4651 // we have support for emitting declarations of (non-member) global variables.
4652 const DeclContext *DC = VD->isStaticDataMember() ? VD->getLexicalDeclContext()
4653 : VD->getDeclContext();
4654 // When a record type contains an in-line initialization of a static data
4655 // member, and the record type is marked as __declspec(dllexport), an implicit
4656 // definition of the member will be created in the record context. DWARF
4657 // doesn't seem to have a nice way to describe this in a form that consumers
4658 // are likely to understand, so fake the "normal" situation of a definition
4659 // outside the class by putting it in the global scope.
4660 if (DC->isRecord())
4661 DC = CGM.getContext().getTranslationUnitDecl();
4662
4663 llvm::DIScope *Mod = getParentModuleOrNull(VD);
4664 VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU);
4665}
4666
4667llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
4668 bool Stub) {
4669 llvm::DINodeArray TParamsArray;
4670 StringRef Name, LinkageName;
4671 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
4672 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
4673 SourceLocation Loc = GD.getDecl()->getLocation();
4674 llvm::DIFile *Unit = getOrCreateFile(Loc);
4675 llvm::DIScope *DContext = Unit;
4676 unsigned Line = getLineNumber(Loc);
4677 collectFunctionDeclProps(GD, Unit, Name, LinkageName, DContext, TParamsArray,
4678 Flags);
4679 auto *FD = cast<FunctionDecl>(GD.getDecl());
4680
4681 // Build function type.
4682 SmallVector<QualType, 16> ArgTypes;
4683 for (const ParmVarDecl *Parm : FD->parameters())
4684 ArgTypes.push_back(Parm->getType());
4685
4686 CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv();
4687 QualType FnType = CGM.getContext().getFunctionType(
4688 FD->getReturnType(), ArgTypes, FunctionProtoType::ExtProtoInfo(CC));
4689 if (!FD->isExternallyVisible())
4690 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
4691 if (CGM.getCodeGenOpts().OptimizationLevel != 0)
4692 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
4693
4694 if (Stub) {
4695 Flags |= getCallSiteRelatedAttrs();
4696 SPFlags |= llvm::DISubprogram::SPFlagDefinition;
4697 return DBuilder.createFunction(
4698 DContext, Name, LinkageName, Unit, Line,
4699 getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
4700 TParamsArray.get(), getFunctionDeclaration(FD), /*ThrownTypes*/ nullptr,
4701 /*Annotations*/ nullptr, /*TargetFuncName*/ "",
4702 CGM.getCodeGenOpts().DebugKeyInstructions);
4703 }
4704
4705 llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(
4706 DContext, Name, LinkageName, Unit, Line,
4707 getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
4708 TParamsArray.get(), getFunctionDeclaration(FD));
4709 const FunctionDecl *CanonDecl = FD->getCanonicalDecl();
4710 FwdDeclReplaceMap.emplace_back(std::piecewise_construct,
4711 std::make_tuple(CanonDecl),
4712 std::make_tuple(SP));
4713 return SP;
4714}
4715
4716llvm::DISubprogram *CGDebugInfo::getFunctionForwardDeclaration(GlobalDecl GD) {
4717 return getFunctionFwdDeclOrStub(GD, /* Stub = */ false);
4718}
4719
4720llvm::DISubprogram *CGDebugInfo::getFunctionStub(GlobalDecl GD) {
4721 return getFunctionFwdDeclOrStub(GD, /* Stub = */ true);
4722}
4723
4724llvm::DIGlobalVariable *
4725CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {
4726 QualType T;
4727 StringRef Name, LinkageName;
4728 SourceLocation Loc = VD->getLocation();
4729 llvm::DIFile *Unit = getOrCreateFile(Loc);
4730 llvm::DIScope *DContext = Unit;
4731 unsigned Line = getLineNumber(Loc);
4732 llvm::MDTuple *TemplateParameters = nullptr;
4733
4734 collectVarDeclProps(VD, Unit, Line, T, Name, LinkageName, TemplateParameters,
4735 DContext);
4736 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
4737 auto *GV = DBuilder.createTempGlobalVariableFwdDecl(
4738 DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit),
4739 !VD->isExternallyVisible(), nullptr, TemplateParameters, Align);
4740 FwdDeclReplaceMap.emplace_back(
4741 std::piecewise_construct,
4742 std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())),
4743 std::make_tuple(static_cast<llvm::Metadata *>(GV)));
4744 return GV;
4745}
4746
4747llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) {
4748 // We only need a declaration (not a definition) of the type - so use whatever
4749 // we would otherwise do to get a type for a pointee. (forward declarations in
4750 // limited debug info, full definitions (if the type definition is available)
4751 // in unlimited debug info)
4752 if (const auto *TD = dyn_cast<TypeDecl>(D)) {
4753 QualType Ty = CGM.getContext().getTypeDeclType(TD);
4754 return getOrCreateType(Ty, getOrCreateFile(TD->getLocation()));
4755 }
4756 auto I = DeclCache.find(D->getCanonicalDecl());
4757
4758 if (I != DeclCache.end()) {
4759 auto N = I->second;
4760 if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(N))
4761 return GVE->getVariable();
4762 return cast<llvm::DINode>(N);
4763 }
4764
4765 // Search imported declaration cache if it is already defined
4766 // as imported declaration.
4767 auto IE = ImportedDeclCache.find(D->getCanonicalDecl());
4768
4769 if (IE != ImportedDeclCache.end()) {
4770 auto N = IE->second;
4771 if (auto *GVE = dyn_cast_or_null<llvm::DIImportedEntity>(N))
4772 return cast<llvm::DINode>(GVE);
4773 return dyn_cast_or_null<llvm::DINode>(N);
4774 }
4775
4776 // No definition for now. Emit a forward definition that might be
4777 // merged with a potential upcoming definition.
4778 if (const auto *FD = dyn_cast<FunctionDecl>(D))
4779 return getFunctionForwardDeclaration(FD);
4780 else if (const auto *VD = dyn_cast<VarDecl>(D))
4781 return getGlobalVariableForwardDeclaration(VD);
4782
4783 return nullptr;
4784}
4785
4786llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) {
4787 if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
4788 return nullptr;
4789
4790 const auto *FD = dyn_cast<FunctionDecl>(D);
4791 if (!FD)
4792 return nullptr;
4793
4794 // Setup context.
4795 auto *S = getDeclContextDescriptor(D);
4796
4797 auto MI = SPCache.find(FD->getCanonicalDecl());
4798 if (MI == SPCache.end()) {
4799 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) {
4800 return CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()),
4802 }
4803 }
4804 if (MI != SPCache.end()) {
4805 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
4806 if (SP && !SP->isDefinition())
4807 return SP;
4808 }
4809
4810 for (auto *NextFD : FD->redecls()) {
4811 auto MI = SPCache.find(NextFD->getCanonicalDecl());
4812 if (MI != SPCache.end()) {
4813 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
4814 if (SP && !SP->isDefinition())
4815 return SP;
4816 }
4817 }
4818 return nullptr;
4819}
4820
4821llvm::DISubprogram *CGDebugInfo::getObjCMethodDeclaration(
4822 const Decl *D, llvm::DISubroutineType *FnType, unsigned LineNo,
4823 llvm::DINode::DIFlags Flags, llvm::DISubprogram::DISPFlags SPFlags) {
4824 if (!D || DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
4825 return nullptr;
4826
4827 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
4828 if (!OMD)
4829 return nullptr;
4830
4831 if (CGM.getCodeGenOpts().DwarfVersion < 5 && !OMD->isDirectMethod())
4832 return nullptr;
4833
4834 if (OMD->isDirectMethod())
4835 SPFlags |= llvm::DISubprogram::SPFlagObjCDirect;
4836
4837 // Starting with DWARF V5 method declarations are emitted as children of
4838 // the interface type.
4839 auto *ID = dyn_cast_or_null<ObjCInterfaceDecl>(D->getDeclContext());
4840 if (!ID)
4841 ID = OMD->getClassInterface();
4842 if (!ID)
4843 return nullptr;
4844 QualType QTy(ID->getTypeForDecl(), 0);
4845 auto It = TypeCache.find(QTy.getAsOpaquePtr());
4846 if (It == TypeCache.end())
4847 return nullptr;
4848 auto *InterfaceType = cast<llvm::DICompositeType>(It->second);
4849 llvm::DISubprogram *FD = DBuilder.createFunction(
4850 InterfaceType, getObjCMethodName(OMD), StringRef(),
4851 InterfaceType->getFile(), LineNo, FnType, LineNo, Flags, SPFlags);
4852 DBuilder.finalizeSubprogram(FD);
4853 ObjCMethodCache[ID].push_back({FD, OMD->isDirectMethod()});
4854 return FD;
4855}
4856
4857// getOrCreateFunctionType - Construct type. If it is a c++ method, include
4858// implicit parameter "this".
4859llvm::DISubroutineType *CGDebugInfo::getOrCreateFunctionType(const Decl *D,
4860 QualType FnType,
4861 llvm::DIFile *F) {
4862 // In CodeView, we emit the function types in line tables only because the
4863 // only way to distinguish between functions is by display name and type.
4864 if (!D || (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly &&
4865 !CGM.getCodeGenOpts().EmitCodeView))
4866 // Create fake but valid subroutine type. Otherwise -verify would fail, and
4867 // subprogram DIE will miss DW_AT_decl_file and DW_AT_decl_line fields.
4868 return DBuilder.createSubroutineType(DBuilder.getOrCreateTypeArray({}));
4869
4870 if (const auto *Method = dyn_cast<CXXDestructorDecl>(D)) {
4871 // Read method type from 'FnType' because 'D.getType()' does not cover
4872 // implicit arguments for destructors.
4873 return getOrCreateMethodTypeForDestructor(Method, F, FnType);
4874 }
4875
4876 if (const auto *Method = dyn_cast<CXXMethodDecl>(D))
4877 return getOrCreateMethodType(Method, F);
4878
4879 const auto *FTy = FnType->getAs<FunctionType>();
4880 CallingConv CC = FTy ? FTy->getCallConv() : CallingConv::CC_C;
4881
4882 if (const auto *OMethod = dyn_cast<ObjCMethodDecl>(D)) {
4883 // Add "self" and "_cmd"
4884 SmallVector<llvm::Metadata *, 16> Elts;
4885
4886 // First element is always return type. For 'void' functions it is NULL.
4887 QualType ResultTy = OMethod->getReturnType();
4888
4889 // Replace the instancetype keyword with the actual type.
4890 if (ResultTy == CGM.getContext().getObjCInstanceType())
4891 ResultTy = CGM.getContext().getPointerType(
4892 QualType(OMethod->getClassInterface()->getTypeForDecl(), 0));
4893
4894 Elts.push_back(getOrCreateType(ResultTy, F));
4895 // "self" pointer is always first argument.
4896 QualType SelfDeclTy;
4897 if (auto *SelfDecl = OMethod->getSelfDecl())
4898 SelfDeclTy = SelfDecl->getType();
4899 else if (auto *FPT = dyn_cast<FunctionProtoType>(FnType))
4900 if (FPT->getNumParams() > 1)
4901 SelfDeclTy = FPT->getParamType(0);
4902 if (!SelfDeclTy.isNull())
4903 Elts.push_back(
4904 CreateSelfType(SelfDeclTy, getOrCreateType(SelfDeclTy, F)));
4905 // "_cmd" pointer is always second argument.
4906 Elts.push_back(DBuilder.createArtificialType(
4907 getOrCreateType(CGM.getContext().getObjCSelType(), F)));
4908 // Get rest of the arguments.
4909 for (const auto *PI : OMethod->parameters())
4910 Elts.push_back(getOrCreateType(PI->getType(), F));
4911 // Variadic methods need a special marker at the end of the type list.
4912 if (OMethod->isVariadic())
4913 Elts.push_back(DBuilder.createUnspecifiedParameter());
4914
4915 llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
4916 return DBuilder.createSubroutineType(
4917 EltTypeArray, llvm::DINode::FlagZero,
4918 getDwarfCC(CC, CGM.getTarget().getTriple()));
4919 }
4920
4921 // Handle variadic function types; they need an additional
4922 // unspecified parameter.
4923 if (const auto *FD = dyn_cast<FunctionDecl>(D))
4924 if (FD->isVariadic()) {
4925 SmallVector<llvm::Metadata *, 16> EltTys;
4926 EltTys.push_back(getOrCreateType(FD->getReturnType(), F));
4927 if (const auto *FPT = dyn_cast<FunctionProtoType>(FnType))
4928 for (QualType ParamType : FPT->param_types())
4929 EltTys.push_back(getOrCreateType(ParamType, F));
4930 EltTys.push_back(DBuilder.createUnspecifiedParameter());
4931 llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
4932 return DBuilder.createSubroutineType(
4933 EltTypeArray, llvm::DINode::FlagZero,
4934 getDwarfCC(CC, CGM.getTarget().getTriple()));
4935 }
4936
4937 return cast<llvm::DISubroutineType>(getOrCreateType(FnType, F));
4938}
4939
4940QualType
4944 if (FD)
4945 if (const auto *SrcFnTy = FD->getType()->getAs<FunctionType>())
4946 CC = SrcFnTy->getCallConv();
4948 for (const VarDecl *VD : Args)
4949 ArgTypes.push_back(VD->getType());
4950 return CGM.getContext().getFunctionType(RetTy, ArgTypes,
4952}
4953
4955 SourceLocation ScopeLoc, QualType FnType,
4956 llvm::Function *Fn, bool CurFuncIsThunk) {
4957 StringRef Name;
4958 StringRef LinkageName;
4959
4960 FnBeginRegionCount.push_back(LexicalBlockStack.size());
4961
4962 const Decl *D = GD.getDecl();
4963 bool HasDecl = (D != nullptr);
4964
4965 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
4966 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
4967 llvm::DIFile *Unit = getOrCreateFile(Loc);
4968 llvm::DIScope *FDContext = Unit;
4969 llvm::DINodeArray TParamsArray;
4970 bool KeyInstructions = CGM.getCodeGenOpts().DebugKeyInstructions;
4971 if (!HasDecl) {
4972 // Use llvm function name.
4973 LinkageName = Fn->getName();
4974 } else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
4975 // If there is a subprogram for this function available then use it.
4976 auto FI = SPCache.find(FD->getCanonicalDecl());
4977 if (FI != SPCache.end()) {
4978 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
4979 if (SP && SP->isDefinition()) {
4980 LexicalBlockStack.emplace_back(SP);
4981 RegionMap[D].reset(SP);
4982 return;
4983 }
4984 }
4985 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
4986 TParamsArray, Flags);
4987 // Disable KIs if this is a coroutine.
4988 KeyInstructions =
4989 KeyInstructions && !isa_and_present<CoroutineBodyStmt>(FD->getBody());
4990 } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
4991 Name = getObjCMethodName(OMD);
4992 Flags |= llvm::DINode::FlagPrototyped;
4993 } else if (isa<VarDecl>(D) &&
4995 // This is a global initializer or atexit destructor for a global variable.
4996 Name = getDynamicInitializerName(cast<VarDecl>(D), GD.getDynamicInitKind(),
4997 Fn);
4998 if (Name != Fn->getName())
4999 LinkageName = Fn->getName();
5000 } else {
5001 Name = Fn->getName();
5002
5003 if (isa<BlockDecl>(D))
5004 LinkageName = Name;
5005
5006 Flags |= llvm::DINode::FlagPrototyped;
5007 }
5008 Name.consume_front("\01");
5009
5010 assert((!D || !isa<VarDecl>(D) ||
5012 "Unexpected DynamicInitKind !");
5013
5014 if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() ||
5016 Flags |= llvm::DINode::FlagArtificial;
5017 // Artificial functions should not silently reuse CurLoc.
5018 clearCurLoc();
5019 }
5020
5021 if (CurFuncIsThunk)
5022 Flags |= llvm::DINode::FlagThunk;
5023
5024 if (Fn->hasLocalLinkage())
5025 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
5026 if (CGM.getCodeGenOpts().OptimizationLevel != 0)
5027 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
5028
5029 llvm::DINode::DIFlags FlagsForDef = Flags | getCallSiteRelatedAttrs();
5030 llvm::DISubprogram::DISPFlags SPFlagsForDef =
5031 SPFlags | llvm::DISubprogram::SPFlagDefinition;
5032
5033 const unsigned LineNo = getLineNumber(Loc.isValid() ? Loc : CurLoc);
5034 unsigned ScopeLine = getLineNumber(ScopeLoc);
5035 llvm::DISubroutineType *DIFnType = getOrCreateFunctionType(D, FnType, Unit);
5036 llvm::DISubprogram *Decl = nullptr;
5037 llvm::DINodeArray Annotations = nullptr;
5038 if (D) {
5040 ? getObjCMethodDeclaration(D, DIFnType, LineNo, Flags, SPFlags)
5041 : getFunctionDeclaration(D);
5042 Annotations = CollectBTFDeclTagAnnotations(D);
5043 }
5044
5045 // FIXME: The function declaration we're constructing here is mostly reusing
5046 // declarations from CXXMethodDecl and not constructing new ones for arbitrary
5047 // FunctionDecls. When/if we fix this we can have FDContext be TheCU/null for
5048 // all subprograms instead of the actual context since subprogram definitions
5049 // are emitted as CU level entities by the backend.
5050 llvm::DISubprogram *SP = DBuilder.createFunction(
5051 FDContext, Name, LinkageName, Unit, LineNo, DIFnType, ScopeLine,
5052 FlagsForDef, SPFlagsForDef, TParamsArray.get(), Decl, nullptr,
5053 Annotations, "", KeyInstructions);
5054 Fn->setSubprogram(SP);
5055
5056 // We might get here with a VarDecl in the case we're generating
5057 // code for the initialization of globals. Do not record these decls
5058 // as they will overwrite the actual VarDecl Decl in the cache.
5059 if (HasDecl && isa<FunctionDecl>(D))
5060 DeclCache[D->getCanonicalDecl()].reset(SP);
5061
5062 // Push the function onto the lexical block stack.
5063 LexicalBlockStack.emplace_back(SP);
5064
5065 if (HasDecl)
5066 RegionMap[D].reset(SP);
5067}
5068
5070 QualType FnType, llvm::Function *Fn) {
5071 StringRef Name;
5072 StringRef LinkageName;
5073
5074 const Decl *D = GD.getDecl();
5075 if (!D)
5076 return;
5077
5078 llvm::TimeTraceScope TimeScope("DebugFunction", [&]() {
5079 return GetName(D, true);
5080 });
5081
5082 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
5083 llvm::DIFile *Unit = getOrCreateFile(Loc);
5084 bool IsDeclForCallSite = Fn ? true : false;
5085 llvm::DIScope *FDContext =
5086 IsDeclForCallSite ? Unit : getDeclContextDescriptor(D);
5087 llvm::DINodeArray TParamsArray;
5088 if (isa<FunctionDecl>(D)) {
5089 // If there is a DISubprogram for this function available then use it.
5090 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
5091 TParamsArray, Flags);
5092 } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
5093 Name = getObjCMethodName(OMD);
5094 Flags |= llvm::DINode::FlagPrototyped;
5095 } else {
5096 llvm_unreachable("not a function or ObjC method");
5097 }
5098 Name.consume_front("\01");
5099
5100 if (D->isImplicit()) {
5101 Flags |= llvm::DINode::FlagArtificial;
5102 // Artificial functions without a location should not silently reuse CurLoc.
5103 if (Loc.isInvalid())
5104 clearCurLoc();
5105 }
5106 unsigned LineNo = getLineNumber(Loc);
5107 unsigned ScopeLine = 0;
5108 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
5109 if (CGM.getCodeGenOpts().OptimizationLevel != 0)
5110 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
5111
5112 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
5113 llvm::DISubroutineType *STy = getOrCreateFunctionType(D, FnType, Unit);
5114 // Key Instructions: Don't set flag on declarations.
5115 assert(~SPFlags & llvm::DISubprogram::SPFlagDefinition);
5116 llvm::DISubprogram *SP = DBuilder.createFunction(
5117 FDContext, Name, LinkageName, Unit, LineNo, STy, ScopeLine, Flags,
5118 SPFlags, TParamsArray.get(), nullptr, nullptr, Annotations,
5119 /*TargetFunctionName*/ "", /*UseKeyInstructions*/ false);
5120
5121 // Preserve btf_decl_tag attributes for parameters of extern functions
5122 // for BPF target. The parameters created in this loop are attached as
5123 // DISubprogram's retainedNodes in the DIBuilder::finalize() call.
5124 if (IsDeclForCallSite && CGM.getTarget().getTriple().isBPF()) {
5125 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
5126 llvm::DITypeArray ParamTypes = STy->getTypeArray();
5127 unsigned ArgNo = 1;
5128 for (ParmVarDecl *PD : FD->parameters()) {
5129 llvm::DINodeArray ParamAnnotations = CollectBTFDeclTagAnnotations(PD);
5130 DBuilder.createParameterVariable(
5131 SP, PD->getName(), ArgNo, Unit, LineNo, ParamTypes[ArgNo], true,
5132 llvm::DINode::FlagZero, ParamAnnotations);
5133 ++ArgNo;
5134 }
5135 }
5136 }
5137
5138 if (IsDeclForCallSite)
5139 Fn->setSubprogram(SP);
5140}
5141
5143 llvm::CallBase *CI) {
5144 if (!shouldGenerateVirtualCallSite())
5145 return;
5146
5147 if (!FD)
5148 return;
5149
5150 assert(CI && "Invalid Call Instruction.");
5151 if (!CI->isIndirectCall())
5152 return;
5153
5154 // Always get the method declaration.
5155 if (llvm::DISubprogram *MD = getFunctionDeclaration(FD))
5156 CI->setMetadata(llvm::LLVMContext::MD_call_target, MD);
5157}
5158
5159void CGDebugInfo::EmitFuncDeclForCallSite(llvm::CallBase *CallOrInvoke,
5160 QualType CalleeType,
5161 GlobalDecl CalleeGlobalDecl) {
5162 if (!CallOrInvoke)
5163 return;
5164 auto *Func = dyn_cast<llvm::Function>(CallOrInvoke->getCalledOperand());
5165 if (!Func)
5166 return;
5167 if (Func->getSubprogram())
5168 return;
5169
5170 const FunctionDecl *CalleeDecl =
5171 cast<FunctionDecl>(CalleeGlobalDecl.getDecl());
5172
5173 // Do not emit a declaration subprogram for a function with nodebug
5174 // attribute, or if call site info isn't required.
5175 if (CalleeDecl->hasAttr<NoDebugAttr>() ||
5176 getCallSiteRelatedAttrs() == llvm::DINode::FlagZero)
5177 return;
5178
5179 // If there is no DISubprogram attached to the function being called,
5180 // create the one describing the function in order to have complete
5181 // call site debug info.
5182 if (!CalleeDecl->isStatic() && !CalleeDecl->isInlined())
5183 EmitFunctionDecl(CalleeGlobalDecl, CalleeDecl->getLocation(), CalleeType,
5184 Func);
5185}
5186
5188 const auto *FD = cast<FunctionDecl>(GD.getDecl());
5189 // If there is a subprogram for this function available then use it.
5190 auto FI = SPCache.find(FD->getCanonicalDecl());
5191 llvm::DISubprogram *SP = nullptr;
5192 if (FI != SPCache.end())
5193 SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
5194 if (!SP || !SP->isDefinition())
5195 SP = getFunctionStub(GD);
5196 FnBeginRegionCount.push_back(LexicalBlockStack.size());
5197 LexicalBlockStack.emplace_back(SP);
5198 setInlinedAt(Builder.getCurrentDebugLocation());
5199 EmitLocation(Builder, FD->getLocation());
5200}
5201
5203 assert(CurInlinedAt && "unbalanced inline scope stack");
5204 EmitFunctionEnd(Builder, nullptr);
5205 setInlinedAt(llvm::DebugLoc(CurInlinedAt).getInlinedAt());
5206}
5207
5209 // Update our current location
5210 setLocation(Loc);
5211
5212 if (CurLoc.isInvalid() ||
5213 (CGM.getCodeGenOpts().DebugInfoMacroExpansionLoc && CurLoc.isMacroID()) ||
5214 LexicalBlockStack.empty())
5215 return;
5216
5217 llvm::MDNode *Scope = LexicalBlockStack.back();
5218 Builder.SetCurrentDebugLocation(llvm::DILocation::get(
5219 CGM.getLLVMContext(), CurLocLine, CurLocColumn, Scope, CurInlinedAt));
5220}
5221
5222void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
5223 llvm::MDNode *Back = nullptr;
5224 if (!LexicalBlockStack.empty())
5225 Back = LexicalBlockStack.back().get();
5226 LexicalBlockStack.emplace_back(DBuilder.createLexicalBlock(
5227 cast<llvm::DIScope>(Back), getOrCreateFile(CurLoc), getLineNumber(CurLoc),
5228 getColumnNumber(CurLoc)));
5229}
5230
5231void CGDebugInfo::AppendAddressSpaceXDeref(
5232 unsigned AddressSpace, SmallVectorImpl<uint64_t> &Expr) const {
5233 std::optional<unsigned> DWARFAddressSpace =
5234 CGM.getTarget().getDWARFAddressSpace(AddressSpace);
5235 if (!DWARFAddressSpace)
5236 return;
5237
5238 Expr.push_back(llvm::dwarf::DW_OP_constu);
5239 Expr.push_back(*DWARFAddressSpace);
5240 Expr.push_back(llvm::dwarf::DW_OP_swap);
5241 Expr.push_back(llvm::dwarf::DW_OP_xderef);
5242}
5243
5245 SourceLocation Loc) {
5246 // Set our current location.
5247 setLocation(Loc);
5248
5249 // Emit a line table change for the current location inside the new scope.
5250 Builder.SetCurrentDebugLocation(llvm::DILocation::get(
5251 CGM.getLLVMContext(), getLineNumber(Loc), getColumnNumber(Loc),
5252 LexicalBlockStack.back(), CurInlinedAt));
5253
5254 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
5255 return;
5256
5257 // Create a new lexical block and push it on the stack.
5258 CreateLexicalBlock(Loc);
5259}
5260
5262 SourceLocation Loc) {
5263 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
5264
5265 // Provide an entry in the line table for the end of the block.
5266 EmitLocation(Builder, Loc);
5267
5268 if (DebugKind <= llvm::codegenoptions::DebugLineTablesOnly)
5269 return;
5270
5271 LexicalBlockStack.pop_back();
5272}
5273
5274void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder, llvm::Function *Fn) {
5275 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
5276 unsigned RCount = FnBeginRegionCount.back();
5277 assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch");
5278
5279 // Pop all regions for this function.
5280 while (LexicalBlockStack.size() != RCount) {
5281 // Provide an entry in the line table for the end of the block.
5282 EmitLocation(Builder, CurLoc);
5283 LexicalBlockStack.pop_back();
5284 }
5285 FnBeginRegionCount.pop_back();
5286
5287 if (Fn && Fn->getSubprogram())
5288 DBuilder.finalizeSubprogram(Fn->getSubprogram());
5289}
5290
5291CGDebugInfo::BlockByRefType
5292CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
5293 uint64_t *XOffset) {
5295 QualType FType;
5296 uint64_t FieldSize, FieldOffset;
5297 uint32_t FieldAlign;
5298
5299 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
5300 QualType Type = VD->getType();
5301
5302 FieldOffset = 0;
5303 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
5304 EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset));
5305 EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset));
5306 FType = CGM.getContext().IntTy;
5307 EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset));
5308 EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset));
5309
5310 bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD);
5311 if (HasCopyAndDispose) {
5312 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
5313 EltTys.push_back(
5314 CreateMemberType(Unit, FType, "__copy_helper", &FieldOffset));
5315 EltTys.push_back(
5316 CreateMemberType(Unit, FType, "__destroy_helper", &FieldOffset));
5317 }
5318 bool HasByrefExtendedLayout;
5319 Qualifiers::ObjCLifetime Lifetime;
5320 if (CGM.getContext().getByrefLifetime(Type, Lifetime,
5321 HasByrefExtendedLayout) &&
5322 HasByrefExtendedLayout) {
5323 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
5324 EltTys.push_back(
5325 CreateMemberType(Unit, FType, "__byref_variable_layout", &FieldOffset));
5326 }
5327
5328 CharUnits Align = CGM.getContext().getDeclAlign(VD);
5329 if (Align > CGM.getContext().toCharUnitsFromBits(
5331 CharUnits FieldOffsetInBytes =
5332 CGM.getContext().toCharUnitsFromBits(FieldOffset);
5333 CharUnits AlignedOffsetInBytes = FieldOffsetInBytes.alignTo(Align);
5334 CharUnits NumPaddingBytes = AlignedOffsetInBytes - FieldOffsetInBytes;
5335
5336 if (NumPaddingBytes.isPositive()) {
5337 llvm::APInt pad(32, NumPaddingBytes.getQuantity());
5338 FType = CGM.getContext().getConstantArrayType(
5339 CGM.getContext().CharTy, pad, nullptr, ArraySizeModifier::Normal, 0);
5340 EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset));
5341 }
5342 }
5343
5344 FType = Type;
5345 llvm::DIType *WrappedTy = getOrCreateType(FType, Unit);
5346 FieldSize = CGM.getContext().getTypeSize(FType);
5347 FieldAlign = CGM.getContext().toBits(Align);
5348
5349 *XOffset = FieldOffset;
5350 llvm::DIType *FieldTy = DBuilder.createMemberType(
5351 Unit, VD->getName(), Unit, 0, FieldSize, FieldAlign, FieldOffset,
5352 llvm::DINode::FlagZero, WrappedTy);
5353 EltTys.push_back(FieldTy);
5354 FieldOffset += FieldSize;
5355
5356 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
5357 return {DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0,
5358 llvm::DINode::FlagZero, nullptr, Elements),
5359 WrappedTy};
5360}
5361
5362llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
5363 llvm::Value *Storage,
5364 std::optional<unsigned> ArgNo,
5365 CGBuilderTy &Builder,
5366 const bool UsePointerValue) {
5367 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5368 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
5369 if (VD->hasAttr<NoDebugAttr>())
5370 return nullptr;
5371
5372 const bool VarIsArtificial = IsArtificial(VD);
5373
5374 llvm::DIFile *Unit = nullptr;
5375 if (!VarIsArtificial)
5376 Unit = getOrCreateFile(VD->getLocation());
5377 llvm::DIType *Ty;
5378 uint64_t XOffset = 0;
5379 if (VD->hasAttr<BlocksAttr>())
5380 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
5381 else
5382 Ty = getOrCreateType(VD->getType(), Unit);
5383
5384 // If there is no debug info for this type then do not emit debug info
5385 // for this variable.
5386 if (!Ty)
5387 return nullptr;
5388
5389 // Get location information.
5390 unsigned Line = 0;
5391 unsigned Column = 0;
5392 if (!VarIsArtificial) {
5393 Line = getLineNumber(VD->getLocation());
5394 Column = getColumnNumber(VD->getLocation());
5395 }
5396 SmallVector<uint64_t, 13> Expr;
5397 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
5398
5399 // While synthesized Objective-C property setters are "artificial" (i.e., they
5400 // are not spelled out in source), we want to pretend they are just like a
5401 // regular non-compiler generated method. Hence, don't mark explicitly passed
5402 // parameters of such methods as artificial.
5403 if (VarIsArtificial && !IsObjCSynthesizedPropertyExplicitParameter(VD))
5404 Flags |= llvm::DINode::FlagArtificial;
5405
5406 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
5407
5408 unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(VD->getType());
5409 AppendAddressSpaceXDeref(AddressSpace, Expr);
5410
5411 // If this is implicit parameter of CXXThis or ObjCSelf kind, then give it an
5412 // object pointer flag.
5413 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD)) {
5414 if (IPD->getParameterKind() == ImplicitParamKind::CXXThis ||
5415 IPD->getParameterKind() == ImplicitParamKind::ObjCSelf)
5416 Flags |= llvm::DINode::FlagObjectPointer;
5417 } else if (const auto *PVD = dyn_cast<ParmVarDecl>(VD)) {
5418 if (PVD->isExplicitObjectParameter())
5419 Flags |= llvm::DINode::FlagObjectPointer;
5420 }
5421
5422 // Note: Older versions of clang used to emit byval references with an extra
5423 // DW_OP_deref, because they referenced the IR arg directly instead of
5424 // referencing an alloca. Newer versions of LLVM don't treat allocas
5425 // differently from other function arguments when used in a dbg.declare.
5426 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
5427 StringRef Name = VD->getName();
5428 if (!Name.empty()) {
5429 // __block vars are stored on the heap if they are captured by a block that
5430 // can escape the local scope.
5431 if (VD->isEscapingByref()) {
5432 // Here, we need an offset *into* the alloca.
5433 CharUnits offset = CharUnits::fromQuantity(32);
5434 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5435 // offset of __forwarding field
5436 offset = CGM.getContext().toCharUnitsFromBits(
5437 CGM.getTarget().getPointerWidth(LangAS::Default));
5438 Expr.push_back(offset.getQuantity());
5439 Expr.push_back(llvm::dwarf::DW_OP_deref);
5440 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5441 // offset of x field
5442 offset = CGM.getContext().toCharUnitsFromBits(XOffset);
5443 Expr.push_back(offset.getQuantity());
5444 }
5445 } else if (const auto *RT = dyn_cast<RecordType>(VD->getType())) {
5446 // If VD is an anonymous union then Storage represents value for
5447 // all union fields.
5448 const RecordDecl *RD = RT->getDecl()->getDefinitionOrSelf();
5449 if (RD->isUnion() && RD->isAnonymousStructOrUnion()) {
5450 // GDB has trouble finding local variables in anonymous unions, so we emit
5451 // artificial local variables for each of the members.
5452 //
5453 // FIXME: Remove this code as soon as GDB supports this.
5454 // The debug info verifier in LLVM operates based on the assumption that a
5455 // variable has the same size as its storage and we had to disable the
5456 // check for artificial variables.
5457 for (const auto *Field : RD->fields()) {
5458 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
5459 StringRef FieldName = Field->getName();
5460
5461 // Ignore unnamed fields. Do not ignore unnamed records.
5462 if (FieldName.empty() && !isa<RecordType>(Field->getType()))
5463 continue;
5464
5465 // Use VarDecl's Tag, Scope and Line number.
5466 auto FieldAlign = getDeclAlignIfRequired(Field, CGM.getContext());
5467 auto *D = DBuilder.createAutoVariable(
5468 Scope, FieldName, Unit, Line, FieldTy,
5469 CGM.getCodeGenOpts().OptimizationLevel != 0,
5470 Flags | llvm::DINode::FlagArtificial, FieldAlign);
5471
5472 // Insert an llvm.dbg.declare into the current block.
5473 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
5474 llvm::DILocation::get(CGM.getLLVMContext(), Line,
5475 Column, Scope,
5476 CurInlinedAt),
5477 Builder.GetInsertBlock());
5478 }
5479 }
5480 }
5481
5482 // Clang stores the sret pointer provided by the caller in a static alloca.
5483 // Use DW_OP_deref to tell the debugger to load the pointer and treat it as
5484 // the address of the variable.
5485 if (UsePointerValue) {
5486 assert(!llvm::is_contained(Expr, llvm::dwarf::DW_OP_deref) &&
5487 "Debug info already contains DW_OP_deref.");
5488 Expr.push_back(llvm::dwarf::DW_OP_deref);
5489 }
5490
5491 // Create the descriptor for the variable.
5492 llvm::DILocalVariable *D = nullptr;
5493 if (ArgNo) {
5494 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(VD);
5495 D = DBuilder.createParameterVariable(
5496 Scope, Name, *ArgNo, Unit, Line, Ty,
5497 CGM.getCodeGenOpts().OptimizationLevel != 0, Flags, Annotations);
5498 } else {
5499 // For normal local variable, we will try to find out whether 'VD' is the
5500 // copy parameter of coroutine.
5501 // If yes, we are going to use DIVariable of the origin parameter instead
5502 // of creating the new one.
5503 // If no, it might be a normal alloc, we just create a new one for it.
5504
5505 // Check whether the VD is move parameters.
5506 auto RemapCoroArgToLocalVar = [&]() -> llvm::DILocalVariable * {
5507 // The scope of parameter and move-parameter should be distinct
5508 // DISubprogram.
5509 if (!isa<llvm::DISubprogram>(Scope) || !Scope->isDistinct())
5510 return nullptr;
5511
5512 auto Iter = llvm::find_if(CoroutineParameterMappings, [&](auto &Pair) {
5513 Stmt *StmtPtr = const_cast<Stmt *>(Pair.second);
5514 if (DeclStmt *DeclStmtPtr = dyn_cast<DeclStmt>(StmtPtr)) {
5515 DeclGroupRef DeclGroup = DeclStmtPtr->getDeclGroup();
5516 Decl *Decl = DeclGroup.getSingleDecl();
5517 if (VD == dyn_cast_or_null<VarDecl>(Decl))
5518 return true;
5519 }
5520 return false;
5521 });
5522
5523 if (Iter != CoroutineParameterMappings.end()) {
5524 ParmVarDecl *PD = const_cast<ParmVarDecl *>(Iter->first);
5525 auto Iter2 = llvm::find_if(ParamDbgMappings, [&](auto &DbgPair) {
5526 return DbgPair.first == PD && DbgPair.second->getScope() == Scope;
5527 });
5528 if (Iter2 != ParamDbgMappings.end())
5529 return const_cast<llvm::DILocalVariable *>(Iter2->second);
5530 }
5531 return nullptr;
5532 };
5533
5534 // If we couldn't find a move param DIVariable, create a new one.
5535 D = RemapCoroArgToLocalVar();
5536 // Or we will create a new DIVariable for this Decl if D dose not exists.
5537 if (!D)
5538 D = DBuilder.createAutoVariable(
5539 Scope, Name, Unit, Line, Ty,
5540 CGM.getCodeGenOpts().OptimizationLevel != 0, Flags, Align);
5541 }
5542 // Insert an llvm.dbg.declare into the current block.
5543 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
5544 llvm::DILocation::get(CGM.getLLVMContext(), Line,
5545 Column, Scope, CurInlinedAt),
5546 Builder.GetInsertBlock());
5547
5548 return D;
5549}
5550
5551llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const BindingDecl *BD,
5552 llvm::Value *Storage,
5553 std::optional<unsigned> ArgNo,
5554 CGBuilderTy &Builder,
5555 const bool UsePointerValue) {
5556 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5557 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
5558 if (BD->hasAttr<NoDebugAttr>())
5559 return nullptr;
5560
5561 // Skip the tuple like case, we don't handle that here
5562 if (isa<DeclRefExpr>(BD->getBinding()))
5563 return nullptr;
5564
5565 llvm::DIFile *Unit = getOrCreateFile(BD->getLocation());
5566 llvm::DIType *Ty = getOrCreateType(BD->getType(), Unit);
5567
5568 // If there is no debug info for this type then do not emit debug info
5569 // for this variable.
5570 if (!Ty)
5571 return nullptr;
5572
5573 auto Align = getDeclAlignIfRequired(BD, CGM.getContext());
5574 unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(BD->getType());
5575
5576 SmallVector<uint64_t, 3> Expr;
5577 AppendAddressSpaceXDeref(AddressSpace, Expr);
5578
5579 // Clang stores the sret pointer provided by the caller in a static alloca.
5580 // Use DW_OP_deref to tell the debugger to load the pointer and treat it as
5581 // the address of the variable.
5582 if (UsePointerValue) {
5583 assert(!llvm::is_contained(Expr, llvm::dwarf::DW_OP_deref) &&
5584 "Debug info already contains DW_OP_deref.");
5585 Expr.push_back(llvm::dwarf::DW_OP_deref);
5586 }
5587
5588 unsigned Line = getLineNumber(BD->getLocation());
5589 unsigned Column = getColumnNumber(BD->getLocation());
5590 StringRef Name = BD->getName();
5591 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
5592 // Create the descriptor for the variable.
5593 llvm::DILocalVariable *D = DBuilder.createAutoVariable(
5594 Scope, Name, Unit, Line, Ty, CGM.getCodeGenOpts().OptimizationLevel != 0,
5595 llvm::DINode::FlagZero, Align);
5596
5597 if (const MemberExpr *ME = dyn_cast<MemberExpr>(BD->getBinding())) {
5598 if (const FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
5599 const unsigned fieldIndex = FD->getFieldIndex();
5600 const clang::CXXRecordDecl *parent =
5601 (const CXXRecordDecl *)FD->getParent();
5602 const ASTRecordLayout &layout =
5603 CGM.getContext().getASTRecordLayout(parent);
5604 const uint64_t fieldOffset = layout.getFieldOffset(fieldIndex);
5605 if (FD->isBitField()) {
5606 const CGRecordLayout &RL =
5607 CGM.getTypes().getCGRecordLayout(FD->getParent());
5608 const CGBitFieldInfo &Info = RL.getBitFieldInfo(FD);
5609 // Use DW_OP_plus_uconst to adjust to the start of the bitfield
5610 // storage.
5611 if (!Info.StorageOffset.isZero()) {
5612 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5613 Expr.push_back(Info.StorageOffset.getQuantity());
5614 }
5615 // Use LLVM_extract_bits to extract the appropriate bits from this
5616 // bitfield.
5617 Expr.push_back(Info.IsSigned
5618 ? llvm::dwarf::DW_OP_LLVM_extract_bits_sext
5619 : llvm::dwarf::DW_OP_LLVM_extract_bits_zext);
5620 Expr.push_back(Info.Offset);
5621 // If we have an oversized bitfield then the value won't be more than
5622 // the size of the type.
5623 const uint64_t TypeSize = CGM.getContext().getTypeSize(BD->getType());
5624 Expr.push_back(std::min((uint64_t)Info.Size, TypeSize));
5625 } else if (fieldOffset != 0) {
5626 assert(fieldOffset % CGM.getContext().getCharWidth() == 0 &&
5627 "Unexpected non-bitfield with non-byte-aligned offset");
5628 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5629 Expr.push_back(
5630 CGM.getContext().toCharUnitsFromBits(fieldOffset).getQuantity());
5631 }
5632 }
5633 } else if (const ArraySubscriptExpr *ASE =
5634 dyn_cast<ArraySubscriptExpr>(BD->getBinding())) {
5635 if (const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(ASE->getIdx())) {
5636 const uint64_t value = IL->getValue().getZExtValue();
5637 const uint64_t typeSize = CGM.getContext().getTypeSize(BD->getType());
5638
5639 if (value != 0) {
5640 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5641 Expr.push_back(CGM.getContext()
5642 .toCharUnitsFromBits(value * typeSize)
5643 .getQuantity());
5644 }
5645 }
5646 }
5647
5648 // Insert an llvm.dbg.declare into the current block.
5649 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
5650 llvm::DILocation::get(CGM.getLLVMContext(), Line,
5651 Column, Scope, CurInlinedAt),
5652 Builder.GetInsertBlock());
5653
5654 return D;
5655}
5656
5657llvm::DILocalVariable *
5658CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, llvm::Value *Storage,
5659 CGBuilderTy &Builder,
5660 const bool UsePointerValue) {
5661 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5662
5663 if (auto *DD = dyn_cast<DecompositionDecl>(VD)) {
5664 for (BindingDecl *B : DD->flat_bindings())
5665 EmitDeclare(B, Storage, std::nullopt, Builder,
5666 VD->getType()->isReferenceType());
5667 // Don't emit an llvm.dbg.declare for the composite storage as it doesn't
5668 // correspond to a user variable.
5669 return nullptr;
5670 }
5671
5672 return EmitDeclare(VD, Storage, std::nullopt, Builder, UsePointerValue);
5673}
5674
5676 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5677 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
5678
5679 if (D->hasAttr<NoDebugAttr>())
5680 return;
5681
5682 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
5683 llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
5684
5685 // Get location information.
5686 unsigned Line = getLineNumber(D->getLocation());
5687 unsigned Column = getColumnNumber(D->getLocation());
5688
5689 StringRef Name = D->getName();
5690
5691 // Create the descriptor for the label.
5692 auto *L = DBuilder.createLabel(Scope, Name, Unit, Line, Column,
5693 /*IsArtificial=*/false,
5694 /*CoroSuspendIdx=*/std::nullopt,
5695 CGM.getCodeGenOpts().OptimizationLevel != 0);
5696
5697 // Insert an llvm.dbg.label into the current block.
5698 DBuilder.insertLabel(L,
5699 llvm::DILocation::get(CGM.getLLVMContext(), Line, Column,
5700 Scope, CurInlinedAt),
5701 Builder.GetInsertBlock()->end());
5702}
5703
5704llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy,
5705 llvm::DIType *Ty) {
5706 llvm::DIType *CachedTy = getTypeOrNull(QualTy);
5707 if (CachedTy)
5708 Ty = CachedTy;
5709 return DBuilder.createObjectPointerType(Ty, /*Implicit=*/true);
5710}
5711
5713 const VarDecl *VD, llvm::Value *Storage, CGBuilderTy &Builder,
5714 const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) {
5715 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5716 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
5717
5718 if (Builder.GetInsertBlock() == nullptr)
5719 return;
5720 if (VD->hasAttr<NoDebugAttr>())
5721 return;
5722
5723 bool isByRef = VD->hasAttr<BlocksAttr>();
5724
5725 uint64_t XOffset = 0;
5726 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
5727 llvm::DIType *Ty;
5728 if (isByRef)
5729 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
5730 else
5731 Ty = getOrCreateType(VD->getType(), Unit);
5732
5733 // Self is passed along as an implicit non-arg variable in a
5734 // block. Mark it as the object pointer.
5735 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD))
5736 if (IPD->getParameterKind() == ImplicitParamKind::ObjCSelf)
5737 Ty = CreateSelfType(VD->getType(), Ty);
5738
5739 // Get location information.
5740 const unsigned Line =
5741 getLineNumber(VD->getLocation().isValid() ? VD->getLocation() : CurLoc);
5742 unsigned Column = getColumnNumber(VD->getLocation());
5743
5744 const llvm::DataLayout &target = CGM.getDataLayout();
5745
5747 target.getStructLayout(blockInfo.StructureType)
5748 ->getElementOffset(blockInfo.getCapture(VD).getIndex()));
5749
5751 addr.push_back(llvm::dwarf::DW_OP_deref);
5752 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5753 addr.push_back(offset.getQuantity());
5754 if (isByRef) {
5755 addr.push_back(llvm::dwarf::DW_OP_deref);
5756 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5757 // offset of __forwarding field
5758 offset =
5759 CGM.getContext().toCharUnitsFromBits(target.getPointerSizeInBits(0));
5760 addr.push_back(offset.getQuantity());
5761 addr.push_back(llvm::dwarf::DW_OP_deref);
5762 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
5763 // offset of x field
5764 offset = CGM.getContext().toCharUnitsFromBits(XOffset);
5765 addr.push_back(offset.getQuantity());
5766 }
5767
5768 // Create the descriptor for the variable.
5769 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
5770 auto *D = DBuilder.createAutoVariable(
5771 cast<llvm::DILocalScope>(LexicalBlockStack.back()), VD->getName(), Unit,
5772 Line, Ty, false, llvm::DINode::FlagZero, Align);
5773
5774 // Insert an llvm.dbg.declare into the current block.
5775 auto DL = llvm::DILocation::get(CGM.getLLVMContext(), Line, Column,
5776 LexicalBlockStack.back(), CurInlinedAt);
5777 auto *Expr = DBuilder.createExpression(addr);
5778 if (InsertPoint)
5779 DBuilder.insertDeclare(Storage, D, Expr, DL, InsertPoint->getIterator());
5780 else
5781 DBuilder.insertDeclare(Storage, D, Expr, DL, Builder.GetInsertBlock());
5782}
5783
5784llvm::DILocalVariable *
5786 unsigned ArgNo, CGBuilderTy &Builder,
5787 bool UsePointerValue) {
5788 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5789 return EmitDeclare(VD, AI, ArgNo, Builder, UsePointerValue);
5790}
5791
5792namespace {
5793struct BlockLayoutChunk {
5794 uint64_t OffsetInBits;
5796};
5797bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) {
5798 return l.OffsetInBits < r.OffsetInBits;
5799}
5800} // namespace
5801
5802void CGDebugInfo::collectDefaultFieldsForBlockLiteralDeclare(
5803 const CGBlockInfo &Block, const ASTContext &Context, SourceLocation Loc,
5804 const llvm::StructLayout &BlockLayout, llvm::DIFile *Unit,
5805 SmallVectorImpl<llvm::Metadata *> &Fields) {
5806 // Blocks in OpenCL have unique constraints which make the standard fields
5807 // redundant while requiring size and align fields for enqueue_kernel. See
5808 // initializeForBlockHeader in CGBlocks.cpp
5809 if (CGM.getLangOpts().OpenCL) {
5810 Fields.push_back(createFieldType("__size", Context.IntTy, Loc, AS_public,
5811 BlockLayout.getElementOffsetInBits(0),
5812 Unit, Unit));
5813 Fields.push_back(createFieldType("__align", Context.IntTy, Loc, AS_public,
5814 BlockLayout.getElementOffsetInBits(1),
5815 Unit, Unit));
5816 } else {
5817 Fields.push_back(createFieldType("__isa", Context.VoidPtrTy, Loc, AS_public,
5818 BlockLayout.getElementOffsetInBits(0),
5819 Unit, Unit));
5820 Fields.push_back(createFieldType("__flags", Context.IntTy, Loc, AS_public,
5821 BlockLayout.getElementOffsetInBits(1),
5822 Unit, Unit));
5823 Fields.push_back(
5824 createFieldType("__reserved", Context.IntTy, Loc, AS_public,
5825 BlockLayout.getElementOffsetInBits(2), Unit, Unit));
5826 auto *FnTy = Block.getBlockExpr()->getFunctionType();
5827 auto FnPtrType = CGM.getContext().getPointerType(FnTy->desugar());
5828 Fields.push_back(createFieldType("__FuncPtr", FnPtrType, Loc, AS_public,
5829 BlockLayout.getElementOffsetInBits(3),
5830 Unit, Unit));
5831 Fields.push_back(createFieldType(
5832 "__descriptor",
5833 Context.getPointerType(Block.NeedsCopyDispose
5835 : Context.getBlockDescriptorType()),
5836 Loc, AS_public, BlockLayout.getElementOffsetInBits(4), Unit, Unit));
5837 }
5838}
5839
5841 StringRef Name,
5842 unsigned ArgNo,
5843 llvm::AllocaInst *Alloca,
5844 CGBuilderTy &Builder) {
5845 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
5846 ASTContext &C = CGM.getContext();
5847 const BlockDecl *blockDecl = block.getBlockDecl();
5848
5849 // Collect some general information about the block's location.
5850 SourceLocation loc = blockDecl->getCaretLocation();
5851 llvm::DIFile *tunit = getOrCreateFile(loc);
5852 unsigned line = getLineNumber(loc);
5853 unsigned column = getColumnNumber(loc);
5854
5855 // Build the debug-info type for the block literal.
5856 getDeclContextDescriptor(blockDecl);
5857
5858 const llvm::StructLayout *blockLayout =
5859 CGM.getDataLayout().getStructLayout(block.StructureType);
5860
5862 collectDefaultFieldsForBlockLiteralDeclare(block, C, loc, *blockLayout, tunit,
5863 fields);
5864
5865 // We want to sort the captures by offset, not because DWARF
5866 // requires this, but because we're paranoid about debuggers.
5868
5869 // 'this' capture.
5870 if (blockDecl->capturesCXXThis()) {
5871 BlockLayoutChunk chunk;
5872 chunk.OffsetInBits =
5873 blockLayout->getElementOffsetInBits(block.CXXThisIndex);
5874 chunk.Capture = nullptr;
5875 chunks.push_back(chunk);
5876 }
5877
5878 // Variable captures.
5879 for (const auto &capture : blockDecl->captures()) {
5880 const VarDecl *variable = capture.getVariable();
5881 const CGBlockInfo::Capture &captureInfo = block.getCapture(variable);
5882
5883 // Ignore constant captures.
5884 if (captureInfo.isConstant())
5885 continue;
5886
5887 BlockLayoutChunk chunk;
5888 chunk.OffsetInBits =
5889 blockLayout->getElementOffsetInBits(captureInfo.getIndex());
5890 chunk.Capture = &capture;
5891 chunks.push_back(chunk);
5892 }
5893
5894 // Sort by offset.
5895 llvm::array_pod_sort(chunks.begin(), chunks.end());
5896
5897 for (const BlockLayoutChunk &Chunk : chunks) {
5898 uint64_t offsetInBits = Chunk.OffsetInBits;
5899 const BlockDecl::Capture *capture = Chunk.Capture;
5900
5901 // If we have a null capture, this must be the C++ 'this' capture.
5902 if (!capture) {
5903 QualType type;
5904 if (auto *Method =
5905 cast_or_null<CXXMethodDecl>(blockDecl->getNonClosureContext()))
5906 type = Method->getThisType();
5907 else if (auto *RDecl = dyn_cast<CXXRecordDecl>(blockDecl->getParent()))
5908 type = CGM.getContext().getCanonicalTagType(RDecl);
5909 else
5910 llvm_unreachable("unexpected block declcontext");
5911
5912 fields.push_back(createFieldType("this", type, loc, AS_public,
5913 offsetInBits, tunit, tunit));
5914 continue;
5915 }
5916
5917 const VarDecl *variable = capture->getVariable();
5918 StringRef name = variable->getName();
5919
5920 llvm::DIType *fieldType;
5921 if (capture->isByRef()) {
5922 TypeInfo PtrInfo = C.getTypeInfo(C.VoidPtrTy);
5923 auto Align = PtrInfo.isAlignRequired() ? PtrInfo.Align : 0;
5924 // FIXME: This recomputes the layout of the BlockByRefWrapper.
5925 uint64_t xoffset;
5926 fieldType =
5927 EmitTypeForVarWithBlocksAttr(variable, &xoffset).BlockByRefWrapper;
5928 fieldType = DBuilder.createPointerType(fieldType, PtrInfo.Width);
5929 fieldType = DBuilder.createMemberType(tunit, name, tunit, line,
5930 PtrInfo.Width, Align, offsetInBits,
5931 llvm::DINode::FlagZero, fieldType);
5932 } else {
5933 auto Align = getDeclAlignIfRequired(variable, CGM.getContext());
5934 fieldType = createFieldType(name, variable->getType(), loc, AS_public,
5935 offsetInBits, Align, tunit, tunit);
5936 }
5937 fields.push_back(fieldType);
5938 }
5939
5940 SmallString<36> typeName;
5941 llvm::raw_svector_ostream(typeName)
5942 << "__block_literal_" << CGM.getUniqueBlockCount();
5943
5944 llvm::DINodeArray fieldsArray = DBuilder.getOrCreateArray(fields);
5945
5946 llvm::DIType *type =
5947 DBuilder.createStructType(tunit, typeName.str(), tunit, line,
5948 CGM.getContext().toBits(block.BlockSize), 0,
5949 llvm::DINode::FlagZero, nullptr, fieldsArray);
5950 type = DBuilder.createPointerType(type, CGM.PointerWidthInBits);
5951
5952 // Get overall information about the block.
5953 llvm::DINode::DIFlags flags = llvm::DINode::FlagArtificial;
5954 auto *scope = cast<llvm::DILocalScope>(LexicalBlockStack.back());
5955
5956 // Create the descriptor for the parameter.
5957 auto *debugVar = DBuilder.createParameterVariable(
5958 scope, Name, ArgNo, tunit, line, type,
5959 CGM.getCodeGenOpts().OptimizationLevel != 0, flags);
5960
5961 // Insert an llvm.dbg.declare into the current block.
5962 DBuilder.insertDeclare(Alloca, debugVar, DBuilder.createExpression(),
5963 llvm::DILocation::get(CGM.getLLVMContext(), line,
5964 column, scope, CurInlinedAt),
5965 Builder.GetInsertBlock());
5966}
5967
5968llvm::DIDerivedType *
5969CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) {
5970 if (!D || !D->isStaticDataMember())
5971 return nullptr;
5972
5973 auto MI = StaticDataMemberCache.find(D->getCanonicalDecl());
5974 if (MI != StaticDataMemberCache.end()) {
5975 assert(MI->second && "Static data member declaration should still exist");
5976 return MI->second;
5977 }
5978
5979 // If the member wasn't found in the cache, lazily construct and add it to the
5980 // type (used when a limited form of the type is emitted).
5981 auto DC = D->getDeclContext();
5982 auto *Ctxt = cast<llvm::DICompositeType>(getDeclContextDescriptor(D));
5983 return CreateRecordStaticField(D, Ctxt, cast<RecordDecl>(DC));
5984}
5985
5986llvm::DIGlobalVariableExpression *CGDebugInfo::CollectAnonRecordDecls(
5987 const RecordDecl *RD, llvm::DIFile *Unit, unsigned LineNo,
5988 StringRef LinkageName, llvm::GlobalVariable *Var, llvm::DIScope *DContext) {
5989 llvm::DIGlobalVariableExpression *GVE = nullptr;
5990
5991 for (const auto *Field : RD->fields()) {
5992 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
5993 StringRef FieldName = Field->getName();
5994
5995 // Ignore unnamed fields, but recurse into anonymous records.
5996 if (FieldName.empty()) {
5997 if (const auto *RT = dyn_cast<RecordType>(Field->getType()))
5998 GVE = CollectAnonRecordDecls(RT->getDecl()->getDefinitionOrSelf(), Unit,
5999 LineNo, LinkageName, Var, DContext);
6000 continue;
6001 }
6002 // Use VarDecl's Tag, Scope and Line number.
6003 GVE = DBuilder.createGlobalVariableExpression(
6004 DContext, FieldName, LinkageName, Unit, LineNo, FieldTy,
6005 Var->hasLocalLinkage());
6006 Var->addDebugInfo(GVE);
6007 }
6008 return GVE;
6009}
6010
6011static bool ReferencesAnonymousEntity(ArrayRef<TemplateArgument> Args);
6012static bool ReferencesAnonymousEntity(RecordType *RT) {
6013 // Unnamed classes/lambdas can't be reconstituted due to a lack of column
6014 // info we produce in the DWARF, so we can't get Clang's full name back.
6015 // But so long as it's not one of those, it doesn't matter if some sub-type
6016 // of the record (a template parameter) can't be reconstituted - because the
6017 // un-reconstitutable type itself will carry its own name.
6018 const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl());
6019 if (!RD)
6020 return false;
6021 if (!RD->getIdentifier())
6022 return true;
6023 auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD);
6024 if (!TSpecial)
6025 return false;
6026 return ReferencesAnonymousEntity(TSpecial->getTemplateArgs().asArray());
6027}
6029 return llvm::any_of(Args, [&](const TemplateArgument &TA) {
6030 switch (TA.getKind()) {
6034 struct ReferencesAnonymous
6035 : public RecursiveASTVisitor<ReferencesAnonymous> {
6036 bool RefAnon = false;
6037 bool VisitRecordType(RecordType *RT) {
6038 if (ReferencesAnonymousEntity(RT)) {
6039 RefAnon = true;
6040 return false;
6041 }
6042 return true;
6043 }
6044 };
6045 ReferencesAnonymous RT;
6046 RT.TraverseType(TA.getAsType());
6047 if (RT.RefAnon)
6048 return true;
6049 break;
6050 }
6051 default:
6052 break;
6053 }
6054 return false;
6055 });
6056}
6057namespace {
6058struct ReconstitutableType : public RecursiveASTVisitor<ReconstitutableType> {
6059 bool Reconstitutable = true;
6060 bool VisitVectorType(VectorType *FT) {
6061 Reconstitutable = false;
6062 return false;
6063 }
6064 bool VisitAtomicType(AtomicType *FT) {
6065 Reconstitutable = false;
6066 return false;
6067 }
6068 bool TraverseEnumType(EnumType *ET, bool = false) {
6069 // Unnamed enums can't be reconstituted due to a lack of column info we
6070 // produce in the DWARF, so we can't get Clang's full name back.
6071 const EnumDecl *ED = ET->getDecl();
6072 if (!ED->getIdentifier()) {
6073 Reconstitutable = false;
6074 return false;
6075 }
6077 Reconstitutable = false;
6078 return false;
6079 }
6080 return true;
6081 }
6082 bool VisitFunctionProtoType(FunctionProtoType *FT) {
6083 // noexcept is not encoded in DWARF, so the reversi
6084 Reconstitutable &= !isNoexceptExceptionSpec(FT->getExceptionSpecType());
6085 Reconstitutable &= !FT->getNoReturnAttr();
6086 return Reconstitutable;
6087 }
6088 bool VisitRecordType(RecordType *RT, bool = false) {
6089 if (ReferencesAnonymousEntity(RT)) {
6090 Reconstitutable = false;
6091 return false;
6092 }
6093 return true;
6094 }
6095};
6096} // anonymous namespace
6097
6098// Test whether a type name could be rebuilt from emitted debug info.
6100 ReconstitutableType T;
6101 T.TraverseType(QT);
6102 return T.Reconstitutable;
6103}
6104
6105bool CGDebugInfo::HasReconstitutableArgs(
6106 ArrayRef<TemplateArgument> Args) const {
6107 return llvm::all_of(Args, [&](const TemplateArgument &TA) {
6108 switch (TA.getKind()) {
6110 // Easy to reconstitute - the value of the parameter in the debug
6111 // info is the string name of the template. The template name
6112 // itself won't benefit from any name rebuilding, but that's a
6113 // representational limitation - maybe DWARF could be
6114 // changed/improved to use some more structural representation.
6115 return true;
6117 // Reference and pointer non-type template parameters point to
6118 // variables, functions, etc and their value is, at best (for
6119 // variables) represented as an address - not a reference to the
6120 // DWARF describing the variable/function/etc. This makes it hard,
6121 // possibly impossible to rebuild the original name - looking up
6122 // the address in the executable file's symbol table would be
6123 // needed.
6124 return false;
6126 // These could be rebuilt, but figured they're close enough to the
6127 // declaration case, and not worth rebuilding.
6128 return false;
6130 // A pack is invalid if any of the elements of the pack are
6131 // invalid.
6132 return HasReconstitutableArgs(TA.getPackAsArray());
6134 // Larger integers get encoded as DWARF blocks which are a bit
6135 // harder to parse back into a large integer, etc - so punting on
6136 // this for now. Re-parsing the integers back into APInt is
6137 // probably feasible some day.
6138 return TA.getAsIntegral().getBitWidth() <= 64 &&
6141 return false;
6143 return IsReconstitutableType(TA.getAsType());
6145 return IsReconstitutableType(TA.getAsExpr()->getType());
6146 default:
6147 llvm_unreachable("Other, unresolved, template arguments should "
6148 "not be seen here");
6149 }
6150 });
6151}
6152
6153std::string CGDebugInfo::GetName(const Decl *D, bool Qualified,
6154 bool *NameIsSimplified) const {
6155 std::string Name;
6156 llvm::raw_string_ostream OS(Name);
6157 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
6158 if (!ND)
6159 return Name;
6160 llvm::codegenoptions::DebugTemplateNamesKind TemplateNamesKind =
6161 CGM.getCodeGenOpts().getDebugSimpleTemplateNames();
6162
6163 if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
6164 TemplateNamesKind = llvm::codegenoptions::DebugTemplateNamesKind::Full;
6165
6166 std::optional<TemplateArgs> Args;
6167
6168 bool IsOperatorOverload = false; // isa<CXXConversionDecl>(ND);
6169 if (auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
6170 Args = GetTemplateArgs(RD);
6171 } else if (auto *FD = dyn_cast<FunctionDecl>(ND)) {
6172 Args = GetTemplateArgs(FD);
6173 auto NameKind = ND->getDeclName().getNameKind();
6174 IsOperatorOverload |=
6177 } else if (auto *VD = dyn_cast<VarDecl>(ND)) {
6178 Args = GetTemplateArgs(VD);
6179 }
6180
6181 // A conversion operator presents complications/ambiguity if there's a
6182 // conversion to class template that is itself a template, eg:
6183 // template<typename T>
6184 // operator ns::t1<T, int>();
6185 // This should be named, eg: "operator ns::t1<float, int><float>"
6186 // (ignoring clang bug that means this is currently "operator t1<float>")
6187 // but if the arguments were stripped, the consumer couldn't differentiate
6188 // whether the template argument list for the conversion type was the
6189 // function's argument list (& no reconstitution was needed) or not.
6190 // This could be handled if reconstitutable names had a separate attribute
6191 // annotating them as such - this would remove the ambiguity.
6192 //
6193 // Alternatively the template argument list could be parsed enough to check
6194 // whether there's one list or two, then compare that with the DWARF
6195 // description of the return type and the template argument lists to determine
6196 // how many lists there should be and if one is missing it could be assumed(?)
6197 // to be the function's template argument list & then be rebuilt.
6198 //
6199 // Other operator overloads that aren't conversion operators could be
6200 // reconstituted but would require a bit more nuance about detecting the
6201 // difference between these different operators during that rebuilding.
6202 bool Reconstitutable =
6203 Args && HasReconstitutableArgs(Args->Args) && !IsOperatorOverload;
6204
6205 PrintingPolicy PP = getPrintingPolicy();
6206
6207 if (TemplateNamesKind == llvm::codegenoptions::DebugTemplateNamesKind::Full ||
6208 !Reconstitutable) {
6209 ND->getNameForDiagnostic(OS, PP, Qualified);
6210 } else {
6211 // Treat both "simple" and "mangled" as simplified.
6212 if (NameIsSimplified)
6213 *NameIsSimplified = true;
6214 bool Mangled = TemplateNamesKind ==
6215 llvm::codegenoptions::DebugTemplateNamesKind::Mangled;
6216 // check if it's a template
6217 if (Mangled)
6218 OS << "_STN|";
6219
6220 OS << ND->getDeclName();
6221 std::string EncodedOriginalName;
6222 llvm::raw_string_ostream EncodedOriginalNameOS(EncodedOriginalName);
6223 EncodedOriginalNameOS << ND->getDeclName();
6224
6225 if (Mangled) {
6226 OS << "|";
6227 printTemplateArgumentList(OS, Args->Args, PP);
6228 printTemplateArgumentList(EncodedOriginalNameOS, Args->Args, PP);
6229#ifndef NDEBUG
6230 std::string CanonicalOriginalName;
6231 llvm::raw_string_ostream OriginalOS(CanonicalOriginalName);
6232 ND->getNameForDiagnostic(OriginalOS, PP, Qualified);
6233 assert(EncodedOriginalName == CanonicalOriginalName);
6234#endif
6235 }
6236 }
6237 return Name;
6238}
6239
6240void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
6241 const VarDecl *D) {
6242 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
6243 if (D->hasAttr<NoDebugAttr>())
6244 return;
6245
6246 llvm::TimeTraceScope TimeScope("DebugGlobalVariable", [&]() {
6247 return GetName(D, true);
6248 });
6249
6250 // If we already created a DIGlobalVariable for this declaration, just attach
6251 // it to the llvm::GlobalVariable.
6252 auto Cached = DeclCache.find(D->getCanonicalDecl());
6253 if (Cached != DeclCache.end())
6254 return Var->addDebugInfo(
6256
6257 // Create global variable debug descriptor.
6258 llvm::DIFile *Unit = nullptr;
6259 llvm::DIScope *DContext = nullptr;
6260 unsigned LineNo;
6261 StringRef DeclName, LinkageName;
6262 QualType T;
6263 llvm::MDTuple *TemplateParameters = nullptr;
6264 collectVarDeclProps(D, Unit, LineNo, T, DeclName, LinkageName,
6265 TemplateParameters, DContext);
6266
6267 // Attempt to store one global variable for the declaration - even if we
6268 // emit a lot of fields.
6269 llvm::DIGlobalVariableExpression *GVE = nullptr;
6270
6271 // If this is an anonymous union then we'll want to emit a global
6272 // variable for each member of the anonymous union so that it's possible
6273 // to find the name of any field in the union.
6274 if (T->isUnionType() && DeclName.empty()) {
6275 const auto *RD = T->castAsRecordDecl();
6276 assert(RD->isAnonymousStructOrUnion() &&
6277 "unnamed non-anonymous struct or union?");
6278 GVE = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext);
6279 } else {
6280 auto Align = getDeclAlignIfRequired(D, CGM.getContext());
6281
6283 unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(D->getType());
6284 if (CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) {
6285 if (D->hasAttr<CUDASharedAttr>())
6286 AddressSpace =
6287 CGM.getContext().getTargetAddressSpace(LangAS::cuda_shared);
6288 else if (D->hasAttr<CUDAConstantAttr>())
6289 AddressSpace =
6290 CGM.getContext().getTargetAddressSpace(LangAS::cuda_constant);
6291 }
6292 AppendAddressSpaceXDeref(AddressSpace, Expr);
6293
6294 llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(D);
6295 GVE = DBuilder.createGlobalVariableExpression(
6296 DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit),
6297 Var->hasLocalLinkage(), true,
6298 Expr.empty() ? nullptr : DBuilder.createExpression(Expr),
6299 getOrCreateStaticDataMemberDeclarationOrNull(D), TemplateParameters,
6300 Align, Annotations);
6301 Var->addDebugInfo(GVE);
6302 }
6303 DeclCache[D->getCanonicalDecl()].reset(GVE);
6304}
6305
6307 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
6308 if (VD->hasAttr<NoDebugAttr>())
6309 return;
6310 llvm::TimeTraceScope TimeScope("DebugConstGlobalVariable", [&]() {
6311 return GetName(VD, true);
6312 });
6313
6314 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
6315 // Create the descriptor for the variable.
6316 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
6317 StringRef Name = VD->getName();
6318 llvm::DIType *Ty = getOrCreateType(VD->getType(), Unit);
6319
6320 if (const auto *ECD = dyn_cast<EnumConstantDecl>(VD)) {
6321 const auto *ED = cast<EnumDecl>(ECD->getDeclContext());
6322 if (CGM.getCodeGenOpts().EmitCodeView) {
6323 // If CodeView, emit enums as global variables, unless they are defined
6324 // inside a class. We do this because MSVC doesn't emit S_CONSTANTs for
6325 // enums in classes, and because it is difficult to attach this scope
6326 // information to the global variable.
6328 return;
6329 } else {
6330 // If not CodeView, emit DW_TAG_enumeration_type if necessary. For
6331 // example: for "enum { ZERO };", a DW_TAG_enumeration_type is created the
6332 // first time `ZERO` is referenced in a function.
6333 CanQualType T = CGM.getContext().getCanonicalTagType(ED);
6334 [[maybe_unused]] llvm::DIType *EDTy = getOrCreateType(T, Unit);
6335 assert(EDTy->getTag() == llvm::dwarf::DW_TAG_enumeration_type);
6336 return;
6337 }
6338 }
6339
6340 // Do not emit separate definitions for function local consts.
6342 return;
6343
6345 auto *VarD = dyn_cast<VarDecl>(VD);
6346 if (VarD && VarD->isStaticDataMember()) {
6347 auto *RD = cast<RecordDecl>(VarD->getDeclContext());
6348 getDeclContextDescriptor(VarD);
6349 // Ensure that the type is retained even though it's otherwise unreferenced.
6350 //
6351 // FIXME: This is probably unnecessary, since Ty should reference RD
6352 // through its scope.
6353 RetainedTypes.push_back(
6354 CGM.getContext().getCanonicalTagType(RD).getAsOpaquePtr());
6355
6356 return;
6357 }
6358 llvm::DIScope *DContext = getDeclContextDescriptor(VD);
6359
6360 auto &GV = DeclCache[VD];
6361 if (GV)
6362 return;
6363
6364 llvm::DIExpression *InitExpr = createConstantValueExpression(VD, Init);
6365 llvm::MDTuple *TemplateParameters = nullptr;
6366
6368 if (VarD) {
6369 llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VarD, &*Unit);
6370 TemplateParameters = parameterNodes.get();
6371 }
6372
6373 GV.reset(DBuilder.createGlobalVariableExpression(
6374 DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty,
6375 true, true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD),
6376 TemplateParameters, Align));
6377}
6378
6379void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
6380 const VarDecl *D) {
6381 assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
6382 if (D->hasAttr<NoDebugAttr>())
6383 return;
6384
6385 auto Align = getDeclAlignIfRequired(D, CGM.getContext());
6386 llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
6387 StringRef Name = D->getName();
6388 llvm::DIType *Ty = getOrCreateType(D->getType(), Unit);
6389
6390 llvm::DIScope *DContext = getDeclContextDescriptor(D);
6391 llvm::DIGlobalVariableExpression *GVE =
6392 DBuilder.createGlobalVariableExpression(
6393 DContext, Name, StringRef(), Unit, getLineNumber(D->getLocation()),
6394 Ty, false, false, nullptr, nullptr, nullptr, Align);
6395 Var->addDebugInfo(GVE);
6396}
6397
6399 llvm::Instruction *Value, QualType Ty) {
6400 // Only when -g2 or above is specified, debug info for variables will be
6401 // generated.
6402 if (CGM.getCodeGenOpts().getDebugInfo() <=
6403 llvm::codegenoptions::DebugLineTablesOnly)
6404 return;
6405
6406 llvm::DILocation *DIL = Value->getDebugLoc().get();
6407 if (!DIL)
6408 return;
6409
6410 llvm::DIFile *Unit = DIL->getFile();
6411 llvm::DIType *Type = getOrCreateType(Ty, Unit);
6412
6413 // Check if Value is already a declared variable and has debug info, in this
6414 // case we have nothing to do. Clang emits a declared variable as alloca, and
6415 // it is loaded upon use, so we identify such pattern here.
6416 if (llvm::LoadInst *Load = dyn_cast<llvm::LoadInst>(Value)) {
6417 llvm::Value *Var = Load->getPointerOperand();
6418 // There can be implicit type cast applied on a variable if it is an opaque
6419 // ptr, in this case its debug info may not match the actual type of object
6420 // being used as in the next instruction, so we will need to emit a pseudo
6421 // variable for type-casted value.
6422 auto DeclareTypeMatches = [&](llvm::DbgVariableRecord *DbgDeclare) {
6423 return DbgDeclare->getVariable()->getType() == Type;
6424 };
6425 if (any_of(llvm::findDVRDeclares(Var), DeclareTypeMatches))
6426 return;
6427 }
6428
6429 llvm::DILocalVariable *D =
6430 DBuilder.createAutoVariable(LexicalBlockStack.back(), "", nullptr, 0,
6431 Type, false, llvm::DINode::FlagArtificial);
6432
6433 if (auto InsertPoint = Value->getInsertionPointAfterDef()) {
6434 DBuilder.insertDbgValue(Value, D, DBuilder.createExpression(), DIL,
6435 *InsertPoint);
6436 }
6437}
6438
6439void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
6440 const GlobalDecl GD) {
6441
6442 assert(GV);
6443
6444 if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
6445 return;
6446
6447 const auto *D = cast<ValueDecl>(GD.getDecl());
6448 if (D->hasAttr<NoDebugAttr>())
6449 return;
6450
6451 auto AliaseeDecl = CGM.getMangledNameDecl(GV->getName());
6452 llvm::DINode *DI;
6453
6454 if (!AliaseeDecl)
6455 // FIXME: Aliasee not declared yet - possibly declared later
6456 // For example,
6457 //
6458 // 1 extern int newname __attribute__((alias("oldname")));
6459 // 2 int oldname = 1;
6460 //
6461 // No debug info would be generated for 'newname' in this case.
6462 //
6463 // Fix compiler to generate "newname" as imported_declaration
6464 // pointing to the DIE of "oldname".
6465 return;
6466 if (!(DI = getDeclarationOrDefinition(
6467 AliaseeDecl.getCanonicalDecl().getDecl())))
6468 return;
6469
6470 llvm::DIScope *DContext = getDeclContextDescriptor(D);
6471 auto Loc = D->getLocation();
6472
6473 llvm::DIImportedEntity *ImportDI = DBuilder.createImportedDeclaration(
6474 DContext, DI, getOrCreateFile(Loc), getLineNumber(Loc), D->getName());
6475
6476 // Record this DIE in the cache for nested declaration reference.
6477 ImportedDeclCache[GD.getCanonicalDecl().getDecl()].reset(ImportDI);
6478}
6479
6480void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,
6481 const StringLiteral *S) {
6482 SourceLocation Loc = S->getStrTokenLoc(0);
6483 SourceManager &SM = CGM.getContext().getSourceManager();
6484 PresumedLoc PLoc = SM.getPresumedLoc(getMacroDebugLoc(CGM, Loc));
6485 if (!PLoc.isValid())
6486 return;
6487
6488 llvm::DIFile *File = getOrCreateFile(Loc);
6489 llvm::DIGlobalVariableExpression *Debug =
6490 DBuilder.createGlobalVariableExpression(
6491 nullptr, StringRef(), StringRef(), getOrCreateFile(Loc),
6492 getLineNumber(Loc), getOrCreateType(S->getType(), File), true);
6493 GV->addDebugInfo(Debug);
6494}
6495
6496llvm::DIScope *CGDebugInfo::getCurrentContextDescriptor(const Decl *D) {
6497 if (!LexicalBlockStack.empty())
6498 return LexicalBlockStack.back();
6499 llvm::DIScope *Mod = getParentModuleOrNull(D);
6500 return getContextDescriptor(D, Mod ? Mod : TheCU);
6501}
6502
6504 if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
6505 return;
6506 const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
6507 if (!NSDecl->isAnonymousNamespace() ||
6508 CGM.getCodeGenOpts().DebugExplicitImport) {
6509 auto Loc = UD.getLocation();
6510 if (!Loc.isValid())
6511 Loc = CurLoc;
6512 DBuilder.createImportedModule(
6513 getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())),
6514 getOrCreateNamespace(NSDecl), getOrCreateFile(Loc), getLineNumber(Loc));
6515 }
6516}
6517
6519 if (llvm::DINode *Target =
6520 getDeclarationOrDefinition(USD.getUnderlyingDecl())) {
6521 auto Loc = USD.getLocation();
6522 DBuilder.createImportedDeclaration(
6523 getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target,
6524 getOrCreateFile(Loc), getLineNumber(Loc));
6525 }
6526}
6527
6529 if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
6530 return;
6531 assert(UD.shadow_size() &&
6532 "We shouldn't be codegening an invalid UsingDecl containing no decls");
6533
6534 for (const auto *USD : UD.shadows()) {
6535 // FIXME: Skip functions with undeduced auto return type for now since we
6536 // don't currently have the plumbing for separate declarations & definitions
6537 // of free functions and mismatched types (auto in the declaration, concrete
6538 // return type in the definition)
6539 if (const auto *FD = dyn_cast<FunctionDecl>(USD->getUnderlyingDecl()))
6540 if (const auto *AT = FD->getType()
6541 ->castAs<FunctionProtoType>()
6543 if (AT->getDeducedType().isNull())
6544 continue;
6545
6546 EmitUsingShadowDecl(*USD);
6547 // Emitting one decl is sufficient - debuggers can detect that this is an
6548 // overloaded name & provide lookup for all the overloads.
6549 break;
6550 }
6551}
6552
6554 if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
6555 return;
6556 assert(UD.shadow_size() &&
6557 "We shouldn't be codegening an invalid UsingEnumDecl"
6558 " containing no decls");
6559
6560 for (const auto *USD : UD.shadows())
6561 EmitUsingShadowDecl(*USD);
6562}
6563
6565 if (CGM.getCodeGenOpts().getDebuggerTuning() != llvm::DebuggerKind::LLDB)
6566 return;
6567 if (Module *M = ID.getImportedModule()) {
6568 auto Info = ASTSourceDescriptor(*M);
6569 auto Loc = ID.getLocation();
6570 DBuilder.createImportedDeclaration(
6571 getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())),
6572 getOrCreateModuleRef(Info, DebugTypeExtRefs), getOrCreateFile(Loc),
6573 getLineNumber(Loc));
6574 }
6575}
6576
6577llvm::DIImportedEntity *
6579 if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
6580 return nullptr;
6581 auto &VH = NamespaceAliasCache[&NA];
6582 if (VH)
6584 llvm::DIImportedEntity *R;
6585 auto Loc = NA.getLocation();
6586 if (const auto *Underlying =
6587 dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace()))
6588 // This could cache & dedup here rather than relying on metadata deduping.
6589 R = DBuilder.createImportedDeclaration(
6590 getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())),
6591 EmitNamespaceAlias(*Underlying), getOrCreateFile(Loc),
6592 getLineNumber(Loc), NA.getName());
6593 else
6594 R = DBuilder.createImportedDeclaration(
6595 getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())),
6596 getOrCreateNamespace(cast<NamespaceDecl>(NA.getAliasedNamespace())),
6597 getOrCreateFile(Loc), getLineNumber(Loc), NA.getName());
6598 VH.reset(R);
6599 return R;
6600}
6601
6602llvm::DINamespace *
6603CGDebugInfo::getOrCreateNamespace(const NamespaceDecl *NSDecl) {
6604 // Don't canonicalize the NamespaceDecl here: The DINamespace will be uniqued
6605 // if necessary, and this way multiple declarations of the same namespace in
6606 // different parent modules stay distinct.
6607 auto I = NamespaceCache.find(NSDecl);
6608 if (I != NamespaceCache.end())
6609 return cast<llvm::DINamespace>(I->second);
6610
6611 llvm::DIScope *Context = getDeclContextDescriptor(NSDecl);
6612 // Don't trust the context if it is a DIModule (see comment above).
6613 llvm::DINamespace *NS =
6614 DBuilder.createNameSpace(Context, NSDecl->getName(), NSDecl->isInline());
6615 NamespaceCache[NSDecl].reset(NS);
6616 return NS;
6617}
6618
6619void CGDebugInfo::setDwoId(uint64_t Signature) {
6620 assert(TheCU && "no main compile unit");
6621 TheCU->setDWOId(Signature);
6622}
6623
6625 // Creating types might create further types - invalidating the current
6626 // element and the size(), so don't cache/reference them.
6627 for (size_t i = 0; i != ObjCInterfaceCache.size(); ++i) {
6628 ObjCInterfaceCacheEntry E = ObjCInterfaceCache[i];
6629 llvm::DIType *Ty = E.Type->getDecl()->getDefinition()
6630 ? CreateTypeDefinition(E.Type, E.Unit)
6631 : E.Decl;
6632 DBuilder.replaceTemporary(llvm::TempDIType(E.Decl), Ty);
6633 }
6634
6635 // Add methods to interface.
6636 for (const auto &P : ObjCMethodCache) {
6637 if (P.second.empty())
6638 continue;
6639
6640 QualType QTy(P.first->getTypeForDecl(), 0);
6641 auto It = TypeCache.find(QTy.getAsOpaquePtr());
6642 assert(It != TypeCache.end());
6643
6644 llvm::DICompositeType *InterfaceDecl =
6645 cast<llvm::DICompositeType>(It->second);
6646
6647 auto CurElts = InterfaceDecl->getElements();
6648 SmallVector<llvm::Metadata *, 16> EltTys(CurElts.begin(), CurElts.end());
6649
6650 // For DWARF v4 or earlier, only add objc_direct methods.
6651 for (auto &SubprogramDirect : P.second)
6652 if (CGM.getCodeGenOpts().DwarfVersion >= 5 || SubprogramDirect.getInt())
6653 EltTys.push_back(SubprogramDirect.getPointer());
6654
6655 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
6656 DBuilder.replaceArrays(InterfaceDecl, Elements);
6657 }
6658
6659 for (const auto &P : ReplaceMap) {
6660 assert(P.second);
6661 auto *Ty = cast<llvm::DIType>(P.second);
6662 assert(Ty->isForwardDecl());
6663
6664 auto It = TypeCache.find(P.first);
6665 assert(It != TypeCache.end());
6666 assert(It->second);
6667
6668 DBuilder.replaceTemporary(llvm::TempDIType(Ty),
6669 cast<llvm::DIType>(It->second));
6670 }
6671
6672 for (const auto &P : FwdDeclReplaceMap) {
6673 assert(P.second);
6674 llvm::TempMDNode FwdDecl(cast<llvm::MDNode>(P.second));
6675 llvm::Metadata *Repl;
6676
6677 auto It = DeclCache.find(P.first);
6678 // If there has been no definition for the declaration, call RAUW
6679 // with ourselves, that will destroy the temporary MDNode and
6680 // replace it with a standard one, avoiding leaking memory.
6681 if (It == DeclCache.end())
6682 Repl = P.second;
6683 else
6684 Repl = It->second;
6685
6686 if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(Repl))
6687 Repl = GVE->getVariable();
6688 DBuilder.replaceTemporary(std::move(FwdDecl), cast<llvm::MDNode>(Repl));
6689 }
6690
6691 // We keep our own list of retained types, because we need to look
6692 // up the final type in the type cache.
6693 for (auto &RT : RetainedTypes)
6694 if (auto MD = TypeCache[RT])
6695 DBuilder.retainType(cast<llvm::DIType>(MD));
6696
6697 DBuilder.finalize();
6698}
6699
6700// Don't ignore in case of explicit cast where it is referenced indirectly.
6702 if (CGM.getCodeGenOpts().hasReducedDebugInfo())
6703 if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile()))
6704 DBuilder.retainType(DieTy);
6705}
6706
6708 if (CGM.getCodeGenOpts().hasMaybeUnusedDebugInfo())
6709 if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile()))
6710 DBuilder.retainType(DieTy);
6711}
6712
6714 if (LexicalBlockStack.empty())
6715 return llvm::DebugLoc();
6716
6717 llvm::MDNode *Scope = LexicalBlockStack.back();
6718 return llvm::DILocation::get(CGM.getLLVMContext(), getLineNumber(Loc),
6719 getColumnNumber(Loc), Scope);
6720}
6721
6722llvm::DINode::DIFlags CGDebugInfo::getCallSiteRelatedAttrs() const {
6723 // Call site-related attributes are only useful in optimized programs, and
6724 // when there's a possibility of debugging backtraces.
6725 if (CGM.getCodeGenOpts().OptimizationLevel == 0 ||
6726 DebugKind == llvm::codegenoptions::NoDebugInfo ||
6727 DebugKind == llvm::codegenoptions::LocTrackingOnly ||
6728 !CGM.getCodeGenOpts().DebugCallSiteInfo)
6729 return llvm::DINode::FlagZero;
6730
6731 // Call site-related attributes are available in DWARF v5. Some debuggers,
6732 // while not fully DWARF v5-compliant, may accept these attributes as if they
6733 // were part of DWARF v4.
6734 bool SupportsDWARFv4Ext =
6735 CGM.getCodeGenOpts().DwarfVersion == 4 &&
6736 (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB ||
6737 CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::GDB);
6738
6739 if (!SupportsDWARFv4Ext && CGM.getCodeGenOpts().DwarfVersion < 5)
6740 return llvm::DINode::FlagZero;
6741
6742 return llvm::DINode::FlagAllCallsDescribed;
6743}
6744
6745llvm::DIExpression *
6746CGDebugInfo::createConstantValueExpression(const clang::ValueDecl *VD,
6747 const APValue &Val) {
6748 // FIXME: Add a representation for integer constants wider than 64 bits.
6749 if (CGM.getContext().getTypeSize(VD->getType()) > 64)
6750 return nullptr;
6751
6752 if (Val.isFloat())
6753 return DBuilder.createConstantValueExpression(
6754 Val.getFloat().bitcastToAPInt().getZExtValue());
6755
6756 if (!Val.isInt())
6757 return nullptr;
6758
6759 llvm::APSInt const &ValInt = Val.getInt();
6760 std::optional<uint64_t> ValIntOpt;
6761 if (ValInt.isUnsigned())
6762 ValIntOpt = ValInt.tryZExtValue();
6763 else if (auto tmp = ValInt.trySExtValue())
6764 // Transform a signed optional to unsigned optional. When cpp 23 comes,
6765 // use std::optional::transform
6766 ValIntOpt = static_cast<uint64_t>(*tmp);
6767
6768 if (ValIntOpt)
6769 return DBuilder.createConstantValueExpression(ValIntOpt.value());
6770
6771 return nullptr;
6772}
6773
6774CodeGenFunction::LexicalScope::LexicalScope(CodeGenFunction &CGF,
6775 SourceRange Range)
6776 : RunCleanupsScope(CGF), Range(Range), ParentScope(CGF.CurLexicalScope) {
6777 CGF.CurLexicalScope = this;
6778 if (CGDebugInfo *DI = CGF.getDebugInfo())
6779 DI->EmitLexicalBlockStart(CGF.Builder, Range.getBegin());
6780}
6781
6783 if (CGDebugInfo *DI = CGF.getDebugInfo())
6784 DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd());
6785
6786 // If we should perform a cleanup, force them now. Note that
6787 // this ends the cleanup scope before rescoping any labels.
6788 if (PerformCleanup) {
6789 ApplyDebugLocation DL(CGF, Range.getEnd());
6790 ForceCleanup();
6791 }
6792}
6793
6795 std::string Label;
6796 switch (Handler) {
6797#define SANITIZER_CHECK(Enum, Name, Version, Msg) \
6798 case Enum: \
6799 Label = "__ubsan_check_" #Name; \
6800 break;
6801
6803#undef SANITIZER_CHECK
6804 };
6805
6806 // Label doesn't require sanitization
6807 return Label;
6808}
6809
6810static std::string
6812 std::string Label;
6813 switch (Ordinal) {
6814#define SANITIZER(NAME, ID) \
6815 case SanitizerKind::SO_##ID: \
6816 Label = "__ubsan_check_" NAME; \
6817 break;
6818#include "clang/Basic/Sanitizers.def"
6819 default:
6820 llvm_unreachable("unexpected sanitizer kind");
6821 }
6822
6823 // Sanitize label (convert hyphens to underscores; also futureproof against
6824 // non-alpha)
6825 for (unsigned int i = 0; i < Label.length(); i++)
6826 if (!std::isalpha(Label[i]))
6827 Label[i] = '_';
6828
6829 return Label;
6830}
6831
6834 SanitizerHandler Handler) {
6835 llvm::DILocation *CheckDebugLoc = Builder.getCurrentDebugLocation();
6836 auto *DI = getDebugInfo();
6837 if (!DI || !CheckDebugLoc)
6838 return CheckDebugLoc;
6839 const auto &AnnotateDebugInfo =
6840 CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo;
6841 if (AnnotateDebugInfo.empty())
6842 return CheckDebugLoc;
6843
6844 std::string Label;
6845 if (Ordinals.size() == 1)
6846 Label = SanitizerOrdinalToCheckLabel(Ordinals[0]);
6847 else
6848 Label = SanitizerHandlerToCheckLabel(Handler);
6849
6850 if (any_of(Ordinals, [&](auto Ord) { return AnnotateDebugInfo.has(Ord); })) {
6851 // Use ubsan header file to have the same filename for all checks. There is
6852 // nothing special in that file, we just want to make tools to count all
6853 // syntetic functions of a check as the same.
6854 llvm::DIFile *File = llvm::DIFile::get(CGM.getLLVMContext(),
6855 /*Filename=*/"ubsan_interface.h",
6856 /*Directory=*/"sanitizer");
6857 return DI->CreateSyntheticInlineAt(CheckDebugLoc, Label, File);
6858 }
6859
6860 return CheckDebugLoc;
6861}
6862
6865 SanitizerHandler Handler)
6866 : CGF(CGF),
6867 Apply(*CGF, CGF->SanitizerAnnotateDebugInfo(Ordinals, Handler)) {
6868 assert(!CGF->IsSanitizerScope);
6869 CGF->IsSanitizerScope = true;
6870}
6871
6873 assert(CGF->IsSanitizerScope);
6874 CGF->IsSanitizerScope = false;
6875}
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 unsigned getDwarfCC(CallingConv CC, const llvm::Triple &T)
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 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:884
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:3848
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Definition TypeBase.h:8303
unsigned shadow_size() const
Return the number of shadowed declarations associated with this using declaration.
Definition DeclCXX.h:3599
shadow_range shadows() const
Definition DeclCXX.h:3587
A binding in a decomposition declaration.
Definition DeclCXX.h:4210
Expr * getBinding() const
Get the expression to which this declaration is bound.
Definition DeclCXX.h:4236
bool isUnsigned() const
Definition TypeBase.h:8366
unsigned getNumBits() const
Definition TypeBase.h:8368
A class which contains all the information about a particular captured value.
Definition Decl.h:4812
bool isByRef() const
Whether this is a "by ref" capture, i.e.
Definition Decl.h:4837
Capture(VarDecl *variable, bool byRef, bool nested, Expr *copy)
Definition Decl.h:4827
VarDecl * getVariable() const
The variable being captured.
Definition Decl.h:4833
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4806
QualType getPointeeType() const
Definition TypeBase.h:3668
Kind getKind() const
Definition TypeBase.h:3292
StringRef getName(const PrintingPolicy &Policy) const
Definition Type.cpp:3519
Represents a C++ constructor within a class.
Definition DeclCXX.h:2637
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:4520
unsigned getNumRows() const
Returns the number of rows in the matrix.
Definition TypeBase.h:4517
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:4145
bool isComplete() const
Returns true if this can be considered a complete type.
Definition Decl.h:4377
EnumDecl * getDefinitionOrSelf() const
Definition Decl.h:4261
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:3397
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
Definition Decl.h:3379
static InputKind getInputKindForExtension(StringRef Extension)
getInputKindForExtension - Return the appropriate input kind for a file extension.
Represents a function declaration or definition.
Definition Decl.h:2058
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:3051
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
Definition Decl.cpp:3694
QualType getReturnType() const
Definition Decl.h:2975
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2904
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
Definition Decl.h:2569
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition Decl.cpp:4366
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:3790
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition Decl.cpp:4372
@ TK_FunctionTemplateSpecialization
Definition Decl.h:2074
bool isStatic() const
Definition Decl.h:3059
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4187
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:4208
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5421
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Definition TypeBase.h:5728
unsigned getNumParams() const
Definition TypeBase.h:5699
QualType getParamType(unsigned i) const
Definition TypeBase.h:5701
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5710
ArrayRef< QualType > getParamTypes() const
Definition TypeBase.h:5706
ArrayRef< QualType > param_types() const
Definition TypeBase.h:5861
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4617
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
Definition TypeBase.h:4965
CallingConv getCallConv() const
Definition TypeBase.h:4972
QualType getReturnType() const
Definition TypeBase.h:4957
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:5187
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:4465
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
Definition Type.cpp:5701
QualType getPointeeType() const
Definition TypeBase.h:3785
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:3226
NamespaceBaseDecl * getAliasedNamespace() const
Retrieve the namespace that this alias refers to, which may either be a NamespaceDecl or a NamespaceA...
Definition DeclCXX.h:3319
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:8197
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
Definition TypeBase.h:8134
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:8333
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:3418
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:8504
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:8451
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
Definition Type.cpp:4824
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:4459
field_range fields() const
Definition Decl.h:4662
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Definition Decl.h:4643
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4659
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4647
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Definition Decl.h:4511
field_iterator field_begin() const
Definition Decl.cpp:5338
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
QualType getPointeeType() const
Definition TypeBase.h:3705
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:1810
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
Definition Expr.h:1956
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3851
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3952
bool isStruct() const
Definition Decl.h:4059
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition Decl.h:4088
bool isCompleteDefinitionRequired() const
Return true if this complete decl is required to be complete for some existing use.
Definition Decl.h:3961
bool isUnion() const
Definition Decl.h:4062
bool isInterface() const
Definition Decl.h:4060
bool isClass() const
Definition Decl.h:4061
TagDecl * getDefinitionOrSelf() const
Definition Decl.h:4034
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:1879
bool isVoidType() const
Definition TypeBase.h:9113
bool isPackedVectorBoolType(const ASTContext &ctx) const
Definition Type.cpp:455
bool isIncompleteArrayType() const
Definition TypeBase.h:8848
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:9157
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9407
bool isReferenceType() const
Definition TypeBase.h:8765
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition TypeBase.h:2976
bool isMemberDataPointerType() const
Definition TypeBase.h:8833
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:2557
TypeClass getTypeClass() const
Definition TypeBase.h:2449
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9340
bool isRecordType() const
Definition TypeBase.h:8868
QualType getUnderlyingType() const
Definition Decl.h:3751
TypedefNameDecl * getDecl() const
Definition TypeBase.h:6266
Represents a C++ using-declaration.
Definition DeclCXX.h:3616
Represents C++ using-directive.
Definition DeclCXX.h:3121
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Definition DeclCXX.cpp:3357
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3817
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3424
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
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
Definition Decl.h:1214
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:2682
unsigned getNumElements() const
Definition TypeBase.h:4304
QualType getElementType() const
Definition TypeBase.h:4303
@ 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...
Top level wrappers for InstallAPI frontend operations.
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:1804
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition TypeBase.h:1807
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:293
@ CC_IntelOclBicc
Definition Specifiers.h:291
@ CC_PreserveMost
Definition Specifiers.h:295
@ CC_Win64
Definition Specifiers.h:286
@ CC_X86ThisCall
Definition Specifiers.h:283
@ CC_AArch64VectorCall
Definition Specifiers.h:297
@ CC_DeviceKernel
Definition Specifiers.h:292
@ CC_AAPCS
Definition Specifiers.h:289
@ CC_PreserveNone
Definition Specifiers.h:300
@ CC_M68kRTD
Definition Specifiers.h:299
@ CC_SwiftAsync
Definition Specifiers.h:294
@ CC_X86RegCall
Definition Specifiers.h:288
@ CC_RISCVVectorCall
Definition Specifiers.h:301
@ CC_X86VectorCall
Definition Specifiers.h:284
@ CC_AArch64SVEPCS
Definition Specifiers.h:298
@ CC_X86StdCall
Definition Specifiers.h:281
@ CC_X86_64SysV
Definition Specifiers.h:287
@ CC_PreserveAll
Definition Specifiers.h:296
@ CC_X86FastCall
Definition Specifiers.h:282
@ CC_AAPCS_VFP
Definition Specifiers.h:290
@ Generic
not a target-specific vector type
Definition TypeBase.h:4250
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6034
@ 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:5506
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