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