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