Bug Summary

File:tools/clang/lib/CodeGen/CGDebugInfo.cpp
Warning:line 1794, column 13
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name CGDebugInfo.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mthread-model posix -mframe-pointer=none -relaxed-aliasing -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -ffunction-sections -fdata-sections -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -D CLANG_VENDOR="Debian " -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/tools/clang/lib/CodeGen -I /build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen -I /build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include -I /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/include -I /build/llvm-toolchain-snapshot-10~svn374877/include -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/tools/clang/lib/CodeGen -fdebug-prefix-map=/build/llvm-toolchain-snapshot-10~svn374877=. -ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fno-common -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -o /tmp/scan-build-2019-10-15-233810-7101-1 -x c++ /build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp
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 "clang/Analysis/Analyses/ExprMutationAnalyzer.h"
22#include "clang/AST/ASTContext.h"
23#include "clang/AST/DeclFriend.h"
24#include "clang/AST/DeclObjC.h"
25#include "clang/AST/DeclTemplate.h"
26#include "clang/AST/Expr.h"
27#include "clang/AST/RecordLayout.h"
28#include "clang/Basic/CodeGenOptions.h"
29#include "clang/Basic/FileManager.h"
30#include "clang/Basic/SourceManager.h"
31#include "clang/Basic/Version.h"
32#include "clang/Frontend/FrontendOptions.h"
33#include "clang/Lex/HeaderSearchOptions.h"
34#include "clang/Lex/ModuleMap.h"
35#include "clang/Lex/PreprocessorOptions.h"
36#include "llvm/ADT/DenseSet.h"
37#include "llvm/ADT/SmallVector.h"
38#include "llvm/ADT/StringExtras.h"
39#include "llvm/IR/Constants.h"
40#include "llvm/IR/DataLayout.h"
41#include "llvm/IR/DerivedTypes.h"
42#include "llvm/IR/Instructions.h"
43#include "llvm/IR/Intrinsics.h"
44#include "llvm/IR/Metadata.h"
45#include "llvm/IR/Module.h"
46#include "llvm/Support/FileSystem.h"
47#include "llvm/Support/MD5.h"
48#include "llvm/Support/Path.h"
49using namespace clang;
50using namespace clang::CodeGen;
51
52static uint32_t getTypeAlignIfRequired(const Type *Ty, const ASTContext &Ctx) {
53 auto TI = Ctx.getTypeInfo(Ty);
54 return TI.AlignIsRequired ? TI.Align : 0;
55}
56
57static uint32_t getTypeAlignIfRequired(QualType Ty, const ASTContext &Ctx) {
58 return getTypeAlignIfRequired(Ty.getTypePtr(), Ctx);
59}
60
61static uint32_t getDeclAlignIfRequired(const Decl *D, const ASTContext &Ctx) {
62 return D->hasAttr<AlignedAttr>() ? D->getMaxAlignment() : 0;
63}
64
65CGDebugInfo::CGDebugInfo(CodeGenModule &CGM)
66 : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()),
67 DebugTypeExtRefs(CGM.getCodeGenOpts().DebugTypeExtRefs),
68 DBuilder(CGM.getModule()) {
69 for (const auto &KV : CGM.getCodeGenOpts().DebugPrefixMap)
70 DebugPrefixMap[KV.first] = KV.second;
71 CreateCompileUnit();
72}
73
74CGDebugInfo::~CGDebugInfo() {
75 assert(LexicalBlockStack.empty() &&((LexicalBlockStack.empty() && "Region stack mismatch, stack not empty!"
) ? static_cast<void> (0) : __assert_fail ("LexicalBlockStack.empty() && \"Region stack mismatch, stack not empty!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 76, __PRETTY_FUNCTION__))
76 "Region stack mismatch, stack not empty!")((LexicalBlockStack.empty() && "Region stack mismatch, stack not empty!"
) ? static_cast<void> (0) : __assert_fail ("LexicalBlockStack.empty() && \"Region stack mismatch, stack not empty!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 76, __PRETTY_FUNCTION__))
;
77}
78
79ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
80 SourceLocation TemporaryLocation)
81 : CGF(&CGF) {
82 init(TemporaryLocation);
83}
84
85ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
86 bool DefaultToEmpty,
87 SourceLocation TemporaryLocation)
88 : CGF(&CGF) {
89 init(TemporaryLocation, DefaultToEmpty);
90}
91
92void ApplyDebugLocation::init(SourceLocation TemporaryLocation,
93 bool DefaultToEmpty) {
94 auto *DI = CGF->getDebugInfo();
95 if (!DI) {
96 CGF = nullptr;
97 return;
98 }
99
100 OriginalLocation = CGF->Builder.getCurrentDebugLocation();
101
102 if (OriginalLocation && !DI->CGM.getExpressionLocationsEnabled())
103 return;
104
105 if (TemporaryLocation.isValid()) {
106 DI->EmitLocation(CGF->Builder, TemporaryLocation);
107 return;
108 }
109
110 if (DefaultToEmpty) {
111 CGF->Builder.SetCurrentDebugLocation(llvm::DebugLoc());
112 return;
113 }
114
115 // Construct a location that has a valid scope, but no line info.
116 assert(!DI->LexicalBlockStack.empty())((!DI->LexicalBlockStack.empty()) ? static_cast<void>
(0) : __assert_fail ("!DI->LexicalBlockStack.empty()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 116, __PRETTY_FUNCTION__))
;
117 CGF->Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(
118 0, 0, DI->LexicalBlockStack.back(), DI->getInlinedAt()));
119}
120
121ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E)
122 : CGF(&CGF) {
123 init(E->getExprLoc());
124}
125
126ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc)
127 : CGF(&CGF) {
128 if (!CGF.getDebugInfo()) {
129 this->CGF = nullptr;
130 return;
131 }
132 OriginalLocation = CGF.Builder.getCurrentDebugLocation();
133 if (Loc)
134 CGF.Builder.SetCurrentDebugLocation(std::move(Loc));
135}
136
137ApplyDebugLocation::~ApplyDebugLocation() {
138 // Query CGF so the location isn't overwritten when location updates are
139 // temporarily disabled (for C++ default function arguments)
140 if (CGF)
141 CGF->Builder.SetCurrentDebugLocation(std::move(OriginalLocation));
142}
143
144ApplyInlineDebugLocation::ApplyInlineDebugLocation(CodeGenFunction &CGF,
145 GlobalDecl InlinedFn)
146 : CGF(&CGF) {
147 if (!CGF.getDebugInfo()) {
148 this->CGF = nullptr;
149 return;
150 }
151 auto &DI = *CGF.getDebugInfo();
152 SavedLocation = DI.getLocation();
153 assert((DI.getInlinedAt() ==(((DI.getInlinedAt() == CGF.Builder.getCurrentDebugLocation()
->getInlinedAt()) && "CGDebugInfo and IRBuilder are out of sync"
) ? static_cast<void> (0) : __assert_fail ("(DI.getInlinedAt() == CGF.Builder.getCurrentDebugLocation()->getInlinedAt()) && \"CGDebugInfo and IRBuilder are out of sync\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 155, __PRETTY_FUNCTION__))
154 CGF.Builder.getCurrentDebugLocation()->getInlinedAt()) &&(((DI.getInlinedAt() == CGF.Builder.getCurrentDebugLocation()
->getInlinedAt()) && "CGDebugInfo and IRBuilder are out of sync"
) ? static_cast<void> (0) : __assert_fail ("(DI.getInlinedAt() == CGF.Builder.getCurrentDebugLocation()->getInlinedAt()) && \"CGDebugInfo and IRBuilder are out of sync\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 155, __PRETTY_FUNCTION__))
155 "CGDebugInfo and IRBuilder are out of sync")(((DI.getInlinedAt() == CGF.Builder.getCurrentDebugLocation()
->getInlinedAt()) && "CGDebugInfo and IRBuilder are out of sync"
) ? static_cast<void> (0) : __assert_fail ("(DI.getInlinedAt() == CGF.Builder.getCurrentDebugLocation()->getInlinedAt()) && \"CGDebugInfo and IRBuilder are out of sync\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 155, __PRETTY_FUNCTION__))
;
156
157 DI.EmitInlineFunctionStart(CGF.Builder, InlinedFn);
158}
159
160ApplyInlineDebugLocation::~ApplyInlineDebugLocation() {
161 if (!CGF)
162 return;
163 auto &DI = *CGF->getDebugInfo();
164 DI.EmitInlineFunctionEnd(CGF->Builder);
165 DI.EmitLocation(CGF->Builder, SavedLocation);
166}
167
168void CGDebugInfo::setLocation(SourceLocation Loc) {
169 // If the new location isn't valid return.
170 if (Loc.isInvalid())
171 return;
172
173 CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc);
174
175 // If we've changed files in the middle of a lexical scope go ahead
176 // and create a new lexical scope with file node if it's different
177 // from the one in the scope.
178 if (LexicalBlockStack.empty())
179 return;
180
181 SourceManager &SM = CGM.getContext().getSourceManager();
182 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
183 PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc);
184 if (PCLoc.isInvalid() || Scope->getFile() == getOrCreateFile(CurLoc))
185 return;
186
187 if (auto *LBF = dyn_cast<llvm::DILexicalBlockFile>(Scope)) {
188 LexicalBlockStack.pop_back();
189 LexicalBlockStack.emplace_back(DBuilder.createLexicalBlockFile(
190 LBF->getScope(), getOrCreateFile(CurLoc)));
191 } else if (isa<llvm::DILexicalBlock>(Scope) ||
192 isa<llvm::DISubprogram>(Scope)) {
193 LexicalBlockStack.pop_back();
194 LexicalBlockStack.emplace_back(
195 DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc)));
196 }
197}
198
199llvm::DIScope *CGDebugInfo::getDeclContextDescriptor(const Decl *D) {
200 llvm::DIScope *Mod = getParentModuleOrNull(D);
201 return getContextDescriptor(cast<Decl>(D->getDeclContext()),
202 Mod ? Mod : TheCU);
203}
204
205llvm::DIScope *CGDebugInfo::getContextDescriptor(const Decl *Context,
206 llvm::DIScope *Default) {
207 if (!Context)
208 return Default;
209
210 auto I = RegionMap.find(Context);
211 if (I != RegionMap.end()) {
212 llvm::Metadata *V = I->second;
213 return dyn_cast_or_null<llvm::DIScope>(V);
214 }
215
216 // Check namespace.
217 if (const auto *NSDecl = dyn_cast<NamespaceDecl>(Context))
218 return getOrCreateNamespace(NSDecl);
219
220 if (const auto *RDecl = dyn_cast<RecordDecl>(Context))
221 if (!RDecl->isDependentType())
222 return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl),
223 TheCU->getFile());
224 return Default;
225}
226
227PrintingPolicy CGDebugInfo::getPrintingPolicy() const {
228 PrintingPolicy PP = CGM.getContext().getPrintingPolicy();
229
230 // If we're emitting codeview, it's important to try to match MSVC's naming so
231 // that visualizers written for MSVC will trigger for our class names. In
232 // particular, we can't have spaces between arguments of standard templates
233 // like basic_string and vector.
234 if (CGM.getCodeGenOpts().EmitCodeView)
235 PP.MSVCFormatting = true;
236
237 // Apply -fdebug-prefix-map.
238 PP.RemapFilePaths = true;
239 PP.remapPath = [this](StringRef Path) { return remapDIPath(Path); };
240 return PP;
241}
242
243StringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) {
244 assert(FD && "Invalid FunctionDecl!")((FD && "Invalid FunctionDecl!") ? static_cast<void
> (0) : __assert_fail ("FD && \"Invalid FunctionDecl!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 244, __PRETTY_FUNCTION__))
;
245 IdentifierInfo *FII = FD->getIdentifier();
246 FunctionTemplateSpecializationInfo *Info =
247 FD->getTemplateSpecializationInfo();
248
249 // Emit the unqualified name in normal operation. LLVM and the debugger can
250 // compute the fully qualified name from the scope chain. If we're only
251 // emitting line table info, there won't be any scope chains, so emit the
252 // fully qualified name here so that stack traces are more accurate.
253 // FIXME: Do this when emitting DWARF as well as when emitting CodeView after
254 // evaluating the size impact.
255 bool UseQualifiedName = DebugKind == codegenoptions::DebugLineTablesOnly &&
256 CGM.getCodeGenOpts().EmitCodeView;
257
258 if (!Info && FII && !UseQualifiedName)
259 return FII->getName();
260
261 SmallString<128> NS;
262 llvm::raw_svector_ostream OS(NS);
263 if (!UseQualifiedName)
264 FD->printName(OS);
265 else
266 FD->printQualifiedName(OS, getPrintingPolicy());
267
268 // Add any template specialization args.
269 if (Info) {
270 const TemplateArgumentList *TArgs = Info->TemplateArguments;
271 printTemplateArgumentList(OS, TArgs->asArray(), getPrintingPolicy());
272 }
273
274 // Copy this name on the side and use its reference.
275 return internString(OS.str());
276}
277
278StringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) {
279 SmallString<256> MethodName;
280 llvm::raw_svector_ostream OS(MethodName);
281 OS << (OMD->isInstanceMethod() ? '-' : '+') << '[';
282 const DeclContext *DC = OMD->getDeclContext();
283 if (const auto *OID = dyn_cast<ObjCImplementationDecl>(DC)) {
284 OS << OID->getName();
285 } else if (const auto *OID = dyn_cast<ObjCInterfaceDecl>(DC)) {
286 OS << OID->getName();
287 } else if (const auto *OC = dyn_cast<ObjCCategoryDecl>(DC)) {
288 if (OC->IsClassExtension()) {
289 OS << OC->getClassInterface()->getName();
290 } else {
291 OS << OC->getIdentifier()->getNameStart() << '('
292 << OC->getIdentifier()->getNameStart() << ')';
293 }
294 } else if (const auto *OCD = dyn_cast<ObjCCategoryImplDecl>(DC)) {
295 OS << OCD->getClassInterface()->getName() << '(' << OCD->getName() << ')';
296 } else if (isa<ObjCProtocolDecl>(DC)) {
297 // We can extract the type of the class from the self pointer.
298 if (ImplicitParamDecl *SelfDecl = OMD->getSelfDecl()) {
299 QualType ClassTy =
300 cast<ObjCObjectPointerType>(SelfDecl->getType())->getPointeeType();
301 ClassTy.print(OS, PrintingPolicy(LangOptions()));
302 }
303 }
304 OS << ' ' << OMD->getSelector().getAsString() << ']';
305
306 return internString(OS.str());
307}
308
309StringRef CGDebugInfo::getSelectorName(Selector S) {
310 return internString(S.getAsString());
311}
312
313StringRef CGDebugInfo::getClassName(const RecordDecl *RD) {
314 if (isa<ClassTemplateSpecializationDecl>(RD)) {
315 SmallString<128> Name;
316 llvm::raw_svector_ostream OS(Name);
317 RD->getNameForDiagnostic(OS, getPrintingPolicy(),
318 /*Qualified*/ false);
319
320 // Copy this name on the side and use its reference.
321 return internString(Name);
322 }
323
324 // quick optimization to avoid having to intern strings that are already
325 // stored reliably elsewhere
326 if (const IdentifierInfo *II = RD->getIdentifier())
327 return II->getName();
328
329 // The CodeView printer in LLVM wants to see the names of unnamed types: it is
330 // used to reconstruct the fully qualified type names.
331 if (CGM.getCodeGenOpts().EmitCodeView) {
332 if (const TypedefNameDecl *D = RD->getTypedefNameForAnonDecl()) {
333 assert(RD->getDeclContext() == D->getDeclContext() &&((RD->getDeclContext() == D->getDeclContext() &&
"Typedef should not be in another decl context!") ? static_cast
<void> (0) : __assert_fail ("RD->getDeclContext() == D->getDeclContext() && \"Typedef should not be in another decl context!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 334, __PRETTY_FUNCTION__))
334 "Typedef should not be in another decl context!")((RD->getDeclContext() == D->getDeclContext() &&
"Typedef should not be in another decl context!") ? static_cast
<void> (0) : __assert_fail ("RD->getDeclContext() == D->getDeclContext() && \"Typedef should not be in another decl context!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 334, __PRETTY_FUNCTION__))
;
335 assert(D->getDeclName().getAsIdentifierInfo() &&((D->getDeclName().getAsIdentifierInfo() && "Typedef was not named!"
) ? static_cast<void> (0) : __assert_fail ("D->getDeclName().getAsIdentifierInfo() && \"Typedef was not named!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 336, __PRETTY_FUNCTION__))
336 "Typedef was not named!")((D->getDeclName().getAsIdentifierInfo() && "Typedef was not named!"
) ? static_cast<void> (0) : __assert_fail ("D->getDeclName().getAsIdentifierInfo() && \"Typedef was not named!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 336, __PRETTY_FUNCTION__))
;
337 return D->getDeclName().getAsIdentifierInfo()->getName();
338 }
339
340 if (CGM.getLangOpts().CPlusPlus) {
341 StringRef Name;
342
343 ASTContext &Context = CGM.getContext();
344 if (const DeclaratorDecl *DD = Context.getDeclaratorForUnnamedTagDecl(RD))
345 // Anonymous types without a name for linkage purposes have their
346 // declarator mangled in if they have one.
347 Name = DD->getName();
348 else if (const TypedefNameDecl *TND =
349 Context.getTypedefNameForUnnamedTagDecl(RD))
350 // Anonymous types without a name for linkage purposes have their
351 // associate typedef mangled in if they have one.
352 Name = TND->getName();
353
354 if (!Name.empty()) {
355 SmallString<256> UnnamedType("<unnamed-type-");
356 UnnamedType += Name;
357 UnnamedType += '>';
358 return internString(UnnamedType);
359 }
360 }
361 }
362
363 return StringRef();
364}
365
366Optional<llvm::DIFile::ChecksumKind>
367CGDebugInfo::computeChecksum(FileID FID, SmallString<32> &Checksum) const {
368 Checksum.clear();
369
370 if (!CGM.getCodeGenOpts().EmitCodeView &&
371 CGM.getCodeGenOpts().DwarfVersion < 5)
372 return None;
373
374 SourceManager &SM = CGM.getContext().getSourceManager();
375 bool Invalid;
376 const llvm::MemoryBuffer *MemBuffer = SM.getBuffer(FID, &Invalid);
377 if (Invalid)
378 return None;
379
380 llvm::MD5 Hash;
381 llvm::MD5::MD5Result Result;
382
383 Hash.update(MemBuffer->getBuffer());
384 Hash.final(Result);
385
386 Hash.stringifyResult(Result, Checksum);
387 return llvm::DIFile::CSK_MD5;
388}
389
390Optional<StringRef> CGDebugInfo::getSource(const SourceManager &SM,
391 FileID FID) {
392 if (!CGM.getCodeGenOpts().EmbedSource)
393 return None;
394
395 bool SourceInvalid = false;
396 StringRef Source = SM.getBufferData(FID, &SourceInvalid);
397
398 if (SourceInvalid)
399 return None;
400
401 return Source;
402}
403
404llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
405 if (!Loc.isValid())
406 // If Location is not valid then use main input file.
407 return TheCU->getFile();
408
409 SourceManager &SM = CGM.getContext().getSourceManager();
410 PresumedLoc PLoc = SM.getPresumedLoc(Loc);
411
412 StringRef FileName = PLoc.getFilename();
413 if (PLoc.isInvalid() || FileName.empty())
414 // If the location is not valid then use main input file.
415 return TheCU->getFile();
416
417 // Cache the results.
418 auto It = DIFileCache.find(FileName.data());
419 if (It != DIFileCache.end()) {
420 // Verify that the information still exists.
421 if (llvm::Metadata *V = It->second)
422 return cast<llvm::DIFile>(V);
423 }
424
425 SmallString<32> Checksum;
426
427 // Compute the checksum if possible. If the location is affected by a #line
428 // directive that refers to a file, PLoc will have an invalid FileID, and we
429 // will correctly get no checksum.
430 Optional<llvm::DIFile::ChecksumKind> CSKind =
431 computeChecksum(PLoc.getFileID(), Checksum);
432 Optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo;
433 if (CSKind)
434 CSInfo.emplace(*CSKind, Checksum);
435 return createFile(FileName, CSInfo, getSource(SM, SM.getFileID(Loc)));
436}
437
438llvm::DIFile *
439CGDebugInfo::createFile(StringRef FileName,
440 Optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo,
441 Optional<StringRef> Source) {
442 StringRef Dir;
443 StringRef File;
444 std::string RemappedFile = remapDIPath(FileName);
445 std::string CurDir = remapDIPath(getCurrentDirname());
446 SmallString<128> DirBuf;
447 SmallString<128> FileBuf;
448 if (llvm::sys::path::is_absolute(RemappedFile)) {
449 // Strip the common prefix (if it is more than just "/") from current
450 // directory and FileName for a more space-efficient encoding.
451 auto FileIt = llvm::sys::path::begin(RemappedFile);
452 auto FileE = llvm::sys::path::end(RemappedFile);
453 auto CurDirIt = llvm::sys::path::begin(CurDir);
454 auto CurDirE = llvm::sys::path::end(CurDir);
455 for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt)
456 llvm::sys::path::append(DirBuf, *CurDirIt);
457 if (std::distance(llvm::sys::path::begin(CurDir), CurDirIt) == 1) {
458 // Don't strip the common prefix if it is only the root "/"
459 // since that would make LLVM diagnostic locations confusing.
460 Dir = {};
461 File = RemappedFile;
462 } else {
463 for (; FileIt != FileE; ++FileIt)
464 llvm::sys::path::append(FileBuf, *FileIt);
465 Dir = DirBuf;
466 File = FileBuf;
467 }
468 } else {
469 Dir = CurDir;
470 File = RemappedFile;
471 }
472 llvm::DIFile *F = DBuilder.createFile(File, Dir, CSInfo, Source);
473 DIFileCache[FileName.data()].reset(F);
474 return F;
475}
476
477std::string CGDebugInfo::remapDIPath(StringRef Path) const {
478 for (const auto &Entry : DebugPrefixMap)
479 if (Path.startswith(Entry.first))
480 return (Twine(Entry.second) + Path.substr(Entry.first.size())).str();
481 return Path.str();
482}
483
484unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {
485 if (Loc.isInvalid() && CurLoc.isInvalid())
486 return 0;
487 SourceManager &SM = CGM.getContext().getSourceManager();
488 PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
489 return PLoc.isValid() ? PLoc.getLine() : 0;
490}
491
492unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
493 // We may not want column information at all.
494 if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo)
495 return 0;
496
497 // If the location is invalid then use the current column.
498 if (Loc.isInvalid() && CurLoc.isInvalid())
499 return 0;
500 SourceManager &SM = CGM.getContext().getSourceManager();
501 PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
502 return PLoc.isValid() ? PLoc.getColumn() : 0;
503}
504
505StringRef CGDebugInfo::getCurrentDirname() {
506 if (!CGM.getCodeGenOpts().DebugCompilationDir.empty())
507 return CGM.getCodeGenOpts().DebugCompilationDir;
508
509 if (!CWDName.empty())
510 return CWDName;
511 SmallString<256> CWD;
512 llvm::sys::fs::current_path(CWD);
513 return CWDName = internString(CWD);
514}
515
516void CGDebugInfo::CreateCompileUnit() {
517 SmallString<32> Checksum;
518 Optional<llvm::DIFile::ChecksumKind> CSKind;
519 Optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo;
520
521 // Should we be asking the SourceManager for the main file name, instead of
522 // accepting it as an argument? This just causes the main file name to
523 // mismatch with source locations and create extra lexical scopes or
524 // mismatched debug info (a CU with a DW_AT_file of "-", because that's what
525 // the driver passed, but functions/other things have DW_AT_file of "<stdin>"
526 // because that's what the SourceManager says)
527
528 // Get absolute path name.
529 SourceManager &SM = CGM.getContext().getSourceManager();
530 std::string MainFileName = CGM.getCodeGenOpts().MainFileName;
531 if (MainFileName.empty())
532 MainFileName = "<stdin>";
533
534 // The main file name provided via the "-main-file-name" option contains just
535 // the file name itself with no path information. This file name may have had
536 // a relative path, so we look into the actual file entry for the main
537 // file to determine the real absolute path for the file.
538 std::string MainFileDir;
539 if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
540 MainFileDir = remapDIPath(MainFile->getDir()->getName());
541 if (MainFileDir != ".") {
542 llvm::SmallString<1024> MainFileDirSS(MainFileDir);
543 llvm::sys::path::append(MainFileDirSS, MainFileName);
544 MainFileName = MainFileDirSS.str();
545 }
546 // If the main file name provided is identical to the input file name, and
547 // if the input file is a preprocessed source, use the module name for
548 // debug info. The module name comes from the name specified in the first
549 // linemarker if the input is a preprocessed source.
550 if (MainFile->getName() == MainFileName &&
551 FrontendOptions::getInputKindForExtension(
552 MainFile->getName().rsplit('.').second)
553 .isPreprocessed())
554 MainFileName = CGM.getModule().getName().str();
555
556 CSKind = computeChecksum(SM.getMainFileID(), Checksum);
557 }
558
559 llvm::dwarf::SourceLanguage LangTag;
560 const LangOptions &LO = CGM.getLangOpts();
561 if (LO.CPlusPlus) {
562 if (LO.ObjC)
563 LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus;
564 else if (LO.CPlusPlus14)
565 LangTag = llvm::dwarf::DW_LANG_C_plus_plus_14;
566 else if (LO.CPlusPlus11)
567 LangTag = llvm::dwarf::DW_LANG_C_plus_plus_11;
568 else
569 LangTag = llvm::dwarf::DW_LANG_C_plus_plus;
570 } else if (LO.ObjC) {
571 LangTag = llvm::dwarf::DW_LANG_ObjC;
572 } else if (LO.RenderScript) {
573 LangTag = llvm::dwarf::DW_LANG_GOOGLE_RenderScript;
574 } else if (LO.C99) {
575 LangTag = llvm::dwarf::DW_LANG_C99;
576 } else {
577 LangTag = llvm::dwarf::DW_LANG_C89;
578 }
579
580 std::string Producer = getClangFullVersion();
581
582 // Figure out which version of the ObjC runtime we have.
583 unsigned RuntimeVers = 0;
584 if (LO.ObjC)
585 RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1;
586
587 llvm::DICompileUnit::DebugEmissionKind EmissionKind;
588 switch (DebugKind) {
589 case codegenoptions::NoDebugInfo:
590 case codegenoptions::LocTrackingOnly:
591 EmissionKind = llvm::DICompileUnit::NoDebug;
592 break;
593 case codegenoptions::DebugLineTablesOnly:
594 EmissionKind = llvm::DICompileUnit::LineTablesOnly;
595 break;
596 case codegenoptions::DebugDirectivesOnly:
597 EmissionKind = llvm::DICompileUnit::DebugDirectivesOnly;
598 break;
599 case codegenoptions::LimitedDebugInfo:
600 case codegenoptions::FullDebugInfo:
601 EmissionKind = llvm::DICompileUnit::FullDebug;
602 break;
603 }
604
605 uint64_t DwoId = 0;
606 auto &CGOpts = CGM.getCodeGenOpts();
607 // The DIFile used by the CU is distinct from the main source
608 // file. Its directory part specifies what becomes the
609 // DW_AT_comp_dir (the compilation directory), even if the source
610 // file was specified with an absolute path.
611 if (CSKind)
612 CSInfo.emplace(*CSKind, Checksum);
613 llvm::DIFile *CUFile = DBuilder.createFile(
614 remapDIPath(MainFileName), remapDIPath(getCurrentDirname()), CSInfo,
615 getSource(SM, SM.getMainFileID()));
616
617 // Create new compile unit.
618 TheCU = DBuilder.createCompileUnit(
619 LangTag, CUFile, CGOpts.EmitVersionIdentMetadata ? Producer : "",
620 LO.Optimize || CGOpts.PrepareForLTO || CGOpts.PrepareForThinLTO,
621 CGOpts.DwarfDebugFlags, RuntimeVers, CGOpts.SplitDwarfFile, EmissionKind,
622 DwoId, CGOpts.SplitDwarfInlining, CGOpts.DebugInfoForProfiling,
623 CGM.getTarget().getTriple().isNVPTX()
624 ? llvm::DICompileUnit::DebugNameTableKind::None
625 : static_cast<llvm::DICompileUnit::DebugNameTableKind>(
626 CGOpts.DebugNameTable),
627 CGOpts.DebugRangesBaseAddress);
628}
629
630llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
631 llvm::dwarf::TypeKind Encoding;
632 StringRef BTName;
633 switch (BT->getKind()) {
634#define BUILTIN_TYPE(Id, SingletonId)
635#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
636#include "clang/AST/BuiltinTypes.def"
637 case BuiltinType::Dependent:
638 llvm_unreachable("Unexpected builtin type")::llvm::llvm_unreachable_internal("Unexpected builtin type", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 638)
;
639 case BuiltinType::NullPtr:
640 return DBuilder.createNullPtrType();
641 case BuiltinType::Void:
642 return nullptr;
643 case BuiltinType::ObjCClass:
644 if (!ClassTy)
645 ClassTy =
646 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
647 "objc_class", TheCU, TheCU->getFile(), 0);
648 return ClassTy;
649 case BuiltinType::ObjCId: {
650 // typedef struct objc_class *Class;
651 // typedef struct objc_object {
652 // Class isa;
653 // } *id;
654
655 if (ObjTy)
656 return ObjTy;
657
658 if (!ClassTy)
659 ClassTy =
660 DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
661 "objc_class", TheCU, TheCU->getFile(), 0);
662
663 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
664
665 auto *ISATy = DBuilder.createPointerType(ClassTy, Size);
666
667 ObjTy = DBuilder.createStructType(TheCU, "objc_object", TheCU->getFile(), 0,
668 0, 0, llvm::DINode::FlagZero, nullptr,
669 llvm::DINodeArray());
670
671 DBuilder.replaceArrays(
672 ObjTy, DBuilder.getOrCreateArray(&*DBuilder.createMemberType(
673 ObjTy, "isa", TheCU->getFile(), 0, Size, 0, 0,
674 llvm::DINode::FlagZero, ISATy)));
675 return ObjTy;
676 }
677 case BuiltinType::ObjCSel: {
678 if (!SelTy)
679 SelTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
680 "objc_selector", TheCU,
681 TheCU->getFile(), 0);
682 return SelTy;
683 }
684
685#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
686 case BuiltinType::Id: \
687 return getOrCreateStructPtrType("opencl_" #ImgType "_" #Suffix "_t", \
688 SingletonId);
689#include "clang/Basic/OpenCLImageTypes.def"
690 case BuiltinType::OCLSampler:
691 return getOrCreateStructPtrType("opencl_sampler_t", OCLSamplerDITy);
692 case BuiltinType::OCLEvent:
693 return getOrCreateStructPtrType("opencl_event_t", OCLEventDITy);
694 case BuiltinType::OCLClkEvent:
695 return getOrCreateStructPtrType("opencl_clk_event_t", OCLClkEventDITy);
696 case BuiltinType::OCLQueue:
697 return getOrCreateStructPtrType("opencl_queue_t", OCLQueueDITy);
698 case BuiltinType::OCLReserveID:
699 return getOrCreateStructPtrType("opencl_reserve_id_t", OCLReserveIDDITy);
700#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
701 case BuiltinType::Id: \
702 return getOrCreateStructPtrType("opencl_" #ExtType, Id##Ty);
703#include "clang/Basic/OpenCLExtensionTypes.def"
704 // TODO: real support for SVE types requires more infrastructure
705 // to be added first. The types have a variable length and are
706 // represented in debug info as types whose length depends on a
707 // target-specific pseudo register.
708#define SVE_TYPE(Name, Id, SingletonId) \
709 case BuiltinType::Id:
710#include "clang/Basic/AArch64SVEACLETypes.def"
711 {
712 unsigned DiagID = CGM.getDiags().getCustomDiagID(
713 DiagnosticsEngine::Error,
714 "cannot yet generate debug info for SVE type '%0'");
715 auto Name = BT->getName(CGM.getContext().getPrintingPolicy());
716 CGM.getDiags().Report(DiagID) << Name;
717 // Return something safe.
718 return CreateType(cast<const BuiltinType>(CGM.getContext().IntTy));
719 }
720
721 case BuiltinType::UChar:
722 case BuiltinType::Char_U:
723 Encoding = llvm::dwarf::DW_ATE_unsigned_char;
724 break;
725 case BuiltinType::Char_S:
726 case BuiltinType::SChar:
727 Encoding = llvm::dwarf::DW_ATE_signed_char;
728 break;
729 case BuiltinType::Char8:
730 case BuiltinType::Char16:
731 case BuiltinType::Char32:
732 Encoding = llvm::dwarf::DW_ATE_UTF;
733 break;
734 case BuiltinType::UShort:
735 case BuiltinType::UInt:
736 case BuiltinType::UInt128:
737 case BuiltinType::ULong:
738 case BuiltinType::WChar_U:
739 case BuiltinType::ULongLong:
740 Encoding = llvm::dwarf::DW_ATE_unsigned;
741 break;
742 case BuiltinType::Short:
743 case BuiltinType::Int:
744 case BuiltinType::Int128:
745 case BuiltinType::Long:
746 case BuiltinType::WChar_S:
747 case BuiltinType::LongLong:
748 Encoding = llvm::dwarf::DW_ATE_signed;
749 break;
750 case BuiltinType::Bool:
751 Encoding = llvm::dwarf::DW_ATE_boolean;
752 break;
753 case BuiltinType::Half:
754 case BuiltinType::Float:
755 case BuiltinType::LongDouble:
756 case BuiltinType::Float16:
757 case BuiltinType::Float128:
758 case BuiltinType::Double:
759 // FIXME: For targets where long double and __float128 have the same size,
760 // they are currently indistinguishable in the debugger without some
761 // special treatment. However, there is currently no consensus on encoding
762 // and this should be updated once a DWARF encoding exists for distinct
763 // floating point types of the same size.
764 Encoding = llvm::dwarf::DW_ATE_float;
765 break;
766 case BuiltinType::ShortAccum:
767 case BuiltinType::Accum:
768 case BuiltinType::LongAccum:
769 case BuiltinType::ShortFract:
770 case BuiltinType::Fract:
771 case BuiltinType::LongFract:
772 case BuiltinType::SatShortFract:
773 case BuiltinType::SatFract:
774 case BuiltinType::SatLongFract:
775 case BuiltinType::SatShortAccum:
776 case BuiltinType::SatAccum:
777 case BuiltinType::SatLongAccum:
778 Encoding = llvm::dwarf::DW_ATE_signed_fixed;
779 break;
780 case BuiltinType::UShortAccum:
781 case BuiltinType::UAccum:
782 case BuiltinType::ULongAccum:
783 case BuiltinType::UShortFract:
784 case BuiltinType::UFract:
785 case BuiltinType::ULongFract:
786 case BuiltinType::SatUShortAccum:
787 case BuiltinType::SatUAccum:
788 case BuiltinType::SatULongAccum:
789 case BuiltinType::SatUShortFract:
790 case BuiltinType::SatUFract:
791 case BuiltinType::SatULongFract:
792 Encoding = llvm::dwarf::DW_ATE_unsigned_fixed;
793 break;
794 }
795
796 switch (BT->getKind()) {
797 case BuiltinType::Long:
798 BTName = "long int";
799 break;
800 case BuiltinType::LongLong:
801 BTName = "long long int";
802 break;
803 case BuiltinType::ULong:
804 BTName = "long unsigned int";
805 break;
806 case BuiltinType::ULongLong:
807 BTName = "long long unsigned int";
808 break;
809 default:
810 BTName = BT->getName(CGM.getLangOpts());
811 break;
812 }
813 // Bit size and offset of the type.
814 uint64_t Size = CGM.getContext().getTypeSize(BT);
815 return DBuilder.createBasicType(BTName, Size, Encoding);
816}
817
818llvm::DIType *CGDebugInfo::CreateType(const ComplexType *Ty) {
819 // Bit size and offset of the type.
820 llvm::dwarf::TypeKind Encoding = llvm::dwarf::DW_ATE_complex_float;
821 if (Ty->isComplexIntegerType())
822 Encoding = llvm::dwarf::DW_ATE_lo_user;
823
824 uint64_t Size = CGM.getContext().getTypeSize(Ty);
825 return DBuilder.createBasicType("complex", Size, Encoding);
826}
827
828llvm::DIType *CGDebugInfo::CreateQualifiedType(QualType Ty,
829 llvm::DIFile *Unit) {
830 QualifierCollector Qc;
831 const Type *T = Qc.strip(Ty);
832
833 // Ignore these qualifiers for now.
834 Qc.removeObjCGCAttr();
835 Qc.removeAddressSpace();
836 Qc.removeObjCLifetime();
837
838 // We will create one Derived type for one qualifier and recurse to handle any
839 // additional ones.
840 llvm::dwarf::Tag Tag;
841 if (Qc.hasConst()) {
842 Tag = llvm::dwarf::DW_TAG_const_type;
843 Qc.removeConst();
844 } else if (Qc.hasVolatile()) {
845 Tag = llvm::dwarf::DW_TAG_volatile_type;
846 Qc.removeVolatile();
847 } else if (Qc.hasRestrict()) {
848 Tag = llvm::dwarf::DW_TAG_restrict_type;
849 Qc.removeRestrict();
850 } else {
851 assert(Qc.empty() && "Unknown type qualifier for debug info")((Qc.empty() && "Unknown type qualifier for debug info"
) ? static_cast<void> (0) : __assert_fail ("Qc.empty() && \"Unknown type qualifier for debug info\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 851, __PRETTY_FUNCTION__))
;
852 return getOrCreateType(QualType(T, 0), Unit);
853 }
854
855 auto *FromTy = getOrCreateType(Qc.apply(CGM.getContext(), T), Unit);
856
857 // No need to fill in the Name, Line, Size, Alignment, Offset in case of
858 // CVR derived types.
859 return DBuilder.createQualifiedType(Tag, FromTy);
860}
861
862llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty,
863 llvm::DIFile *Unit) {
864
865 // The frontend treats 'id' as a typedef to an ObjCObjectType,
866 // whereas 'id<protocol>' is treated as an ObjCPointerType. For the
867 // debug info, we want to emit 'id' in both cases.
868 if (Ty->isObjCQualifiedIdType())
869 return getOrCreateType(CGM.getContext().getObjCIdType(), Unit);
870
871 return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
872 Ty->getPointeeType(), Unit);
873}
874
875llvm::DIType *CGDebugInfo::CreateType(const PointerType *Ty,
876 llvm::DIFile *Unit) {
877 return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
878 Ty->getPointeeType(), Unit);
879}
880
881/// \return whether a C++ mangling exists for the type defined by TD.
882static bool hasCXXMangling(const TagDecl *TD, llvm::DICompileUnit *TheCU) {
883 switch (TheCU->getSourceLanguage()) {
884 case llvm::dwarf::DW_LANG_C_plus_plus:
885 case llvm::dwarf::DW_LANG_C_plus_plus_11:
886 case llvm::dwarf::DW_LANG_C_plus_plus_14:
887 return true;
888 case llvm::dwarf::DW_LANG_ObjC_plus_plus:
889 return isa<CXXRecordDecl>(TD) || isa<EnumDecl>(TD);
890 default:
891 return false;
892 }
893}
894
895// Determines if the debug info for this tag declaration needs a type
896// identifier. The purpose of the unique identifier is to deduplicate type
897// information for identical types across TUs. Because of the C++ one definition
898// rule (ODR), it is valid to assume that the type is defined the same way in
899// every TU and its debug info is equivalent.
900//
901// C does not have the ODR, and it is common for codebases to contain multiple
902// different definitions of a struct with the same name in different TUs.
903// Therefore, if the type doesn't have a C++ mangling, don't give it an
904// identifer. Type information in C is smaller and simpler than C++ type
905// information, so the increase in debug info size is negligible.
906//
907// If the type is not externally visible, it should be unique to the current TU,
908// and should not need an identifier to participate in type deduplication.
909// However, when emitting CodeView, the format internally uses these
910// unique type name identifers for references between debug info. For example,
911// the method of a class in an anonymous namespace uses the identifer to refer
912// to its parent class. The Microsoft C++ ABI attempts to provide unique names
913// for such types, so when emitting CodeView, always use identifiers for C++
914// types. This may create problems when attempting to emit CodeView when the MS
915// C++ ABI is not in use.
916static bool needsTypeIdentifier(const TagDecl *TD, CodeGenModule &CGM,
917 llvm::DICompileUnit *TheCU) {
918 // We only add a type identifier for types with C++ name mangling.
919 if (!hasCXXMangling(TD, TheCU))
920 return false;
921
922 // Externally visible types with C++ mangling need a type identifier.
923 if (TD->isExternallyVisible())
924 return true;
925
926 // CodeView types with C++ mangling need a type identifier.
927 if (CGM.getCodeGenOpts().EmitCodeView)
928 return true;
929
930 return false;
931}
932
933// Returns a unique type identifier string if one exists, or an empty string.
934static SmallString<256> getTypeIdentifier(const TagType *Ty, CodeGenModule &CGM,
935 llvm::DICompileUnit *TheCU) {
936 SmallString<256> Identifier;
937 const TagDecl *TD = Ty->getDecl();
938
939 if (!needsTypeIdentifier(TD, CGM, TheCU))
940 return Identifier;
941 if (const auto *RD = dyn_cast<CXXRecordDecl>(TD))
942 if (RD->getDefinition())
943 if (RD->isDynamicClass() &&
944 CGM.getVTableLinkage(RD) == llvm::GlobalValue::ExternalLinkage)
945 return Identifier;
946
947 // TODO: This is using the RTTI name. Is there a better way to get
948 // a unique string for a type?
949 llvm::raw_svector_ostream Out(Identifier);
950 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(QualType(Ty, 0), Out);
951 return Identifier;
952}
953
954/// \return the appropriate DWARF tag for a composite type.
955static llvm::dwarf::Tag getTagForRecord(const RecordDecl *RD) {
956 llvm::dwarf::Tag Tag;
957 if (RD->isStruct() || RD->isInterface())
958 Tag = llvm::dwarf::DW_TAG_structure_type;
959 else if (RD->isUnion())
960 Tag = llvm::dwarf::DW_TAG_union_type;
961 else {
962 // FIXME: This could be a struct type giving a default visibility different
963 // than C++ class type, but needs llvm metadata changes first.
964 assert(RD->isClass())((RD->isClass()) ? static_cast<void> (0) : __assert_fail
("RD->isClass()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 964, __PRETTY_FUNCTION__))
;
965 Tag = llvm::dwarf::DW_TAG_class_type;
966 }
967 return Tag;
968}
969
970llvm::DICompositeType *
971CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,
972 llvm::DIScope *Ctx) {
973 const RecordDecl *RD = Ty->getDecl();
974 if (llvm::DIType *T = getTypeOrNull(CGM.getContext().getRecordType(RD)))
975 return cast<llvm::DICompositeType>(T);
976 llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
977 unsigned Line = getLineNumber(RD->getLocation());
978 StringRef RDName = getClassName(RD);
979
980 uint64_t Size = 0;
981 uint32_t Align = 0;
982
983 // Create the type.
984 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
985 llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType(
986 getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align,
987 llvm::DINode::FlagFwdDecl, Identifier);
988 if (CGM.getCodeGenOpts().DebugFwdTemplateParams)
989 if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
990 DBuilder.replaceArrays(RetTy, llvm::DINodeArray(),
991 CollectCXXTemplateParams(TSpecial, DefUnit));
992 ReplaceMap.emplace_back(
993 std::piecewise_construct, std::make_tuple(Ty),
994 std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
995 return RetTy;
996}
997
998llvm::DIType *CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag,
999 const Type *Ty,
1000 QualType PointeeTy,
1001 llvm::DIFile *Unit) {
1002 // Bit size, align and offset of the type.
1003 // Size is always the size of a pointer. We can't use getTypeSize here
1004 // because that does not return the correct value for references.
1005 unsigned AddressSpace = CGM.getContext().getTargetAddressSpace(PointeeTy);
1006 uint64_t Size = CGM.getTarget().getPointerWidth(AddressSpace);
1007 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
1008 Optional<unsigned> DWARFAddressSpace =
1009 CGM.getTarget().getDWARFAddressSpace(AddressSpace);
1010
1011 if (Tag == llvm::dwarf::DW_TAG_reference_type ||
1012 Tag == llvm::dwarf::DW_TAG_rvalue_reference_type)
1013 return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit),
1014 Size, Align, DWARFAddressSpace);
1015 else
1016 return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size,
1017 Align, DWARFAddressSpace);
1018}
1019
1020llvm::DIType *CGDebugInfo::getOrCreateStructPtrType(StringRef Name,
1021 llvm::DIType *&Cache) {
1022 if (Cache)
1023 return Cache;
1024 Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name,
1025 TheCU, TheCU->getFile(), 0);
1026 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
1027 Cache = DBuilder.createPointerType(Cache, Size);
1028 return Cache;
1029}
1030
1031uint64_t CGDebugInfo::collectDefaultElementTypesForBlockPointer(
1032 const BlockPointerType *Ty, llvm::DIFile *Unit, llvm::DIDerivedType *DescTy,
1033 unsigned LineNo, SmallVectorImpl<llvm::Metadata *> &EltTys) {
1034 QualType FType;
1035
1036 // Advanced by calls to CreateMemberType in increments of FType, then
1037 // returned as the overall size of the default elements.
1038 uint64_t FieldOffset = 0;
1039
1040 // Blocks in OpenCL have unique constraints which make the standard fields
1041 // redundant while requiring size and align fields for enqueue_kernel. See
1042 // initializeForBlockHeader in CGBlocks.cpp
1043 if (CGM.getLangOpts().OpenCL) {
1044 FType = CGM.getContext().IntTy;
1045 EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset));
1046 EltTys.push_back(CreateMemberType(Unit, FType, "__align", &FieldOffset));
1047 } else {
1048 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
1049 EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset));
1050 FType = CGM.getContext().IntTy;
1051 EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset));
1052 EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset));
1053 FType = CGM.getContext().getPointerType(Ty->getPointeeType());
1054 EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset));
1055 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
1056 uint64_t FieldSize = CGM.getContext().getTypeSize(Ty);
1057 uint32_t FieldAlign = CGM.getContext().getTypeAlign(Ty);
1058 EltTys.push_back(DBuilder.createMemberType(
1059 Unit, "__descriptor", nullptr, LineNo, FieldSize, FieldAlign,
1060 FieldOffset, llvm::DINode::FlagZero, DescTy));
1061 FieldOffset += FieldSize;
1062 }
1063
1064 return FieldOffset;
1065}
1066
1067llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,
1068 llvm::DIFile *Unit) {
1069 SmallVector<llvm::Metadata *, 8> EltTys;
1070 QualType FType;
1071 uint64_t FieldOffset;
1072 llvm::DINodeArray Elements;
1073
1074 FieldOffset = 0;
1075 FType = CGM.getContext().UnsignedLongTy;
1076 EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset));
1077 EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset));
1078
1079 Elements = DBuilder.getOrCreateArray(EltTys);
1080 EltTys.clear();
1081
1082 llvm::DINode::DIFlags Flags = llvm::DINode::FlagAppleBlock;
1083
1084 auto *EltTy =
1085 DBuilder.createStructType(Unit, "__block_descriptor", nullptr, 0,
1086 FieldOffset, 0, Flags, nullptr, Elements);
1087
1088 // Bit size, align and offset of the type.
1089 uint64_t Size = CGM.getContext().getTypeSize(Ty);
1090
1091 auto *DescTy = DBuilder.createPointerType(EltTy, Size);
1092
1093 FieldOffset = collectDefaultElementTypesForBlockPointer(Ty, Unit, DescTy,
1094 0, EltTys);
1095
1096 Elements = DBuilder.getOrCreateArray(EltTys);
1097
1098 // The __block_literal_generic structs are marked with a special
1099 // DW_AT_APPLE_BLOCK attribute and are an implementation detail only
1100 // the debugger needs to know about. To allow type uniquing, emit
1101 // them without a name or a location.
1102 EltTy = DBuilder.createStructType(Unit, "", nullptr, 0, FieldOffset, 0,
1103 Flags, nullptr, Elements);
1104
1105 return DBuilder.createPointerType(EltTy, Size);
1106}
1107
1108llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,
1109 llvm::DIFile *Unit) {
1110 assert(Ty->isTypeAlias())((Ty->isTypeAlias()) ? static_cast<void> (0) : __assert_fail
("Ty->isTypeAlias()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1110, __PRETTY_FUNCTION__))
;
1111 llvm::DIType *Src = getOrCreateType(Ty->getAliasedType(), Unit);
1112
1113 auto *AliasDecl =
1114 cast<TypeAliasTemplateDecl>(Ty->getTemplateName().getAsTemplateDecl())
1115 ->getTemplatedDecl();
1116
1117 if (AliasDecl->hasAttr<NoDebugAttr>())
1118 return Src;
1119
1120 SmallString<128> NS;
1121 llvm::raw_svector_ostream OS(NS);
1122 Ty->getTemplateName().print(OS, getPrintingPolicy(), /*qualified*/ false);
1123 printTemplateArgumentList(OS, Ty->template_arguments(), getPrintingPolicy());
1124
1125 SourceLocation Loc = AliasDecl->getLocation();
1126 return DBuilder.createTypedef(Src, OS.str(), getOrCreateFile(Loc),
1127 getLineNumber(Loc),
1128 getDeclContextDescriptor(AliasDecl));
1129}
1130
1131llvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty,
1132 llvm::DIFile *Unit) {
1133 llvm::DIType *Underlying =
1134 getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit);
1135
1136 if (Ty->getDecl()->hasAttr<NoDebugAttr>())
1137 return Underlying;
1138
1139 // We don't set size information, but do specify where the typedef was
1140 // declared.
1141 SourceLocation Loc = Ty->getDecl()->getLocation();
1142
1143 // Typedefs are derived from some other type.
1144 return DBuilder.createTypedef(Underlying, Ty->getDecl()->getName(),
1145 getOrCreateFile(Loc), getLineNumber(Loc),
1146 getDeclContextDescriptor(Ty->getDecl()));
1147}
1148
1149static unsigned getDwarfCC(CallingConv CC) {
1150 switch (CC) {
1151 case CC_C:
1152 // Avoid emitting DW_AT_calling_convention if the C convention was used.
1153 return 0;
1154
1155 case CC_X86StdCall:
1156 return llvm::dwarf::DW_CC_BORLAND_stdcall;
1157 case CC_X86FastCall:
1158 return llvm::dwarf::DW_CC_BORLAND_msfastcall;
1159 case CC_X86ThisCall:
1160 return llvm::dwarf::DW_CC_BORLAND_thiscall;
1161 case CC_X86VectorCall:
1162 return llvm::dwarf::DW_CC_LLVM_vectorcall;
1163 case CC_X86Pascal:
1164 return llvm::dwarf::DW_CC_BORLAND_pascal;
1165 case CC_Win64:
1166 return llvm::dwarf::DW_CC_LLVM_Win64;
1167 case CC_X86_64SysV:
1168 return llvm::dwarf::DW_CC_LLVM_X86_64SysV;
1169 case CC_AAPCS:
1170 case CC_AArch64VectorCall:
1171 return llvm::dwarf::DW_CC_LLVM_AAPCS;
1172 case CC_AAPCS_VFP:
1173 return llvm::dwarf::DW_CC_LLVM_AAPCS_VFP;
1174 case CC_IntelOclBicc:
1175 return llvm::dwarf::DW_CC_LLVM_IntelOclBicc;
1176 case CC_SpirFunction:
1177 return llvm::dwarf::DW_CC_LLVM_SpirFunction;
1178 case CC_OpenCLKernel:
1179 return llvm::dwarf::DW_CC_LLVM_OpenCLKernel;
1180 case CC_Swift:
1181 return llvm::dwarf::DW_CC_LLVM_Swift;
1182 case CC_PreserveMost:
1183 return llvm::dwarf::DW_CC_LLVM_PreserveMost;
1184 case CC_PreserveAll:
1185 return llvm::dwarf::DW_CC_LLVM_PreserveAll;
1186 case CC_X86RegCall:
1187 return llvm::dwarf::DW_CC_LLVM_X86RegCall;
1188 }
1189 return 0;
1190}
1191
1192llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty,
1193 llvm::DIFile *Unit) {
1194 SmallVector<llvm::Metadata *, 16> EltTys;
1195
1196 // Add the result type at least.
1197 EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit));
1198
1199 // Set up remainder of arguments if there is a prototype.
1200 // otherwise emit it as a variadic function.
1201 if (isa<FunctionNoProtoType>(Ty))
1202 EltTys.push_back(DBuilder.createUnspecifiedParameter());
1203 else if (const auto *FPT = dyn_cast<FunctionProtoType>(Ty)) {
1204 for (const QualType &ParamType : FPT->param_types())
1205 EltTys.push_back(getOrCreateType(ParamType, Unit));
1206 if (FPT->isVariadic())
1207 EltTys.push_back(DBuilder.createUnspecifiedParameter());
1208 }
1209
1210 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
1211 return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero,
1212 getDwarfCC(Ty->getCallConv()));
1213}
1214
1215/// Convert an AccessSpecifier into the corresponding DINode flag.
1216/// As an optimization, return 0 if the access specifier equals the
1217/// default for the containing type.
1218static llvm::DINode::DIFlags getAccessFlag(AccessSpecifier Access,
1219 const RecordDecl *RD) {
1220 AccessSpecifier Default = clang::AS_none;
1221 if (RD && RD->isClass())
1222 Default = clang::AS_private;
1223 else if (RD && (RD->isStruct() || RD->isUnion()))
1224 Default = clang::AS_public;
1225
1226 if (Access == Default)
1227 return llvm::DINode::FlagZero;
1228
1229 switch (Access) {
1230 case clang::AS_private:
1231 return llvm::DINode::FlagPrivate;
1232 case clang::AS_protected:
1233 return llvm::DINode::FlagProtected;
1234 case clang::AS_public:
1235 return llvm::DINode::FlagPublic;
1236 case clang::AS_none:
1237 return llvm::DINode::FlagZero;
1238 }
1239 llvm_unreachable("unexpected access enumerator")::llvm::llvm_unreachable_internal("unexpected access enumerator"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1239)
;
1240}
1241
1242llvm::DIType *CGDebugInfo::createBitFieldType(const FieldDecl *BitFieldDecl,
1243 llvm::DIScope *RecordTy,
1244 const RecordDecl *RD) {
1245 StringRef Name = BitFieldDecl->getName();
1246 QualType Ty = BitFieldDecl->getType();
1247 SourceLocation Loc = BitFieldDecl->getLocation();
1248 llvm::DIFile *VUnit = getOrCreateFile(Loc);
1249 llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
1250
1251 // Get the location for the field.
1252 llvm::DIFile *File = getOrCreateFile(Loc);
1253 unsigned Line = getLineNumber(Loc);
1254
1255 const CGBitFieldInfo &BitFieldInfo =
1256 CGM.getTypes().getCGRecordLayout(RD).getBitFieldInfo(BitFieldDecl);
1257 uint64_t SizeInBits = BitFieldInfo.Size;
1258 assert(SizeInBits > 0 && "found named 0-width bitfield")((SizeInBits > 0 && "found named 0-width bitfield"
) ? static_cast<void> (0) : __assert_fail ("SizeInBits > 0 && \"found named 0-width bitfield\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1258, __PRETTY_FUNCTION__))
;
1259 uint64_t StorageOffsetInBits =
1260 CGM.getContext().toBits(BitFieldInfo.StorageOffset);
1261 uint64_t Offset = BitFieldInfo.Offset;
1262 // The bit offsets for big endian machines are reversed for big
1263 // endian target, compensate for that as the DIDerivedType requires
1264 // un-reversed offsets.
1265 if (CGM.getDataLayout().isBigEndian())
1266 Offset = BitFieldInfo.StorageSize - BitFieldInfo.Size - Offset;
1267 uint64_t OffsetInBits = StorageOffsetInBits + Offset;
1268 llvm::DINode::DIFlags Flags = getAccessFlag(BitFieldDecl->getAccess(), RD);
1269 return DBuilder.createBitFieldMemberType(
1270 RecordTy, Name, File, Line, SizeInBits, OffsetInBits, StorageOffsetInBits,
1271 Flags, DebugType);
1272}
1273
1274llvm::DIType *
1275CGDebugInfo::createFieldType(StringRef name, QualType type, SourceLocation loc,
1276 AccessSpecifier AS, uint64_t offsetInBits,
1277 uint32_t AlignInBits, llvm::DIFile *tunit,
1278 llvm::DIScope *scope, const RecordDecl *RD) {
1279 llvm::DIType *debugType = getOrCreateType(type, tunit);
1280
1281 // Get the location for the field.
1282 llvm::DIFile *file = getOrCreateFile(loc);
1283 unsigned line = getLineNumber(loc);
1284
1285 uint64_t SizeInBits = 0;
1286 auto Align = AlignInBits;
1287 if (!type->isIncompleteArrayType()) {
1288 TypeInfo TI = CGM.getContext().getTypeInfo(type);
1289 SizeInBits = TI.Width;
1290 if (!Align)
1291 Align = getTypeAlignIfRequired(type, CGM.getContext());
1292 }
1293
1294 llvm::DINode::DIFlags flags = getAccessFlag(AS, RD);
1295 return DBuilder.createMemberType(scope, name, file, line, SizeInBits, Align,
1296 offsetInBits, flags, debugType);
1297}
1298
1299void CGDebugInfo::CollectRecordLambdaFields(
1300 const CXXRecordDecl *CXXDecl, SmallVectorImpl<llvm::Metadata *> &elements,
1301 llvm::DIType *RecordTy) {
1302 // For C++11 Lambdas a Field will be the same as a Capture, but the Capture
1303 // has the name and the location of the variable so we should iterate over
1304 // both concurrently.
1305 const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl);
1306 RecordDecl::field_iterator Field = CXXDecl->field_begin();
1307 unsigned fieldno = 0;
1308 for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(),
1309 E = CXXDecl->captures_end();
1310 I != E; ++I, ++Field, ++fieldno) {
1311 const LambdaCapture &C = *I;
1312 if (C.capturesVariable()) {
1313 SourceLocation Loc = C.getLocation();
1314 assert(!Field->isBitField() && "lambdas don't have bitfield members!")((!Field->isBitField() && "lambdas don't have bitfield members!"
) ? static_cast<void> (0) : __assert_fail ("!Field->isBitField() && \"lambdas don't have bitfield members!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1314, __PRETTY_FUNCTION__))
;
1315 VarDecl *V = C.getCapturedVar();
1316 StringRef VName = V->getName();
1317 llvm::DIFile *VUnit = getOrCreateFile(Loc);
1318 auto Align = getDeclAlignIfRequired(V, CGM.getContext());
1319 llvm::DIType *FieldType = createFieldType(
1320 VName, Field->getType(), Loc, Field->getAccess(),
1321 layout.getFieldOffset(fieldno), Align, VUnit, RecordTy, CXXDecl);
1322 elements.push_back(FieldType);
1323 } else if (C.capturesThis()) {
1324 // TODO: Need to handle 'this' in some way by probably renaming the
1325 // this of the lambda class and having a field member of 'this' or
1326 // by using AT_object_pointer for the function and having that be
1327 // used as 'this' for semantic references.
1328 FieldDecl *f = *Field;
1329 llvm::DIFile *VUnit = getOrCreateFile(f->getLocation());
1330 QualType type = f->getType();
1331 llvm::DIType *fieldType = createFieldType(
1332 "this", type, f->getLocation(), f->getAccess(),
1333 layout.getFieldOffset(fieldno), VUnit, RecordTy, CXXDecl);
1334
1335 elements.push_back(fieldType);
1336 }
1337 }
1338}
1339
1340llvm::DIDerivedType *
1341CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy,
1342 const RecordDecl *RD) {
1343 // Create the descriptor for the static variable, with or without
1344 // constant initializers.
1345 Var = Var->getCanonicalDecl();
1346 llvm::DIFile *VUnit = getOrCreateFile(Var->getLocation());
1347 llvm::DIType *VTy = getOrCreateType(Var->getType(), VUnit);
1348
1349 unsigned LineNumber = getLineNumber(Var->getLocation());
1350 StringRef VName = Var->getName();
1351 llvm::Constant *C = nullptr;
1352 if (Var->getInit()) {
1353 const APValue *Value = Var->evaluateValue();
1354 if (Value) {
1355 if (Value->isInt())
1356 C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt());
1357 if (Value->isFloat())
1358 C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat());
1359 }
1360 }
1361
1362 llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD);
1363 auto Align = getDeclAlignIfRequired(Var, CGM.getContext());
1364 llvm::DIDerivedType *GV = DBuilder.createStaticMemberType(
1365 RecordTy, VName, VUnit, LineNumber, VTy, Flags, C, Align);
1366 StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV);
1367 return GV;
1368}
1369
1370void CGDebugInfo::CollectRecordNormalField(
1371 const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile *tunit,
1372 SmallVectorImpl<llvm::Metadata *> &elements, llvm::DIType *RecordTy,
1373 const RecordDecl *RD) {
1374 StringRef name = field->getName();
1375 QualType type = field->getType();
1376
1377 // Ignore unnamed fields unless they're anonymous structs/unions.
1378 if (name.empty() && !type->isRecordType())
1379 return;
1380
1381 llvm::DIType *FieldType;
1382 if (field->isBitField()) {
1383 FieldType = createBitFieldType(field, RecordTy, RD);
1384 } else {
1385 auto Align = getDeclAlignIfRequired(field, CGM.getContext());
1386 FieldType =
1387 createFieldType(name, type, field->getLocation(), field->getAccess(),
1388 OffsetInBits, Align, tunit, RecordTy, RD);
1389 }
1390
1391 elements.push_back(FieldType);
1392}
1393
1394void CGDebugInfo::CollectRecordNestedType(
1395 const TypeDecl *TD, SmallVectorImpl<llvm::Metadata *> &elements) {
1396 QualType Ty = CGM.getContext().getTypeDeclType(TD);
1397 // Injected class names are not considered nested records.
1398 if (isa<InjectedClassNameType>(Ty))
1399 return;
1400 SourceLocation Loc = TD->getLocation();
1401 llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateFile(Loc));
1402 elements.push_back(nestedType);
1403}
1404
1405void CGDebugInfo::CollectRecordFields(
1406 const RecordDecl *record, llvm::DIFile *tunit,
1407 SmallVectorImpl<llvm::Metadata *> &elements,
1408 llvm::DICompositeType *RecordTy) {
1409 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(record);
1410
1411 if (CXXDecl && CXXDecl->isLambda())
1412 CollectRecordLambdaFields(CXXDecl, elements, RecordTy);
1413 else {
1414 const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record);
1415
1416 // Field number for non-static fields.
1417 unsigned fieldNo = 0;
1418
1419 // Static and non-static members should appear in the same order as
1420 // the corresponding declarations in the source program.
1421 for (const auto *I : record->decls())
1422 if (const auto *V = dyn_cast<VarDecl>(I)) {
1423 if (V->hasAttr<NoDebugAttr>())
1424 continue;
1425
1426 // Skip variable template specializations when emitting CodeView. MSVC
1427 // doesn't emit them.
1428 if (CGM.getCodeGenOpts().EmitCodeView &&
1429 isa<VarTemplateSpecializationDecl>(V))
1430 continue;
1431
1432 if (isa<VarTemplatePartialSpecializationDecl>(V))
1433 continue;
1434
1435 // Reuse the existing static member declaration if one exists
1436 auto MI = StaticDataMemberCache.find(V->getCanonicalDecl());
1437 if (MI != StaticDataMemberCache.end()) {
1438 assert(MI->second &&((MI->second && "Static data member declaration should still exist"
) ? static_cast<void> (0) : __assert_fail ("MI->second && \"Static data member declaration should still exist\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1439, __PRETTY_FUNCTION__))
1439 "Static data member declaration should still exist")((MI->second && "Static data member declaration should still exist"
) ? static_cast<void> (0) : __assert_fail ("MI->second && \"Static data member declaration should still exist\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1439, __PRETTY_FUNCTION__))
;
1440 elements.push_back(MI->second);
1441 } else {
1442 auto Field = CreateRecordStaticField(V, RecordTy, record);
1443 elements.push_back(Field);
1444 }
1445 } else if (const auto *field = dyn_cast<FieldDecl>(I)) {
1446 CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), tunit,
1447 elements, RecordTy, record);
1448
1449 // Bump field number for next field.
1450 ++fieldNo;
1451 } else if (CGM.getCodeGenOpts().EmitCodeView) {
1452 // Debug info for nested types is included in the member list only for
1453 // CodeView.
1454 if (const auto *nestedType = dyn_cast<TypeDecl>(I))
1455 if (!nestedType->isImplicit() &&
1456 nestedType->getDeclContext() == record)
1457 CollectRecordNestedType(nestedType, elements);
1458 }
1459 }
1460}
1461
1462llvm::DISubroutineType *
1463CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method,
1464 llvm::DIFile *Unit) {
1465 const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>();
1466 if (Method->isStatic())
1467 return cast_or_null<llvm::DISubroutineType>(
1468 getOrCreateType(QualType(Func, 0), Unit));
1469 return getOrCreateInstanceMethodType(Method->getThisType(), Func, Unit);
1470}
1471
1472llvm::DISubroutineType *CGDebugInfo::getOrCreateInstanceMethodType(
1473 QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile *Unit) {
1474 // Add "this" pointer.
1475 llvm::DITypeRefArray Args(
1476 cast<llvm::DISubroutineType>(getOrCreateType(QualType(Func, 0), Unit))
1477 ->getTypeArray());
1478 assert(Args.size() && "Invalid number of arguments!")((Args.size() && "Invalid number of arguments!") ? static_cast
<void> (0) : __assert_fail ("Args.size() && \"Invalid number of arguments!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1478, __PRETTY_FUNCTION__))
;
1479
1480 SmallVector<llvm::Metadata *, 16> Elts;
1481
1482 // First element is always return type. For 'void' functions it is NULL.
1483 Elts.push_back(Args[0]);
1484
1485 // "this" pointer is always first argument.
1486 const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl();
1487 if (isa<ClassTemplateSpecializationDecl>(RD)) {
1488 // Create pointer type directly in this case.
1489 const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr);
1490 QualType PointeeTy = ThisPtrTy->getPointeeType();
1491 unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy);
1492 uint64_t Size = CGM.getTarget().getPointerWidth(AS);
1493 auto Align = getTypeAlignIfRequired(ThisPtrTy, CGM.getContext());
1494 llvm::DIType *PointeeType = getOrCreateType(PointeeTy, Unit);
1495 llvm::DIType *ThisPtrType =
1496 DBuilder.createPointerType(PointeeType, Size, Align);
1497 TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType);
1498 // TODO: This and the artificial type below are misleading, the
1499 // types aren't artificial the argument is, but the current
1500 // metadata doesn't represent that.
1501 ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType);
1502 Elts.push_back(ThisPtrType);
1503 } else {
1504 llvm::DIType *ThisPtrType = getOrCreateType(ThisPtr, Unit);
1505 TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType);
1506 ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType);
1507 Elts.push_back(ThisPtrType);
1508 }
1509
1510 // Copy rest of the arguments.
1511 for (unsigned i = 1, e = Args.size(); i != e; ++i)
1512 Elts.push_back(Args[i]);
1513
1514 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
1515
1516 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1517 if (Func->getExtProtoInfo().RefQualifier == RQ_LValue)
1518 Flags |= llvm::DINode::FlagLValueReference;
1519 if (Func->getExtProtoInfo().RefQualifier == RQ_RValue)
1520 Flags |= llvm::DINode::FlagRValueReference;
1521
1522 return DBuilder.createSubroutineType(EltTypeArray, Flags,
1523 getDwarfCC(Func->getCallConv()));
1524}
1525
1526/// isFunctionLocalClass - Return true if CXXRecordDecl is defined
1527/// inside a function.
1528static bool isFunctionLocalClass(const CXXRecordDecl *RD) {
1529 if (const auto *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext()))
1530 return isFunctionLocalClass(NRD);
1531 if (isa<FunctionDecl>(RD->getDeclContext()))
1532 return true;
1533 return false;
1534}
1535
1536llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
1537 const CXXMethodDecl *Method, llvm::DIFile *Unit, llvm::DIType *RecordTy) {
1538 bool IsCtorOrDtor =
1539 isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method);
1540
1541 StringRef MethodName = getFunctionName(Method);
1542 llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit);
1543
1544 // Since a single ctor/dtor corresponds to multiple functions, it doesn't
1545 // make sense to give a single ctor/dtor a linkage name.
1546 StringRef MethodLinkageName;
1547 // FIXME: 'isFunctionLocalClass' seems like an arbitrary/unintentional
1548 // property to use here. It may've been intended to model "is non-external
1549 // type" but misses cases of non-function-local but non-external classes such
1550 // as those in anonymous namespaces as well as the reverse - external types
1551 // that are function local, such as those in (non-local) inline functions.
1552 if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent()))
1553 MethodLinkageName = CGM.getMangledName(Method);
1554
1555 // Get the location for the method.
1556 llvm::DIFile *MethodDefUnit = nullptr;
1557 unsigned MethodLine = 0;
1558 if (!Method->isImplicit()) {
1559 MethodDefUnit = getOrCreateFile(Method->getLocation());
1560 MethodLine = getLineNumber(Method->getLocation());
1561 }
1562
1563 // Collect virtual method info.
1564 llvm::DIType *ContainingType = nullptr;
1565 unsigned VIndex = 0;
1566 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
1567 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
1568 int ThisAdjustment = 0;
1569
1570 if (Method->isVirtual()) {
1571 if (Method->isPure())
1572 SPFlags |= llvm::DISubprogram::SPFlagPureVirtual;
1573 else
1574 SPFlags |= llvm::DISubprogram::SPFlagVirtual;
1575
1576 if (CGM.getTarget().getCXXABI().isItaniumFamily()) {
1577 // It doesn't make sense to give a virtual destructor a vtable index,
1578 // since a single destructor has two entries in the vtable.
1579 if (!isa<CXXDestructorDecl>(Method))
1580 VIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(Method);
1581 } else {
1582 // Emit MS ABI vftable information. There is only one entry for the
1583 // deleting dtor.
1584 const auto *DD = dyn_cast<CXXDestructorDecl>(Method);
1585 GlobalDecl GD = DD ? GlobalDecl(DD, Dtor_Deleting) : GlobalDecl(Method);
1586 MethodVFTableLocation ML =
1587 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD);
1588 VIndex = ML.Index;
1589
1590 // CodeView only records the vftable offset in the class that introduces
1591 // the virtual method. This is possible because, unlike Itanium, the MS
1592 // C++ ABI does not include all virtual methods from non-primary bases in
1593 // the vtable for the most derived class. For example, if C inherits from
1594 // A and B, C's primary vftable will not include B's virtual methods.
1595 if (Method->size_overridden_methods() == 0)
1596 Flags |= llvm::DINode::FlagIntroducedVirtual;
1597
1598 // The 'this' adjustment accounts for both the virtual and non-virtual
1599 // portions of the adjustment. Presumably the debugger only uses it when
1600 // it knows the dynamic type of an object.
1601 ThisAdjustment = CGM.getCXXABI()
1602 .getVirtualFunctionPrologueThisAdjustment(GD)
1603 .getQuantity();
1604 }
1605 ContainingType = RecordTy;
1606 }
1607
1608 if (Method->isStatic())
1609 Flags |= llvm::DINode::FlagStaticMember;
1610 if (Method->isImplicit())
1611 Flags |= llvm::DINode::FlagArtificial;
1612 Flags |= getAccessFlag(Method->getAccess(), Method->getParent());
1613 if (const auto *CXXC = dyn_cast<CXXConstructorDecl>(Method)) {
1614 if (CXXC->isExplicit())
1615 Flags |= llvm::DINode::FlagExplicit;
1616 } else if (const auto *CXXC = dyn_cast<CXXConversionDecl>(Method)) {
1617 if (CXXC->isExplicit())
1618 Flags |= llvm::DINode::FlagExplicit;
1619 }
1620 if (Method->hasPrototype())
1621 Flags |= llvm::DINode::FlagPrototyped;
1622 if (Method->getRefQualifier() == RQ_LValue)
1623 Flags |= llvm::DINode::FlagLValueReference;
1624 if (Method->getRefQualifier() == RQ_RValue)
1625 Flags |= llvm::DINode::FlagRValueReference;
1626 if (CGM.getLangOpts().Optimize)
1627 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
1628
1629 llvm::DINodeArray TParamsArray = CollectFunctionTemplateParams(Method, Unit);
1630 llvm::DISubprogram *SP = DBuilder.createMethod(
1631 RecordTy, MethodName, MethodLinkageName, MethodDefUnit, MethodLine,
1632 MethodTy, VIndex, ThisAdjustment, ContainingType, Flags, SPFlags,
1633 TParamsArray.get());
1634
1635 SPCache[Method->getCanonicalDecl()].reset(SP);
1636
1637 return SP;
1638}
1639
1640void CGDebugInfo::CollectCXXMemberFunctions(
1641 const CXXRecordDecl *RD, llvm::DIFile *Unit,
1642 SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy) {
1643
1644 // Since we want more than just the individual member decls if we
1645 // have templated functions iterate over every declaration to gather
1646 // the functions.
1647 for (const auto *I : RD->decls()) {
1648 const auto *Method = dyn_cast<CXXMethodDecl>(I);
1649 // If the member is implicit, don't add it to the member list. This avoids
1650 // the member being added to type units by LLVM, while still allowing it
1651 // to be emitted into the type declaration/reference inside the compile
1652 // unit.
1653 // Ditto 'nodebug' methods, for consistency with CodeGenFunction.cpp.
1654 // FIXME: Handle Using(Shadow?)Decls here to create
1655 // DW_TAG_imported_declarations inside the class for base decls brought into
1656 // derived classes. GDB doesn't seem to notice/leverage these when I tried
1657 // it, so I'm not rushing to fix this. (GCC seems to produce them, if
1658 // referenced)
1659 if (!Method || Method->isImplicit() || Method->hasAttr<NoDebugAttr>())
1660 continue;
1661
1662 if (Method->getType()->castAs<FunctionProtoType>()->getContainedAutoType())
1663 continue;
1664
1665 // Reuse the existing member function declaration if it exists.
1666 // It may be associated with the declaration of the type & should be
1667 // reused as we're building the definition.
1668 //
1669 // This situation can arise in the vtable-based debug info reduction where
1670 // implicit members are emitted in a non-vtable TU.
1671 auto MI = SPCache.find(Method->getCanonicalDecl());
1672 EltTys.push_back(MI == SPCache.end()
1673 ? CreateCXXMemberFunction(Method, Unit, RecordTy)
1674 : static_cast<llvm::Metadata *>(MI->second));
1675 }
1676}
1677
1678void CGDebugInfo::CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile *Unit,
1679 SmallVectorImpl<llvm::Metadata *> &EltTys,
1680 llvm::DIType *RecordTy) {
1681 llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> SeenTypes;
1682 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->bases(), SeenTypes,
1683 llvm::DINode::FlagZero);
1684
1685 // If we are generating CodeView debug info, we also need to emit records for
1686 // indirect virtual base classes.
1687 if (CGM.getCodeGenOpts().EmitCodeView) {
1688 CollectCXXBasesAux(RD, Unit, EltTys, RecordTy, RD->vbases(), SeenTypes,
1689 llvm::DINode::FlagIndirectVirtualBase);
1690 }
1691}
1692
1693void CGDebugInfo::CollectCXXBasesAux(
1694 const CXXRecordDecl *RD, llvm::DIFile *Unit,
1695 SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy,
1696 const CXXRecordDecl::base_class_const_range &Bases,
1697 llvm::DenseSet<CanonicalDeclPtr<const CXXRecordDecl>> &SeenTypes,
1698 llvm::DINode::DIFlags StartingFlags) {
1699 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
1700 for (const auto &BI : Bases) {
1701 const auto *Base =
1702 cast<CXXRecordDecl>(BI.getType()->castAs<RecordType>()->getDecl());
1703 if (!SeenTypes.insert(Base).second)
1704 continue;
1705 auto *BaseTy = getOrCreateType(BI.getType(), Unit);
1706 llvm::DINode::DIFlags BFlags = StartingFlags;
1707 uint64_t BaseOffset;
1708 uint32_t VBPtrOffset = 0;
1709
1710 if (BI.isVirtual()) {
1711 if (CGM.getTarget().getCXXABI().isItaniumFamily()) {
1712 // virtual base offset offset is -ve. The code generator emits dwarf
1713 // expression where it expects +ve number.
1714 BaseOffset = 0 - CGM.getItaniumVTableContext()
1715 .getVirtualBaseOffsetOffset(RD, Base)
1716 .getQuantity();
1717 } else {
1718 // In the MS ABI, store the vbtable offset, which is analogous to the
1719 // vbase offset offset in Itanium.
1720 BaseOffset =
1721 4 * CGM.getMicrosoftVTableContext().getVBTableIndex(RD, Base);
1722 VBPtrOffset = CGM.getContext()
1723 .getASTRecordLayout(RD)
1724 .getVBPtrOffset()
1725 .getQuantity();
1726 }
1727 BFlags |= llvm::DINode::FlagVirtual;
1728 } else
1729 BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base));
1730 // FIXME: Inconsistent units for BaseOffset. It is in bytes when
1731 // BI->isVirtual() and bits when not.
1732
1733 BFlags |= getAccessFlag(BI.getAccessSpecifier(), RD);
1734 llvm::DIType *DTy = DBuilder.createInheritance(RecordTy, BaseTy, BaseOffset,
1735 VBPtrOffset, BFlags);
1736 EltTys.push_back(DTy);
1737 }
1738}
1739
1740llvm::DINodeArray
1741CGDebugInfo::CollectTemplateParams(const TemplateParameterList *TPList,
1742 ArrayRef<TemplateArgument> TAList,
1743 llvm::DIFile *Unit) {
1744 SmallVector<llvm::Metadata *, 16> TemplateParams;
1745 for (unsigned i = 0, e = TAList.size(); i != e; ++i) {
18
Assuming 'i' is not equal to 'e'
19
Loop condition is true. Entering loop body
24
Assuming 'i' is not equal to 'e'
25
Loop condition is true. Entering loop body
1746 const TemplateArgument &TA = TAList[i];
1747 StringRef Name;
1748 if (TPList
25.1
'TPList' is null
)
20
Assuming 'TPList' is null
21
Taking false branch
26
Taking false branch
1749 Name = TPList->getParam(i)->getName();
1750 switch (TA.getKind()) {
22
Control jumps to 'case Pack:' at line 1823
27
Control jumps to 'case Declaration:' at line 1762
1751 case TemplateArgument::Type: {
1752 llvm::DIType *TTy = getOrCreateType(TA.getAsType(), Unit);
1753 TemplateParams.push_back(
1754 DBuilder.createTemplateTypeParameter(TheCU, Name, TTy));
1755 } break;
1756 case TemplateArgument::Integral: {
1757 llvm::DIType *TTy = getOrCreateType(TA.getIntegralType(), Unit);
1758 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
1759 TheCU, Name, TTy,
1760 llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())));
1761 } break;
1762 case TemplateArgument::Declaration: {
1763 const ValueDecl *D = TA.getAsDecl();
1764 QualType T = TA.getParamTypeForDecl().getDesugaredType(CGM.getContext());
1765 llvm::DIType *TTy = getOrCreateType(T, Unit);
1766 llvm::Constant *V = nullptr;
28
'V' initialized to a null pointer value
1767 // Skip retrieve the value if that template parameter has cuda device
1768 // attribute, i.e. that value is not available at the host side.
1769 if (!CGM.getLangOpts().CUDA || CGM.getLangOpts().CUDAIsDevice ||
29
Assuming field 'CUDA' is not equal to 0
30
Assuming field 'CUDAIsDevice' is 0
32
Taking true branch
1770 !D->hasAttr<CUDADeviceAttr>()) {
31
Assuming the condition is true
1771 const CXXMethodDecl *MD;
1772 // Variable pointer template parameters have a value that is the address
1773 // of the variable.
1774 if (const auto *VD
33.1
'VD' is null
= dyn_cast<VarDecl>(D))
33
Assuming 'D' is not a 'VarDecl'
34
Taking false branch
1775 V = CGM.GetAddrOfGlobalVar(VD);
1776 // Member function pointers have special support for building them,
1777 // though this is currently unsupported in LLVM CodeGen.
1778 else if ((MD = dyn_cast<CXXMethodDecl>(D)) && MD->isInstance())
35
Assuming 'D' is not a 'CXXMethodDecl'
36
Assuming 'MD' is null
1779 V = CGM.getCXXABI().EmitMemberFunctionPointer(MD);
1780 else if (const auto *FD
37.1
'FD' is null
= dyn_cast<FunctionDecl>(D))
37
Assuming 'D' is not a 'FunctionDecl'
38
Taking false branch
1781 V = CGM.GetAddrOfFunction(FD);
1782 // Member data pointers have special handling too to compute the fixed
1783 // offset within the object.
1784 else if (const auto *MPT
39.1
'MPT' is null
=
40
Taking false branch
1785 dyn_cast<MemberPointerType>(T.getTypePtr())) {
39
Assuming the object is not a 'MemberPointerType'
1786 // These five lines (& possibly the above member function pointer
1787 // handling) might be able to be refactored to use similar code in
1788 // CodeGenModule::getMemberPointerConstant
1789 uint64_t fieldOffset = CGM.getContext().getFieldOffset(D);
1790 CharUnits chars =
1791 CGM.getContext().toCharUnitsFromBits((int64_t)fieldOffset);
1792 V = CGM.getCXXABI().EmitMemberDataPointer(MPT, chars);
1793 }
1794 V = V->stripPointerCasts();
41
Called C++ object pointer is null
1795 }
1796 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
1797 TheCU, Name, TTy, cast_or_null<llvm::Constant>(V)));
1798 } break;
1799 case TemplateArgument::NullPtr: {
1800 QualType T = TA.getNullPtrType();
1801 llvm::DIType *TTy = getOrCreateType(T, Unit);
1802 llvm::Constant *V = nullptr;
1803 // Special case member data pointer null values since they're actually -1
1804 // instead of zero.
1805 if (const auto *MPT = dyn_cast<MemberPointerType>(T.getTypePtr()))
1806 // But treat member function pointers as simple zero integers because
1807 // it's easier than having a special case in LLVM's CodeGen. If LLVM
1808 // CodeGen grows handling for values of non-null member function
1809 // pointers then perhaps we could remove this special case and rely on
1810 // EmitNullMemberPointer for member function pointers.
1811 if (MPT->isMemberDataPointer())
1812 V = CGM.getCXXABI().EmitNullMemberPointer(MPT);
1813 if (!V)
1814 V = llvm::ConstantInt::get(CGM.Int8Ty, 0);
1815 TemplateParams.push_back(
1816 DBuilder.createTemplateValueParameter(TheCU, Name, TTy, V));
1817 } break;
1818 case TemplateArgument::Template:
1819 TemplateParams.push_back(DBuilder.createTemplateTemplateParameter(
1820 TheCU, Name, nullptr,
1821 TA.getAsTemplate().getAsTemplateDecl()->getQualifiedNameAsString()));
1822 break;
1823 case TemplateArgument::Pack:
1824 TemplateParams.push_back(DBuilder.createTemplateParameterPack(
1825 TheCU, Name, nullptr,
1826 CollectTemplateParams(nullptr, TA.getPackAsArray(), Unit)));
23
Calling 'CGDebugInfo::CollectTemplateParams'
1827 break;
1828 case TemplateArgument::Expression: {
1829 const Expr *E = TA.getAsExpr();
1830 QualType T = E->getType();
1831 if (E->isGLValue())
1832 T = CGM.getContext().getLValueReferenceType(T);
1833 llvm::Constant *V = ConstantEmitter(CGM).emitAbstract(E, T);
1834 assert(V && "Expression in template argument isn't constant")((V && "Expression in template argument isn't constant"
) ? static_cast<void> (0) : __assert_fail ("V && \"Expression in template argument isn't constant\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1834, __PRETTY_FUNCTION__))
;
1835 llvm::DIType *TTy = getOrCreateType(T, Unit);
1836 TemplateParams.push_back(DBuilder.createTemplateValueParameter(
1837 TheCU, Name, TTy, V->stripPointerCasts()));
1838 } break;
1839 // And the following should never occur:
1840 case TemplateArgument::TemplateExpansion:
1841 case TemplateArgument::Null:
1842 llvm_unreachable(::llvm::llvm_unreachable_internal("These argument types shouldn't exist in concrete types"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1843)
1843 "These argument types shouldn't exist in concrete types")::llvm::llvm_unreachable_internal("These argument types shouldn't exist in concrete types"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1843)
;
1844 }
1845 }
1846 return DBuilder.getOrCreateArray(TemplateParams);
1847}
1848
1849llvm::DINodeArray
1850CGDebugInfo::CollectFunctionTemplateParams(const FunctionDecl *FD,
1851 llvm::DIFile *Unit) {
1852 if (FD->getTemplatedKind() ==
1853 FunctionDecl::TK_FunctionTemplateSpecialization) {
1854 const TemplateParameterList *TList = FD->getTemplateSpecializationInfo()
1855 ->getTemplate()
1856 ->getTemplateParameters();
1857 return CollectTemplateParams(
1858 TList, FD->getTemplateSpecializationArgs()->asArray(), Unit);
1859 }
1860 return llvm::DINodeArray();
1861}
1862
1863llvm::DINodeArray CGDebugInfo::CollectVarTemplateParams(const VarDecl *VL,
1864 llvm::DIFile *Unit) {
1865 // Always get the full list of parameters, not just the ones from the
1866 // specialization. A partial specialization may have fewer parameters than
1867 // there are arguments.
1868 auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VL);
15
Assuming 'VL' is a 'VarTemplateSpecializationDecl'
1869 if (!TS
15.1
'TS' is non-null
)
16
Taking false branch
1870 return llvm::DINodeArray();
1871 VarTemplateDecl *T = TS->getSpecializedTemplate();
1872 const TemplateParameterList *TList = T->getTemplateParameters();
1873 auto TA = TS->getTemplateArgs().asArray();
1874 return CollectTemplateParams(TList, TA, Unit);
17
Calling 'CGDebugInfo::CollectTemplateParams'
1875}
1876
1877llvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams(
1878 const ClassTemplateSpecializationDecl *TSpecial, llvm::DIFile *Unit) {
1879 // Always get the full list of parameters, not just the ones from the
1880 // specialization. A partial specialization may have fewer parameters than
1881 // there are arguments.
1882 TemplateParameterList *TPList =
1883 TSpecial->getSpecializedTemplate()->getTemplateParameters();
1884 const TemplateArgumentList &TAList = TSpecial->getTemplateArgs();
1885 return CollectTemplateParams(TPList, TAList.asArray(), Unit);
1886}
1887
1888llvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) {
1889 if (VTablePtrType)
1890 return VTablePtrType;
1891
1892 ASTContext &Context = CGM.getContext();
1893
1894 /* Function type */
1895 llvm::Metadata *STy = getOrCreateType(Context.IntTy, Unit);
1896 llvm::DITypeRefArray SElements = DBuilder.getOrCreateTypeArray(STy);
1897 llvm::DIType *SubTy = DBuilder.createSubroutineType(SElements);
1898 unsigned Size = Context.getTypeSize(Context.VoidPtrTy);
1899 unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace();
1900 Optional<unsigned> DWARFAddressSpace =
1901 CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace);
1902
1903 llvm::DIType *vtbl_ptr_type = DBuilder.createPointerType(
1904 SubTy, Size, 0, DWARFAddressSpace, "__vtbl_ptr_type");
1905 VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size);
1906 return VTablePtrType;
1907}
1908
1909StringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) {
1910 // Copy the gdb compatible name on the side and use its reference.
1911 return internString("_vptr$", RD->getNameAsString());
1912}
1913
1914StringRef CGDebugInfo::getDynamicInitializerName(const VarDecl *VD,
1915 DynamicInitKind StubKind,
1916 llvm::Function *InitFn) {
1917 // If we're not emitting codeview, use the mangled name. For Itanium, this is
1918 // arbitrary.
1919 if (!CGM.getCodeGenOpts().EmitCodeView)
1920 return InitFn->getName();
1921
1922 // Print the normal qualified name for the variable, then break off the last
1923 // NNS, and add the appropriate other text. Clang always prints the global
1924 // variable name without template arguments, so we can use rsplit("::") and
1925 // then recombine the pieces.
1926 SmallString<128> QualifiedGV;
1927 StringRef Quals;
1928 StringRef GVName;
1929 {
1930 llvm::raw_svector_ostream OS(QualifiedGV);
1931 VD->printQualifiedName(OS, getPrintingPolicy());
1932 std::tie(Quals, GVName) = OS.str().rsplit("::");
1933 if (GVName.empty())
1934 std::swap(Quals, GVName);
1935 }
1936
1937 SmallString<128> InitName;
1938 llvm::raw_svector_ostream OS(InitName);
1939 if (!Quals.empty())
1940 OS << Quals << "::";
1941
1942 switch (StubKind) {
1943 case DynamicInitKind::NoStub:
1944 llvm_unreachable("not an initializer")::llvm::llvm_unreachable_internal("not an initializer", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 1944)
;
1945 case DynamicInitKind::Initializer:
1946 OS << "`dynamic initializer for '";
1947 break;
1948 case DynamicInitKind::AtExit:
1949 OS << "`dynamic atexit destructor for '";
1950 break;
1951 }
1952
1953 OS << GVName;
1954
1955 // Add any template specialization args.
1956 if (const auto *VTpl = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
1957 printTemplateArgumentList(OS, VTpl->getTemplateArgs().asArray(),
1958 getPrintingPolicy());
1959 }
1960
1961 OS << '\'';
1962
1963 return internString(OS.str());
1964}
1965
1966void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,
1967 SmallVectorImpl<llvm::Metadata *> &EltTys,
1968 llvm::DICompositeType *RecordTy) {
1969 // If this class is not dynamic then there is not any vtable info to collect.
1970 if (!RD->isDynamicClass())
1971 return;
1972
1973 // Don't emit any vtable shape or vptr info if this class doesn't have an
1974 // extendable vfptr. This can happen if the class doesn't have virtual
1975 // methods, or in the MS ABI if those virtual methods only come from virtually
1976 // inherited bases.
1977 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
1978 if (!RL.hasExtendableVFPtr())
1979 return;
1980
1981 // CodeView needs to know how large the vtable of every dynamic class is, so
1982 // emit a special named pointer type into the element list. The vptr type
1983 // points to this type as well.
1984 llvm::DIType *VPtrTy = nullptr;
1985 bool NeedVTableShape = CGM.getCodeGenOpts().EmitCodeView &&
1986 CGM.getTarget().getCXXABI().isMicrosoft();
1987 if (NeedVTableShape) {
1988 uint64_t PtrWidth =
1989 CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
1990 const VTableLayout &VFTLayout =
1991 CGM.getMicrosoftVTableContext().getVFTableLayout(RD, CharUnits::Zero());
1992 unsigned VSlotCount =
1993 VFTLayout.vtable_components().size() - CGM.getLangOpts().RTTIData;
1994 unsigned VTableWidth = PtrWidth * VSlotCount;
1995 unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace();
1996 Optional<unsigned> DWARFAddressSpace =
1997 CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace);
1998
1999 // Create a very wide void* type and insert it directly in the element list.
2000 llvm::DIType *VTableType = DBuilder.createPointerType(
2001 nullptr, VTableWidth, 0, DWARFAddressSpace, "__vtbl_ptr_type");
2002 EltTys.push_back(VTableType);
2003
2004 // The vptr is a pointer to this special vtable type.
2005 VPtrTy = DBuilder.createPointerType(VTableType, PtrWidth);
2006 }
2007
2008 // If there is a primary base then the artificial vptr member lives there.
2009 if (RL.getPrimaryBase())
2010 return;
2011
2012 if (!VPtrTy)
2013 VPtrTy = getOrCreateVTablePtrType(Unit);
2014
2015 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
2016 llvm::DIType *VPtrMember =
2017 DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 0, Size, 0, 0,
2018 llvm::DINode::FlagArtificial, VPtrTy);
2019 EltTys.push_back(VPtrMember);
2020}
2021
2022llvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy,
2023 SourceLocation Loc) {
2024 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2024, __PRETTY_FUNCTION__))
;
2025 llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc));
2026 return T;
2027}
2028
2029llvm::DIType *CGDebugInfo::getOrCreateInterfaceType(QualType D,
2030 SourceLocation Loc) {
2031 return getOrCreateStandaloneType(D, Loc);
2032}
2033
2034llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D,
2035 SourceLocation Loc) {
2036 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2036, __PRETTY_FUNCTION__))
;
2037 assert(!D.isNull() && "null type")((!D.isNull() && "null type") ? static_cast<void>
(0) : __assert_fail ("!D.isNull() && \"null type\"",
"/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2037, __PRETTY_FUNCTION__))
;
2038 llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
2039 assert(T && "could not create debug info for type")((T && "could not create debug info for type") ? static_cast
<void> (0) : __assert_fail ("T && \"could not create debug info for type\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2039, __PRETTY_FUNCTION__))
;
2040
2041 RetainedTypes.push_back(D.getAsOpaquePtr());
2042 return T;
2043}
2044
2045void CGDebugInfo::addHeapAllocSiteMetadata(llvm::Instruction *CI,
2046 QualType D,
2047 SourceLocation Loc) {
2048 llvm::MDNode *node;
2049 if (D.getTypePtr()->isVoidPointerType()) {
2050 node = llvm::MDNode::get(CGM.getLLVMContext(), None);
2051 } else {
2052 QualType PointeeTy = D.getTypePtr()->getPointeeType();
2053 node = getOrCreateType(PointeeTy, getOrCreateFile(Loc));
2054 }
2055
2056 CI->setMetadata("heapallocsite", node);
2057}
2058
2059void CGDebugInfo::completeType(const EnumDecl *ED) {
2060 if (DebugKind <= codegenoptions::DebugLineTablesOnly)
2061 return;
2062 QualType Ty = CGM.getContext().getEnumType(ED);
2063 void *TyPtr = Ty.getAsOpaquePtr();
2064 auto I = TypeCache.find(TyPtr);
2065 if (I == TypeCache.end() || !cast<llvm::DIType>(I->second)->isForwardDecl())
2066 return;
2067 llvm::DIType *Res = CreateTypeDefinition(Ty->castAs<EnumType>());
2068 assert(!Res->isForwardDecl())((!Res->isForwardDecl()) ? static_cast<void> (0) : __assert_fail
("!Res->isForwardDecl()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2068, __PRETTY_FUNCTION__))
;
2069 TypeCache[TyPtr].reset(Res);
2070}
2071
2072void CGDebugInfo::completeType(const RecordDecl *RD) {
2073 if (DebugKind > codegenoptions::LimitedDebugInfo ||
2074 !CGM.getLangOpts().CPlusPlus)
2075 completeRequiredType(RD);
2076}
2077
2078/// Return true if the class or any of its methods are marked dllimport.
2079static bool isClassOrMethodDLLImport(const CXXRecordDecl *RD) {
2080 if (RD->hasAttr<DLLImportAttr>())
2081 return true;
2082 for (const CXXMethodDecl *MD : RD->methods())
2083 if (MD->hasAttr<DLLImportAttr>())
2084 return true;
2085 return false;
2086}
2087
2088/// Does a type definition exist in an imported clang module?
2089static bool isDefinedInClangModule(const RecordDecl *RD) {
2090 // Only definitions that where imported from an AST file come from a module.
2091 if (!RD || !RD->isFromASTFile())
2092 return false;
2093 // Anonymous entities cannot be addressed. Treat them as not from module.
2094 if (!RD->isExternallyVisible() && RD->getName().empty())
2095 return false;
2096 if (auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) {
2097 if (!CXXDecl->isCompleteDefinition())
2098 return false;
2099 // Check wether RD is a template.
2100 auto TemplateKind = CXXDecl->getTemplateSpecializationKind();
2101 if (TemplateKind != TSK_Undeclared) {
2102 // Unfortunately getOwningModule() isn't accurate enough to find the
2103 // owning module of a ClassTemplateSpecializationDecl that is inside a
2104 // namespace spanning multiple modules.
2105 bool Explicit = false;
2106 if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(CXXDecl))
2107 Explicit = TD->isExplicitInstantiationOrSpecialization();
2108 if (!Explicit && CXXDecl->getEnclosingNamespaceContext())
2109 return false;
2110 // This is a template, check the origin of the first member.
2111 if (CXXDecl->field_begin() == CXXDecl->field_end())
2112 return TemplateKind == TSK_ExplicitInstantiationDeclaration;
2113 if (!CXXDecl->field_begin()->isFromASTFile())
2114 return false;
2115 }
2116 }
2117 return true;
2118}
2119
2120void CGDebugInfo::completeClassData(const RecordDecl *RD) {
2121 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2122 if (CXXRD->isDynamicClass() &&
2123 CGM.getVTableLinkage(CXXRD) ==
2124 llvm::GlobalValue::AvailableExternallyLinkage &&
2125 !isClassOrMethodDLLImport(CXXRD))
2126 return;
2127
2128 if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition()))
2129 return;
2130
2131 completeClass(RD);
2132}
2133
2134void CGDebugInfo::completeClass(const RecordDecl *RD) {
2135 if (DebugKind <= codegenoptions::DebugLineTablesOnly)
2136 return;
2137 QualType Ty = CGM.getContext().getRecordType(RD);
2138 void *TyPtr = Ty.getAsOpaquePtr();
2139 auto I = TypeCache.find(TyPtr);
2140 if (I != TypeCache.end() && !cast<llvm::DIType>(I->second)->isForwardDecl())
2141 return;
2142 llvm::DIType *Res = CreateTypeDefinition(Ty->castAs<RecordType>());
2143 assert(!Res->isForwardDecl())((!Res->isForwardDecl()) ? static_cast<void> (0) : __assert_fail
("!Res->isForwardDecl()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2143, __PRETTY_FUNCTION__))
;
2144 TypeCache[TyPtr].reset(Res);
2145}
2146
2147static bool hasExplicitMemberDefinition(CXXRecordDecl::method_iterator I,
2148 CXXRecordDecl::method_iterator End) {
2149 for (CXXMethodDecl *MD : llvm::make_range(I, End))
2150 if (FunctionDecl *Tmpl = MD->getInstantiatedFromMemberFunction())
2151 if (!Tmpl->isImplicit() && Tmpl->isThisDeclarationADefinition() &&
2152 !MD->getMemberSpecializationInfo()->isExplicitSpecialization())
2153 return true;
2154 return false;
2155}
2156
2157static bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind,
2158 bool DebugTypeExtRefs, const RecordDecl *RD,
2159 const LangOptions &LangOpts) {
2160 if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition()))
2161 return true;
2162
2163 if (auto *ES = RD->getASTContext().getExternalSource())
2164 if (ES->hasExternalDefinitions(RD) == ExternalASTSource::EK_Always)
2165 return true;
2166
2167 if (DebugKind > codegenoptions::LimitedDebugInfo)
2168 return false;
2169
2170 if (!LangOpts.CPlusPlus)
2171 return false;
2172
2173 if (!RD->isCompleteDefinitionRequired())
2174 return true;
2175
2176 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
2177
2178 if (!CXXDecl)
2179 return false;
2180
2181 // Only emit complete debug info for a dynamic class when its vtable is
2182 // emitted. However, Microsoft debuggers don't resolve type information
2183 // across DLL boundaries, so skip this optimization if the class or any of its
2184 // methods are marked dllimport. This isn't a complete solution, since objects
2185 // without any dllimport methods can be used in one DLL and constructed in
2186 // another, but it is the current behavior of LimitedDebugInfo.
2187 if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass() &&
2188 !isClassOrMethodDLLImport(CXXDecl))
2189 return true;
2190
2191 TemplateSpecializationKind Spec = TSK_Undeclared;
2192 if (const auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
2193 Spec = SD->getSpecializationKind();
2194
2195 if (Spec == TSK_ExplicitInstantiationDeclaration &&
2196 hasExplicitMemberDefinition(CXXDecl->method_begin(),
2197 CXXDecl->method_end()))
2198 return true;
2199
2200 return false;
2201}
2202
2203void CGDebugInfo::completeRequiredType(const RecordDecl *RD) {
2204 if (shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD, CGM.getLangOpts()))
2205 return;
2206
2207 QualType Ty = CGM.getContext().getRecordType(RD);
2208 llvm::DIType *T = getTypeOrNull(Ty);
2209 if (T && T->isForwardDecl())
2210 completeClassData(RD);
2211}
2212
2213llvm::DIType *CGDebugInfo::CreateType(const RecordType *Ty) {
2214 RecordDecl *RD = Ty->getDecl();
2215 llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(QualType(Ty, 0)));
2216 if (T || shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD,
2217 CGM.getLangOpts())) {
2218 if (!T)
2219 T = getOrCreateRecordFwdDecl(Ty, getDeclContextDescriptor(RD));
2220 return T;
2221 }
2222
2223 return CreateTypeDefinition(Ty);
2224}
2225
2226llvm::DIType *CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) {
2227 RecordDecl *RD = Ty->getDecl();
2228
2229 // Get overall information about the record type for the debug info.
2230 llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
2231
2232 // Records and classes and unions can all be recursive. To handle them, we
2233 // first generate a debug descriptor for the struct as a forward declaration.
2234 // Then (if it is a definition) we go through and get debug info for all of
2235 // its members. Finally, we create a descriptor for the complete type (which
2236 // may refer to the forward decl if the struct is recursive) and replace all
2237 // uses of the forward declaration with the final definition.
2238 llvm::DICompositeType *FwdDecl = getOrCreateLimitedType(Ty, DefUnit);
2239
2240 const RecordDecl *D = RD->getDefinition();
2241 if (!D || !D->isCompleteDefinition())
2242 return FwdDecl;
2243
2244 if (const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD))
2245 CollectContainingType(CXXDecl, FwdDecl);
2246
2247 // Push the struct on region stack.
2248 LexicalBlockStack.emplace_back(&*FwdDecl);
2249 RegionMap[Ty->getDecl()].reset(FwdDecl);
2250
2251 // Convert all the elements.
2252 SmallVector<llvm::Metadata *, 16> EltTys;
2253 // what about nested types?
2254
2255 // Note: The split of CXXDecl information here is intentional, the
2256 // gdb tests will depend on a certain ordering at printout. The debug
2257 // information offsets are still correct if we merge them all together
2258 // though.
2259 const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
2260 if (CXXDecl) {
2261 CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl);
2262 CollectVTableInfo(CXXDecl, DefUnit, EltTys, FwdDecl);
2263 }
2264
2265 // Collect data fields (including static variables and any initializers).
2266 CollectRecordFields(RD, DefUnit, EltTys, FwdDecl);
2267 if (CXXDecl)
2268 CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl);
2269
2270 LexicalBlockStack.pop_back();
2271 RegionMap.erase(Ty->getDecl());
2272
2273 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
2274 DBuilder.replaceArrays(FwdDecl, Elements);
2275
2276 if (FwdDecl->isTemporary())
2277 FwdDecl =
2278 llvm::MDNode::replaceWithPermanent(llvm::TempDICompositeType(FwdDecl));
2279
2280 RegionMap[Ty->getDecl()].reset(FwdDecl);
2281 return FwdDecl;
2282}
2283
2284llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectType *Ty,
2285 llvm::DIFile *Unit) {
2286 // Ignore protocols.
2287 return getOrCreateType(Ty->getBaseType(), Unit);
2288}
2289
2290llvm::DIType *CGDebugInfo::CreateType(const ObjCTypeParamType *Ty,
2291 llvm::DIFile *Unit) {
2292 // Ignore protocols.
2293 SourceLocation Loc = Ty->getDecl()->getLocation();
2294
2295 // Use Typedefs to represent ObjCTypeParamType.
2296 return DBuilder.createTypedef(
2297 getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit),
2298 Ty->getDecl()->getName(), getOrCreateFile(Loc), getLineNumber(Loc),
2299 getDeclContextDescriptor(Ty->getDecl()));
2300}
2301
2302/// \return true if Getter has the default name for the property PD.
2303static bool hasDefaultGetterName(const ObjCPropertyDecl *PD,
2304 const ObjCMethodDecl *Getter) {
2305 assert(PD)((PD) ? static_cast<void> (0) : __assert_fail ("PD", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2305, __PRETTY_FUNCTION__))
;
2306 if (!Getter)
2307 return true;
2308
2309 assert(Getter->getDeclName().isObjCZeroArgSelector())((Getter->getDeclName().isObjCZeroArgSelector()) ? static_cast
<void> (0) : __assert_fail ("Getter->getDeclName().isObjCZeroArgSelector()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2309, __PRETTY_FUNCTION__))
;
2310 return PD->getName() ==
2311 Getter->getDeclName().getObjCSelector().getNameForSlot(0);
2312}
2313
2314/// \return true if Setter has the default name for the property PD.
2315static bool hasDefaultSetterName(const ObjCPropertyDecl *PD,
2316 const ObjCMethodDecl *Setter) {
2317 assert(PD)((PD) ? static_cast<void> (0) : __assert_fail ("PD", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2317, __PRETTY_FUNCTION__))
;
2318 if (!Setter)
2319 return true;
2320
2321 assert(Setter->getDeclName().isObjCOneArgSelector())((Setter->getDeclName().isObjCOneArgSelector()) ? static_cast
<void> (0) : __assert_fail ("Setter->getDeclName().isObjCOneArgSelector()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2321, __PRETTY_FUNCTION__))
;
2322 return SelectorTable::constructSetterName(PD->getName()) ==
2323 Setter->getDeclName().getObjCSelector().getNameForSlot(0);
2324}
2325
2326llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
2327 llvm::DIFile *Unit) {
2328 ObjCInterfaceDecl *ID = Ty->getDecl();
2329 if (!ID)
2330 return nullptr;
2331
2332 // Return a forward declaration if this type was imported from a clang module,
2333 // and this is not the compile unit with the implementation of the type (which
2334 // may contain hidden ivars).
2335 if (DebugTypeExtRefs && ID->isFromASTFile() && ID->getDefinition() &&
2336 !ID->getImplementation())
2337 return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
2338 ID->getName(),
2339 getDeclContextDescriptor(ID), Unit, 0);
2340
2341 // Get overall information about the record type for the debug info.
2342 llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
2343 unsigned Line = getLineNumber(ID->getLocation());
2344 auto RuntimeLang =
2345 static_cast<llvm::dwarf::SourceLanguage>(TheCU->getSourceLanguage());
2346
2347 // If this is just a forward declaration return a special forward-declaration
2348 // debug type since we won't be able to lay out the entire type.
2349 ObjCInterfaceDecl *Def = ID->getDefinition();
2350 if (!Def || !Def->getImplementation()) {
2351 llvm::DIScope *Mod = getParentModuleOrNull(ID);
2352 llvm::DIType *FwdDecl = DBuilder.createReplaceableCompositeType(
2353 llvm::dwarf::DW_TAG_structure_type, ID->getName(), Mod ? Mod : TheCU,
2354 DefUnit, Line, RuntimeLang);
2355 ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit));
2356 return FwdDecl;
2357 }
2358
2359 return CreateTypeDefinition(Ty, Unit);
2360}
2361
2362llvm::DIModule *
2363CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod,
2364 bool CreateSkeletonCU) {
2365 // Use the Module pointer as the key into the cache. This is a
2366 // nullptr if the "Module" is a PCH, which is safe because we don't
2367 // support chained PCH debug info, so there can only be a single PCH.
2368 const Module *M = Mod.getModuleOrNull();
2369 auto ModRef = ModuleCache.find(M);
2370 if (ModRef != ModuleCache.end())
2371 return cast<llvm::DIModule>(ModRef->second);
2372
2373 // Macro definitions that were defined with "-D" on the command line.
2374 SmallString<128> ConfigMacros;
2375 {
2376 llvm::raw_svector_ostream OS(ConfigMacros);
2377 const auto &PPOpts = CGM.getPreprocessorOpts();
2378 unsigned I = 0;
2379 // Translate the macro definitions back into a command line.
2380 for (auto &M : PPOpts.Macros) {
2381 if (++I > 1)
2382 OS << " ";
2383 const std::string &Macro = M.first;
2384 bool Undef = M.second;
2385 OS << "\"-" << (Undef ? 'U' : 'D');
2386 for (char c : Macro)
2387 switch (c) {
2388 case '\\':
2389 OS << "\\\\";
2390 break;
2391 case '"':
2392 OS << "\\\"";
2393 break;
2394 default:
2395 OS << c;
2396 }
2397 OS << '\"';
2398 }
2399 }
2400
2401 bool IsRootModule = M ? !M->Parent : true;
2402 // When a module name is specified as -fmodule-name, that module gets a
2403 // clang::Module object, but it won't actually be built or imported; it will
2404 // be textual.
2405 if (CreateSkeletonCU && IsRootModule && Mod.getASTFile().empty() && M)
2406 assert(StringRef(M->Name).startswith(CGM.getLangOpts().ModuleName) &&((StringRef(M->Name).startswith(CGM.getLangOpts().ModuleName
) && "clang module without ASTFile must be specified by -fmodule-name"
) ? static_cast<void> (0) : __assert_fail ("StringRef(M->Name).startswith(CGM.getLangOpts().ModuleName) && \"clang module without ASTFile must be specified by -fmodule-name\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2407, __PRETTY_FUNCTION__))
2407 "clang module without ASTFile must be specified by -fmodule-name")((StringRef(M->Name).startswith(CGM.getLangOpts().ModuleName
) && "clang module without ASTFile must be specified by -fmodule-name"
) ? static_cast<void> (0) : __assert_fail ("StringRef(M->Name).startswith(CGM.getLangOpts().ModuleName) && \"clang module without ASTFile must be specified by -fmodule-name\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2407, __PRETTY_FUNCTION__))
;
2408
2409 if (CreateSkeletonCU && IsRootModule && !Mod.getASTFile().empty()) {
2410 // PCH files don't have a signature field in the control block,
2411 // but LLVM detects skeleton CUs by looking for a non-zero DWO id.
2412 // We use the lower 64 bits for debug info.
2413 uint64_t Signature =
2414 Mod.getSignature()
2415 ? (uint64_t)Mod.getSignature()[1] << 32 | Mod.getSignature()[0]
2416 : ~1ULL;
2417 llvm::DIBuilder DIB(CGM.getModule());
2418 DIB.createCompileUnit(TheCU->getSourceLanguage(),
2419 // TODO: Support "Source" from external AST providers?
2420 DIB.createFile(Mod.getModuleName(), Mod.getPath()),
2421 TheCU->getProducer(), true, StringRef(), 0,
2422 Mod.getASTFile(), llvm::DICompileUnit::FullDebug,
2423 Signature);
2424 DIB.finalize();
2425 }
2426
2427 llvm::DIModule *Parent =
2428 IsRootModule ? nullptr
2429 : getOrCreateModuleRef(
2430 ExternalASTSource::ASTSourceDescriptor(*M->Parent),
2431 CreateSkeletonCU);
2432 llvm::DIModule *DIMod =
2433 DBuilder.createModule(Parent, Mod.getModuleName(), ConfigMacros,
2434 Mod.getPath(), CGM.getHeaderSearchOpts().Sysroot);
2435 ModuleCache[M].reset(DIMod);
2436 return DIMod;
2437}
2438
2439llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
2440 llvm::DIFile *Unit) {
2441 ObjCInterfaceDecl *ID = Ty->getDecl();
2442 llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
2443 unsigned Line = getLineNumber(ID->getLocation());
2444 unsigned RuntimeLang = TheCU->getSourceLanguage();
2445
2446 // Bit size, align and offset of the type.
2447 uint64_t Size = CGM.getContext().getTypeSize(Ty);
2448 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
2449
2450 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
2451 if (ID->getImplementation())
2452 Flags |= llvm::DINode::FlagObjcClassComplete;
2453
2454 llvm::DIScope *Mod = getParentModuleOrNull(ID);
2455 llvm::DICompositeType *RealDecl = DBuilder.createStructType(
2456 Mod ? Mod : Unit, ID->getName(), DefUnit, Line, Size, Align, Flags,
2457 nullptr, llvm::DINodeArray(), RuntimeLang);
2458
2459 QualType QTy(Ty, 0);
2460 TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl);
2461
2462 // Push the struct on region stack.
2463 LexicalBlockStack.emplace_back(RealDecl);
2464 RegionMap[Ty->getDecl()].reset(RealDecl);
2465
2466 // Convert all the elements.
2467 SmallVector<llvm::Metadata *, 16> EltTys;
2468
2469 ObjCInterfaceDecl *SClass = ID->getSuperClass();
2470 if (SClass) {
2471 llvm::DIType *SClassTy =
2472 getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit);
2473 if (!SClassTy)
2474 return nullptr;
2475
2476 llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0, 0,
2477 llvm::DINode::FlagZero);
2478 EltTys.push_back(InhTag);
2479 }
2480
2481 // Create entries for all of the properties.
2482 auto AddProperty = [&](const ObjCPropertyDecl *PD) {
2483 SourceLocation Loc = PD->getLocation();
2484 llvm::DIFile *PUnit = getOrCreateFile(Loc);
2485 unsigned PLine = getLineNumber(Loc);
2486 ObjCMethodDecl *Getter = PD->getGetterMethodDecl();
2487 ObjCMethodDecl *Setter = PD->getSetterMethodDecl();
2488 llvm::MDNode *PropertyNode = DBuilder.createObjCProperty(
2489 PD->getName(), PUnit, PLine,
2490 hasDefaultGetterName(PD, Getter) ? ""
2491 : getSelectorName(PD->getGetterName()),
2492 hasDefaultSetterName(PD, Setter) ? ""
2493 : getSelectorName(PD->getSetterName()),
2494 PD->getPropertyAttributes(), getOrCreateType(PD->getType(), PUnit));
2495 EltTys.push_back(PropertyNode);
2496 };
2497 {
2498 llvm::SmallPtrSet<const IdentifierInfo *, 16> PropertySet;
2499 for (const ObjCCategoryDecl *ClassExt : ID->known_extensions())
2500 for (auto *PD : ClassExt->properties()) {
2501 PropertySet.insert(PD->getIdentifier());
2502 AddProperty(PD);
2503 }
2504 for (const auto *PD : ID->properties()) {
2505 // Don't emit duplicate metadata for properties that were already in a
2506 // class extension.
2507 if (!PropertySet.insert(PD->getIdentifier()).second)
2508 continue;
2509 AddProperty(PD);
2510 }
2511 }
2512
2513 const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID);
2514 unsigned FieldNo = 0;
2515 for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field;
2516 Field = Field->getNextIvar(), ++FieldNo) {
2517 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
2518 if (!FieldTy)
2519 return nullptr;
2520
2521 StringRef FieldName = Field->getName();
2522
2523 // Ignore unnamed fields.
2524 if (FieldName.empty())
2525 continue;
2526
2527 // Get the location for the field.
2528 llvm::DIFile *FieldDefUnit = getOrCreateFile(Field->getLocation());
2529 unsigned FieldLine = getLineNumber(Field->getLocation());
2530 QualType FType = Field->getType();
2531 uint64_t FieldSize = 0;
2532 uint32_t FieldAlign = 0;
2533
2534 if (!FType->isIncompleteArrayType()) {
2535
2536 // Bit size, align and offset of the type.
2537 FieldSize = Field->isBitField()
2538 ? Field->getBitWidthValue(CGM.getContext())
2539 : CGM.getContext().getTypeSize(FType);
2540 FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext());
2541 }
2542
2543 uint64_t FieldOffset;
2544 if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) {
2545 // We don't know the runtime offset of an ivar if we're using the
2546 // non-fragile ABI. For bitfields, use the bit offset into the first
2547 // byte of storage of the bitfield. For other fields, use zero.
2548 if (Field->isBitField()) {
2549 FieldOffset =
2550 CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field);
2551 FieldOffset %= CGM.getContext().getCharWidth();
2552 } else {
2553 FieldOffset = 0;
2554 }
2555 } else {
2556 FieldOffset = RL.getFieldOffset(FieldNo);
2557 }
2558
2559 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
2560 if (Field->getAccessControl() == ObjCIvarDecl::Protected)
2561 Flags = llvm::DINode::FlagProtected;
2562 else if (Field->getAccessControl() == ObjCIvarDecl::Private)
2563 Flags = llvm::DINode::FlagPrivate;
2564 else if (Field->getAccessControl() == ObjCIvarDecl::Public)
2565 Flags = llvm::DINode::FlagPublic;
2566
2567 llvm::MDNode *PropertyNode = nullptr;
2568 if (ObjCImplementationDecl *ImpD = ID->getImplementation()) {
2569 if (ObjCPropertyImplDecl *PImpD =
2570 ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) {
2571 if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) {
2572 SourceLocation Loc = PD->getLocation();
2573 llvm::DIFile *PUnit = getOrCreateFile(Loc);
2574 unsigned PLine = getLineNumber(Loc);
2575 ObjCMethodDecl *Getter = PD->getGetterMethodDecl();
2576 ObjCMethodDecl *Setter = PD->getSetterMethodDecl();
2577 PropertyNode = DBuilder.createObjCProperty(
2578 PD->getName(), PUnit, PLine,
2579 hasDefaultGetterName(PD, Getter)
2580 ? ""
2581 : getSelectorName(PD->getGetterName()),
2582 hasDefaultSetterName(PD, Setter)
2583 ? ""
2584 : getSelectorName(PD->getSetterName()),
2585 PD->getPropertyAttributes(),
2586 getOrCreateType(PD->getType(), PUnit));
2587 }
2588 }
2589 }
2590 FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, FieldLine,
2591 FieldSize, FieldAlign, FieldOffset, Flags,
2592 FieldTy, PropertyNode);
2593 EltTys.push_back(FieldTy);
2594 }
2595
2596 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
2597 DBuilder.replaceArrays(RealDecl, Elements);
2598
2599 LexicalBlockStack.pop_back();
2600 return RealDecl;
2601}
2602
2603llvm::DIType *CGDebugInfo::CreateType(const VectorType *Ty,
2604 llvm::DIFile *Unit) {
2605 llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit);
2606 int64_t Count = Ty->getNumElements();
2607
2608 llvm::Metadata *Subscript;
2609 QualType QTy(Ty, 0);
2610 auto SizeExpr = SizeExprCache.find(QTy);
2611 if (SizeExpr != SizeExprCache.end())
2612 Subscript = DBuilder.getOrCreateSubrange(0, SizeExpr->getSecond());
2613 else
2614 Subscript = DBuilder.getOrCreateSubrange(0, Count ? Count : -1);
2615 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
2616
2617 uint64_t Size = CGM.getContext().getTypeSize(Ty);
2618 auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
2619
2620 return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray);
2621}
2622
2623llvm::DIType *CGDebugInfo::CreateType(const ArrayType *Ty, llvm::DIFile *Unit) {
2624 uint64_t Size;
2625 uint32_t Align;
2626
2627 // FIXME: make getTypeAlign() aware of VLAs and incomplete array types
2628 if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
2629 Size = 0;
2630 Align = getTypeAlignIfRequired(CGM.getContext().getBaseElementType(VAT),
2631 CGM.getContext());
2632 } else if (Ty->isIncompleteArrayType()) {
2633 Size = 0;
2634 if (Ty->getElementType()->isIncompleteType())
2635 Align = 0;
2636 else
2637 Align = getTypeAlignIfRequired(Ty->getElementType(), CGM.getContext());
2638 } else if (Ty->isIncompleteType()) {
2639 Size = 0;
2640 Align = 0;
2641 } else {
2642 // Size and align of the whole array, not the element type.
2643 Size = CGM.getContext().getTypeSize(Ty);
2644 Align = getTypeAlignIfRequired(Ty, CGM.getContext());
2645 }
2646
2647 // Add the dimensions of the array. FIXME: This loses CV qualifiers from
2648 // interior arrays, do we care? Why aren't nested arrays represented the
2649 // obvious/recursive way?
2650 SmallVector<llvm::Metadata *, 8> Subscripts;
2651 QualType EltTy(Ty, 0);
2652 while ((Ty = dyn_cast<ArrayType>(EltTy))) {
2653 // If the number of elements is known, then count is that number. Otherwise,
2654 // it's -1. This allows us to represent a subrange with an array of 0
2655 // elements, like this:
2656 //
2657 // struct foo {
2658 // int x[0];
2659 // };
2660 int64_t Count = -1; // Count == -1 is an unbounded array.
2661 if (const auto *CAT = dyn_cast<ConstantArrayType>(Ty))
2662 Count = CAT->getSize().getZExtValue();
2663 else if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
2664 if (Expr *Size = VAT->getSizeExpr()) {
2665 Expr::EvalResult Result;
2666 if (Size->EvaluateAsInt(Result, CGM.getContext()))
2667 Count = Result.Val.getInt().getExtValue();
2668 }
2669 }
2670
2671 auto SizeNode = SizeExprCache.find(EltTy);
2672 if (SizeNode != SizeExprCache.end())
2673 Subscripts.push_back(
2674 DBuilder.getOrCreateSubrange(0, SizeNode->getSecond()));
2675 else
2676 Subscripts.push_back(DBuilder.getOrCreateSubrange(0, Count));
2677 EltTy = Ty->getElementType();
2678 }
2679
2680 llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);
2681
2682 return DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit),
2683 SubscriptArray);
2684}
2685
2686llvm::DIType *CGDebugInfo::CreateType(const LValueReferenceType *Ty,
2687 llvm::DIFile *Unit) {
2688 return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, Ty,
2689 Ty->getPointeeType(), Unit);
2690}
2691
2692llvm::DIType *CGDebugInfo::CreateType(const RValueReferenceType *Ty,
2693 llvm::DIFile *Unit) {
2694 return CreatePointerLikeType(llvm::dwarf::DW_TAG_rvalue_reference_type, Ty,
2695 Ty->getPointeeType(), Unit);
2696}
2697
2698llvm::DIType *CGDebugInfo::CreateType(const MemberPointerType *Ty,
2699 llvm::DIFile *U) {
2700 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
2701 uint64_t Size = 0;
2702
2703 if (!Ty->isIncompleteType()) {
2704 Size = CGM.getContext().getTypeSize(Ty);
2705
2706 // Set the MS inheritance model. There is no flag for the unspecified model.
2707 if (CGM.getTarget().getCXXABI().isMicrosoft()) {
2708 switch (Ty->getMostRecentCXXRecordDecl()->getMSInheritanceModel()) {
2709 case MSInheritanceAttr::Keyword_single_inheritance:
2710 Flags |= llvm::DINode::FlagSingleInheritance;
2711 break;
2712 case MSInheritanceAttr::Keyword_multiple_inheritance:
2713 Flags |= llvm::DINode::FlagMultipleInheritance;
2714 break;
2715 case MSInheritanceAttr::Keyword_virtual_inheritance:
2716 Flags |= llvm::DINode::FlagVirtualInheritance;
2717 break;
2718 case MSInheritanceAttr::Keyword_unspecified_inheritance:
2719 break;
2720 case MSInheritanceAttr::SpellingNotCalculated:
2721 llvm_unreachable("Spelling not yet calculated")::llvm::llvm_unreachable_internal("Spelling not yet calculated"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2721)
;
2722 }
2723 }
2724 }
2725
2726 llvm::DIType *ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U);
2727 if (Ty->isMemberDataPointerType())
2728 return DBuilder.createMemberPointerType(
2729 getOrCreateType(Ty->getPointeeType(), U), ClassType, Size, /*Align=*/0,
2730 Flags);
2731
2732 const FunctionProtoType *FPT =
2733 Ty->getPointeeType()->getAs<FunctionProtoType>();
2734 return DBuilder.createMemberPointerType(
2735 getOrCreateInstanceMethodType(
2736 CXXMethodDecl::getThisType(FPT, Ty->getMostRecentCXXRecordDecl()),
2737 FPT, U),
2738 ClassType, Size, /*Align=*/0, Flags);
2739}
2740
2741llvm::DIType *CGDebugInfo::CreateType(const AtomicType *Ty, llvm::DIFile *U) {
2742 auto *FromTy = getOrCreateType(Ty->getValueType(), U);
2743 return DBuilder.createQualifiedType(llvm::dwarf::DW_TAG_atomic_type, FromTy);
2744}
2745
2746llvm::DIType *CGDebugInfo::CreateType(const PipeType *Ty, llvm::DIFile *U) {
2747 return getOrCreateType(Ty->getElementType(), U);
2748}
2749
2750llvm::DIType *CGDebugInfo::CreateEnumType(const EnumType *Ty) {
2751 const EnumDecl *ED = Ty->getDecl();
2752
2753 uint64_t Size = 0;
2754 uint32_t Align = 0;
2755 if (!ED->getTypeForDecl()->isIncompleteType()) {
2756 Size = CGM.getContext().getTypeSize(ED->getTypeForDecl());
2757 Align = getDeclAlignIfRequired(ED, CGM.getContext());
2758 }
2759
2760 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
2761
2762 bool isImportedFromModule =
2763 DebugTypeExtRefs && ED->isFromASTFile() && ED->getDefinition();
2764
2765 // If this is just a forward declaration, construct an appropriately
2766 // marked node and just return it.
2767 if (isImportedFromModule || !ED->getDefinition()) {
2768 // Note that it is possible for enums to be created as part of
2769 // their own declcontext. In this case a FwdDecl will be created
2770 // twice. This doesn't cause a problem because both FwdDecls are
2771 // entered into the ReplaceMap: finalize() will replace the first
2772 // FwdDecl with the second and then replace the second with
2773 // complete type.
2774 llvm::DIScope *EDContext = getDeclContextDescriptor(ED);
2775 llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
2776 llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType(
2777 llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit, 0));
2778
2779 unsigned Line = getLineNumber(ED->getLocation());
2780 StringRef EDName = ED->getName();
2781 llvm::DIType *RetTy = DBuilder.createReplaceableCompositeType(
2782 llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line,
2783 0, Size, Align, llvm::DINode::FlagFwdDecl, Identifier);
2784
2785 ReplaceMap.emplace_back(
2786 std::piecewise_construct, std::make_tuple(Ty),
2787 std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
2788 return RetTy;
2789 }
2790
2791 return CreateTypeDefinition(Ty);
2792}
2793
2794llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
2795 const EnumDecl *ED = Ty->getDecl();
2796 uint64_t Size = 0;
2797 uint32_t Align = 0;
2798 if (!ED->getTypeForDecl()->isIncompleteType()) {
2799 Size = CGM.getContext().getTypeSize(ED->getTypeForDecl());
2800 Align = getDeclAlignIfRequired(ED, CGM.getContext());
2801 }
2802
2803 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
2804
2805 // Create elements for each enumerator.
2806 SmallVector<llvm::Metadata *, 16> Enumerators;
2807 ED = ED->getDefinition();
2808 bool IsSigned = ED->getIntegerType()->isSignedIntegerType();
2809 for (const auto *Enum : ED->enumerators()) {
2810 const auto &InitVal = Enum->getInitVal();
2811 auto Value = IsSigned ? InitVal.getSExtValue() : InitVal.getZExtValue();
2812 Enumerators.push_back(
2813 DBuilder.createEnumerator(Enum->getName(), Value, !IsSigned));
2814 }
2815
2816 // Return a CompositeType for the enum itself.
2817 llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
2818
2819 llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
2820 unsigned Line = getLineNumber(ED->getLocation());
2821 llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
2822 llvm::DIType *ClassTy = getOrCreateType(ED->getIntegerType(), DefUnit);
2823 return DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit,
2824 Line, Size, Align, EltArray, ClassTy,
2825 Identifier, ED->isScoped());
2826}
2827
2828llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
2829 unsigned MType, SourceLocation LineLoc,
2830 StringRef Name, StringRef Value) {
2831 unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
2832 return DBuilder.createMacro(Parent, Line, MType, Name, Value);
2833}
2834
2835llvm::DIMacroFile *CGDebugInfo::CreateTempMacroFile(llvm::DIMacroFile *Parent,
2836 SourceLocation LineLoc,
2837 SourceLocation FileLoc) {
2838 llvm::DIFile *FName = getOrCreateFile(FileLoc);
2839 unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
2840 return DBuilder.createTempMacroFile(Parent, Line, FName);
2841}
2842
2843static QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) {
2844 Qualifiers Quals;
2845 do {
2846 Qualifiers InnerQuals = T.getLocalQualifiers();
2847 // Qualifiers::operator+() doesn't like it if you add a Qualifier
2848 // that is already there.
2849 Quals += Qualifiers::removeCommonQualifiers(Quals, InnerQuals);
2850 Quals += InnerQuals;
2851 QualType LastT = T;
2852 switch (T->getTypeClass()) {
2853 default:
2854 return C.getQualifiedType(T.getTypePtr(), Quals);
2855 case Type::TemplateSpecialization: {
2856 const auto *Spec = cast<TemplateSpecializationType>(T);
2857 if (Spec->isTypeAlias())
2858 return C.getQualifiedType(T.getTypePtr(), Quals);
2859 T = Spec->desugar();
2860 break;
2861 }
2862 case Type::TypeOfExpr:
2863 T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType();
2864 break;
2865 case Type::TypeOf:
2866 T = cast<TypeOfType>(T)->getUnderlyingType();
2867 break;
2868 case Type::Decltype:
2869 T = cast<DecltypeType>(T)->getUnderlyingType();
2870 break;
2871 case Type::UnaryTransform:
2872 T = cast<UnaryTransformType>(T)->getUnderlyingType();
2873 break;
2874 case Type::Attributed:
2875 T = cast<AttributedType>(T)->getEquivalentType();
2876 break;
2877 case Type::Elaborated:
2878 T = cast<ElaboratedType>(T)->getNamedType();
2879 break;
2880 case Type::Paren:
2881 T = cast<ParenType>(T)->getInnerType();
2882 break;
2883 case Type::MacroQualified:
2884 T = cast<MacroQualifiedType>(T)->getUnderlyingType();
2885 break;
2886 case Type::SubstTemplateTypeParm:
2887 T = cast<SubstTemplateTypeParmType>(T)->getReplacementType();
2888 break;
2889 case Type::Auto:
2890 case Type::DeducedTemplateSpecialization: {
2891 QualType DT = cast<DeducedType>(T)->getDeducedType();
2892 assert(!DT.isNull() && "Undeduced types shouldn't reach here.")((!DT.isNull() && "Undeduced types shouldn't reach here."
) ? static_cast<void> (0) : __assert_fail ("!DT.isNull() && \"Undeduced types shouldn't reach here.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2892, __PRETTY_FUNCTION__))
;
2893 T = DT;
2894 break;
2895 }
2896 case Type::Adjusted:
2897 case Type::Decayed:
2898 // Decayed and adjusted types use the adjusted type in LLVM and DWARF.
2899 T = cast<AdjustedType>(T)->getAdjustedType();
2900 break;
2901 }
2902
2903 assert(T != LastT && "Type unwrapping failed to unwrap!")((T != LastT && "Type unwrapping failed to unwrap!") ?
static_cast<void> (0) : __assert_fail ("T != LastT && \"Type unwrapping failed to unwrap!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 2903, __PRETTY_FUNCTION__))
;
2904 (void)LastT;
2905 } while (true);
2906}
2907
2908llvm::DIType *CGDebugInfo::getTypeOrNull(QualType Ty) {
2909
2910 // Unwrap the type as needed for debug information.
2911 Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext());
2912
2913 auto It = TypeCache.find(Ty.getAsOpaquePtr());
2914 if (It != TypeCache.end()) {
2915 // Verify that the debug info still exists.
2916 if (llvm::Metadata *V = It->second)
2917 return cast<llvm::DIType>(V);
2918 }
2919
2920 return nullptr;
2921}
2922
2923void CGDebugInfo::completeTemplateDefinition(
2924 const ClassTemplateSpecializationDecl &SD) {
2925 if (DebugKind <= codegenoptions::DebugLineTablesOnly)
2926 return;
2927 completeUnusedClass(SD);
2928}
2929
2930void CGDebugInfo::completeUnusedClass(const CXXRecordDecl &D) {
2931 if (DebugKind <= codegenoptions::DebugLineTablesOnly)
2932 return;
2933
2934 completeClassData(&D);
2935 // In case this type has no member function definitions being emitted, ensure
2936 // it is retained
2937 RetainedTypes.push_back(CGM.getContext().getRecordType(&D).getAsOpaquePtr());
2938}
2939
2940llvm::DIType *CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile *Unit) {
2941 if (Ty.isNull())
2942 return nullptr;
2943
2944 // Unwrap the type as needed for debug information.
2945 Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext());
2946
2947 if (auto *T = getTypeOrNull(Ty))
2948 return T;
2949
2950 llvm::DIType *Res = CreateTypeNode(Ty, Unit);
2951 void *TyPtr = Ty.getAsOpaquePtr();
2952
2953 // And update the type cache.
2954 TypeCache[TyPtr].reset(Res);
2955
2956 return Res;
2957}
2958
2959llvm::DIModule *CGDebugInfo::getParentModuleOrNull(const Decl *D) {
2960 // A forward declaration inside a module header does not belong to the module.
2961 if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->getDefinition())
2962 return nullptr;
2963 if (DebugTypeExtRefs && D->isFromASTFile()) {
2964 // Record a reference to an imported clang module or precompiled header.
2965 auto *Reader = CGM.getContext().getExternalSource();
2966 auto Idx = D->getOwningModuleID();
2967 auto Info = Reader->getSourceDescriptor(Idx);
2968 if (Info)
2969 return getOrCreateModuleRef(*Info, /*SkeletonCU=*/true);
2970 } else if (ClangModuleMap) {
2971 // We are building a clang module or a precompiled header.
2972 //
2973 // TODO: When D is a CXXRecordDecl or a C++ Enum, the ODR applies
2974 // and it wouldn't be necessary to specify the parent scope
2975 // because the type is already unique by definition (it would look
2976 // like the output of -fno-standalone-debug). On the other hand,
2977 // the parent scope helps a consumer to quickly locate the object
2978 // file where the type's definition is located, so it might be
2979 // best to make this behavior a command line or debugger tuning
2980 // option.
2981 if (Module *M = D->getOwningModule()) {
2982 // This is a (sub-)module.
2983 auto Info = ExternalASTSource::ASTSourceDescriptor(*M);
2984 return getOrCreateModuleRef(Info, /*SkeletonCU=*/false);
2985 } else {
2986 // This the precompiled header being built.
2987 return getOrCreateModuleRef(PCHDescriptor, /*SkeletonCU=*/false);
2988 }
2989 }
2990
2991 return nullptr;
2992}
2993
2994llvm::DIType *CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile *Unit) {
2995 // Handle qualifiers, which recursively handles what they refer to.
2996 if (Ty.hasLocalQualifiers())
2997 return CreateQualifiedType(Ty, Unit);
2998
2999 // Work out details of type.
3000 switch (Ty->getTypeClass()) {
3001#define TYPE(Class, Base)
3002#define ABSTRACT_TYPE(Class, Base)
3003#define NON_CANONICAL_TYPE(Class, Base)
3004#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3005#include "clang/AST/TypeNodes.inc"
3006 llvm_unreachable("Dependent types cannot show up in debug information")::llvm::llvm_unreachable_internal("Dependent types cannot show up in debug information"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3006)
;
3007
3008 case Type::ExtVector:
3009 case Type::Vector:
3010 return CreateType(cast<VectorType>(Ty), Unit);
3011 case Type::ObjCObjectPointer:
3012 return CreateType(cast<ObjCObjectPointerType>(Ty), Unit);
3013 case Type::ObjCObject:
3014 return CreateType(cast<ObjCObjectType>(Ty), Unit);
3015 case Type::ObjCTypeParam:
3016 return CreateType(cast<ObjCTypeParamType>(Ty), Unit);
3017 case Type::ObjCInterface:
3018 return CreateType(cast<ObjCInterfaceType>(Ty), Unit);
3019 case Type::Builtin:
3020 return CreateType(cast<BuiltinType>(Ty));
3021 case Type::Complex:
3022 return CreateType(cast<ComplexType>(Ty));
3023 case Type::Pointer:
3024 return CreateType(cast<PointerType>(Ty), Unit);
3025 case Type::BlockPointer:
3026 return CreateType(cast<BlockPointerType>(Ty), Unit);
3027 case Type::Typedef:
3028 return CreateType(cast<TypedefType>(Ty), Unit);
3029 case Type::Record:
3030 return CreateType(cast<RecordType>(Ty));
3031 case Type::Enum:
3032 return CreateEnumType(cast<EnumType>(Ty));
3033 case Type::FunctionProto:
3034 case Type::FunctionNoProto:
3035 return CreateType(cast<FunctionType>(Ty), Unit);
3036 case Type::ConstantArray:
3037 case Type::VariableArray:
3038 case Type::IncompleteArray:
3039 return CreateType(cast<ArrayType>(Ty), Unit);
3040
3041 case Type::LValueReference:
3042 return CreateType(cast<LValueReferenceType>(Ty), Unit);
3043 case Type::RValueReference:
3044 return CreateType(cast<RValueReferenceType>(Ty), Unit);
3045
3046 case Type::MemberPointer:
3047 return CreateType(cast<MemberPointerType>(Ty), Unit);
3048
3049 case Type::Atomic:
3050 return CreateType(cast<AtomicType>(Ty), Unit);
3051
3052 case Type::Pipe:
3053 return CreateType(cast<PipeType>(Ty), Unit);
3054
3055 case Type::TemplateSpecialization:
3056 return CreateType(cast<TemplateSpecializationType>(Ty), Unit);
3057
3058 case Type::Auto:
3059 case Type::Attributed:
3060 case Type::Adjusted:
3061 case Type::Decayed:
3062 case Type::DeducedTemplateSpecialization:
3063 case Type::Elaborated:
3064 case Type::Paren:
3065 case Type::MacroQualified:
3066 case Type::SubstTemplateTypeParm:
3067 case Type::TypeOfExpr:
3068 case Type::TypeOf:
3069 case Type::Decltype:
3070 case Type::UnaryTransform:
3071 case Type::PackExpansion:
3072 break;
3073 }
3074
3075 llvm_unreachable("type should have been unwrapped!")::llvm::llvm_unreachable_internal("type should have been unwrapped!"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3075)
;
3076}
3077
3078llvm::DICompositeType *CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty,
3079 llvm::DIFile *Unit) {
3080 QualType QTy(Ty, 0);
3081
3082 auto *T = cast_or_null<llvm::DICompositeType>(getTypeOrNull(QTy));
3083
3084 // We may have cached a forward decl when we could have created
3085 // a non-forward decl. Go ahead and create a non-forward decl
3086 // now.
3087 if (T && !T->isForwardDecl())
3088 return T;
3089
3090 // Otherwise create the type.
3091 llvm::DICompositeType *Res = CreateLimitedType(Ty);
3092
3093 // Propagate members from the declaration to the definition
3094 // CreateType(const RecordType*) will overwrite this with the members in the
3095 // correct order if the full type is needed.
3096 DBuilder.replaceArrays(Res, T ? T->getElements() : llvm::DINodeArray());
3097
3098 // And update the type cache.
3099 TypeCache[QTy.getAsOpaquePtr()].reset(Res);
3100 return Res;
3101}
3102
3103// TODO: Currently used for context chains when limiting debug info.
3104llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
3105 RecordDecl *RD = Ty->getDecl();
3106
3107 // Get overall information about the record type for the debug info.
3108 llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
3109 unsigned Line = getLineNumber(RD->getLocation());
3110 StringRef RDName = getClassName(RD);
3111
3112 llvm::DIScope *RDContext = getDeclContextDescriptor(RD);
3113
3114 // If we ended up creating the type during the context chain construction,
3115 // just return that.
3116 auto *T = cast_or_null<llvm::DICompositeType>(
3117 getTypeOrNull(CGM.getContext().getRecordType(RD)));
3118 if (T && (!T->isForwardDecl() || !RD->getDefinition()))
3119 return T;
3120
3121 // If this is just a forward or incomplete declaration, construct an
3122 // appropriately marked node and just return it.
3123 const RecordDecl *D = RD->getDefinition();
3124 if (!D || !D->isCompleteDefinition())
3125 return getOrCreateRecordFwdDecl(Ty, RDContext);
3126
3127 uint64_t Size = CGM.getContext().getTypeSize(Ty);
3128 auto Align = getDeclAlignIfRequired(D, CGM.getContext());
3129
3130 SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
3131
3132 // Explicitly record the calling convention and export symbols for C++
3133 // records.
3134 auto Flags = llvm::DINode::FlagZero;
3135 if (auto CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3136 if (CGM.getCXXABI().getRecordArgABI(CXXRD) == CGCXXABI::RAA_Indirect)
3137 Flags |= llvm::DINode::FlagTypePassByReference;
3138 else
3139 Flags |= llvm::DINode::FlagTypePassByValue;
3140
3141 // Record if a C++ record is non-trivial type.
3142 if (!CXXRD->isTrivial())
3143 Flags |= llvm::DINode::FlagNonTrivial;
3144
3145 // Record exports it symbols to the containing structure.
3146 if (CXXRD->isAnonymousStructOrUnion())
3147 Flags |= llvm::DINode::FlagExportSymbols;
3148 }
3149
3150 llvm::DICompositeType *RealDecl = DBuilder.createReplaceableCompositeType(
3151 getTagForRecord(RD), RDName, RDContext, DefUnit, Line, 0, Size, Align,
3152 Flags, Identifier);
3153
3154 // Elements of composite types usually have back to the type, creating
3155 // uniquing cycles. Distinct nodes are more efficient.
3156 switch (RealDecl->getTag()) {
3157 default:
3158 llvm_unreachable("invalid composite type tag")::llvm::llvm_unreachable_internal("invalid composite type tag"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3158)
;
3159
3160 case llvm::dwarf::DW_TAG_array_type:
3161 case llvm::dwarf::DW_TAG_enumeration_type:
3162 // Array elements and most enumeration elements don't have back references,
3163 // so they don't tend to be involved in uniquing cycles and there is some
3164 // chance of merging them when linking together two modules. Only make
3165 // them distinct if they are ODR-uniqued.
3166 if (Identifier.empty())
3167 break;
3168 LLVM_FALLTHROUGH[[gnu::fallthrough]];
3169
3170 case llvm::dwarf::DW_TAG_structure_type:
3171 case llvm::dwarf::DW_TAG_union_type:
3172 case llvm::dwarf::DW_TAG_class_type:
3173 // Immediately resolve to a distinct node.
3174 RealDecl =
3175 llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
3176 break;
3177 }
3178
3179 RegionMap[Ty->getDecl()].reset(RealDecl);
3180 TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
3181
3182 if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
3183 DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(),
3184 CollectCXXTemplateParams(TSpecial, DefUnit));
3185 return RealDecl;
3186}
3187
3188void CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD,
3189 llvm::DICompositeType *RealDecl) {
3190 // A class's primary base or the class itself contains the vtable.
3191 llvm::DICompositeType *ContainingType = nullptr;
3192 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
3193 if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) {
3194 // Seek non-virtual primary base root.
3195 while (1) {
3196 const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase);
3197 const CXXRecordDecl *PBT = BRL.getPrimaryBase();
3198 if (PBT && !BRL.isPrimaryBaseVirtual())
3199 PBase = PBT;
3200 else
3201 break;
3202 }
3203 ContainingType = cast<llvm::DICompositeType>(
3204 getOrCreateType(QualType(PBase->getTypeForDecl(), 0),
3205 getOrCreateFile(RD->getLocation())));
3206 } else if (RD->isDynamicClass())
3207 ContainingType = RealDecl;
3208
3209 DBuilder.replaceVTableHolder(RealDecl, ContainingType);
3210}
3211
3212llvm::DIType *CGDebugInfo::CreateMemberType(llvm::DIFile *Unit, QualType FType,
3213 StringRef Name, uint64_t *Offset) {
3214 llvm::DIType *FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
3215 uint64_t FieldSize = CGM.getContext().getTypeSize(FType);
3216 auto FieldAlign = getTypeAlignIfRequired(FType, CGM.getContext());
3217 llvm::DIType *Ty =
3218 DBuilder.createMemberType(Unit, Name, Unit, 0, FieldSize, FieldAlign,
3219 *Offset, llvm::DINode::FlagZero, FieldTy);
3220 *Offset += FieldSize;
3221 return Ty;
3222}
3223
3224void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit,
3225 StringRef &Name,
3226 StringRef &LinkageName,
3227 llvm::DIScope *&FDContext,
3228 llvm::DINodeArray &TParamsArray,
3229 llvm::DINode::DIFlags &Flags) {
3230 const auto *FD = cast<FunctionDecl>(GD.getDecl());
3231 Name = getFunctionName(FD);
3232 // Use mangled name as linkage name for C/C++ functions.
3233 if (FD->hasPrototype()) {
3234 LinkageName = CGM.getMangledName(GD);
3235 Flags |= llvm::DINode::FlagPrototyped;
3236 }
3237 // No need to replicate the linkage name if it isn't different from the
3238 // subprogram name, no need to have it at all unless coverage is enabled or
3239 // debug is set to more than just line tables or extra debug info is needed.
3240 if (LinkageName == Name || (!CGM.getCodeGenOpts().EmitGcovArcs &&
3241 !CGM.getCodeGenOpts().EmitGcovNotes &&
3242 !CGM.getCodeGenOpts().DebugInfoForProfiling &&
3243 DebugKind <= codegenoptions::DebugLineTablesOnly))
3244 LinkageName = StringRef();
3245
3246 if (DebugKind >= codegenoptions::LimitedDebugInfo) {
3247 if (const NamespaceDecl *NSDecl =
3248 dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
3249 FDContext = getOrCreateNamespace(NSDecl);
3250 else if (const RecordDecl *RDecl =
3251 dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) {
3252 llvm::DIScope *Mod = getParentModuleOrNull(RDecl);
3253 FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU);
3254 }
3255 // Check if it is a noreturn-marked function
3256 if (FD->isNoReturn())
3257 Flags |= llvm::DINode::FlagNoReturn;
3258 // Collect template parameters.
3259 TParamsArray = CollectFunctionTemplateParams(FD, Unit);
3260 }
3261}
3262
3263void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit,
3264 unsigned &LineNo, QualType &T,
3265 StringRef &Name, StringRef &LinkageName,
3266 llvm::MDTuple *&TemplateParameters,
3267 llvm::DIScope *&VDContext) {
3268 Unit = getOrCreateFile(VD->getLocation());
3269 LineNo = getLineNumber(VD->getLocation());
3270
3271 setLocation(VD->getLocation());
3272
3273 T = VD->getType();
3274 if (T->isIncompleteArrayType()) {
7
Taking false branch
3275 // CodeGen turns int[] into int[1] so we'll do the same here.
3276 llvm::APInt ConstVal(32, 1);
3277 QualType ET = CGM.getContext().getAsArrayType(T)->getElementType();
3278
3279 T = CGM.getContext().getConstantArrayType(ET, ConstVal, nullptr,
3280 ArrayType::Normal, 0);
3281 }
3282
3283 Name = VD->getName();
3284 if (VD->getDeclContext() && !isa<FunctionDecl>(VD->getDeclContext()) &&
8
Assuming the condition is false
9
Taking false branch
3285 !isa<ObjCMethodDecl>(VD->getDeclContext()))
3286 LinkageName = CGM.getMangledName(VD);
3287 if (LinkageName == Name)
10
Assuming the condition is false
11
Taking false branch
3288 LinkageName = StringRef();
3289
3290 if (isa<VarTemplateSpecializationDecl>(VD)) {
12
Assuming 'VD' is a 'VarTemplateSpecializationDecl'
13
Taking true branch
3291 llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VD, &*Unit);
14
Calling 'CGDebugInfo::CollectVarTemplateParams'
3292 TemplateParameters = parameterNodes.get();
3293 } else {
3294 TemplateParameters = nullptr;
3295 }
3296
3297 // Since we emit declarations (DW_AT_members) for static members, place the
3298 // definition of those static members in the namespace they were declared in
3299 // in the source code (the lexical decl context).
3300 // FIXME: Generalize this for even non-member global variables where the
3301 // declaration and definition may have different lexical decl contexts, once
3302 // we have support for emitting declarations of (non-member) global variables.
3303 const DeclContext *DC = VD->isStaticDataMember() ? VD->getLexicalDeclContext()
3304 : VD->getDeclContext();
3305 // When a record type contains an in-line initialization of a static data
3306 // member, and the record type is marked as __declspec(dllexport), an implicit
3307 // definition of the member will be created in the record context. DWARF
3308 // doesn't seem to have a nice way to describe this in a form that consumers
3309 // are likely to understand, so fake the "normal" situation of a definition
3310 // outside the class by putting it in the global scope.
3311 if (DC->isRecord())
3312 DC = CGM.getContext().getTranslationUnitDecl();
3313
3314 llvm::DIScope *Mod = getParentModuleOrNull(VD);
3315 VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU);
3316}
3317
3318llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
3319 bool Stub) {
3320 llvm::DINodeArray TParamsArray;
3321 StringRef Name, LinkageName;
3322 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3323 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
3324 SourceLocation Loc = GD.getDecl()->getLocation();
3325 llvm::DIFile *Unit = getOrCreateFile(Loc);
3326 llvm::DIScope *DContext = Unit;
3327 unsigned Line = getLineNumber(Loc);
3328 collectFunctionDeclProps(GD, Unit, Name, LinkageName, DContext, TParamsArray,
3329 Flags);
3330 auto *FD = dyn_cast<FunctionDecl>(GD.getDecl());
3331
3332 // Build function type.
3333 SmallVector<QualType, 16> ArgTypes;
3334 if (FD)
3335 for (const ParmVarDecl *Parm : FD->parameters())
3336 ArgTypes.push_back(Parm->getType());
3337 CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv();
3338 QualType FnType = CGM.getContext().getFunctionType(
3339 FD->getReturnType(), ArgTypes, FunctionProtoType::ExtProtoInfo(CC));
3340 if (!FD->isExternallyVisible())
3341 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
3342 if (CGM.getLangOpts().Optimize)
3343 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
3344
3345 if (Stub) {
3346 Flags |= getCallSiteRelatedAttrs();
3347 SPFlags |= llvm::DISubprogram::SPFlagDefinition;
3348 return DBuilder.createFunction(
3349 DContext, Name, LinkageName, Unit, Line,
3350 getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
3351 TParamsArray.get(), getFunctionDeclaration(FD));
3352 }
3353
3354 llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(
3355 DContext, Name, LinkageName, Unit, Line,
3356 getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
3357 TParamsArray.get(), getFunctionDeclaration(FD));
3358 const FunctionDecl *CanonDecl = FD->getCanonicalDecl();
3359 FwdDeclReplaceMap.emplace_back(std::piecewise_construct,
3360 std::make_tuple(CanonDecl),
3361 std::make_tuple(SP));
3362 return SP;
3363}
3364
3365llvm::DISubprogram *CGDebugInfo::getFunctionForwardDeclaration(GlobalDecl GD) {
3366 return getFunctionFwdDeclOrStub(GD, /* Stub = */ false);
3367}
3368
3369llvm::DISubprogram *CGDebugInfo::getFunctionStub(GlobalDecl GD) {
3370 return getFunctionFwdDeclOrStub(GD, /* Stub = */ true);
3371}
3372
3373llvm::DIGlobalVariable *
3374CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {
3375 QualType T;
3376 StringRef Name, LinkageName;
3377 SourceLocation Loc = VD->getLocation();
3378 llvm::DIFile *Unit = getOrCreateFile(Loc);
3379 llvm::DIScope *DContext = Unit;
3380 unsigned Line = getLineNumber(Loc);
3381 llvm::MDTuple *TemplateParameters = nullptr;
3382
3383 collectVarDeclProps(VD, Unit, Line, T, Name, LinkageName, TemplateParameters,
3384 DContext);
3385 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
3386 auto *GV = DBuilder.createTempGlobalVariableFwdDecl(
3387 DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit),
3388 !VD->isExternallyVisible(), nullptr, TemplateParameters, Align);
3389 FwdDeclReplaceMap.emplace_back(
3390 std::piecewise_construct,
3391 std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())),
3392 std::make_tuple(static_cast<llvm::Metadata *>(GV)));
3393 return GV;
3394}
3395
3396llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) {
3397 // We only need a declaration (not a definition) of the type - so use whatever
3398 // we would otherwise do to get a type for a pointee. (forward declarations in
3399 // limited debug info, full definitions (if the type definition is available)
3400 // in unlimited debug info)
3401 if (const auto *TD = dyn_cast<TypeDecl>(D))
3402 return getOrCreateType(CGM.getContext().getTypeDeclType(TD),
3403 getOrCreateFile(TD->getLocation()));
3404 auto I = DeclCache.find(D->getCanonicalDecl());
3405
3406 if (I != DeclCache.end()) {
3407 auto N = I->second;
3408 if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(N))
3409 return GVE->getVariable();
3410 return dyn_cast_or_null<llvm::DINode>(N);
3411 }
3412
3413 // No definition for now. Emit a forward definition that might be
3414 // merged with a potential upcoming definition.
3415 if (const auto *FD = dyn_cast<FunctionDecl>(D))
3416 return getFunctionForwardDeclaration(FD);
3417 else if (const auto *VD = dyn_cast<VarDecl>(D))
3418 return getGlobalVariableForwardDeclaration(VD);
3419
3420 return nullptr;
3421}
3422
3423llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) {
3424 if (!D || DebugKind <= codegenoptions::DebugLineTablesOnly)
3425 return nullptr;
3426
3427 const auto *FD = dyn_cast<FunctionDecl>(D);
3428 if (!FD)
3429 return nullptr;
3430
3431 // Setup context.
3432 auto *S = getDeclContextDescriptor(D);
3433
3434 auto MI = SPCache.find(FD->getCanonicalDecl());
3435 if (MI == SPCache.end()) {
3436 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) {
3437 return CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()),
3438 cast<llvm::DICompositeType>(S));
3439 }
3440 }
3441 if (MI != SPCache.end()) {
3442 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
3443 if (SP && !SP->isDefinition())
3444 return SP;
3445 }
3446
3447 for (auto NextFD : FD->redecls()) {
3448 auto MI = SPCache.find(NextFD->getCanonicalDecl());
3449 if (MI != SPCache.end()) {
3450 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
3451 if (SP && !SP->isDefinition())
3452 return SP;
3453 }
3454 }
3455 return nullptr;
3456}
3457
3458// getOrCreateFunctionType - Construct type. If it is a c++ method, include
3459// implicit parameter "this".
3460llvm::DISubroutineType *CGDebugInfo::getOrCreateFunctionType(const Decl *D,
3461 QualType FnType,
3462 llvm::DIFile *F) {
3463 if (!D || DebugKind <= codegenoptions::DebugLineTablesOnly)
3464 // Create fake but valid subroutine type. Otherwise -verify would fail, and
3465 // subprogram DIE will miss DW_AT_decl_file and DW_AT_decl_line fields.
3466 return DBuilder.createSubroutineType(DBuilder.getOrCreateTypeArray(None));
3467
3468 if (const auto *Method = dyn_cast<CXXMethodDecl>(D))
3469 return getOrCreateMethodType(Method, F);
3470
3471 const auto *FTy = FnType->getAs<FunctionType>();
3472 CallingConv CC = FTy ? FTy->getCallConv() : CallingConv::CC_C;
3473
3474 if (const auto *OMethod = dyn_cast<ObjCMethodDecl>(D)) {
3475 // Add "self" and "_cmd"
3476 SmallVector<llvm::Metadata *, 16> Elts;
3477
3478 // First element is always return type. For 'void' functions it is NULL.
3479 QualType ResultTy = OMethod->getReturnType();
3480
3481 // Replace the instancetype keyword with the actual type.
3482 if (ResultTy == CGM.getContext().getObjCInstanceType())
3483 ResultTy = CGM.getContext().getPointerType(
3484 QualType(OMethod->getClassInterface()->getTypeForDecl(), 0));
3485
3486 Elts.push_back(getOrCreateType(ResultTy, F));
3487 // "self" pointer is always first argument.
3488 QualType SelfDeclTy;
3489 if (auto *SelfDecl = OMethod->getSelfDecl())
3490 SelfDeclTy = SelfDecl->getType();
3491 else if (auto *FPT = dyn_cast<FunctionProtoType>(FnType))
3492 if (FPT->getNumParams() > 1)
3493 SelfDeclTy = FPT->getParamType(0);
3494 if (!SelfDeclTy.isNull())
3495 Elts.push_back(
3496 CreateSelfType(SelfDeclTy, getOrCreateType(SelfDeclTy, F)));
3497 // "_cmd" pointer is always second argument.
3498 Elts.push_back(DBuilder.createArtificialType(
3499 getOrCreateType(CGM.getContext().getObjCSelType(), F)));
3500 // Get rest of the arguments.
3501 for (const auto *PI : OMethod->parameters())
3502 Elts.push_back(getOrCreateType(PI->getType(), F));
3503 // Variadic methods need a special marker at the end of the type list.
3504 if (OMethod->isVariadic())
3505 Elts.push_back(DBuilder.createUnspecifiedParameter());
3506
3507 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
3508 return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero,
3509 getDwarfCC(CC));
3510 }
3511
3512 // Handle variadic function types; they need an additional
3513 // unspecified parameter.
3514 if (const auto *FD = dyn_cast<FunctionDecl>(D))
3515 if (FD->isVariadic()) {
3516 SmallVector<llvm::Metadata *, 16> EltTys;
3517 EltTys.push_back(getOrCreateType(FD->getReturnType(), F));
3518 if (const auto *FPT = dyn_cast<FunctionProtoType>(FnType))
3519 for (QualType ParamType : FPT->param_types())
3520 EltTys.push_back(getOrCreateType(ParamType, F));
3521 EltTys.push_back(DBuilder.createUnspecifiedParameter());
3522 llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);
3523 return DBuilder.createSubroutineType(EltTypeArray, llvm::DINode::FlagZero,
3524 getDwarfCC(CC));
3525 }
3526
3527 return cast<llvm::DISubroutineType>(getOrCreateType(FnType, F));
3528}
3529
3530void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, SourceLocation Loc,
3531 SourceLocation ScopeLoc, QualType FnType,
3532 llvm::Function *Fn, bool CurFuncIsThunk,
3533 CGBuilderTy &Builder) {
3534
3535 StringRef Name;
3536 StringRef LinkageName;
3537
3538 FnBeginRegionCount.push_back(LexicalBlockStack.size());
3539
3540 const Decl *D = GD.getDecl();
3541 bool HasDecl = (D != nullptr);
3542
3543 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3544 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
3545 llvm::DIFile *Unit = getOrCreateFile(Loc);
3546 llvm::DIScope *FDContext = Unit;
3547 llvm::DINodeArray TParamsArray;
3548 if (!HasDecl) {
3549 // Use llvm function name.
3550 LinkageName = Fn->getName();
3551 } else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
3552 // If there is a subprogram for this function available then use it.
3553 auto FI = SPCache.find(FD->getCanonicalDecl());
3554 if (FI != SPCache.end()) {
3555 auto *SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
3556 if (SP && SP->isDefinition()) {
3557 LexicalBlockStack.emplace_back(SP);
3558 RegionMap[D].reset(SP);
3559 return;
3560 }
3561 }
3562 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
3563 TParamsArray, Flags);
3564 } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
3565 Name = getObjCMethodName(OMD);
3566 Flags |= llvm::DINode::FlagPrototyped;
3567 } else if (isa<VarDecl>(D) &&
3568 GD.getDynamicInitKind() != DynamicInitKind::NoStub) {
3569 // This is a global initializer or atexit destructor for a global variable.
3570 Name = getDynamicInitializerName(cast<VarDecl>(D), GD.getDynamicInitKind(),
3571 Fn);
3572 } else {
3573 // Use llvm function name.
3574 Name = Fn->getName();
3575 Flags |= llvm::DINode::FlagPrototyped;
3576 }
3577 if (Name.startswith("\01"))
3578 Name = Name.substr(1);
3579
3580 if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>()) {
3581 Flags |= llvm::DINode::FlagArtificial;
3582 // Artificial functions should not silently reuse CurLoc.
3583 CurLoc = SourceLocation();
3584 }
3585
3586 if (CurFuncIsThunk)
3587 Flags |= llvm::DINode::FlagThunk;
3588
3589 if (Fn->hasLocalLinkage())
3590 SPFlags |= llvm::DISubprogram::SPFlagLocalToUnit;
3591 if (CGM.getLangOpts().Optimize)
3592 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
3593
3594 llvm::DINode::DIFlags FlagsForDef = Flags | getCallSiteRelatedAttrs();
3595 llvm::DISubprogram::DISPFlags SPFlagsForDef =
3596 SPFlags | llvm::DISubprogram::SPFlagDefinition;
3597
3598 unsigned LineNo = getLineNumber(Loc);
3599 unsigned ScopeLine = getLineNumber(ScopeLoc);
3600
3601 // FIXME: The function declaration we're constructing here is mostly reusing
3602 // declarations from CXXMethodDecl and not constructing new ones for arbitrary
3603 // FunctionDecls. When/if we fix this we can have FDContext be TheCU/null for
3604 // all subprograms instead of the actual context since subprogram definitions
3605 // are emitted as CU level entities by the backend.
3606 llvm::DISubprogram *SP = DBuilder.createFunction(
3607 FDContext, Name, LinkageName, Unit, LineNo,
3608 getOrCreateFunctionType(D, FnType, Unit), ScopeLine, FlagsForDef,
3609 SPFlagsForDef, TParamsArray.get(), getFunctionDeclaration(D));
3610 Fn->setSubprogram(SP);
3611 // We might get here with a VarDecl in the case we're generating
3612 // code for the initialization of globals. Do not record these decls
3613 // as they will overwrite the actual VarDecl Decl in the cache.
3614 if (HasDecl && isa<FunctionDecl>(D))
3615 DeclCache[D->getCanonicalDecl()].reset(SP);
3616
3617 // We use the SPDefCache only in the case when the debug entry values option
3618 // is set, in order to speed up parameters modification analysis.
3619 //
3620 // FIXME: Use AbstractCallee here to support ObjCMethodDecl.
3621 if (CGM.getCodeGenOpts().EnableDebugEntryValues && HasDecl)
3622 if (auto *FD = dyn_cast<FunctionDecl>(D))
3623 if (FD->hasBody() && !FD->param_empty())
3624 SPDefCache[FD].reset(SP);
3625
3626 if (CGM.getCodeGenOpts().DwarfVersion >= 5) {
3627 // Starting with DWARF V5 method declarations are emitted as children of
3628 // the interface type.
3629 if (const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
3630 const ObjCInterfaceDecl *ID = OMD->getClassInterface();
3631 QualType QTy(ID->getTypeForDecl(), 0);
3632 auto It = TypeCache.find(QTy.getAsOpaquePtr());
3633 if (It != TypeCache.end()) {
3634 llvm::DICompositeType *InterfaceDecl =
3635 cast<llvm::DICompositeType>(It->second);
3636 llvm::DISubprogram *FD = DBuilder.createFunction(
3637 InterfaceDecl, Name, LinkageName, Unit, LineNo,
3638 getOrCreateFunctionType(D, FnType, Unit), ScopeLine, Flags, SPFlags,
3639 TParamsArray.get());
3640 DBuilder.finalizeSubprogram(FD);
3641 ObjCMethodCache[ID].push_back(FD);
3642 }
3643 }
3644 }
3645
3646 // Push the function onto the lexical block stack.
3647 LexicalBlockStack.emplace_back(SP);
3648
3649 if (HasDecl)
3650 RegionMap[D].reset(SP);
3651}
3652
3653void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc,
3654 QualType FnType, llvm::Function *Fn) {
3655 StringRef Name;
3656 StringRef LinkageName;
3657
3658 const Decl *D = GD.getDecl();
3659 if (!D)
3660 return;
3661
3662 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3663 llvm::DIFile *Unit = getOrCreateFile(Loc);
3664 bool IsDeclForCallSite = Fn ? true : false;
3665 llvm::DIScope *FDContext =
3666 IsDeclForCallSite ? Unit : getDeclContextDescriptor(D);
3667 llvm::DINodeArray TParamsArray;
3668 if (isa<FunctionDecl>(D)) {
3669 // If there is a DISubprogram for this function available then use it.
3670 collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
3671 TParamsArray, Flags);
3672 } else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(D)) {
3673 Name = getObjCMethodName(OMD);
3674 Flags |= llvm::DINode::FlagPrototyped;
3675 } else {
3676 llvm_unreachable("not a function or ObjC method")::llvm::llvm_unreachable_internal("not a function or ObjC method"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3676)
;
3677 }
3678 if (!Name.empty() && Name[0] == '\01')
3679 Name = Name.substr(1);
3680
3681 if (D->isImplicit()) {
3682 Flags |= llvm::DINode::FlagArtificial;
3683 // Artificial functions without a location should not silently reuse CurLoc.
3684 if (Loc.isInvalid())
3685 CurLoc = SourceLocation();
3686 }
3687 unsigned LineNo = getLineNumber(Loc);
3688 unsigned ScopeLine = 0;
3689 llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
3690 if (CGM.getLangOpts().Optimize)
3691 SPFlags |= llvm::DISubprogram::SPFlagOptimized;
3692
3693 llvm::DISubprogram *SP = DBuilder.createFunction(
3694 FDContext, Name, LinkageName, Unit, LineNo,
3695 getOrCreateFunctionType(D, FnType, Unit), ScopeLine, Flags, SPFlags,
3696 TParamsArray.get(), getFunctionDeclaration(D));
3697
3698 if (IsDeclForCallSite)
3699 Fn->setSubprogram(SP);
3700
3701 DBuilder.retainType(SP);
3702}
3703
3704void CGDebugInfo::EmitFuncDeclForCallSite(llvm::CallBase *CallOrInvoke,
3705 QualType CalleeType,
3706 const FunctionDecl *CalleeDecl) {
3707 auto &CGOpts = CGM.getCodeGenOpts();
3708 if (!CGOpts.EnableDebugEntryValues || !CGM.getLangOpts().Optimize ||
3709 !CallOrInvoke)
3710 return;
3711
3712 auto *Func = CallOrInvoke->getCalledFunction();
3713 if (!Func)
3714 return;
3715
3716 // If there is no DISubprogram attached to the function being called,
3717 // create the one describing the function in order to have complete
3718 // call site debug info.
3719 if (Func->getSubprogram())
3720 return;
3721
3722 if (!CalleeDecl->isStatic() && !CalleeDecl->isInlined())
3723 EmitFunctionDecl(CalleeDecl, CalleeDecl->getLocation(), CalleeType, Func);
3724}
3725
3726void CGDebugInfo::EmitInlineFunctionStart(CGBuilderTy &Builder, GlobalDecl GD) {
3727 const auto *FD = cast<FunctionDecl>(GD.getDecl());
3728 // If there is a subprogram for this function available then use it.
3729 auto FI = SPCache.find(FD->getCanonicalDecl());
3730 llvm::DISubprogram *SP = nullptr;
3731 if (FI != SPCache.end())
3732 SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second);
3733 if (!SP || !SP->isDefinition())
3734 SP = getFunctionStub(GD);
3735 FnBeginRegionCount.push_back(LexicalBlockStack.size());
3736 LexicalBlockStack.emplace_back(SP);
3737 setInlinedAt(Builder.getCurrentDebugLocation());
3738 EmitLocation(Builder, FD->getLocation());
3739}
3740
3741void CGDebugInfo::EmitInlineFunctionEnd(CGBuilderTy &Builder) {
3742 assert(CurInlinedAt && "unbalanced inline scope stack")((CurInlinedAt && "unbalanced inline scope stack") ? static_cast
<void> (0) : __assert_fail ("CurInlinedAt && \"unbalanced inline scope stack\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3742, __PRETTY_FUNCTION__))
;
3743 EmitFunctionEnd(Builder, nullptr);
3744 setInlinedAt(llvm::DebugLoc(CurInlinedAt).getInlinedAt());
3745}
3746
3747void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {
3748 // Update our current location
3749 setLocation(Loc);
3750
3751 if (CurLoc.isInvalid() || CurLoc.isMacroID() || LexicalBlockStack.empty())
3752 return;
3753
3754 llvm::MDNode *Scope = LexicalBlockStack.back();
3755 Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(
3756 getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope, CurInlinedAt));
3757}
3758
3759void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
3760 llvm::MDNode *Back = nullptr;
3761 if (!LexicalBlockStack.empty())
3762 Back = LexicalBlockStack.back().get();
3763 LexicalBlockStack.emplace_back(DBuilder.createLexicalBlock(
3764 cast<llvm::DIScope>(Back), getOrCreateFile(CurLoc), getLineNumber(CurLoc),
3765 getColumnNumber(CurLoc)));
3766}
3767
3768void CGDebugInfo::AppendAddressSpaceXDeref(
3769 unsigned AddressSpace, SmallVectorImpl<int64_t> &Expr) const {
3770 Optional<unsigned> DWARFAddressSpace =
3771 CGM.getTarget().getDWARFAddressSpace(AddressSpace);
3772 if (!DWARFAddressSpace)
3773 return;
3774
3775 Expr.push_back(llvm::dwarf::DW_OP_constu);
3776 Expr.push_back(DWARFAddressSpace.getValue());
3777 Expr.push_back(llvm::dwarf::DW_OP_swap);
3778 Expr.push_back(llvm::dwarf::DW_OP_xderef);
3779}
3780
3781void CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder,
3782 SourceLocation Loc) {
3783 // Set our current location.
3784 setLocation(Loc);
3785
3786 // Emit a line table change for the current location inside the new scope.
3787 Builder.SetCurrentDebugLocation(
3788 llvm::DebugLoc::get(getLineNumber(Loc), getColumnNumber(Loc),
3789 LexicalBlockStack.back(), CurInlinedAt));
3790
3791 if (DebugKind <= codegenoptions::DebugLineTablesOnly)
3792 return;
3793
3794 // Create a new lexical block and push it on the stack.
3795 CreateLexicalBlock(Loc);
3796}
3797
3798void CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder,
3799 SourceLocation Loc) {
3800 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!")((!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"
) ? static_cast<void> (0) : __assert_fail ("!LexicalBlockStack.empty() && \"Region stack mismatch, stack empty!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3800, __PRETTY_FUNCTION__))
;
3801
3802 // Provide an entry in the line table for the end of the block.
3803 EmitLocation(Builder, Loc);
3804
3805 if (DebugKind <= codegenoptions::DebugLineTablesOnly)
3806 return;
3807
3808 LexicalBlockStack.pop_back();
3809}
3810
3811void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder, llvm::Function *Fn) {
3812 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!")((!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"
) ? static_cast<void> (0) : __assert_fail ("!LexicalBlockStack.empty() && \"Region stack mismatch, stack empty!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3812, __PRETTY_FUNCTION__))
;
3813 unsigned RCount = FnBeginRegionCount.back();
3814 assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch")((RCount <= LexicalBlockStack.size() && "Region stack mismatch"
) ? static_cast<void> (0) : __assert_fail ("RCount <= LexicalBlockStack.size() && \"Region stack mismatch\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3814, __PRETTY_FUNCTION__))
;
3815
3816 // Pop all regions for this function.
3817 while (LexicalBlockStack.size() != RCount) {
3818 // Provide an entry in the line table for the end of the block.
3819 EmitLocation(Builder, CurLoc);
3820 LexicalBlockStack.pop_back();
3821 }
3822 FnBeginRegionCount.pop_back();
3823
3824 if (Fn && Fn->getSubprogram())
3825 DBuilder.finalizeSubprogram(Fn->getSubprogram());
3826}
3827
3828CGDebugInfo::BlockByRefType
3829CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
3830 uint64_t *XOffset) {
3831 SmallVector<llvm::Metadata *, 5> EltTys;
3832 QualType FType;
3833 uint64_t FieldSize, FieldOffset;
3834 uint32_t FieldAlign;
3835
3836 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
3837 QualType Type = VD->getType();
3838
3839 FieldOffset = 0;
3840 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
3841 EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset));
3842 EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset));
3843 FType = CGM.getContext().IntTy;
3844 EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset));
3845 EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset));
3846
3847 bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD);
3848 if (HasCopyAndDispose) {
3849 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
3850 EltTys.push_back(
3851 CreateMemberType(Unit, FType, "__copy_helper", &FieldOffset));
3852 EltTys.push_back(
3853 CreateMemberType(Unit, FType, "__destroy_helper", &FieldOffset));
3854 }
3855 bool HasByrefExtendedLayout;
3856 Qualifiers::ObjCLifetime Lifetime;
3857 if (CGM.getContext().getByrefLifetime(Type, Lifetime,
3858 HasByrefExtendedLayout) &&
3859 HasByrefExtendedLayout) {
3860 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
3861 EltTys.push_back(
3862 CreateMemberType(Unit, FType, "__byref_variable_layout", &FieldOffset));
3863 }
3864
3865 CharUnits Align = CGM.getContext().getDeclAlign(VD);
3866 if (Align > CGM.getContext().toCharUnitsFromBits(
3867 CGM.getTarget().getPointerAlign(0))) {
3868 CharUnits FieldOffsetInBytes =
3869 CGM.getContext().toCharUnitsFromBits(FieldOffset);
3870 CharUnits AlignedOffsetInBytes = FieldOffsetInBytes.alignTo(Align);
3871 CharUnits NumPaddingBytes = AlignedOffsetInBytes - FieldOffsetInBytes;
3872
3873 if (NumPaddingBytes.isPositive()) {
3874 llvm::APInt pad(32, NumPaddingBytes.getQuantity());
3875 FType = CGM.getContext().getConstantArrayType(
3876 CGM.getContext().CharTy, pad, nullptr, ArrayType::Normal, 0);
3877 EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset));
3878 }
3879 }
3880
3881 FType = Type;
3882 llvm::DIType *WrappedTy = getOrCreateType(FType, Unit);
3883 FieldSize = CGM.getContext().getTypeSize(FType);
3884 FieldAlign = CGM.getContext().toBits(Align);
3885
3886 *XOffset = FieldOffset;
3887 llvm::DIType *FieldTy = DBuilder.createMemberType(
3888 Unit, VD->getName(), Unit, 0, FieldSize, FieldAlign, FieldOffset,
3889 llvm::DINode::FlagZero, WrappedTy);
3890 EltTys.push_back(FieldTy);
3891 FieldOffset += FieldSize;
3892
3893 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
3894 return {DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0,
3895 llvm::DINode::FlagZero, nullptr, Elements),
3896 WrappedTy};
3897}
3898
3899llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
3900 llvm::Value *Storage,
3901 llvm::Optional<unsigned> ArgNo,
3902 CGBuilderTy &Builder,
3903 const bool UsePointerValue) {
3904 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3904, __PRETTY_FUNCTION__))
;
3905 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!")((!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"
) ? static_cast<void> (0) : __assert_fail ("!LexicalBlockStack.empty() && \"Region stack mismatch, stack empty!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 3905, __PRETTY_FUNCTION__))
;
3906 if (VD->hasAttr<NoDebugAttr>())
3907 return nullptr;
3908
3909 bool Unwritten =
3910 VD->isImplicit() || (isa<Decl>(VD->getDeclContext()) &&
3911 cast<Decl>(VD->getDeclContext())->isImplicit());
3912 llvm::DIFile *Unit = nullptr;
3913 if (!Unwritten)
3914 Unit = getOrCreateFile(VD->getLocation());
3915 llvm::DIType *Ty;
3916 uint64_t XOffset = 0;
3917 if (VD->hasAttr<BlocksAttr>())
3918 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
3919 else
3920 Ty = getOrCreateType(VD->getType(), Unit);
3921
3922 // If there is no debug info for this type then do not emit debug info
3923 // for this variable.
3924 if (!Ty)
3925 return nullptr;
3926
3927 // Get location information.
3928 unsigned Line = 0;
3929 unsigned Column = 0;
3930 if (!Unwritten) {
3931 Line = getLineNumber(VD->getLocation());
3932 Column = getColumnNumber(VD->getLocation());
3933 }
3934 SmallVector<int64_t, 13> Expr;
3935 llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
3936 if (VD->isImplicit())
3937 Flags |= llvm::DINode::FlagArtificial;
3938
3939 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
3940
3941 unsigned AddressSpace = CGM.getContext().getTargetAddressSpace(VD->getType());
3942 AppendAddressSpaceXDeref(AddressSpace, Expr);
3943
3944 // If this is implicit parameter of CXXThis or ObjCSelf kind, then give it an
3945 // object pointer flag.
3946 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD)) {
3947 if (IPD->getParameterKind() == ImplicitParamDecl::CXXThis ||
3948 IPD->getParameterKind() == ImplicitParamDecl::ObjCSelf)
3949 Flags |= llvm::DINode::FlagObjectPointer;
3950 }
3951
3952 // Note: Older versions of clang used to emit byval references with an extra
3953 // DW_OP_deref, because they referenced the IR arg directly instead of
3954 // referencing an alloca. Newer versions of LLVM don't treat allocas
3955 // differently from other function arguments when used in a dbg.declare.
3956 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
3957 StringRef Name = VD->getName();
3958 if (!Name.empty()) {
3959 if (VD->hasAttr<BlocksAttr>()) {
3960 // Here, we need an offset *into* the alloca.
3961 CharUnits offset = CharUnits::fromQuantity(32);
3962 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
3963 // offset of __forwarding field
3964 offset = CGM.getContext().toCharUnitsFromBits(
3965 CGM.getTarget().getPointerWidth(0));
3966 Expr.push_back(offset.getQuantity());
3967 Expr.push_back(llvm::dwarf::DW_OP_deref);
3968 Expr.push_back(llvm::dwarf::DW_OP_plus_uconst);
3969 // offset of x field
3970 offset = CGM.getContext().toCharUnitsFromBits(XOffset);
3971 Expr.push_back(offset.getQuantity());
3972 }
3973 } else if (const auto *RT = dyn_cast<RecordType>(VD->getType())) {
3974 // If VD is an anonymous union then Storage represents value for
3975 // all union fields.
3976 const RecordDecl *RD = RT->getDecl();
3977 if (RD->isUnion() && RD->isAnonymousStructOrUnion()) {
3978 // GDB has trouble finding local variables in anonymous unions, so we emit
3979 // artificial local variables for each of the members.
3980 //
3981 // FIXME: Remove this code as soon as GDB supports this.
3982 // The debug info verifier in LLVM operates based on the assumption that a
3983 // variable has the same size as its storage and we had to disable the
3984 // check for artificial variables.
3985 for (const auto *Field : RD->fields()) {
3986 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
3987 StringRef FieldName = Field->getName();
3988
3989 // Ignore unnamed fields. Do not ignore unnamed records.
3990 if (FieldName.empty() && !isa<RecordType>(Field->getType()))
3991 continue;
3992
3993 // Use VarDecl's Tag, Scope and Line number.
3994 auto FieldAlign = getDeclAlignIfRequired(Field, CGM.getContext());
3995 auto *D = DBuilder.createAutoVariable(
3996 Scope, FieldName, Unit, Line, FieldTy, CGM.getLangOpts().Optimize,
3997 Flags | llvm::DINode::FlagArtificial, FieldAlign);
3998
3999 // Insert an llvm.dbg.declare into the current block.
4000 DBuilder.insertDeclare(
4001 Storage, D, DBuilder.createExpression(Expr),
4002 llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt),
4003 Builder.GetInsertBlock());
4004 }
4005 }
4006 }
4007
4008 // Clang stores the sret pointer provided by the caller in a static alloca.
4009 // Use DW_OP_deref to tell the debugger to load the pointer and treat it as
4010 // the address of the variable.
4011 if (UsePointerValue) {
4012 assert(std::find(Expr.begin(), Expr.end(), llvm::dwarf::DW_OP_deref) ==((std::find(Expr.begin(), Expr.end(), llvm::dwarf::DW_OP_deref
) == Expr.end() && "Debug info already contains DW_OP_deref."
) ? static_cast<void> (0) : __assert_fail ("std::find(Expr.begin(), Expr.end(), llvm::dwarf::DW_OP_deref) == Expr.end() && \"Debug info already contains DW_OP_deref.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4014, __PRETTY_FUNCTION__))
4013 Expr.end() &&((std::find(Expr.begin(), Expr.end(), llvm::dwarf::DW_OP_deref
) == Expr.end() && "Debug info already contains DW_OP_deref."
) ? static_cast<void> (0) : __assert_fail ("std::find(Expr.begin(), Expr.end(), llvm::dwarf::DW_OP_deref) == Expr.end() && \"Debug info already contains DW_OP_deref.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4014, __PRETTY_FUNCTION__))
4014 "Debug info already contains DW_OP_deref.")((std::find(Expr.begin(), Expr.end(), llvm::dwarf::DW_OP_deref
) == Expr.end() && "Debug info already contains DW_OP_deref."
) ? static_cast<void> (0) : __assert_fail ("std::find(Expr.begin(), Expr.end(), llvm::dwarf::DW_OP_deref) == Expr.end() && \"Debug info already contains DW_OP_deref.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4014, __PRETTY_FUNCTION__))
;
4015 Expr.push_back(llvm::dwarf::DW_OP_deref);
4016 }
4017
4018 // Create the descriptor for the variable.
4019 auto *D = ArgNo ? DBuilder.createParameterVariable(
4020 Scope, Name, *ArgNo, Unit, Line, Ty,
4021 CGM.getLangOpts().Optimize, Flags)
4022 : DBuilder.createAutoVariable(Scope, Name, Unit, Line, Ty,
4023 CGM.getLangOpts().Optimize,
4024 Flags, Align);
4025
4026 // Insert an llvm.dbg.declare into the current block.
4027 DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
4028 llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt),
4029 Builder.GetInsertBlock());
4030
4031 if (CGM.getCodeGenOpts().EnableDebugEntryValues && ArgNo) {
4032 if (auto *PD = dyn_cast<ParmVarDecl>(VD))
4033 ParamCache[PD].reset(D);
4034 }
4035
4036 return D;
4037}
4038
4039llvm::DILocalVariable *
4040CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, llvm::Value *Storage,
4041 CGBuilderTy &Builder,
4042 const bool UsePointerValue) {
4043 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4043, __PRETTY_FUNCTION__))
;
4044 return EmitDeclare(VD, Storage, llvm::None, Builder, UsePointerValue);
4045}
4046
4047void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
4048 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4048, __PRETTY_FUNCTION__))
;
4049 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!")((!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"
) ? static_cast<void> (0) : __assert_fail ("!LexicalBlockStack.empty() && \"Region stack mismatch, stack empty!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4049, __PRETTY_FUNCTION__))
;
4050
4051 if (D->hasAttr<NoDebugAttr>())
4052 return;
4053
4054 auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
4055 llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
4056
4057 // Get location information.
4058 unsigned Line = getLineNumber(D->getLocation());
4059 unsigned Column = getColumnNumber(D->getLocation());
4060
4061 StringRef Name = D->getName();
4062
4063 // Create the descriptor for the label.
4064 auto *L =
4065 DBuilder.createLabel(Scope, Name, Unit, Line, CGM.getLangOpts().Optimize);
4066
4067 // Insert an llvm.dbg.label into the current block.
4068 DBuilder.insertLabel(L,
4069 llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt),
4070 Builder.GetInsertBlock());
4071}
4072
4073llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy,
4074 llvm::DIType *Ty) {
4075 llvm::DIType *CachedTy = getTypeOrNull(QualTy);
4076 if (CachedTy)
4077 Ty = CachedTy;
4078 return DBuilder.createObjectPointerType(Ty);
4079}
4080
4081void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
4082 const VarDecl *VD, llvm::Value *Storage, CGBuilderTy &Builder,
4083 const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) {
4084 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4084, __PRETTY_FUNCTION__))
;
4085 assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!")((!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"
) ? static_cast<void> (0) : __assert_fail ("!LexicalBlockStack.empty() && \"Region stack mismatch, stack empty!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4085, __PRETTY_FUNCTION__))
;
4086
4087 if (Builder.GetInsertBlock() == nullptr)
4088 return;
4089 if (VD->hasAttr<NoDebugAttr>())
4090 return;
4091
4092 bool isByRef = VD->hasAttr<BlocksAttr>();
4093
4094 uint64_t XOffset = 0;
4095 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
4096 llvm::DIType *Ty;
4097 if (isByRef)
4098 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
4099 else
4100 Ty = getOrCreateType(VD->getType(), Unit);
4101
4102 // Self is passed along as an implicit non-arg variable in a
4103 // block. Mark it as the object pointer.
4104 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(VD))
4105 if (IPD->getParameterKind() == ImplicitParamDecl::ObjCSelf)
4106 Ty = CreateSelfType(VD->getType(), Ty);
4107
4108 // Get location information.
4109 unsigned Line = getLineNumber(VD->getLocation());
4110 unsigned Column = getColumnNumber(VD->getLocation());
4111
4112 const llvm::DataLayout &target = CGM.getDataLayout();
4113
4114 CharUnits offset = CharUnits::fromQuantity(
4115 target.getStructLayout(blockInfo.StructureType)
4116 ->getElementOffset(blockInfo.getCapture(VD).getIndex()));
4117
4118 SmallVector<int64_t, 9> addr;
4119 addr.push_back(llvm::dwarf::DW_OP_deref);
4120 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4121 addr.push_back(offset.getQuantity());
4122 if (isByRef) {
4123 addr.push_back(llvm::dwarf::DW_OP_deref);
4124 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4125 // offset of __forwarding field
4126 offset =
4127 CGM.getContext().toCharUnitsFromBits(target.getPointerSizeInBits(0));
4128 addr.push_back(offset.getQuantity());
4129 addr.push_back(llvm::dwarf::DW_OP_deref);
4130 addr.push_back(llvm::dwarf::DW_OP_plus_uconst);
4131 // offset of x field
4132 offset = CGM.getContext().toCharUnitsFromBits(XOffset);
4133 addr.push_back(offset.getQuantity());
4134 }
4135
4136 // Create the descriptor for the variable.
4137 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
4138 auto *D = DBuilder.createAutoVariable(
4139 cast<llvm::DILocalScope>(LexicalBlockStack.back()), VD->getName(), Unit,
4140 Line, Ty, false, llvm::DINode::FlagZero, Align);
4141
4142 // Insert an llvm.dbg.declare into the current block.
4143 auto DL =
4144 llvm::DebugLoc::get(Line, Column, LexicalBlockStack.back(), CurInlinedAt);
4145 auto *Expr = DBuilder.createExpression(addr);
4146 if (InsertPoint)
4147 DBuilder.insertDeclare(Storage, D, Expr, DL, InsertPoint);
4148 else
4149 DBuilder.insertDeclare(Storage, D, Expr, DL, Builder.GetInsertBlock());
4150}
4151
4152void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI,
4153 unsigned ArgNo,
4154 CGBuilderTy &Builder) {
4155 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4155, __PRETTY_FUNCTION__))
;
4156 EmitDeclare(VD, AI, ArgNo, Builder);
4157}
4158
4159namespace {
4160struct BlockLayoutChunk {
4161 uint64_t OffsetInBits;
4162 const BlockDecl::Capture *Capture;
4163};
4164bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) {
4165 return l.OffsetInBits < r.OffsetInBits;
4166}
4167} // namespace
4168
4169void CGDebugInfo::collectDefaultFieldsForBlockLiteralDeclare(
4170 const CGBlockInfo &Block, const ASTContext &Context, SourceLocation Loc,
4171 const llvm::StructLayout &BlockLayout, llvm::DIFile *Unit,
4172 SmallVectorImpl<llvm::Metadata *> &Fields) {
4173 // Blocks in OpenCL have unique constraints which make the standard fields
4174 // redundant while requiring size and align fields for enqueue_kernel. See
4175 // initializeForBlockHeader in CGBlocks.cpp
4176 if (CGM.getLangOpts().OpenCL) {
4177 Fields.push_back(createFieldType("__size", Context.IntTy, Loc, AS_public,
4178 BlockLayout.getElementOffsetInBits(0),
4179 Unit, Unit));
4180 Fields.push_back(createFieldType("__align", Context.IntTy, Loc, AS_public,
4181 BlockLayout.getElementOffsetInBits(1),
4182 Unit, Unit));
4183 } else {
4184 Fields.push_back(createFieldType("__isa", Context.VoidPtrTy, Loc, AS_public,
4185 BlockLayout.getElementOffsetInBits(0),
4186 Unit, Unit));
4187 Fields.push_back(createFieldType("__flags", Context.IntTy, Loc, AS_public,
4188 BlockLayout.getElementOffsetInBits(1),
4189 Unit, Unit));
4190 Fields.push_back(
4191 createFieldType("__reserved", Context.IntTy, Loc, AS_public,
4192 BlockLayout.getElementOffsetInBits(2), Unit, Unit));
4193 auto *FnTy = Block.getBlockExpr()->getFunctionType();
4194 auto FnPtrType = CGM.getContext().getPointerType(FnTy->desugar());
4195 Fields.push_back(createFieldType("__FuncPtr", FnPtrType, Loc, AS_public,
4196 BlockLayout.getElementOffsetInBits(3),
4197 Unit, Unit));
4198 Fields.push_back(createFieldType(
4199 "__descriptor",
4200 Context.getPointerType(Block.NeedsCopyDispose
4201 ? Context.getBlockDescriptorExtendedType()
4202 : Context.getBlockDescriptorType()),
4203 Loc, AS_public, BlockLayout.getElementOffsetInBits(4), Unit, Unit));
4204 }
4205}
4206
4207void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
4208 StringRef Name,
4209 unsigned ArgNo,
4210 llvm::AllocaInst *Alloca,
4211 CGBuilderTy &Builder) {
4212 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4212, __PRETTY_FUNCTION__))
;
4213 ASTContext &C = CGM.getContext();
4214 const BlockDecl *blockDecl = block.getBlockDecl();
4215
4216 // Collect some general information about the block's location.
4217 SourceLocation loc = blockDecl->getCaretLocation();
4218 llvm::DIFile *tunit = getOrCreateFile(loc);
4219 unsigned line = getLineNumber(loc);
4220 unsigned column = getColumnNumber(loc);
4221
4222 // Build the debug-info type for the block literal.
4223 getDeclContextDescriptor(blockDecl);
4224
4225 const llvm::StructLayout *blockLayout =
4226 CGM.getDataLayout().getStructLayout(block.StructureType);
4227
4228 SmallVector<llvm::Metadata *, 16> fields;
4229 collectDefaultFieldsForBlockLiteralDeclare(block, C, loc, *blockLayout, tunit,
4230 fields);
4231
4232 // We want to sort the captures by offset, not because DWARF
4233 // requires this, but because we're paranoid about debuggers.
4234 SmallVector<BlockLayoutChunk, 8> chunks;
4235
4236 // 'this' capture.
4237 if (blockDecl->capturesCXXThis()) {
4238 BlockLayoutChunk chunk;
4239 chunk.OffsetInBits =
4240 blockLayout->getElementOffsetInBits(block.CXXThisIndex);
4241 chunk.Capture = nullptr;
4242 chunks.push_back(chunk);
4243 }
4244
4245 // Variable captures.
4246 for (const auto &capture : blockDecl->captures()) {
4247 const VarDecl *variable = capture.getVariable();
4248 const CGBlockInfo::Capture &captureInfo = block.getCapture(variable);
4249
4250 // Ignore constant captures.
4251 if (captureInfo.isConstant())
4252 continue;
4253
4254 BlockLayoutChunk chunk;
4255 chunk.OffsetInBits =
4256 blockLayout->getElementOffsetInBits(captureInfo.getIndex());
4257 chunk.Capture = &capture;
4258 chunks.push_back(chunk);
4259 }
4260
4261 // Sort by offset.
4262 llvm::array_pod_sort(chunks.begin(), chunks.end());
4263
4264 for (const BlockLayoutChunk &Chunk : chunks) {
4265 uint64_t offsetInBits = Chunk.OffsetInBits;
4266 const BlockDecl::Capture *capture = Chunk.Capture;
4267
4268 // If we have a null capture, this must be the C++ 'this' capture.
4269 if (!capture) {
4270 QualType type;
4271 if (auto *Method =
4272 cast_or_null<CXXMethodDecl>(blockDecl->getNonClosureContext()))
4273 type = Method->getThisType();
4274 else if (auto *RDecl = dyn_cast<CXXRecordDecl>(blockDecl->getParent()))
4275 type = QualType(RDecl->getTypeForDecl(), 0);
4276 else
4277 llvm_unreachable("unexpected block declcontext")::llvm::llvm_unreachable_internal("unexpected block declcontext"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4277)
;
4278
4279 fields.push_back(createFieldType("this", type, loc, AS_public,
4280 offsetInBits, tunit, tunit));
4281 continue;
4282 }
4283
4284 const VarDecl *variable = capture->getVariable();
4285 StringRef name = variable->getName();
4286
4287 llvm::DIType *fieldType;
4288 if (capture->isByRef()) {
4289 TypeInfo PtrInfo = C.getTypeInfo(C.VoidPtrTy);
4290 auto Align = PtrInfo.AlignIsRequired ? PtrInfo.Align : 0;
4291 // FIXME: This recomputes the layout of the BlockByRefWrapper.
4292 uint64_t xoffset;
4293 fieldType =
4294 EmitTypeForVarWithBlocksAttr(variable, &xoffset).BlockByRefWrapper;
4295 fieldType = DBuilder.createPointerType(fieldType, PtrInfo.Width);
4296 fieldType = DBuilder.createMemberType(tunit, name, tunit, line,
4297 PtrInfo.Width, Align, offsetInBits,
4298 llvm::DINode::FlagZero, fieldType);
4299 } else {
4300 auto Align = getDeclAlignIfRequired(variable, CGM.getContext());
4301 fieldType = createFieldType(name, variable->getType(), loc, AS_public,
4302 offsetInBits, Align, tunit, tunit);
4303 }
4304 fields.push_back(fieldType);
4305 }
4306
4307 SmallString<36> typeName;
4308 llvm::raw_svector_ostream(typeName)
4309 << "__block_literal_" << CGM.getUniqueBlockCount();
4310
4311 llvm::DINodeArray fieldsArray = DBuilder.getOrCreateArray(fields);
4312
4313 llvm::DIType *type =
4314 DBuilder.createStructType(tunit, typeName.str(), tunit, line,
4315 CGM.getContext().toBits(block.BlockSize), 0,
4316 llvm::DINode::FlagZero, nullptr, fieldsArray);
4317 type = DBuilder.createPointerType(type, CGM.PointerWidthInBits);
4318
4319 // Get overall information about the block.
4320 llvm::DINode::DIFlags flags = llvm::DINode::FlagArtificial;
4321 auto *scope = cast<llvm::DILocalScope>(LexicalBlockStack.back());
4322
4323 // Create the descriptor for the parameter.
4324 auto *debugVar = DBuilder.createParameterVariable(
4325 scope, Name, ArgNo, tunit, line, type, CGM.getLangOpts().Optimize, flags);
4326
4327 // Insert an llvm.dbg.declare into the current block.
4328 DBuilder.insertDeclare(Alloca, debugVar, DBuilder.createExpression(),
4329 llvm::DebugLoc::get(line, column, scope, CurInlinedAt),
4330 Builder.GetInsertBlock());
4331}
4332
4333llvm::DIDerivedType *
4334CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) {
4335 if (!D || !D->isStaticDataMember())
4336 return nullptr;
4337
4338 auto MI = StaticDataMemberCache.find(D->getCanonicalDecl());
4339 if (MI != StaticDataMemberCache.end()) {
4340 assert(MI->second && "Static data member declaration should still exist")((MI->second && "Static data member declaration should still exist"
) ? static_cast<void> (0) : __assert_fail ("MI->second && \"Static data member declaration should still exist\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4340, __PRETTY_FUNCTION__))
;
4341 return MI->second;
4342 }
4343
4344 // If the member wasn't found in the cache, lazily construct and add it to the
4345 // type (used when a limited form of the type is emitted).
4346 auto DC = D->getDeclContext();
4347 auto *Ctxt = cast<llvm::DICompositeType>(getDeclContextDescriptor(D));
4348 return CreateRecordStaticField(D, Ctxt, cast<RecordDecl>(DC));
4349}
4350
4351llvm::DIGlobalVariableExpression *CGDebugInfo::CollectAnonRecordDecls(
4352 const RecordDecl *RD, llvm::DIFile *Unit, unsigned LineNo,
4353 StringRef LinkageName, llvm::GlobalVariable *Var, llvm::DIScope *DContext) {
4354 llvm::DIGlobalVariableExpression *GVE = nullptr;
4355
4356 for (const auto *Field : RD->fields()) {
4357 llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit);
4358 StringRef FieldName = Field->getName();
4359
4360 // Ignore unnamed fields, but recurse into anonymous records.
4361 if (FieldName.empty()) {
4362 if (const auto *RT = dyn_cast<RecordType>(Field->getType()))
4363 GVE = CollectAnonRecordDecls(RT->getDecl(), Unit, LineNo, LinkageName,
4364 Var, DContext);
4365 continue;
4366 }
4367 // Use VarDecl's Tag, Scope and Line number.
4368 GVE = DBuilder.createGlobalVariableExpression(
4369 DContext, FieldName, LinkageName, Unit, LineNo, FieldTy,
4370 Var->hasLocalLinkage());
4371 Var->addDebugInfo(GVE);
4372 }
4373 return GVE;
4374}
4375
4376void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
4377 const VarDecl *D) {
4378 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4378, __PRETTY_FUNCTION__))
;
1
Assuming field 'DebugKind' is >= LimitedDebugInfo
2
'?' condition is true
4379 if (D->hasAttr<NoDebugAttr>())
3
Taking false branch
4380 return;
4381
4382 // If we already created a DIGlobalVariable for this declaration, just attach
4383 // it to the llvm::GlobalVariable.
4384 auto Cached = DeclCache.find(D->getCanonicalDecl());
4385 if (Cached != DeclCache.end())
4
Assuming the condition is false
5
Taking false branch
4386 return Var->addDebugInfo(
4387 cast<llvm::DIGlobalVariableExpression>(Cached->second));
4388
4389 // Create global variable debug descriptor.
4390 llvm::DIFile *Unit = nullptr;
4391 llvm::DIScope *DContext = nullptr;
4392 unsigned LineNo;
4393 StringRef DeclName, LinkageName;
4394 QualType T;
4395 llvm::MDTuple *TemplateParameters = nullptr;
4396 collectVarDeclProps(D, Unit, LineNo, T, DeclName, LinkageName,
6
Calling 'CGDebugInfo::collectVarDeclProps'
4397 TemplateParameters, DContext);
4398
4399 // Attempt to store one global variable for the declaration - even if we
4400 // emit a lot of fields.
4401 llvm::DIGlobalVariableExpression *GVE = nullptr;
4402
4403 // If this is an anonymous union then we'll want to emit a global
4404 // variable for each member of the anonymous union so that it's possible
4405 // to find the name of any field in the union.
4406 if (T->isUnionType() && DeclName.empty()) {
4407 const RecordDecl *RD = T->castAs<RecordType>()->getDecl();
4408 assert(RD->isAnonymousStructOrUnion() &&((RD->isAnonymousStructOrUnion() && "unnamed non-anonymous struct or union?"
) ? static_cast<void> (0) : __assert_fail ("RD->isAnonymousStructOrUnion() && \"unnamed non-anonymous struct or union?\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4409, __PRETTY_FUNCTION__))
4409 "unnamed non-anonymous struct or union?")((RD->isAnonymousStructOrUnion() && "unnamed non-anonymous struct or union?"
) ? static_cast<void> (0) : __assert_fail ("RD->isAnonymousStructOrUnion() && \"unnamed non-anonymous struct or union?\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4409, __PRETTY_FUNCTION__))
;
4410 GVE = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext);
4411 } else {
4412 auto Align = getDeclAlignIfRequired(D, CGM.getContext());
4413
4414 SmallVector<int64_t, 4> Expr;
4415 unsigned AddressSpace =
4416 CGM.getContext().getTargetAddressSpace(D->getType());
4417 if (CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) {
4418 if (D->hasAttr<CUDASharedAttr>())
4419 AddressSpace =
4420 CGM.getContext().getTargetAddressSpace(LangAS::cuda_shared);
4421 else if (D->hasAttr<CUDAConstantAttr>())
4422 AddressSpace =
4423 CGM.getContext().getTargetAddressSpace(LangAS::cuda_constant);
4424 }
4425 AppendAddressSpaceXDeref(AddressSpace, Expr);
4426
4427 GVE = DBuilder.createGlobalVariableExpression(
4428 DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit),
4429 Var->hasLocalLinkage(),
4430 Expr.empty() ? nullptr : DBuilder.createExpression(Expr),
4431 getOrCreateStaticDataMemberDeclarationOrNull(D), TemplateParameters,
4432 Align);
4433 Var->addDebugInfo(GVE);
4434 }
4435 DeclCache[D->getCanonicalDecl()].reset(GVE);
4436}
4437
4438void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
4439 assert(DebugKind >= codegenoptions::LimitedDebugInfo)((DebugKind >= codegenoptions::LimitedDebugInfo) ? static_cast
<void> (0) : __assert_fail ("DebugKind >= codegenoptions::LimitedDebugInfo"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4439, __PRETTY_FUNCTION__))
;
4440 if (VD->hasAttr<NoDebugAttr>())
4441 return;
4442 auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
4443 // Create the descriptor for the variable.
4444 llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
4445 StringRef Name = VD->getName();
4446 llvm::DIType *Ty = getOrCreateType(VD->getType(), Unit);
4447
4448 if (const auto *ECD = dyn_cast<EnumConstantDecl>(VD)) {
4449 const auto *ED = cast<EnumDecl>(ECD->getDeclContext());
4450 assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?")((isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"
) ? static_cast<void> (0) : __assert_fail ("isa<EnumType>(ED->getTypeForDecl()) && \"Enum without EnumType?\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4450, __PRETTY_FUNCTION__))
;
4451
4452 if (CGM.getCodeGenOpts().EmitCodeView) {
4453 // If CodeView, emit enums as global variables, unless they are defined
4454 // inside a class. We do this because MSVC doesn't emit S_CONSTANTs for
4455 // enums in classes, and because it is difficult to attach this scope
4456 // information to the global variable.
4457 if (isa<RecordDecl>(ED->getDeclContext()))
4458 return;
4459 } else {
4460 // If not CodeView, emit DW_TAG_enumeration_type if necessary. For
4461 // example: for "enum { ZERO };", a DW_TAG_enumeration_type is created the
4462 // first time `ZERO` is referenced in a function.
4463 llvm::DIType *EDTy =
4464 getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit);
4465 assert (EDTy->getTag() == llvm::dwarf::DW_TAG_enumeration_type)((EDTy->getTag() == llvm::dwarf::DW_TAG_enumeration_type) ?
static_cast<void> (0) : __assert_fail ("EDTy->getTag() == llvm::dwarf::DW_TAG_enumeration_type"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4465, __PRETTY_FUNCTION__))
;
4466 (void)EDTy;
4467 return;
4468 }
4469 }
4470
4471 llvm::DIScope *DContext = nullptr;
4472
4473 // Do not emit separate definitions for function local consts.
4474 if (isa<FunctionDecl>(VD->getDeclContext()))
4475 return;
4476
4477 // Emit definition for static members in CodeView.
4478 VD = cast<ValueDecl>(VD->getCanonicalDecl());
4479 auto *VarD = dyn_cast<VarDecl>(VD);
4480 if (VarD && VarD->isStaticDataMember()) {
4481 auto *RD = cast<RecordDecl>(VarD->getDeclContext());
4482 getDeclContextDescriptor(VarD);
4483 // Ensure that the type is retained even though it's otherwise unreferenced.
4484 //
4485 // FIXME: This is probably unnecessary, since Ty should reference RD
4486 // through its scope.
4487 RetainedTypes.push_back(
4488 CGM.getContext().getRecordType(RD).getAsOpaquePtr());
4489
4490 if (!CGM.getCodeGenOpts().EmitCodeView)
4491 return;
4492
4493 // Use the global scope for static members.
4494 DContext = getContextDescriptor(
4495 cast<Decl>(CGM.getContext().getTranslationUnitDecl()), TheCU);
4496 } else {
4497 DContext = getDeclContextDescriptor(VD);
4498 }
4499
4500 auto &GV = DeclCache[VD];
4501 if (GV)
4502 return;
4503 llvm::DIExpression *InitExpr = nullptr;
4504 if (CGM.getContext().getTypeSize(VD->getType()) <= 64) {
4505 // FIXME: Add a representation for integer constants wider than 64 bits.
4506 if (Init.isInt())
4507 InitExpr =
4508 DBuilder.createConstantValueExpression(Init.getInt().getExtValue());
4509 else if (Init.isFloat())
4510 InitExpr = DBuilder.createConstantValueExpression(
4511 Init.getFloat().bitcastToAPInt().getZExtValue());
4512 }
4513
4514 llvm::MDTuple *TemplateParameters = nullptr;
4515
4516 if (isa<VarTemplateSpecializationDecl>(VD))
4517 if (VarD) {
4518 llvm::DINodeArray parameterNodes = CollectVarTemplateParams(VarD, &*Unit);
4519 TemplateParameters = parameterNodes.get();
4520 }
4521
4522 GV.reset(DBuilder.createGlobalVariableExpression(
4523 DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty,
4524 true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD),
4525 TemplateParameters, Align));
4526}
4527
4528llvm::DIScope *CGDebugInfo::getCurrentContextDescriptor(const Decl *D) {
4529 if (!LexicalBlockStack.empty())
4530 return LexicalBlockStack.back();
4531 llvm::DIScope *Mod = getParentModuleOrNull(D);
4532 return getContextDescriptor(D, Mod ? Mod : TheCU);
4533}
4534
4535void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
4536 if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo)
4537 return;
4538 const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
4539 if (!NSDecl->isAnonymousNamespace() ||
4540 CGM.getCodeGenOpts().DebugExplicitImport) {
4541 auto Loc = UD.getLocation();
4542 DBuilder.createImportedModule(
4543 getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())),
4544 getOrCreateNamespace(NSDecl), getOrCreateFile(Loc), getLineNumber(Loc));
4545 }
4546}
4547
4548void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) {
4549 if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo)
4550 return;
4551 assert(UD.shadow_size() &&((UD.shadow_size() && "We shouldn't be codegening an invalid UsingDecl containing no decls"
) ? static_cast<void> (0) : __assert_fail ("UD.shadow_size() && \"We shouldn't be codegening an invalid UsingDecl containing no decls\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4552, __PRETTY_FUNCTION__))
4552 "We shouldn't be codegening an invalid UsingDecl containing no decls")((UD.shadow_size() && "We shouldn't be codegening an invalid UsingDecl containing no decls"
) ? static_cast<void> (0) : __assert_fail ("UD.shadow_size() && \"We shouldn't be codegening an invalid UsingDecl containing no decls\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4552, __PRETTY_FUNCTION__))
;
4553 // Emitting one decl is sufficient - debuggers can detect that this is an
4554 // overloaded name & provide lookup for all the overloads.
4555 const UsingShadowDecl &USD = **UD.shadow_begin();
4556
4557 // FIXME: Skip functions with undeduced auto return type for now since we
4558 // don't currently have the plumbing for separate declarations & definitions
4559 // of free functions and mismatched types (auto in the declaration, concrete
4560 // return type in the definition)
4561 if (const auto *FD = dyn_cast<FunctionDecl>(USD.getUnderlyingDecl()))
4562 if (const auto *AT =
4563 FD->getType()->castAs<FunctionProtoType>()->getContainedAutoType())
4564 if (AT->getDeducedType().isNull())
4565 return;
4566 if (llvm::DINode *Target =
4567 getDeclarationOrDefinition(USD.getUnderlyingDecl())) {
4568 auto Loc = USD.getLocation();
4569 DBuilder.createImportedDeclaration(
4570 getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target,
4571 getOrCreateFile(Loc), getLineNumber(Loc));
4572 }
4573}
4574
4575void CGDebugInfo::EmitImportDecl(const ImportDecl &ID) {
4576 if (CGM.getCodeGenOpts().getDebuggerTuning() != llvm::DebuggerKind::LLDB)
4577 return;
4578 if (Module *M = ID.getImportedModule()) {
4579 auto Info = ExternalASTSource::ASTSourceDescriptor(*M);
4580 auto Loc = ID.getLocation();
4581 DBuilder.createImportedDeclaration(
4582 getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())),
4583 getOrCreateModuleRef(Info, DebugTypeExtRefs), getOrCreateFile(Loc),
4584 getLineNumber(Loc));
4585 }
4586}
4587
4588llvm::DIImportedEntity *
4589CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) {
4590 if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo)
4591 return nullptr;
4592 auto &VH = NamespaceAliasCache[&NA];
4593 if (VH)
4594 return cast<llvm::DIImportedEntity>(VH);
4595 llvm::DIImportedEntity *R;
4596 auto Loc = NA.getLocation();
4597 if (const auto *Underlying =
4598 dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace()))
4599 // This could cache & dedup here rather than relying on metadata deduping.
4600 R = DBuilder.createImportedDeclaration(
4601 getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())),
4602 EmitNamespaceAlias(*Underlying), getOrCreateFile(Loc),
4603 getLineNumber(Loc), NA.getName());
4604 else
4605 R = DBuilder.createImportedDeclaration(
4606 getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())),
4607 getOrCreateNamespace(cast<NamespaceDecl>(NA.getAliasedNamespace())),
4608 getOrCreateFile(Loc), getLineNumber(Loc), NA.getName());
4609 VH.reset(R);
4610 return R;
4611}
4612
4613llvm::DINamespace *
4614CGDebugInfo::getOrCreateNamespace(const NamespaceDecl *NSDecl) {
4615 // Don't canonicalize the NamespaceDecl here: The DINamespace will be uniqued
4616 // if necessary, and this way multiple declarations of the same namespace in
4617 // different parent modules stay distinct.
4618 auto I = NamespaceCache.find(NSDecl);
4619 if (I != NamespaceCache.end())
4620 return cast<llvm::DINamespace>(I->second);
4621
4622 llvm::DIScope *Context = getDeclContextDescriptor(NSDecl);
4623 // Don't trust the context if it is a DIModule (see comment above).
4624 llvm::DINamespace *NS =
4625 DBuilder.createNameSpace(Context, NSDecl->getName(), NSDecl->isInline());
4626 NamespaceCache[NSDecl].reset(NS);
4627 return NS;
4628}
4629
4630void CGDebugInfo::setDwoId(uint64_t Signature) {
4631 assert(TheCU && "no main compile unit")((TheCU && "no main compile unit") ? static_cast<void
> (0) : __assert_fail ("TheCU && \"no main compile unit\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4631, __PRETTY_FUNCTION__))
;
4632 TheCU->setDWOId(Signature);
4633}
4634
4635/// Analyzes each function parameter to determine whether it is constant
4636/// throughout the function body.
4637static void analyzeParametersModification(
4638 ASTContext &Ctx,
4639 llvm::DenseMap<const FunctionDecl *, llvm::TrackingMDRef> &SPDefCache,
4640 llvm::DenseMap<const ParmVarDecl *, llvm::TrackingMDRef> &ParamCache) {
4641 for (auto &SP : SPDefCache) {
4642 auto *FD = SP.first;
4643 assert(FD->hasBody() && "Functions must have body here")((FD->hasBody() && "Functions must have body here"
) ? static_cast<void> (0) : __assert_fail ("FD->hasBody() && \"Functions must have body here\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4643, __PRETTY_FUNCTION__))
;
4644 const Stmt *FuncBody = (*FD).getBody();
4645 for (auto Parm : FD->parameters()) {
4646 ExprMutationAnalyzer FuncAnalyzer(*FuncBody, Ctx);
4647 if (FuncAnalyzer.isMutated(Parm))
4648 continue;
4649
4650 auto I = ParamCache.find(Parm);
4651 assert(I != ParamCache.end() && "Parameters should be already cached")((I != ParamCache.end() && "Parameters should be already cached"
) ? static_cast<void> (0) : __assert_fail ("I != ParamCache.end() && \"Parameters should be already cached\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4651, __PRETTY_FUNCTION__))
;
4652 auto *DIParm = cast<llvm::DILocalVariable>(I->second);
4653 DIParm->setIsNotModified();
4654 }
4655 }
4656}
4657
4658void CGDebugInfo::finalize() {
4659 // Creating types might create further types - invalidating the current
4660 // element and the size(), so don't cache/reference them.
4661 for (size_t i = 0; i != ObjCInterfaceCache.size(); ++i) {
4662 ObjCInterfaceCacheEntry E = ObjCInterfaceCache[i];
4663 llvm::DIType *Ty = E.Type->getDecl()->getDefinition()
4664 ? CreateTypeDefinition(E.Type, E.Unit)
4665 : E.Decl;
4666 DBuilder.replaceTemporary(llvm::TempDIType(E.Decl), Ty);
4667 }
4668
4669 if (CGM.getCodeGenOpts().DwarfVersion >= 5) {
4670 // Add methods to interface.
4671 for (const auto &P : ObjCMethodCache) {
4672 if (P.second.empty())
4673 continue;
4674
4675 QualType QTy(P.first->getTypeForDecl(), 0);
4676 auto It = TypeCache.find(QTy.getAsOpaquePtr());
4677 assert(It != TypeCache.end())((It != TypeCache.end()) ? static_cast<void> (0) : __assert_fail
("It != TypeCache.end()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4677, __PRETTY_FUNCTION__))
;
4678
4679 llvm::DICompositeType *InterfaceDecl =
4680 cast<llvm::DICompositeType>(It->second);
4681
4682 SmallVector<llvm::Metadata *, 16> EltTys;
4683 auto CurrenetElts = InterfaceDecl->getElements();
4684 EltTys.append(CurrenetElts.begin(), CurrenetElts.end());
4685 for (auto &MD : P.second)
4686 EltTys.push_back(MD);
4687 llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
4688 DBuilder.replaceArrays(InterfaceDecl, Elements);
4689 }
4690 }
4691
4692 for (const auto &P : ReplaceMap) {
4693 assert(P.second)((P.second) ? static_cast<void> (0) : __assert_fail ("P.second"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4693, __PRETTY_FUNCTION__))
;
4694 auto *Ty = cast<llvm::DIType>(P.second);
4695 assert(Ty->isForwardDecl())((Ty->isForwardDecl()) ? static_cast<void> (0) : __assert_fail
("Ty->isForwardDecl()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4695, __PRETTY_FUNCTION__))
;
4696
4697 auto It = TypeCache.find(P.first);
4698 assert(It != TypeCache.end())((It != TypeCache.end()) ? static_cast<void> (0) : __assert_fail
("It != TypeCache.end()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4698, __PRETTY_FUNCTION__))
;
4699 assert(It->second)((It->second) ? static_cast<void> (0) : __assert_fail
("It->second", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4699, __PRETTY_FUNCTION__))
;
4700
4701 DBuilder.replaceTemporary(llvm::TempDIType(Ty),
4702 cast<llvm::DIType>(It->second));
4703 }
4704
4705 for (const auto &P : FwdDeclReplaceMap) {
4706 assert(P.second)((P.second) ? static_cast<void> (0) : __assert_fail ("P.second"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/CodeGen/CGDebugInfo.cpp"
, 4706, __PRETTY_FUNCTION__))
;
4707 llvm::TempMDNode FwdDecl(cast<llvm::MDNode>(P.second));
4708 llvm::Metadata *Repl;
4709
4710 auto It = DeclCache.find(P.first);
4711 // If there has been no definition for the declaration, call RAUW
4712 // with ourselves, that will destroy the temporary MDNode and
4713 // replace it with a standard one, avoiding leaking memory.
4714 if (It == DeclCache.end())
4715 Repl = P.second;
4716 else
4717 Repl = It->second;
4718
4719 if (auto *GVE = dyn_cast_or_null<llvm::DIGlobalVariableExpression>(Repl))
4720 Repl = GVE->getVariable();
4721 DBuilder.replaceTemporary(std::move(FwdDecl), cast<llvm::MDNode>(Repl));
4722 }
4723
4724 // We keep our own list of retained types, because we need to look
4725 // up the final type in the type cache.
4726 for (auto &RT : RetainedTypes)
4727 if (auto MD = TypeCache[RT])
4728 DBuilder.retainType(cast<llvm::DIType>(MD));
4729
4730 if (CGM.getCodeGenOpts().EnableDebugEntryValues)
4731 // This will be used to emit debug entry values.
4732 analyzeParametersModification(CGM.getContext(), SPDefCache, ParamCache);
4733
4734 DBuilder.finalize();
4735}
4736
4737void CGDebugInfo::EmitExplicitCastType(QualType Ty) {
4738 if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo)
4739 return;
4740
4741 if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile()))
4742 // Don't ignore in case of explicit cast where it is referenced indirectly.
4743 DBuilder.retainType(DieTy);
4744}
4745
4746llvm::DebugLoc CGDebugInfo::SourceLocToDebugLoc(SourceLocation Loc) {
4747 if (LexicalBlockStack.empty())
4748 return llvm::DebugLoc();
4749
4750 llvm::MDNode *Scope = LexicalBlockStack.back();
4751 return llvm::DebugLoc::get(getLineNumber(Loc), getColumnNumber(Loc), Scope);
4752}
4753
4754llvm::DINode::DIFlags CGDebugInfo::getCallSiteRelatedAttrs() const {
4755 // Call site-related attributes are only useful in optimized programs, and
4756 // when there's a possibility of debugging backtraces.
4757 if (!CGM.getLangOpts().Optimize || DebugKind == codegenoptions::NoDebugInfo ||
4758 DebugKind == codegenoptions::LocTrackingOnly)
4759 return llvm::DINode::FlagZero;
4760
4761 // Call site-related attributes are available in DWARF v5. Some debuggers,
4762 // while not fully DWARF v5-compliant, may accept these attributes as if they
4763 // were part of DWARF v4.
4764 bool SupportsDWARFv4Ext =
4765 CGM.getCodeGenOpts().DwarfVersion == 4 &&
4766 (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB ||
4767 (CGM.getCodeGenOpts().EnableDebugEntryValues &&
4768 CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::GDB));
4769
4770 if (!SupportsDWARFv4Ext && CGM.getCodeGenOpts().DwarfVersion < 5)
4771 return llvm::DINode::FlagZero;
4772
4773 return llvm::DINode::FlagAllCallsDescribed;
4774}