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