Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/DebugInfo/LogicalView/Readers/LVCodeViewVisitor.cpp
35295 views
1
//===-- LVCodeViewVisitor.cpp ---------------------------------------------===//
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 implements the LVCodeViewVisitor class.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "llvm/DebugInfo/LogicalView/Readers/LVCodeViewVisitor.h"
14
#include "llvm/BinaryFormat/Magic.h"
15
#include "llvm/DebugInfo/CodeView/EnumTables.h"
16
#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
17
#include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h"
18
#include "llvm/DebugInfo/CodeView/TypeRecordHelpers.h"
19
#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
20
#include "llvm/DebugInfo/LogicalView/Core/LVScope.h"
21
#include "llvm/DebugInfo/LogicalView/Core/LVSymbol.h"
22
#include "llvm/DebugInfo/LogicalView/Core/LVType.h"
23
#include "llvm/DebugInfo/LogicalView/Readers/LVCodeViewReader.h"
24
#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
25
#include "llvm/DebugInfo/PDB/Native/InputFile.h"
26
#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
27
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
28
#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
29
#include "llvm/DebugInfo/PDB/Native/RawError.h"
30
#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
31
#include "llvm/DebugInfo/PDB/PDB.h"
32
#include "llvm/Demangle/Demangle.h"
33
#include "llvm/Object/COFF.h"
34
#include "llvm/Support/Error.h"
35
#include "llvm/Support/FileSystem.h"
36
#include "llvm/Support/FormatAdapters.h"
37
#include "llvm/Support/FormatVariadic.h"
38
39
using namespace llvm;
40
using namespace llvm::codeview;
41
using namespace llvm::object;
42
using namespace llvm::pdb;
43
using namespace llvm::logicalview;
44
45
#define DEBUG_TYPE "CodeViewUtilities"
46
47
namespace llvm {
48
namespace logicalview {
49
50
static TypeIndex getTrueType(TypeIndex &TI) {
51
// Dealing with a MSVC generated PDB, we encountered a type index with the
52
// value of: 0x0280xxxx where xxxx=0000.
53
//
54
// There is some documentation about type indices:
55
// https://llvm.org/docs/PDB/TpiStream.html
56
//
57
// A type index is a 32-bit integer that uniquely identifies a type inside
58
// of an object file’s .debug$T section or a PDB file’s TPI or IPI stream.
59
// The value of the type index for the first type record from the TPI stream
60
// is given by the TypeIndexBegin member of the TPI Stream Header although
61
// in practice this value is always equal to 0x1000 (4096).
62
//
63
// Any type index with a high bit set is considered to come from the IPI
64
// stream, although this appears to be more of a hack, and LLVM does not
65
// generate type indices of this nature. They can, however, be observed in
66
// Microsoft PDBs occasionally, so one should be prepared to handle them.
67
// Note that having the high bit set is not a necessary condition to
68
// determine whether a type index comes from the IPI stream, it is only
69
// sufficient.
70
LLVM_DEBUG(
71
{ dbgs() << "Index before: " << HexNumber(TI.getIndex()) << "\n"; });
72
TI.setIndex(TI.getIndex() & 0x0000ffff);
73
LLVM_DEBUG(
74
{ dbgs() << "Index after: " << HexNumber(TI.getIndex()) << "\n"; });
75
return TI;
76
}
77
78
static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
79
#define CV_TYPE(enum, val) {#enum, enum},
80
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
81
};
82
83
// Return the type name pointed by the type index. It uses the kind to query
84
// the associated name for the record type.
85
static StringRef getRecordName(LazyRandomTypeCollection &Types, TypeIndex TI) {
86
if (TI.isSimple())
87
return {};
88
89
StringRef RecordName;
90
CVType CVReference = Types.getType(TI);
91
auto GetName = [&](auto Record) {
92
if (Error Err = TypeDeserializer::deserializeAs(
93
const_cast<CVType &>(CVReference), Record))
94
consumeError(std::move(Err));
95
else
96
RecordName = Record.getName();
97
};
98
99
TypeRecordKind RK = static_cast<TypeRecordKind>(CVReference.kind());
100
if (RK == TypeRecordKind::Class || RK == TypeRecordKind::Struct)
101
GetName(ClassRecord(RK));
102
else if (RK == TypeRecordKind::Union)
103
GetName(UnionRecord(RK));
104
else if (RK == TypeRecordKind::Enum)
105
GetName(EnumRecord(RK));
106
107
return RecordName;
108
}
109
110
} // namespace logicalview
111
} // namespace llvm
112
113
#undef DEBUG_TYPE
114
#define DEBUG_TYPE "CodeViewDataVisitor"
115
116
namespace llvm {
117
namespace logicalview {
118
119
// Keeps the type indexes with line information.
120
using LVLineRecords = std::vector<TypeIndex>;
121
122
namespace {
123
124
class LVTypeRecords {
125
LVShared *Shared = nullptr;
126
127
// Logical elements associated to their CodeView Type Index.
128
using RecordEntry = std::pair<TypeLeafKind, LVElement *>;
129
using RecordTable = std::map<TypeIndex, RecordEntry>;
130
RecordTable RecordFromTypes;
131
RecordTable RecordFromIds;
132
133
using NameTable = std::map<StringRef, TypeIndex>;
134
NameTable NameFromTypes;
135
NameTable NameFromIds;
136
137
public:
138
LVTypeRecords(LVShared *Shared) : Shared(Shared) {}
139
140
void add(uint32_t StreamIdx, TypeIndex TI, TypeLeafKind Kind,
141
LVElement *Element = nullptr);
142
void add(uint32_t StreamIdx, TypeIndex TI, StringRef Name);
143
LVElement *find(uint32_t StreamIdx, TypeIndex TI, bool Create = true);
144
TypeIndex find(uint32_t StreamIdx, StringRef Name);
145
};
146
147
class LVForwardReferences {
148
// Forward reference and its definitions (Name as key).
149
using ForwardEntry = std::pair<TypeIndex, TypeIndex>;
150
using ForwardTypeNames = std::map<StringRef, ForwardEntry>;
151
ForwardTypeNames ForwardTypesNames;
152
153
// Forward reference and its definition (TypeIndex as key).
154
using ForwardType = std::map<TypeIndex, TypeIndex>;
155
ForwardType ForwardTypes;
156
157
// Forward types and its references.
158
void add(TypeIndex TIForward, TypeIndex TIReference) {
159
ForwardTypes.emplace(TIForward, TIReference);
160
}
161
162
void add(StringRef Name, TypeIndex TIForward) {
163
if (ForwardTypesNames.find(Name) == ForwardTypesNames.end()) {
164
ForwardTypesNames.emplace(
165
std::piecewise_construct, std::forward_as_tuple(Name),
166
std::forward_as_tuple(TIForward, TypeIndex::None()));
167
} else {
168
// Update a recorded definition with its reference.
169
ForwardTypesNames[Name].first = TIForward;
170
add(TIForward, ForwardTypesNames[Name].second);
171
}
172
}
173
174
// Update a previously recorded forward reference with its definition.
175
void update(StringRef Name, TypeIndex TIReference) {
176
if (ForwardTypesNames.find(Name) != ForwardTypesNames.end()) {
177
// Update the recorded forward reference with its definition.
178
ForwardTypesNames[Name].second = TIReference;
179
add(ForwardTypesNames[Name].first, TIReference);
180
} else {
181
// We have not seen the forward reference. Insert the definition.
182
ForwardTypesNames.emplace(
183
std::piecewise_construct, std::forward_as_tuple(Name),
184
std::forward_as_tuple(TypeIndex::None(), TIReference));
185
}
186
}
187
188
public:
189
LVForwardReferences() = default;
190
191
void record(bool IsForwardRef, StringRef Name, TypeIndex TI) {
192
// We are expecting for the forward references to be first. But that
193
// is not always the case. A name must be recorded regardless of the
194
// order in which the forward reference appears.
195
(IsForwardRef) ? add(Name, TI) : update(Name, TI);
196
}
197
198
TypeIndex find(TypeIndex TIForward) {
199
return (ForwardTypes.find(TIForward) != ForwardTypes.end())
200
? ForwardTypes[TIForward]
201
: TypeIndex::None();
202
}
203
204
TypeIndex find(StringRef Name) {
205
return (ForwardTypesNames.find(Name) != ForwardTypesNames.end())
206
? ForwardTypesNames[Name].second
207
: TypeIndex::None();
208
}
209
210
// If the given TI corresponds to a reference, return the reference.
211
// Otherwise return the given TI.
212
TypeIndex remap(TypeIndex TI) {
213
TypeIndex Forward = find(TI);
214
return Forward.isNoneType() ? TI : Forward;
215
}
216
};
217
218
// Namespace deduction.
219
class LVNamespaceDeduction {
220
LVShared *Shared = nullptr;
221
222
using Names = std::map<StringRef, LVScope *>;
223
Names NamespaceNames;
224
225
using LookupSet = std::set<StringRef>;
226
LookupSet DeducedScopes;
227
LookupSet UnresolvedScopes;
228
LookupSet IdentifiedNamespaces;
229
230
void add(StringRef Name, LVScope *Namespace) {
231
if (NamespaceNames.find(Name) == NamespaceNames.end())
232
NamespaceNames.emplace(Name, Namespace);
233
}
234
235
public:
236
LVNamespaceDeduction(LVShared *Shared) : Shared(Shared) {}
237
238
void init();
239
void add(StringRef String);
240
LVScope *get(LVStringRefs Components);
241
LVScope *get(StringRef Name, bool CheckScope = true);
242
243
// Find the logical namespace for the 'Name' component.
244
LVScope *find(StringRef Name) {
245
LVScope *Namespace = (NamespaceNames.find(Name) != NamespaceNames.end())
246
? NamespaceNames[Name]
247
: nullptr;
248
return Namespace;
249
}
250
251
// For the given lexical components, return a tuple with the first entry
252
// being the outermost namespace and the second entry being the first
253
// non-namespace.
254
LVLexicalIndex find(LVStringRefs Components) {
255
if (Components.empty())
256
return {};
257
258
LVStringRefs::size_type FirstNamespace = 0;
259
LVStringRefs::size_type FirstNonNamespace;
260
for (LVStringRefs::size_type Index = 0; Index < Components.size();
261
++Index) {
262
FirstNonNamespace = Index;
263
LookupSet::iterator Iter = IdentifiedNamespaces.find(Components[Index]);
264
if (Iter == IdentifiedNamespaces.end())
265
// The component is not a namespace name.
266
break;
267
}
268
return std::make_tuple(FirstNamespace, FirstNonNamespace);
269
}
270
};
271
272
// Strings.
273
class LVStringRecords {
274
using StringEntry = std::tuple<uint32_t, std::string, LVScopeCompileUnit *>;
275
using StringIds = std::map<TypeIndex, StringEntry>;
276
StringIds Strings;
277
278
public:
279
LVStringRecords() = default;
280
281
void add(TypeIndex TI, StringRef String) {
282
static uint32_t Index = 0;
283
if (Strings.find(TI) == Strings.end())
284
Strings.emplace(
285
std::piecewise_construct, std::forward_as_tuple(TI),
286
std::forward_as_tuple(++Index, std::string(String), nullptr));
287
}
288
289
StringRef find(TypeIndex TI) {
290
StringIds::iterator Iter = Strings.find(TI);
291
return Iter != Strings.end() ? std::get<1>(Iter->second) : StringRef{};
292
}
293
294
uint32_t findIndex(TypeIndex TI) {
295
StringIds::iterator Iter = Strings.find(TI);
296
return Iter != Strings.end() ? std::get<0>(Iter->second) : 0;
297
}
298
299
// Move strings representing the filenames to the compile unit.
300
void addFilenames();
301
void addFilenames(LVScopeCompileUnit *Scope);
302
};
303
} // namespace
304
305
using LVTypeKinds = std::set<TypeLeafKind>;
306
using LVSymbolKinds = std::set<SymbolKind>;
307
308
// The following data keeps forward information, type records, names for
309
// namespace deduction, strings records, line records.
310
// It is shared by the type visitor, symbol visitor and logical visitor and
311
// it is independent from the CodeViewReader.
312
struct LVShared {
313
LVCodeViewReader *Reader;
314
LVLogicalVisitor *Visitor;
315
LVForwardReferences ForwardReferences;
316
LVLineRecords LineRecords;
317
LVNamespaceDeduction NamespaceDeduction;
318
LVStringRecords StringRecords;
319
LVTypeRecords TypeRecords;
320
321
// In order to determine which types and/or symbols records should be handled
322
// by the reader, we record record kinds seen by the type and symbol visitors.
323
// At the end of the scopes creation, the '--internal=tag' option will allow
324
// to print the unique record ids collected.
325
LVTypeKinds TypeKinds;
326
LVSymbolKinds SymbolKinds;
327
328
LVShared(LVCodeViewReader *Reader, LVLogicalVisitor *Visitor)
329
: Reader(Reader), Visitor(Visitor), NamespaceDeduction(this),
330
TypeRecords(this) {}
331
~LVShared() = default;
332
};
333
} // namespace logicalview
334
} // namespace llvm
335
336
void LVTypeRecords::add(uint32_t StreamIdx, TypeIndex TI, TypeLeafKind Kind,
337
LVElement *Element) {
338
RecordTable &Target =
339
(StreamIdx == StreamTPI) ? RecordFromTypes : RecordFromIds;
340
Target.emplace(std::piecewise_construct, std::forward_as_tuple(TI),
341
std::forward_as_tuple(Kind, Element));
342
}
343
344
void LVTypeRecords::add(uint32_t StreamIdx, TypeIndex TI, StringRef Name) {
345
NameTable &Target = (StreamIdx == StreamTPI) ? NameFromTypes : NameFromIds;
346
Target.emplace(Name, TI);
347
}
348
349
LVElement *LVTypeRecords::find(uint32_t StreamIdx, TypeIndex TI, bool Create) {
350
RecordTable &Target =
351
(StreamIdx == StreamTPI) ? RecordFromTypes : RecordFromIds;
352
353
LVElement *Element = nullptr;
354
RecordTable::iterator Iter = Target.find(TI);
355
if (Iter != Target.end()) {
356
Element = Iter->second.second;
357
if (Element || !Create)
358
return Element;
359
360
// Create the logical element if not found.
361
Element = Shared->Visitor->createElement(Iter->second.first);
362
if (Element) {
363
Element->setOffset(TI.getIndex());
364
Element->setOffsetFromTypeIndex();
365
Target[TI].second = Element;
366
}
367
}
368
return Element;
369
}
370
371
TypeIndex LVTypeRecords::find(uint32_t StreamIdx, StringRef Name) {
372
NameTable &Target = (StreamIdx == StreamTPI) ? NameFromTypes : NameFromIds;
373
NameTable::iterator Iter = Target.find(Name);
374
return Iter != Target.end() ? Iter->second : TypeIndex::None();
375
}
376
377
void LVStringRecords::addFilenames() {
378
for (StringIds::const_reference Entry : Strings) {
379
StringRef Name = std::get<1>(Entry.second);
380
LVScopeCompileUnit *Scope = std::get<2>(Entry.second);
381
Scope->addFilename(transformPath(Name));
382
}
383
Strings.clear();
384
}
385
386
void LVStringRecords::addFilenames(LVScopeCompileUnit *Scope) {
387
for (StringIds::reference Entry : Strings)
388
if (!std::get<2>(Entry.second))
389
std::get<2>(Entry.second) = Scope;
390
}
391
392
void LVNamespaceDeduction::add(StringRef String) {
393
StringRef InnerComponent;
394
StringRef OuterComponent;
395
std::tie(OuterComponent, InnerComponent) = getInnerComponent(String);
396
DeducedScopes.insert(InnerComponent);
397
if (OuterComponent.size())
398
UnresolvedScopes.insert(OuterComponent);
399
}
400
401
void LVNamespaceDeduction::init() {
402
// We have 2 sets of names:
403
// - deduced scopes (class, structure, union and enum) and
404
// - unresolved scopes, that can represent namespaces or any deduced.
405
// Before creating the namespaces, we have to traverse the unresolved
406
// and remove any references to already deduced scopes.
407
LVStringRefs Components;
408
for (const StringRef &Unresolved : UnresolvedScopes) {
409
Components = getAllLexicalComponents(Unresolved);
410
for (const StringRef &Component : Components) {
411
LookupSet::iterator Iter = DeducedScopes.find(Component);
412
if (Iter == DeducedScopes.end())
413
IdentifiedNamespaces.insert(Component);
414
}
415
}
416
417
LLVM_DEBUG({
418
auto Print = [&](LookupSet &Container, const char *Title) {
419
auto Header = [&]() {
420
dbgs() << formatv("\n{0}\n", fmt_repeat('=', 72));
421
dbgs() << formatv("{0}\n", Title);
422
dbgs() << formatv("{0}\n", fmt_repeat('=', 72));
423
};
424
Header();
425
for (const StringRef &Item : Container)
426
dbgs() << formatv("'{0}'\n", Item.str().c_str());
427
};
428
429
Print(DeducedScopes, "Deducted Scopes");
430
Print(UnresolvedScopes, "Unresolved Scopes");
431
Print(IdentifiedNamespaces, "Namespaces");
432
});
433
}
434
435
LVScope *LVNamespaceDeduction::get(LVStringRefs Components) {
436
LLVM_DEBUG({
437
for (const StringRef &Component : Components)
438
dbgs() << formatv("'{0}'\n", Component.str().c_str());
439
});
440
441
if (Components.empty())
442
return nullptr;
443
444
// Update the namespaces relationship.
445
LVScope *Namespace = nullptr;
446
LVScope *Parent = Shared->Reader->getCompileUnit();
447
for (const StringRef &Component : Components) {
448
// Check if we have seen the namespace.
449
Namespace = find(Component);
450
if (!Namespace) {
451
// We have identified namespaces that are generated by MSVC. Mark them
452
// as 'system' so they will be excluded from the logical view.
453
Namespace = Shared->Reader->createScopeNamespace();
454
Namespace->setTag(dwarf::DW_TAG_namespace);
455
Namespace->setName(Component);
456
Parent->addElement(Namespace);
457
getReader().isSystemEntry(Namespace);
458
add(Component, Namespace);
459
}
460
Parent = Namespace;
461
}
462
return Parent;
463
}
464
465
LVScope *LVNamespaceDeduction::get(StringRef ScopedName, bool CheckScope) {
466
LVStringRefs Components = getAllLexicalComponents(ScopedName);
467
if (CheckScope)
468
llvm::erase_if(Components, [&](StringRef Component) {
469
LookupSet::iterator Iter = IdentifiedNamespaces.find(Component);
470
return Iter == IdentifiedNamespaces.end();
471
});
472
473
LLVM_DEBUG(
474
{ dbgs() << formatv("ScopedName: '{0}'\n", ScopedName.str().c_str()); });
475
476
return get(Components);
477
}
478
479
#undef DEBUG_TYPE
480
#define DEBUG_TYPE "CodeViewTypeVisitor"
481
482
//===----------------------------------------------------------------------===//
483
// TypeRecord traversal.
484
//===----------------------------------------------------------------------===//
485
void LVTypeVisitor::printTypeIndex(StringRef FieldName, TypeIndex TI,
486
uint32_t StreamIdx) const {
487
codeview::printTypeIndex(W, FieldName, TI,
488
StreamIdx == StreamTPI ? Types : Ids);
489
}
490
491
Error LVTypeVisitor::visitTypeBegin(CVType &Record) {
492
return visitTypeBegin(Record, TypeIndex::fromArrayIndex(Types.size()));
493
}
494
495
Error LVTypeVisitor::visitTypeBegin(CVType &Record, TypeIndex TI) {
496
LLVM_DEBUG({
497
W.getOStream() << formatTypeLeafKind(Record.kind());
498
W.getOStream() << " (" << HexNumber(TI.getIndex()) << ")\n";
499
});
500
501
if (options().getInternalTag())
502
Shared->TypeKinds.insert(Record.kind());
503
504
// The collected type records, will be use to create the logical elements
505
// during the symbols traversal when a type is referenced.
506
CurrentTypeIndex = TI;
507
Shared->TypeRecords.add(StreamIdx, TI, Record.kind());
508
return Error::success();
509
}
510
511
Error LVTypeVisitor::visitUnknownType(CVType &Record) {
512
LLVM_DEBUG({ W.printNumber("Length", uint32_t(Record.content().size())); });
513
return Error::success();
514
}
515
516
Error LVTypeVisitor::visitMemberBegin(CVMemberRecord &Record) {
517
LLVM_DEBUG({
518
W.startLine() << formatTypeLeafKind(Record.Kind);
519
W.getOStream() << " {\n";
520
W.indent();
521
});
522
return Error::success();
523
}
524
525
Error LVTypeVisitor::visitMemberEnd(CVMemberRecord &Record) {
526
LLVM_DEBUG({
527
W.unindent();
528
W.startLine() << "}\n";
529
});
530
return Error::success();
531
}
532
533
Error LVTypeVisitor::visitUnknownMember(CVMemberRecord &Record) {
534
LLVM_DEBUG({ W.printHex("UnknownMember", unsigned(Record.Kind)); });
535
return Error::success();
536
}
537
538
// LF_BUILDINFO (TPI)/(IPI)
539
Error LVTypeVisitor::visitKnownRecord(CVType &Record, BuildInfoRecord &Args) {
540
// All the args are references into the TPI/IPI stream.
541
LLVM_DEBUG({
542
W.printNumber("NumArgs", static_cast<uint32_t>(Args.getArgs().size()));
543
ListScope Arguments(W, "Arguments");
544
for (TypeIndex Arg : Args.getArgs())
545
printTypeIndex("ArgType", Arg, StreamIPI);
546
});
547
548
// Only add the strings that hold information about filenames. They will be
549
// used to complete the line/file information for the logical elements.
550
// There are other strings holding information about namespaces.
551
TypeIndex TI;
552
StringRef String;
553
554
// Absolute CWD path
555
TI = Args.getArgs()[BuildInfoRecord::BuildInfoArg::CurrentDirectory];
556
String = Ids.getTypeName(TI);
557
if (!String.empty())
558
Shared->StringRecords.add(TI, String);
559
560
// Get the compile unit name.
561
TI = Args.getArgs()[BuildInfoRecord::BuildInfoArg::SourceFile];
562
String = Ids.getTypeName(TI);
563
if (!String.empty())
564
Shared->StringRecords.add(TI, String);
565
LogicalVisitor->setCompileUnitName(std::string(String));
566
567
return Error::success();
568
}
569
570
// LF_CLASS, LF_STRUCTURE, LF_INTERFACE (TPI)
571
Error LVTypeVisitor::visitKnownRecord(CVType &Record, ClassRecord &Class) {
572
LLVM_DEBUG({
573
printTypeIndex("TypeIndex", CurrentTypeIndex, StreamTPI);
574
printTypeIndex("FieldListType", Class.getFieldList(), StreamTPI);
575
W.printString("Name", Class.getName());
576
});
577
578
// Collect class name for scope deduction.
579
Shared->NamespaceDeduction.add(Class.getName());
580
Shared->ForwardReferences.record(Class.isForwardRef(), Class.getName(),
581
CurrentTypeIndex);
582
583
// Collect class name for contained scopes deduction.
584
Shared->TypeRecords.add(StreamIdx, CurrentTypeIndex, Class.getName());
585
return Error::success();
586
}
587
588
// LF_ENUM (TPI)
589
Error LVTypeVisitor::visitKnownRecord(CVType &Record, EnumRecord &Enum) {
590
LLVM_DEBUG({
591
printTypeIndex("TypeIndex", CurrentTypeIndex, StreamTPI);
592
printTypeIndex("FieldListType", Enum.getFieldList(), StreamTPI);
593
W.printString("Name", Enum.getName());
594
});
595
596
// Collect enum name for scope deduction.
597
Shared->NamespaceDeduction.add(Enum.getName());
598
return Error::success();
599
}
600
601
// LF_FUNC_ID (TPI)/(IPI)
602
Error LVTypeVisitor::visitKnownRecord(CVType &Record, FuncIdRecord &Func) {
603
LLVM_DEBUG({
604
printTypeIndex("TypeIndex", CurrentTypeIndex, StreamTPI);
605
printTypeIndex("Type", Func.getFunctionType(), StreamTPI);
606
printTypeIndex("Parent", Func.getParentScope(), StreamTPI);
607
W.printString("Name", Func.getName());
608
});
609
610
// Collect function name for scope deduction.
611
Shared->NamespaceDeduction.add(Func.getName());
612
return Error::success();
613
}
614
615
// LF_PROCEDURE (TPI)
616
Error LVTypeVisitor::visitKnownRecord(CVType &Record, ProcedureRecord &Proc) {
617
LLVM_DEBUG({
618
printTypeIndex("TypeIndex", CurrentTypeIndex, StreamTPI);
619
printTypeIndex("ReturnType", Proc.getReturnType(), StreamTPI);
620
W.printNumber("NumParameters", Proc.getParameterCount());
621
printTypeIndex("ArgListType", Proc.getArgumentList(), StreamTPI);
622
});
623
624
// Collect procedure information as they can be referenced by typedefs.
625
Shared->TypeRecords.add(StreamTPI, CurrentTypeIndex, {});
626
return Error::success();
627
}
628
629
// LF_STRING_ID (TPI)/(IPI)
630
Error LVTypeVisitor::visitKnownRecord(CVType &Record, StringIdRecord &String) {
631
// No additional references are needed.
632
LLVM_DEBUG({
633
printTypeIndex("Id", String.getId(), StreamIPI);
634
W.printString("StringData", String.getString());
635
});
636
return Error::success();
637
}
638
639
// LF_UDT_SRC_LINE (TPI)/(IPI)
640
Error LVTypeVisitor::visitKnownRecord(CVType &Record,
641
UdtSourceLineRecord &Line) {
642
// UDT and SourceFile are references into the TPI/IPI stream.
643
LLVM_DEBUG({
644
printTypeIndex("UDT", Line.getUDT(), StreamIPI);
645
printTypeIndex("SourceFile", Line.getSourceFile(), StreamIPI);
646
W.printNumber("LineNumber", Line.getLineNumber());
647
});
648
649
Shared->LineRecords.push_back(CurrentTypeIndex);
650
return Error::success();
651
}
652
653
// LF_UNION (TPI)
654
Error LVTypeVisitor::visitKnownRecord(CVType &Record, UnionRecord &Union) {
655
LLVM_DEBUG({
656
W.printNumber("MemberCount", Union.getMemberCount());
657
printTypeIndex("FieldList", Union.getFieldList(), StreamTPI);
658
W.printNumber("SizeOf", Union.getSize());
659
W.printString("Name", Union.getName());
660
if (Union.hasUniqueName())
661
W.printString("UniqueName", Union.getUniqueName());
662
});
663
664
// Collect union name for scope deduction.
665
Shared->NamespaceDeduction.add(Union.getName());
666
Shared->ForwardReferences.record(Union.isForwardRef(), Union.getName(),
667
CurrentTypeIndex);
668
669
// Collect class name for contained scopes deduction.
670
Shared->TypeRecords.add(StreamIdx, CurrentTypeIndex, Union.getName());
671
return Error::success();
672
}
673
674
#undef DEBUG_TYPE
675
#define DEBUG_TYPE "CodeViewSymbolVisitor"
676
677
//===----------------------------------------------------------------------===//
678
// SymbolRecord traversal.
679
//===----------------------------------------------------------------------===//
680
void LVSymbolVisitorDelegate::printRelocatedField(StringRef Label,
681
uint32_t RelocOffset,
682
uint32_t Offset,
683
StringRef *RelocSym) {
684
Reader->printRelocatedField(Label, CoffSection, RelocOffset, Offset,
685
RelocSym);
686
}
687
688
void LVSymbolVisitorDelegate::getLinkageName(uint32_t RelocOffset,
689
uint32_t Offset,
690
StringRef *RelocSym) {
691
Reader->getLinkageName(CoffSection, RelocOffset, Offset, RelocSym);
692
}
693
694
StringRef
695
LVSymbolVisitorDelegate::getFileNameForFileOffset(uint32_t FileOffset) {
696
Expected<StringRef> Name = Reader->getFileNameForFileOffset(FileOffset);
697
if (!Name) {
698
consumeError(Name.takeError());
699
return {};
700
}
701
return *Name;
702
}
703
704
DebugStringTableSubsectionRef LVSymbolVisitorDelegate::getStringTable() {
705
return Reader->CVStringTable;
706
}
707
708
void LVSymbolVisitor::printLocalVariableAddrRange(
709
const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
710
DictScope S(W, "LocalVariableAddrRange");
711
if (ObjDelegate)
712
ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
713
Range.OffsetStart);
714
W.printHex("ISectStart", Range.ISectStart);
715
W.printHex("Range", Range.Range);
716
}
717
718
void LVSymbolVisitor::printLocalVariableAddrGap(
719
ArrayRef<LocalVariableAddrGap> Gaps) {
720
for (const LocalVariableAddrGap &Gap : Gaps) {
721
ListScope S(W, "LocalVariableAddrGap");
722
W.printHex("GapStartOffset", Gap.GapStartOffset);
723
W.printHex("Range", Gap.Range);
724
}
725
}
726
727
void LVSymbolVisitor::printTypeIndex(StringRef FieldName, TypeIndex TI) const {
728
codeview::printTypeIndex(W, FieldName, TI, Types);
729
}
730
731
Error LVSymbolVisitor::visitSymbolBegin(CVSymbol &Record) {
732
return visitSymbolBegin(Record, 0);
733
}
734
735
Error LVSymbolVisitor::visitSymbolBegin(CVSymbol &Record, uint32_t Offset) {
736
SymbolKind Kind = Record.kind();
737
LLVM_DEBUG({
738
W.printNumber("Offset", Offset);
739
W.printEnum("Begin Kind", unsigned(Kind), getSymbolTypeNames());
740
});
741
742
if (options().getInternalTag())
743
Shared->SymbolKinds.insert(Kind);
744
745
LogicalVisitor->CurrentElement = LogicalVisitor->createElement(Kind);
746
if (!LogicalVisitor->CurrentElement) {
747
LLVM_DEBUG({
748
// We have an unsupported Symbol or Type Record.
749
// W.printEnum("Kind ignored", unsigned(Kind), getSymbolTypeNames());
750
});
751
return Error::success();
752
}
753
754
// Offset carried by the traversal routines when dealing with streams.
755
CurrentOffset = Offset;
756
IsCompileUnit = false;
757
if (!LogicalVisitor->CurrentElement->getOffsetFromTypeIndex())
758
LogicalVisitor->CurrentElement->setOffset(Offset);
759
if (symbolOpensScope(Kind) || (IsCompileUnit = symbolIsCompileUnit(Kind))) {
760
assert(LogicalVisitor->CurrentScope && "Invalid scope!");
761
LogicalVisitor->addElement(LogicalVisitor->CurrentScope, IsCompileUnit);
762
} else {
763
if (LogicalVisitor->CurrentSymbol)
764
LogicalVisitor->addElement(LogicalVisitor->CurrentSymbol);
765
if (LogicalVisitor->CurrentType)
766
LogicalVisitor->addElement(LogicalVisitor->CurrentType);
767
}
768
769
return Error::success();
770
}
771
772
Error LVSymbolVisitor::visitSymbolEnd(CVSymbol &Record) {
773
SymbolKind Kind = Record.kind();
774
LLVM_DEBUG(
775
{ W.printEnum("End Kind", unsigned(Kind), getSymbolTypeNames()); });
776
777
if (symbolEndsScope(Kind)) {
778
LogicalVisitor->popScope();
779
}
780
781
return Error::success();
782
}
783
784
Error LVSymbolVisitor::visitUnknownSymbol(CVSymbol &Record) {
785
LLVM_DEBUG({ W.printNumber("Length", Record.length()); });
786
return Error::success();
787
}
788
789
// S_BLOCK32
790
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, BlockSym &Block) {
791
LLVM_DEBUG({
792
W.printHex("CodeSize", Block.CodeSize);
793
W.printHex("Segment", Block.Segment);
794
W.printString("BlockName", Block.Name);
795
});
796
797
if (LVScope *Scope = LogicalVisitor->CurrentScope) {
798
StringRef LinkageName;
799
if (ObjDelegate)
800
ObjDelegate->getLinkageName(Block.getRelocationOffset(), Block.CodeOffset,
801
&LinkageName);
802
Scope->setLinkageName(LinkageName);
803
804
if (options().getGeneralCollectRanges()) {
805
// Record converted segment::offset addressing for this scope.
806
LVAddress Addendum = Reader->getSymbolTableAddress(LinkageName);
807
LVAddress LowPC =
808
Reader->linearAddress(Block.Segment, Block.CodeOffset, Addendum);
809
LVAddress HighPC = LowPC + Block.CodeSize - 1;
810
Scope->addObject(LowPC, HighPC);
811
}
812
}
813
814
return Error::success();
815
}
816
817
// S_BPREL32
818
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
819
BPRelativeSym &Local) {
820
LLVM_DEBUG({
821
printTypeIndex("Type", Local.Type);
822
W.printNumber("Offset", Local.Offset);
823
W.printString("VarName", Local.Name);
824
});
825
826
if (LVSymbol *Symbol = LogicalVisitor->CurrentSymbol) {
827
Symbol->setName(Local.Name);
828
// From the MS_Symbol_Type.pdf documentation (S_BPREL32):
829
// This symbol specifies symbols that are allocated on the stack for a
830
// procedure. For C and C++, these include the actual function parameters
831
// and the local non-static variables of functions.
832
// However, the offset for 'this' comes as a negative value.
833
834
// Symbol was created as 'variable'; determine its real kind.
835
Symbol->resetIsVariable();
836
837
if (Local.Name == "this") {
838
Symbol->setIsParameter();
839
Symbol->setIsArtificial();
840
} else {
841
// Determine symbol kind.
842
bool(Local.Offset > 0) ? Symbol->setIsParameter()
843
: Symbol->setIsVariable();
844
}
845
846
// Update correct debug information tag.
847
if (Symbol->getIsParameter())
848
Symbol->setTag(dwarf::DW_TAG_formal_parameter);
849
850
LVElement *Element = LogicalVisitor->getElement(StreamTPI, Local.Type);
851
if (Element && Element->getIsScoped()) {
852
// We have a local type. Find its parent function.
853
LVScope *Parent = Symbol->getFunctionParent();
854
// The element representing the type has been already finalized. If
855
// the type is an aggregate type, its members have been already added.
856
// As the type is local, its level will be changed.
857
858
// FIXME: Currently the algorithm used to scope lambda functions is
859
// incorrect. Before we allocate the type at this scope, check if is
860
// already allocated in other scope.
861
if (!Element->getParentScope()) {
862
Parent->addElement(Element);
863
Element->updateLevel(Parent);
864
}
865
}
866
Symbol->setType(Element);
867
}
868
869
return Error::success();
870
}
871
872
// S_REGREL32
873
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
874
RegRelativeSym &Local) {
875
LLVM_DEBUG({
876
printTypeIndex("Type", Local.Type);
877
W.printNumber("Offset", Local.Offset);
878
W.printString("VarName", Local.Name);
879
});
880
881
if (LVSymbol *Symbol = LogicalVisitor->CurrentSymbol) {
882
Symbol->setName(Local.Name);
883
884
// Symbol was created as 'variable'; determine its real kind.
885
Symbol->resetIsVariable();
886
887
// Check for the 'this' symbol.
888
if (Local.Name == "this") {
889
Symbol->setIsArtificial();
890
Symbol->setIsParameter();
891
} else {
892
// Determine symbol kind.
893
determineSymbolKind(Symbol, Local.Register);
894
}
895
896
// Update correct debug information tag.
897
if (Symbol->getIsParameter())
898
Symbol->setTag(dwarf::DW_TAG_formal_parameter);
899
900
LVElement *Element = LogicalVisitor->getElement(StreamTPI, Local.Type);
901
if (Element && Element->getIsScoped()) {
902
// We have a local type. Find its parent function.
903
LVScope *Parent = Symbol->getFunctionParent();
904
// The element representing the type has been already finalized. If
905
// the type is an aggregate type, its members have been already added.
906
// As the type is local, its level will be changed.
907
908
// FIXME: Currently the algorithm used to scope lambda functions is
909
// incorrect. Before we allocate the type at this scope, check if is
910
// already allocated in other scope.
911
if (!Element->getParentScope()) {
912
Parent->addElement(Element);
913
Element->updateLevel(Parent);
914
}
915
}
916
Symbol->setType(Element);
917
}
918
919
return Error::success();
920
}
921
922
// S_BUILDINFO
923
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &CVR,
924
BuildInfoSym &BuildInfo) {
925
LLVM_DEBUG({ printTypeIndex("BuildId", BuildInfo.BuildId); });
926
927
CVType CVBuildType = Ids.getType(BuildInfo.BuildId);
928
if (Error Err = LogicalVisitor->finishVisitation(
929
CVBuildType, BuildInfo.BuildId, Reader->getCompileUnit()))
930
return Err;
931
932
return Error::success();
933
}
934
935
// S_COMPILE2
936
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
937
Compile2Sym &Compile2) {
938
LLVM_DEBUG({
939
W.printEnum("Language", uint8_t(Compile2.getLanguage()),
940
getSourceLanguageNames());
941
W.printFlags("Flags", uint32_t(Compile2.getFlags()),
942
getCompileSym3FlagNames());
943
W.printEnum("Machine", unsigned(Compile2.Machine), getCPUTypeNames());
944
W.printString("VersionName", Compile2.Version);
945
});
946
947
// MSVC generates the following sequence for a CodeView module:
948
// S_OBJNAME --> Set 'CurrentObjectName'.
949
// S_COMPILE2 --> Set the compile unit name using 'CurrentObjectName'.
950
// ...
951
// S_BUILDINFO --> Extract the source name.
952
//
953
// Clang generates the following sequence for a CodeView module:
954
// S_COMPILE2 --> Set the compile unit name to empty string.
955
// ...
956
// S_BUILDINFO --> Extract the source name.
957
//
958
// For both toolchains, update the compile unit name from S_BUILDINFO.
959
if (LVScope *Scope = LogicalVisitor->CurrentScope) {
960
// The name of the CU, was extracted from the 'BuildInfo' subsection.
961
Reader->setCompileUnitCPUType(Compile2.Machine);
962
Scope->setName(CurrentObjectName);
963
if (options().getAttributeProducer())
964
Scope->setProducer(Compile2.Version);
965
getReader().isSystemEntry(Scope, CurrentObjectName);
966
967
// The line records in CodeView are recorded per Module ID. Update
968
// the relationship between the current CU and the Module ID.
969
Reader->addModule(Scope);
970
971
// Updated the collected strings with their associated compile unit.
972
Shared->StringRecords.addFilenames(Reader->getCompileUnit());
973
}
974
975
// Clear any previous ObjectName.
976
CurrentObjectName = "";
977
return Error::success();
978
}
979
980
// S_COMPILE3
981
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
982
Compile3Sym &Compile3) {
983
LLVM_DEBUG({
984
W.printEnum("Language", uint8_t(Compile3.getLanguage()),
985
getSourceLanguageNames());
986
W.printFlags("Flags", uint32_t(Compile3.getFlags()),
987
getCompileSym3FlagNames());
988
W.printEnum("Machine", unsigned(Compile3.Machine), getCPUTypeNames());
989
W.printString("VersionName", Compile3.Version);
990
});
991
992
// MSVC generates the following sequence for a CodeView module:
993
// S_OBJNAME --> Set 'CurrentObjectName'.
994
// S_COMPILE3 --> Set the compile unit name using 'CurrentObjectName'.
995
// ...
996
// S_BUILDINFO --> Extract the source name.
997
//
998
// Clang generates the following sequence for a CodeView module:
999
// S_COMPILE3 --> Set the compile unit name to empty string.
1000
// ...
1001
// S_BUILDINFO --> Extract the source name.
1002
//
1003
// For both toolchains, update the compile unit name from S_BUILDINFO.
1004
if (LVScope *Scope = LogicalVisitor->CurrentScope) {
1005
// The name of the CU, was extracted from the 'BuildInfo' subsection.
1006
Reader->setCompileUnitCPUType(Compile3.Machine);
1007
Scope->setName(CurrentObjectName);
1008
if (options().getAttributeProducer())
1009
Scope->setProducer(Compile3.Version);
1010
getReader().isSystemEntry(Scope, CurrentObjectName);
1011
1012
// The line records in CodeView are recorded per Module ID. Update
1013
// the relationship between the current CU and the Module ID.
1014
Reader->addModule(Scope);
1015
1016
// Updated the collected strings with their associated compile unit.
1017
Shared->StringRecords.addFilenames(Reader->getCompileUnit());
1018
}
1019
1020
// Clear any previous ObjectName.
1021
CurrentObjectName = "";
1022
return Error::success();
1023
}
1024
1025
// S_CONSTANT, S_MANCONSTANT
1026
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1027
ConstantSym &Constant) {
1028
LLVM_DEBUG({
1029
printTypeIndex("Type", Constant.Type);
1030
W.printNumber("Value", Constant.Value);
1031
W.printString("Name", Constant.Name);
1032
});
1033
1034
if (LVSymbol *Symbol = LogicalVisitor->CurrentSymbol) {
1035
Symbol->setName(Constant.Name);
1036
Symbol->setType(LogicalVisitor->getElement(StreamTPI, Constant.Type));
1037
Symbol->resetIncludeInPrint();
1038
}
1039
1040
return Error::success();
1041
}
1042
1043
// S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE
1044
Error LVSymbolVisitor::visitKnownRecord(
1045
CVSymbol &Record,
1046
DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
1047
// DefRanges don't have types, just registers and code offsets.
1048
LLVM_DEBUG({
1049
if (LocalSymbol)
1050
W.getOStream() << formatv("Symbol: {0}, ", LocalSymbol->getName());
1051
1052
W.printNumber("Offset", DefRangeFramePointerRelFullScope.Offset);
1053
});
1054
1055
if (LVSymbol *Symbol = LocalSymbol) {
1056
Symbol->setHasCodeViewLocation();
1057
LocalSymbol = nullptr;
1058
1059
// Add location debug location. Operands: [Offset, 0].
1060
dwarf::Attribute Attr =
1061
dwarf::Attribute(SymbolKind::S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE);
1062
1063
uint64_t Operand1 = DefRangeFramePointerRelFullScope.Offset;
1064
Symbol->addLocation(Attr, 0, 0, 0, 0);
1065
Symbol->addLocationOperands(LVSmall(Attr), {Operand1});
1066
}
1067
1068
return Error::success();
1069
}
1070
1071
// S_DEFRANGE_FRAMEPOINTER_REL
1072
Error LVSymbolVisitor::visitKnownRecord(
1073
CVSymbol &Record, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
1074
// DefRanges don't have types, just registers and code offsets.
1075
LLVM_DEBUG({
1076
if (LocalSymbol)
1077
W.getOStream() << formatv("Symbol: {0}, ", LocalSymbol->getName());
1078
1079
W.printNumber("Offset", DefRangeFramePointerRel.Hdr.Offset);
1080
printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
1081
DefRangeFramePointerRel.getRelocationOffset());
1082
printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
1083
});
1084
1085
// We are expecting the following sequence:
1086
// 128 | S_LOCAL [size = 20] `ParamBar`
1087
// ...
1088
// 148 | S_DEFRANGE_FRAMEPOINTER_REL [size = 16]
1089
if (LVSymbol *Symbol = LocalSymbol) {
1090
Symbol->setHasCodeViewLocation();
1091
LocalSymbol = nullptr;
1092
1093
// Add location debug location. Operands: [Offset, 0].
1094
dwarf::Attribute Attr =
1095
dwarf::Attribute(SymbolKind::S_DEFRANGE_FRAMEPOINTER_REL);
1096
uint64_t Operand1 = DefRangeFramePointerRel.Hdr.Offset;
1097
1098
LocalVariableAddrRange Range = DefRangeFramePointerRel.Range;
1099
LVAddress Address =
1100
Reader->linearAddress(Range.ISectStart, Range.OffsetStart);
1101
1102
Symbol->addLocation(Attr, Address, Address + Range.Range, 0, 0);
1103
Symbol->addLocationOperands(LVSmall(Attr), {Operand1});
1104
}
1105
1106
return Error::success();
1107
}
1108
1109
// S_DEFRANGE_REGISTER_REL
1110
Error LVSymbolVisitor::visitKnownRecord(
1111
CVSymbol &Record, DefRangeRegisterRelSym &DefRangeRegisterRel) {
1112
// DefRanges don't have types, just registers and code offsets.
1113
LLVM_DEBUG({
1114
if (LocalSymbol)
1115
W.getOStream() << formatv("Symbol: {0}, ", LocalSymbol->getName());
1116
1117
W.printBoolean("HasSpilledUDTMember",
1118
DefRangeRegisterRel.hasSpilledUDTMember());
1119
W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
1120
W.printNumber("BasePointerOffset",
1121
DefRangeRegisterRel.Hdr.BasePointerOffset);
1122
printLocalVariableAddrRange(DefRangeRegisterRel.Range,
1123
DefRangeRegisterRel.getRelocationOffset());
1124
printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
1125
});
1126
1127
if (LVSymbol *Symbol = LocalSymbol) {
1128
Symbol->setHasCodeViewLocation();
1129
LocalSymbol = nullptr;
1130
1131
// Add location debug location. Operands: [Register, Offset].
1132
dwarf::Attribute Attr =
1133
dwarf::Attribute(SymbolKind::S_DEFRANGE_REGISTER_REL);
1134
uint64_t Operand1 = DefRangeRegisterRel.Hdr.Register;
1135
uint64_t Operand2 = DefRangeRegisterRel.Hdr.BasePointerOffset;
1136
1137
LocalVariableAddrRange Range = DefRangeRegisterRel.Range;
1138
LVAddress Address =
1139
Reader->linearAddress(Range.ISectStart, Range.OffsetStart);
1140
1141
Symbol->addLocation(Attr, Address, Address + Range.Range, 0, 0);
1142
Symbol->addLocationOperands(LVSmall(Attr), {Operand1, Operand2});
1143
}
1144
1145
return Error::success();
1146
}
1147
1148
// S_DEFRANGE_REGISTER
1149
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1150
DefRangeRegisterSym &DefRangeRegister) {
1151
// DefRanges don't have types, just registers and code offsets.
1152
LLVM_DEBUG({
1153
if (LocalSymbol)
1154
W.getOStream() << formatv("Symbol: {0}, ", LocalSymbol->getName());
1155
1156
W.printEnum("Register", uint16_t(DefRangeRegister.Hdr.Register),
1157
getRegisterNames(Reader->getCompileUnitCPUType()));
1158
W.printNumber("MayHaveNoName", DefRangeRegister.Hdr.MayHaveNoName);
1159
printLocalVariableAddrRange(DefRangeRegister.Range,
1160
DefRangeRegister.getRelocationOffset());
1161
printLocalVariableAddrGap(DefRangeRegister.Gaps);
1162
});
1163
1164
if (LVSymbol *Symbol = LocalSymbol) {
1165
Symbol->setHasCodeViewLocation();
1166
LocalSymbol = nullptr;
1167
1168
// Add location debug location. Operands: [Register, 0].
1169
dwarf::Attribute Attr = dwarf::Attribute(SymbolKind::S_DEFRANGE_REGISTER);
1170
uint64_t Operand1 = DefRangeRegister.Hdr.Register;
1171
1172
LocalVariableAddrRange Range = DefRangeRegister.Range;
1173
LVAddress Address =
1174
Reader->linearAddress(Range.ISectStart, Range.OffsetStart);
1175
1176
Symbol->addLocation(Attr, Address, Address + Range.Range, 0, 0);
1177
Symbol->addLocationOperands(LVSmall(Attr), {Operand1});
1178
}
1179
1180
return Error::success();
1181
}
1182
1183
// S_DEFRANGE_SUBFIELD_REGISTER
1184
Error LVSymbolVisitor::visitKnownRecord(
1185
CVSymbol &Record, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
1186
// DefRanges don't have types, just registers and code offsets.
1187
LLVM_DEBUG({
1188
if (LocalSymbol)
1189
W.getOStream() << formatv("Symbol: {0}, ", LocalSymbol->getName());
1190
1191
W.printEnum("Register", uint16_t(DefRangeSubfieldRegister.Hdr.Register),
1192
getRegisterNames(Reader->getCompileUnitCPUType()));
1193
W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Hdr.MayHaveNoName);
1194
W.printNumber("OffsetInParent",
1195
DefRangeSubfieldRegister.Hdr.OffsetInParent);
1196
printLocalVariableAddrRange(DefRangeSubfieldRegister.Range,
1197
DefRangeSubfieldRegister.getRelocationOffset());
1198
printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
1199
});
1200
1201
if (LVSymbol *Symbol = LocalSymbol) {
1202
Symbol->setHasCodeViewLocation();
1203
LocalSymbol = nullptr;
1204
1205
// Add location debug location. Operands: [Register, 0].
1206
dwarf::Attribute Attr =
1207
dwarf::Attribute(SymbolKind::S_DEFRANGE_SUBFIELD_REGISTER);
1208
uint64_t Operand1 = DefRangeSubfieldRegister.Hdr.Register;
1209
1210
LocalVariableAddrRange Range = DefRangeSubfieldRegister.Range;
1211
LVAddress Address =
1212
Reader->linearAddress(Range.ISectStart, Range.OffsetStart);
1213
1214
Symbol->addLocation(Attr, Address, Address + Range.Range, 0, 0);
1215
Symbol->addLocationOperands(LVSmall(Attr), {Operand1});
1216
}
1217
1218
return Error::success();
1219
}
1220
1221
// S_DEFRANGE_SUBFIELD
1222
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1223
DefRangeSubfieldSym &DefRangeSubfield) {
1224
// DefRanges don't have types, just registers and code offsets.
1225
LLVM_DEBUG({
1226
if (LocalSymbol)
1227
W.getOStream() << formatv("Symbol: {0}, ", LocalSymbol->getName());
1228
1229
if (ObjDelegate) {
1230
DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
1231
auto ExpectedProgram = Strings.getString(DefRangeSubfield.Program);
1232
if (!ExpectedProgram) {
1233
consumeError(ExpectedProgram.takeError());
1234
return llvm::make_error<CodeViewError>(
1235
"String table offset outside of bounds of String Table!");
1236
}
1237
W.printString("Program", *ExpectedProgram);
1238
}
1239
W.printNumber("OffsetInParent", DefRangeSubfield.OffsetInParent);
1240
printLocalVariableAddrRange(DefRangeSubfield.Range,
1241
DefRangeSubfield.getRelocationOffset());
1242
printLocalVariableAddrGap(DefRangeSubfield.Gaps);
1243
});
1244
1245
if (LVSymbol *Symbol = LocalSymbol) {
1246
Symbol->setHasCodeViewLocation();
1247
LocalSymbol = nullptr;
1248
1249
// Add location debug location. Operands: [Program, 0].
1250
dwarf::Attribute Attr = dwarf::Attribute(SymbolKind::S_DEFRANGE_SUBFIELD);
1251
uint64_t Operand1 = DefRangeSubfield.Program;
1252
1253
LocalVariableAddrRange Range = DefRangeSubfield.Range;
1254
LVAddress Address =
1255
Reader->linearAddress(Range.ISectStart, Range.OffsetStart);
1256
1257
Symbol->addLocation(Attr, Address, Address + Range.Range, 0, 0);
1258
Symbol->addLocationOperands(LVSmall(Attr), {Operand1, /*Operand2=*/0});
1259
}
1260
1261
return Error::success();
1262
}
1263
1264
// S_DEFRANGE
1265
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1266
DefRangeSym &DefRange) {
1267
// DefRanges don't have types, just registers and code offsets.
1268
LLVM_DEBUG({
1269
if (LocalSymbol)
1270
W.getOStream() << formatv("Symbol: {0}, ", LocalSymbol->getName());
1271
1272
if (ObjDelegate) {
1273
DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
1274
auto ExpectedProgram = Strings.getString(DefRange.Program);
1275
if (!ExpectedProgram) {
1276
consumeError(ExpectedProgram.takeError());
1277
return llvm::make_error<CodeViewError>(
1278
"String table offset outside of bounds of String Table!");
1279
}
1280
W.printString("Program", *ExpectedProgram);
1281
}
1282
printLocalVariableAddrRange(DefRange.Range, DefRange.getRelocationOffset());
1283
printLocalVariableAddrGap(DefRange.Gaps);
1284
});
1285
1286
if (LVSymbol *Symbol = LocalSymbol) {
1287
Symbol->setHasCodeViewLocation();
1288
LocalSymbol = nullptr;
1289
1290
// Add location debug location. Operands: [Program, 0].
1291
dwarf::Attribute Attr = dwarf::Attribute(SymbolKind::S_DEFRANGE);
1292
uint64_t Operand1 = DefRange.Program;
1293
1294
LocalVariableAddrRange Range = DefRange.Range;
1295
LVAddress Address =
1296
Reader->linearAddress(Range.ISectStart, Range.OffsetStart);
1297
1298
Symbol->addLocation(Attr, Address, Address + Range.Range, 0, 0);
1299
Symbol->addLocationOperands(LVSmall(Attr), {Operand1, /*Operand2=*/0});
1300
}
1301
1302
return Error::success();
1303
}
1304
1305
// S_FRAMEPROC
1306
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1307
FrameProcSym &FrameProc) {
1308
if (LVScope *Function = LogicalVisitor->getReaderScope()) {
1309
// S_FRAMEPROC contains extra information for the function described
1310
// by any of the previous generated records:
1311
// S_GPROC32, S_LPROC32, S_LPROC32_ID, S_GPROC32_ID.
1312
1313
// The generated sequence is:
1314
// S_GPROC32_ID ...
1315
// S_FRAMEPROC ...
1316
1317
// Collect additional inline flags for the current scope function.
1318
FrameProcedureOptions Flags = FrameProc.Flags;
1319
if (FrameProcedureOptions::MarkedInline ==
1320
(Flags & FrameProcedureOptions::MarkedInline))
1321
Function->setInlineCode(dwarf::DW_INL_declared_inlined);
1322
if (FrameProcedureOptions::Inlined ==
1323
(Flags & FrameProcedureOptions::Inlined))
1324
Function->setInlineCode(dwarf::DW_INL_inlined);
1325
1326
// To determine the symbol kind for any symbol declared in that function,
1327
// we can access the S_FRAMEPROC for the parent scope function. It contains
1328
// information about the local fp and param fp registers and compare with
1329
// the register in the S_REGREL32 to get a match.
1330
codeview::CPUType CPU = Reader->getCompileUnitCPUType();
1331
LocalFrameRegister = FrameProc.getLocalFramePtrReg(CPU);
1332
ParamFrameRegister = FrameProc.getParamFramePtrReg(CPU);
1333
}
1334
1335
return Error::success();
1336
}
1337
1338
// S_GDATA32, S_LDATA32, S_LMANDATA, S_GMANDATA
1339
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, DataSym &Data) {
1340
LLVM_DEBUG({
1341
printTypeIndex("Type", Data.Type);
1342
W.printString("DisplayName", Data.Name);
1343
});
1344
1345
if (LVSymbol *Symbol = LogicalVisitor->CurrentSymbol) {
1346
StringRef LinkageName;
1347
if (ObjDelegate)
1348
ObjDelegate->getLinkageName(Data.getRelocationOffset(), Data.DataOffset,
1349
&LinkageName);
1350
1351
Symbol->setName(Data.Name);
1352
Symbol->setLinkageName(LinkageName);
1353
1354
// The MSVC generates local data as initialization for aggregates. It
1355
// contains the address for an initialization function.
1356
// The symbols contains the '$initializer$' pattern. Allow them only if
1357
// the '--internal=system' option is given.
1358
// 0 | S_LDATA32 `Struct$initializer$`
1359
// type = 0x1040 (void ()*)
1360
if (getReader().isSystemEntry(Symbol) && !options().getAttributeSystem()) {
1361
Symbol->resetIncludeInPrint();
1362
return Error::success();
1363
}
1364
1365
if (LVScope *Namespace = Shared->NamespaceDeduction.get(Data.Name)) {
1366
// The variable is already at different scope. In order to reflect
1367
// the correct parent, move it to the namespace.
1368
if (Symbol->getParentScope()->removeElement(Symbol))
1369
Namespace->addElement(Symbol);
1370
}
1371
1372
Symbol->setType(LogicalVisitor->getElement(StreamTPI, Data.Type));
1373
if (Record.kind() == SymbolKind::S_GDATA32)
1374
Symbol->setIsExternal();
1375
}
1376
1377
return Error::success();
1378
}
1379
1380
// S_INLINESITE
1381
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1382
InlineSiteSym &InlineSite) {
1383
LLVM_DEBUG({ printTypeIndex("Inlinee", InlineSite.Inlinee); });
1384
1385
if (LVScope *InlinedFunction = LogicalVisitor->CurrentScope) {
1386
LVScope *AbstractFunction = Reader->createScopeFunction();
1387
AbstractFunction->setIsSubprogram();
1388
AbstractFunction->setTag(dwarf::DW_TAG_subprogram);
1389
AbstractFunction->setInlineCode(dwarf::DW_INL_inlined);
1390
AbstractFunction->setIsInlinedAbstract();
1391
InlinedFunction->setReference(AbstractFunction);
1392
1393
LogicalVisitor->startProcessArgumentList();
1394
// 'Inlinee' is a Type ID.
1395
CVType CVFunctionType = Ids.getType(InlineSite.Inlinee);
1396
if (Error Err = LogicalVisitor->finishVisitation(
1397
CVFunctionType, InlineSite.Inlinee, AbstractFunction))
1398
return Err;
1399
LogicalVisitor->stopProcessArgumentList();
1400
1401
// For inlined functions set the linkage name to be the same as
1402
// the name. It used to find their lines and ranges.
1403
StringRef Name = AbstractFunction->getName();
1404
InlinedFunction->setName(Name);
1405
InlinedFunction->setLinkageName(Name);
1406
1407
// Process annotation bytes to calculate code and line offsets.
1408
if (Error Err = LogicalVisitor->inlineSiteAnnotation(
1409
AbstractFunction, InlinedFunction, InlineSite))
1410
return Err;
1411
}
1412
1413
return Error::success();
1414
}
1415
1416
// S_LOCAL
1417
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, LocalSym &Local) {
1418
LLVM_DEBUG({
1419
printTypeIndex("Type", Local.Type);
1420
W.printFlags("Flags", uint16_t(Local.Flags), getLocalFlagNames());
1421
W.printString("VarName", Local.Name);
1422
});
1423
1424
if (LVSymbol *Symbol = LogicalVisitor->CurrentSymbol) {
1425
Symbol->setName(Local.Name);
1426
1427
// Symbol was created as 'variable'; determine its real kind.
1428
Symbol->resetIsVariable();
1429
1430
// Be sure the 'this' symbol is marked as 'compiler generated'.
1431
if (bool(Local.Flags & LocalSymFlags::IsCompilerGenerated) ||
1432
Local.Name == "this") {
1433
Symbol->setIsArtificial();
1434
Symbol->setIsParameter();
1435
} else {
1436
bool(Local.Flags & LocalSymFlags::IsParameter) ? Symbol->setIsParameter()
1437
: Symbol->setIsVariable();
1438
}
1439
1440
// Update correct debug information tag.
1441
if (Symbol->getIsParameter())
1442
Symbol->setTag(dwarf::DW_TAG_formal_parameter);
1443
1444
LVElement *Element = LogicalVisitor->getElement(StreamTPI, Local.Type);
1445
if (Element && Element->getIsScoped()) {
1446
// We have a local type. Find its parent function.
1447
LVScope *Parent = Symbol->getFunctionParent();
1448
// The element representing the type has been already finalized. If
1449
// the type is an aggregate type, its members have been already added.
1450
// As the type is local, its level will be changed.
1451
Parent->addElement(Element);
1452
Element->updateLevel(Parent);
1453
}
1454
Symbol->setType(Element);
1455
1456
// The CodeView records (S_DEFFRAME_*) describing debug location for
1457
// this symbol, do not have any direct reference to it. Those records
1458
// are emitted after this symbol. Record the current symbol.
1459
LocalSymbol = Symbol;
1460
}
1461
1462
return Error::success();
1463
}
1464
1465
// S_OBJNAME
1466
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, ObjNameSym &ObjName) {
1467
LLVM_DEBUG({
1468
W.printHex("Signature", ObjName.Signature);
1469
W.printString("ObjectName", ObjName.Name);
1470
});
1471
1472
CurrentObjectName = ObjName.Name;
1473
return Error::success();
1474
}
1475
1476
// S_GPROC32, S_LPROC32, S_LPROC32_ID, S_GPROC32_ID
1477
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, ProcSym &Proc) {
1478
if (InFunctionScope)
1479
return llvm::make_error<CodeViewError>("Visiting a ProcSym while inside "
1480
"function scope!");
1481
1482
InFunctionScope = true;
1483
1484
LLVM_DEBUG({
1485
printTypeIndex("FunctionType", Proc.FunctionType);
1486
W.printHex("Segment", Proc.Segment);
1487
W.printFlags("Flags", static_cast<uint8_t>(Proc.Flags),
1488
getProcSymFlagNames());
1489
W.printString("DisplayName", Proc.Name);
1490
});
1491
1492
// Clang and Microsoft generated different debug information records:
1493
// For functions definitions:
1494
// Clang: S_GPROC32 -> LF_FUNC_ID -> LF_PROCEDURE
1495
// Microsoft: S_GPROC32 -> LF_PROCEDURE
1496
1497
// For member function definition:
1498
// Clang: S_GPROC32 -> LF_MFUNC_ID -> LF_MFUNCTION
1499
// Microsoft: S_GPROC32 -> LF_MFUNCTION
1500
// In order to support both sequences, if we found LF_FUNCTION_ID, just
1501
// get the TypeIndex for LF_PROCEDURE.
1502
1503
// For the given test case, we have the sequence:
1504
// namespace NSP_local {
1505
// void foo_local() {
1506
// }
1507
// }
1508
//
1509
// 0x1000 | LF_STRING_ID String: NSP_local
1510
// 0x1002 | LF_PROCEDURE
1511
// return type = 0x0003 (void), # args = 0, param list = 0x1001
1512
// calling conv = cdecl, options = None
1513
// 0x1003 | LF_FUNC_ID
1514
// name = foo_local, type = 0x1002, parent scope = 0x1000
1515
// 0 | S_GPROC32_ID `NSP_local::foo_local`
1516
// type = `0x1003 (foo_local)`
1517
// 0x1004 | LF_STRING_ID String: suite
1518
// 0x1005 | LF_STRING_ID String: suite_local.cpp
1519
//
1520
// The LF_STRING_ID can hold different information:
1521
// 0x1000 - The enclosing namespace.
1522
// 0x1004 - The compile unit directory name.
1523
// 0x1005 - The compile unit name.
1524
//
1525
// Before deducting its scope, we need to evaluate its type and create any
1526
// associated namespaces.
1527
if (LVScope *Function = LogicalVisitor->CurrentScope) {
1528
StringRef LinkageName;
1529
if (ObjDelegate)
1530
ObjDelegate->getLinkageName(Proc.getRelocationOffset(), Proc.CodeOffset,
1531
&LinkageName);
1532
1533
// The line table can be accessed using the linkage name.
1534
Reader->addToSymbolTable(LinkageName, Function);
1535
Function->setName(Proc.Name);
1536
Function->setLinkageName(LinkageName);
1537
1538
if (options().getGeneralCollectRanges()) {
1539
// Record converted segment::offset addressing for this scope.
1540
LVAddress Addendum = Reader->getSymbolTableAddress(LinkageName);
1541
LVAddress LowPC =
1542
Reader->linearAddress(Proc.Segment, Proc.CodeOffset, Addendum);
1543
LVAddress HighPC = LowPC + Proc.CodeSize - 1;
1544
Function->addObject(LowPC, HighPC);
1545
1546
// If the scope is a function, add it to the public names.
1547
if ((options().getAttributePublics() || options().getPrintAnyLine()) &&
1548
!Function->getIsInlinedFunction())
1549
Reader->getCompileUnit()->addPublicName(Function, LowPC, HighPC);
1550
}
1551
1552
if (Function->getIsSystem() && !options().getAttributeSystem()) {
1553
Function->resetIncludeInPrint();
1554
return Error::success();
1555
}
1556
1557
TypeIndex TIFunctionType = Proc.FunctionType;
1558
if (TIFunctionType.isSimple())
1559
Function->setType(LogicalVisitor->getElement(StreamTPI, TIFunctionType));
1560
else {
1561
// We have to detect the correct stream, using the lexical parent
1562
// name, as there is not other obvious way to get the stream.
1563
// Normal function: LF_FUNC_ID (TPI)/(IPI)
1564
// LF_PROCEDURE (TPI)
1565
// Lambda function: LF_MFUNCTION (TPI)
1566
// Member function: LF_MFUNC_ID (TPI)/(IPI)
1567
1568
StringRef OuterComponent;
1569
std::tie(OuterComponent, std::ignore) = getInnerComponent(Proc.Name);
1570
TypeIndex TI = Shared->ForwardReferences.find(OuterComponent);
1571
1572
std::optional<CVType> CVFunctionType;
1573
auto GetRecordType = [&]() -> bool {
1574
CVFunctionType = Ids.tryGetType(TIFunctionType);
1575
if (!CVFunctionType)
1576
return false;
1577
1578
if (TI.isNoneType())
1579
// Normal function.
1580
if (CVFunctionType->kind() == LF_FUNC_ID)
1581
return true;
1582
1583
// Member function.
1584
return (CVFunctionType->kind() == LF_MFUNC_ID);
1585
};
1586
1587
// We can have a LF_FUNC_ID, LF_PROCEDURE or LF_MFUNCTION.
1588
if (!GetRecordType()) {
1589
CVFunctionType = Types.tryGetType(TIFunctionType);
1590
if (!CVFunctionType)
1591
return llvm::make_error<CodeViewError>("Invalid type index");
1592
}
1593
1594
if (Error Err = LogicalVisitor->finishVisitation(
1595
*CVFunctionType, TIFunctionType, Function))
1596
return Err;
1597
}
1598
1599
if (Record.kind() == SymbolKind::S_GPROC32 ||
1600
Record.kind() == SymbolKind::S_GPROC32_ID)
1601
Function->setIsExternal();
1602
1603
// We don't have a way to see if the symbol is compiler generated. Use
1604
// the linkage name, to detect `scalar deleting destructor' functions.
1605
std::string DemangledSymbol = demangle(LinkageName);
1606
if (DemangledSymbol.find("scalar deleting dtor") != std::string::npos) {
1607
Function->setIsArtificial();
1608
} else {
1609
// Clang generates global ctor and dtor names containing the substrings:
1610
// 'dynamic initializer for' and 'dynamic atexit destructor for'.
1611
if (DemangledSymbol.find("dynamic atexit destructor for") !=
1612
std::string::npos)
1613
Function->setIsArtificial();
1614
}
1615
}
1616
1617
return Error::success();
1618
}
1619
1620
// S_END
1621
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1622
ScopeEndSym &ScopeEnd) {
1623
InFunctionScope = false;
1624
return Error::success();
1625
}
1626
1627
// S_THUNK32
1628
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, Thunk32Sym &Thunk) {
1629
if (InFunctionScope)
1630
return llvm::make_error<CodeViewError>("Visiting a Thunk32Sym while inside "
1631
"function scope!");
1632
1633
InFunctionScope = true;
1634
1635
LLVM_DEBUG({
1636
W.printHex("Segment", Thunk.Segment);
1637
W.printString("Name", Thunk.Name);
1638
});
1639
1640
if (LVScope *Function = LogicalVisitor->CurrentScope)
1641
Function->setName(Thunk.Name);
1642
1643
return Error::success();
1644
}
1645
1646
// S_UDT, S_COBOLUDT
1647
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, UDTSym &UDT) {
1648
LLVM_DEBUG({
1649
printTypeIndex("Type", UDT.Type);
1650
W.printString("UDTName", UDT.Name);
1651
});
1652
1653
if (LVType *Type = LogicalVisitor->CurrentType) {
1654
if (LVScope *Namespace = Shared->NamespaceDeduction.get(UDT.Name)) {
1655
if (Type->getParentScope()->removeElement(Type))
1656
Namespace->addElement(Type);
1657
}
1658
1659
Type->setName(UDT.Name);
1660
1661
// We have to determine if the typedef is a real C/C++ definition or is
1662
// the S_UDT record that describe all the user defined types.
1663
// 0 | S_UDT `Name` original type = 0x1009
1664
// 0x1009 | LF_STRUCTURE `Name`
1665
// Ignore type definitions for RTTI types:
1666
// _s__RTTIBaseClassArray, _s__RTTIBaseClassDescriptor,
1667
// _s__RTTICompleteObjectLocator, _s__RTTIClassHierarchyDescriptor.
1668
if (getReader().isSystemEntry(Type))
1669
Type->resetIncludeInPrint();
1670
else {
1671
StringRef RecordName = getRecordName(Types, UDT.Type);
1672
if (UDT.Name == RecordName)
1673
Type->resetIncludeInPrint();
1674
Type->setType(LogicalVisitor->getElement(StreamTPI, UDT.Type));
1675
}
1676
}
1677
1678
return Error::success();
1679
}
1680
1681
// S_UNAMESPACE
1682
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1683
UsingNamespaceSym &UN) {
1684
LLVM_DEBUG({ W.printString("Namespace", UN.Name); });
1685
return Error::success();
1686
}
1687
1688
// S_ARMSWITCHTABLE
1689
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &CVR,
1690
JumpTableSym &JumpTable) {
1691
LLVM_DEBUG({
1692
W.printHex("BaseOffset", JumpTable.BaseOffset);
1693
W.printNumber("BaseSegment", JumpTable.BaseSegment);
1694
W.printFlags("SwitchType", static_cast<uint16_t>(JumpTable.SwitchType),
1695
getJumpTableEntrySizeNames());
1696
W.printHex("BranchOffset", JumpTable.BranchOffset);
1697
W.printHex("TableOffset", JumpTable.TableOffset);
1698
W.printNumber("BranchSegment", JumpTable.BranchSegment);
1699
W.printNumber("TableSegment", JumpTable.TableSegment);
1700
W.printNumber("EntriesCount", JumpTable.EntriesCount);
1701
});
1702
return Error::success();
1703
}
1704
1705
// S_CALLERS, S_CALLEES, S_INLINEES
1706
Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, CallerSym &Caller) {
1707
LLVM_DEBUG({
1708
llvm::StringRef FieldName;
1709
switch (Caller.getKind()) {
1710
case SymbolRecordKind::CallerSym:
1711
FieldName = "Callee";
1712
break;
1713
case SymbolRecordKind::CalleeSym:
1714
FieldName = "Caller";
1715
break;
1716
case SymbolRecordKind::InlineesSym:
1717
FieldName = "Inlinee";
1718
break;
1719
default:
1720
return llvm::make_error<CodeViewError>(
1721
"Unknown CV Record type for a CallerSym object!");
1722
}
1723
for (auto FuncID : Caller.Indices) {
1724
printTypeIndex(FieldName, FuncID);
1725
}
1726
});
1727
return Error::success();
1728
}
1729
1730
#undef DEBUG_TYPE
1731
#define DEBUG_TYPE "CodeViewLogicalVisitor"
1732
1733
//===----------------------------------------------------------------------===//
1734
// Logical visitor.
1735
//===----------------------------------------------------------------------===//
1736
LVLogicalVisitor::LVLogicalVisitor(LVCodeViewReader *Reader, ScopedPrinter &W,
1737
InputFile &Input)
1738
: Reader(Reader), W(W), Input(Input) {
1739
// The LogicalVisitor connects the CodeViewReader with the visitors that
1740
// traverse the types, symbols, etc. Do any initialization that is needed.
1741
Shared = std::make_shared<LVShared>(Reader, this);
1742
}
1743
1744
void LVLogicalVisitor::printTypeIndex(StringRef FieldName, TypeIndex TI,
1745
uint32_t StreamIdx) {
1746
codeview::printTypeIndex(W, FieldName, TI,
1747
StreamIdx == StreamTPI ? types() : ids());
1748
}
1749
1750
void LVLogicalVisitor::printTypeBegin(CVType &Record, TypeIndex TI,
1751
LVElement *Element, uint32_t StreamIdx) {
1752
W.getOStream() << "\n";
1753
W.startLine() << formatTypeLeafKind(Record.kind());
1754
W.getOStream() << " (" << HexNumber(TI.getIndex()) << ")";
1755
W.getOStream() << " {\n";
1756
W.indent();
1757
W.printEnum("TypeLeafKind", unsigned(Record.kind()), ArrayRef(LeafTypeNames));
1758
printTypeIndex("TI", TI, StreamIdx);
1759
W.startLine() << "Element: " << HexNumber(Element->getOffset()) << " "
1760
<< Element->getName() << "\n";
1761
}
1762
1763
void LVLogicalVisitor::printTypeEnd(CVType &Record) {
1764
W.unindent();
1765
W.startLine() << "}\n";
1766
}
1767
1768
void LVLogicalVisitor::printMemberBegin(CVMemberRecord &Record, TypeIndex TI,
1769
LVElement *Element,
1770
uint32_t StreamIdx) {
1771
W.getOStream() << "\n";
1772
W.startLine() << formatTypeLeafKind(Record.Kind);
1773
W.getOStream() << " (" << HexNumber(TI.getIndex()) << ")";
1774
W.getOStream() << " {\n";
1775
W.indent();
1776
W.printEnum("TypeLeafKind", unsigned(Record.Kind), ArrayRef(LeafTypeNames));
1777
printTypeIndex("TI", TI, StreamIdx);
1778
W.startLine() << "Element: " << HexNumber(Element->getOffset()) << " "
1779
<< Element->getName() << "\n";
1780
}
1781
1782
void LVLogicalVisitor::printMemberEnd(CVMemberRecord &Record) {
1783
W.unindent();
1784
W.startLine() << "}\n";
1785
}
1786
1787
Error LVLogicalVisitor::visitUnknownType(CVType &Record, TypeIndex TI) {
1788
LLVM_DEBUG({
1789
printTypeIndex("\nTI", TI, StreamTPI);
1790
W.printNumber("Length", uint32_t(Record.content().size()));
1791
});
1792
return Error::success();
1793
}
1794
1795
// LF_ARGLIST (TPI)
1796
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, ArgListRecord &Args,
1797
TypeIndex TI, LVElement *Element) {
1798
ArrayRef<TypeIndex> Indices = Args.getIndices();
1799
uint32_t Size = Indices.size();
1800
LLVM_DEBUG({
1801
printTypeBegin(Record, TI, Element, StreamTPI);
1802
W.printNumber("NumArgs", Size);
1803
ListScope Arguments(W, "Arguments");
1804
for (uint32_t I = 0; I < Size; ++I)
1805
printTypeIndex("ArgType", Indices[I], StreamTPI);
1806
printTypeEnd(Record);
1807
});
1808
1809
LVScope *Function = static_cast<LVScope *>(Element);
1810
for (uint32_t Index = 0; Index < Size; ++Index) {
1811
TypeIndex ParameterType = Indices[Index];
1812
createParameter(ParameterType, StringRef(), Function);
1813
}
1814
1815
return Error::success();
1816
}
1817
1818
// LF_ARRAY (TPI)
1819
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, ArrayRecord &AT,
1820
TypeIndex TI, LVElement *Element) {
1821
LLVM_DEBUG({
1822
printTypeBegin(Record, TI, Element, StreamTPI);
1823
printTypeIndex("ElementType", AT.getElementType(), StreamTPI);
1824
printTypeIndex("IndexType", AT.getIndexType(), StreamTPI);
1825
W.printNumber("SizeOf", AT.getSize());
1826
W.printString("Name", AT.getName());
1827
printTypeEnd(Record);
1828
});
1829
1830
if (Element->getIsFinalized())
1831
return Error::success();
1832
Element->setIsFinalized();
1833
1834
LVScopeArray *Array = static_cast<LVScopeArray *>(Element);
1835
if (!Array)
1836
return Error::success();
1837
1838
Reader->getCompileUnit()->addElement(Array);
1839
TypeIndex TIElementType = AT.getElementType();
1840
1841
LVType *PrevSubrange = nullptr;
1842
LazyRandomTypeCollection &Types = types();
1843
1844
// As the logical view is modeled on DWARF, for each dimension we have to
1845
// create a DW_TAG_subrange_type, with dimension size.
1846
// The subrange type can be: unsigned __int32 or unsigned __int64.
1847
auto AddSubrangeType = [&](ArrayRecord &AR) {
1848
LVType *Subrange = Reader->createTypeSubrange();
1849
Subrange->setTag(dwarf::DW_TAG_subrange_type);
1850
Subrange->setType(getElement(StreamTPI, AR.getIndexType()));
1851
Subrange->setCount(AR.getSize());
1852
Subrange->setOffset(
1853
TIElementType.isSimple()
1854
? (uint32_t)(TypeLeafKind)TIElementType.getSimpleKind()
1855
: TIElementType.getIndex());
1856
Array->addElement(Subrange);
1857
1858
if (PrevSubrange)
1859
if (int64_t Count = Subrange->getCount())
1860
PrevSubrange->setCount(PrevSubrange->getCount() / Count);
1861
PrevSubrange = Subrange;
1862
};
1863
1864
// Preserve the original TypeIndex; it would be updated in the case of:
1865
// - The array type contains qualifiers.
1866
// - In multidimensional arrays, the last LF_ARRAY entry contains the type.
1867
TypeIndex TIArrayType;
1868
1869
// For each dimension in the array, there is a LF_ARRAY entry. The last
1870
// entry contains the array type, which can be a LF_MODIFIER in the case
1871
// of the type being modified by a qualifier (const, etc).
1872
ArrayRecord AR(AT);
1873
CVType CVEntry = Record;
1874
while (CVEntry.kind() == LF_ARRAY) {
1875
// Create the subrange information, required by the logical view. Once
1876
// the array has been processed, the dimension sizes will updated, as
1877
// the sizes are a progression. For instance:
1878
// sizeof(int) = 4
1879
// int Array[2]; Sizes: 8 Dim: 8 / 4 -> [2]
1880
// int Array[2][3]; Sizes: 24, 12 Dim: 24 / 12 -> [2]
1881
// Dim: 12 / 4 -> [3]
1882
// int Array[2][3][4]; sizes: 96, 48, 16 Dim: 96 / 48 -> [2]
1883
// Dim: 48 / 16 -> [3]
1884
// Dim: 16 / 4 -> [4]
1885
AddSubrangeType(AR);
1886
TIArrayType = TIElementType;
1887
1888
// The current ElementType can be a modifier, in which case we need to
1889
// get the type being modified.
1890
// If TypeIndex is not a simple type, check if we have a qualified type.
1891
if (!TIElementType.isSimple()) {
1892
CVType CVElementType = Types.getType(TIElementType);
1893
if (CVElementType.kind() == LF_MODIFIER) {
1894
LVElement *QualifiedType =
1895
Shared->TypeRecords.find(StreamTPI, TIElementType);
1896
if (Error Err =
1897
finishVisitation(CVElementType, TIElementType, QualifiedType))
1898
return Err;
1899
// Get the TypeIndex of the type that the LF_MODIFIER modifies.
1900
TIElementType = getModifiedType(CVElementType);
1901
}
1902
}
1903
// Ends the traversal, as we have reached a simple type (int, char, etc).
1904
if (TIElementType.isSimple())
1905
break;
1906
1907
// Read next dimension linked entry, if any.
1908
CVEntry = Types.getType(TIElementType);
1909
if (Error Err = TypeDeserializer::deserializeAs(
1910
const_cast<CVType &>(CVEntry), AR)) {
1911
consumeError(std::move(Err));
1912
break;
1913
}
1914
TIElementType = AR.getElementType();
1915
// NOTE: The typeindex has a value of: 0x0280.0000
1916
getTrueType(TIElementType);
1917
}
1918
1919
Array->setName(AT.getName());
1920
TIArrayType = Shared->ForwardReferences.remap(TIArrayType);
1921
Array->setType(getElement(StreamTPI, TIArrayType));
1922
1923
if (PrevSubrange)
1924
// In the case of an aggregate type (class, struct, union, interface),
1925
// get the aggregate size. As the original record is pointing to its
1926
// reference, we have to update it.
1927
if (uint64_t Size =
1928
isAggregate(CVEntry)
1929
? getSizeInBytesForTypeRecord(Types.getType(TIArrayType))
1930
: getSizeInBytesForTypeIndex(TIElementType))
1931
PrevSubrange->setCount(PrevSubrange->getCount() / Size);
1932
1933
return Error::success();
1934
}
1935
1936
// LF_BITFIELD (TPI)
1937
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, BitFieldRecord &BF,
1938
TypeIndex TI, LVElement *Element) {
1939
LLVM_DEBUG({
1940
printTypeBegin(Record, TI, Element, StreamTPI);
1941
printTypeIndex("Type", TI, StreamTPI);
1942
W.printNumber("BitSize", BF.getBitSize());
1943
W.printNumber("BitOffset", BF.getBitOffset());
1944
printTypeEnd(Record);
1945
});
1946
1947
Element->setType(getElement(StreamTPI, BF.getType()));
1948
Element->setBitSize(BF.getBitSize());
1949
return Error::success();
1950
}
1951
1952
// LF_BUILDINFO (TPI)/(IPI)
1953
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, BuildInfoRecord &BI,
1954
TypeIndex TI, LVElement *Element) {
1955
LLVM_DEBUG({
1956
printTypeBegin(Record, TI, Element, StreamIPI);
1957
W.printNumber("NumArgs", static_cast<uint32_t>(BI.getArgs().size()));
1958
ListScope Arguments(W, "Arguments");
1959
for (TypeIndex Arg : BI.getArgs())
1960
printTypeIndex("ArgType", Arg, StreamIPI);
1961
printTypeEnd(Record);
1962
});
1963
1964
// The given 'Element' refers to the current compilation unit.
1965
// All the args are references into the TPI/IPI stream.
1966
TypeIndex TIName = BI.getArgs()[BuildInfoRecord::BuildInfoArg::SourceFile];
1967
std::string Name = std::string(ids().getTypeName(TIName));
1968
1969
// There are cases where LF_BUILDINFO fields are empty.
1970
if (!Name.empty())
1971
Element->setName(Name);
1972
1973
return Error::success();
1974
}
1975
1976
// LF_CLASS, LF_STRUCTURE, LF_INTERFACE (TPI)
1977
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, ClassRecord &Class,
1978
TypeIndex TI, LVElement *Element) {
1979
LLVM_DEBUG({
1980
printTypeBegin(Record, TI, Element, StreamTPI);
1981
W.printNumber("MemberCount", Class.getMemberCount());
1982
printTypeIndex("FieldList", Class.getFieldList(), StreamTPI);
1983
printTypeIndex("DerivedFrom", Class.getDerivationList(), StreamTPI);
1984
printTypeIndex("VShape", Class.getVTableShape(), StreamTPI);
1985
W.printNumber("SizeOf", Class.getSize());
1986
W.printString("Name", Class.getName());
1987
if (Class.hasUniqueName())
1988
W.printString("UniqueName", Class.getUniqueName());
1989
printTypeEnd(Record);
1990
});
1991
1992
if (Element->getIsFinalized())
1993
return Error::success();
1994
Element->setIsFinalized();
1995
1996
LVScopeAggregate *Scope = static_cast<LVScopeAggregate *>(Element);
1997
if (!Scope)
1998
return Error::success();
1999
2000
Scope->setName(Class.getName());
2001
if (Class.hasUniqueName())
2002
Scope->setLinkageName(Class.getUniqueName());
2003
2004
if (Class.isNested()) {
2005
Scope->setIsNested();
2006
createParents(Class.getName(), Scope);
2007
}
2008
2009
if (Class.isScoped())
2010
Scope->setIsScoped();
2011
2012
// Nested types will be added to their parents at creation. The forward
2013
// references are only processed to finish the referenced element creation.
2014
if (!(Class.isNested() || Class.isScoped())) {
2015
if (LVScope *Namespace = Shared->NamespaceDeduction.get(Class.getName()))
2016
Namespace->addElement(Scope);
2017
else
2018
Reader->getCompileUnit()->addElement(Scope);
2019
}
2020
2021
LazyRandomTypeCollection &Types = types();
2022
TypeIndex TIFieldList = Class.getFieldList();
2023
if (TIFieldList.isNoneType()) {
2024
TypeIndex ForwardType = Shared->ForwardReferences.find(Class.getName());
2025
if (!ForwardType.isNoneType()) {
2026
CVType CVReference = Types.getType(ForwardType);
2027
TypeRecordKind RK = static_cast<TypeRecordKind>(CVReference.kind());
2028
ClassRecord ReferenceRecord(RK);
2029
if (Error Err = TypeDeserializer::deserializeAs(
2030
const_cast<CVType &>(CVReference), ReferenceRecord))
2031
return Err;
2032
TIFieldList = ReferenceRecord.getFieldList();
2033
}
2034
}
2035
2036
if (!TIFieldList.isNoneType()) {
2037
// Pass down the TypeIndex 'TI' for the aggregate containing the field list.
2038
CVType CVFieldList = Types.getType(TIFieldList);
2039
if (Error Err = finishVisitation(CVFieldList, TI, Scope))
2040
return Err;
2041
}
2042
2043
return Error::success();
2044
}
2045
2046
// LF_ENUM (TPI)
2047
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, EnumRecord &Enum,
2048
TypeIndex TI, LVElement *Element) {
2049
LLVM_DEBUG({
2050
printTypeBegin(Record, TI, Element, StreamTPI);
2051
W.printNumber("NumEnumerators", Enum.getMemberCount());
2052
printTypeIndex("UnderlyingType", Enum.getUnderlyingType(), StreamTPI);
2053
printTypeIndex("FieldListType", Enum.getFieldList(), StreamTPI);
2054
W.printString("Name", Enum.getName());
2055
printTypeEnd(Record);
2056
});
2057
2058
LVScopeEnumeration *Scope = static_cast<LVScopeEnumeration *>(Element);
2059
if (!Scope)
2060
return Error::success();
2061
2062
if (Scope->getIsFinalized())
2063
return Error::success();
2064
Scope->setIsFinalized();
2065
2066
// Set the name, as in the case of nested, it would determine the relation
2067
// to any potential parent, via the LF_NESTTYPE record.
2068
Scope->setName(Enum.getName());
2069
if (Enum.hasUniqueName())
2070
Scope->setLinkageName(Enum.getUniqueName());
2071
2072
Scope->setType(getElement(StreamTPI, Enum.getUnderlyingType()));
2073
2074
if (Enum.isNested()) {
2075
Scope->setIsNested();
2076
createParents(Enum.getName(), Scope);
2077
}
2078
2079
if (Enum.isScoped()) {
2080
Scope->setIsScoped();
2081
Scope->setIsEnumClass();
2082
}
2083
2084
// Nested types will be added to their parents at creation.
2085
if (!(Enum.isNested() || Enum.isScoped())) {
2086
if (LVScope *Namespace = Shared->NamespaceDeduction.get(Enum.getName()))
2087
Namespace->addElement(Scope);
2088
else
2089
Reader->getCompileUnit()->addElement(Scope);
2090
}
2091
2092
TypeIndex TIFieldList = Enum.getFieldList();
2093
if (!TIFieldList.isNoneType()) {
2094
LazyRandomTypeCollection &Types = types();
2095
CVType CVFieldList = Types.getType(TIFieldList);
2096
if (Error Err = finishVisitation(CVFieldList, TIFieldList, Scope))
2097
return Err;
2098
}
2099
2100
return Error::success();
2101
}
2102
2103
// LF_FIELDLIST (TPI)
2104
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2105
FieldListRecord &FieldList,
2106
TypeIndex TI, LVElement *Element) {
2107
LLVM_DEBUG({
2108
printTypeBegin(Record, TI, Element, StreamTPI);
2109
printTypeEnd(Record);
2110
});
2111
2112
if (Error Err = visitFieldListMemberStream(TI, Element, FieldList.Data))
2113
return Err;
2114
2115
return Error::success();
2116
}
2117
2118
// LF_FUNC_ID (TPI)/(IPI)
2119
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, FuncIdRecord &Func,
2120
TypeIndex TI, LVElement *Element) {
2121
// ParentScope and FunctionType are references into the TPI stream.
2122
LLVM_DEBUG({
2123
printTypeBegin(Record, TI, Element, StreamIPI);
2124
printTypeIndex("ParentScope", Func.getParentScope(), StreamTPI);
2125
printTypeIndex("FunctionType", Func.getFunctionType(), StreamTPI);
2126
W.printString("Name", Func.getName());
2127
printTypeEnd(Record);
2128
});
2129
2130
// The TypeIndex (LF_PROCEDURE) returned by 'getFunctionType' is the
2131
// function propotype, we need to use the function definition.
2132
if (LVScope *FunctionDcl = static_cast<LVScope *>(Element)) {
2133
// For inlined functions, the inlined instance has been already processed
2134
// (all its information is contained in the Symbols section).
2135
// 'Element' points to the created 'abstract' (out-of-line) function.
2136
// Use the parent scope information to allocate it to the correct scope.
2137
LazyRandomTypeCollection &Types = types();
2138
TypeIndex TIParent = Func.getParentScope();
2139
if (FunctionDcl->getIsInlinedAbstract()) {
2140
FunctionDcl->setName(Func.getName());
2141
if (TIParent.isNoneType())
2142
Reader->getCompileUnit()->addElement(FunctionDcl);
2143
}
2144
2145
if (!TIParent.isNoneType()) {
2146
CVType CVParentScope = ids().getType(TIParent);
2147
if (Error Err = finishVisitation(CVParentScope, TIParent, FunctionDcl))
2148
return Err;
2149
}
2150
2151
TypeIndex TIFunctionType = Func.getFunctionType();
2152
CVType CVFunctionType = Types.getType(TIFunctionType);
2153
if (Error Err =
2154
finishVisitation(CVFunctionType, TIFunctionType, FunctionDcl))
2155
return Err;
2156
2157
FunctionDcl->setIsFinalized();
2158
}
2159
2160
return Error::success();
2161
}
2162
2163
// LF_LABEL (TPI)
2164
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, LabelRecord &LR,
2165
TypeIndex TI, LVElement *Element) {
2166
LLVM_DEBUG({
2167
printTypeBegin(Record, TI, Element, StreamTPI);
2168
printTypeEnd(Record);
2169
});
2170
return Error::success();
2171
}
2172
2173
// LF_MFUNC_ID (TPI)/(IPI)
2174
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, MemberFuncIdRecord &Id,
2175
TypeIndex TI, LVElement *Element) {
2176
// ClassType and FunctionType are references into the TPI stream.
2177
LLVM_DEBUG({
2178
printTypeBegin(Record, TI, Element, StreamIPI);
2179
printTypeIndex("ClassType", Id.getClassType(), StreamTPI);
2180
printTypeIndex("FunctionType", Id.getFunctionType(), StreamTPI);
2181
W.printString("Name", Id.getName());
2182
printTypeEnd(Record);
2183
});
2184
2185
LVScope *FunctionDcl = static_cast<LVScope *>(Element);
2186
if (FunctionDcl->getIsInlinedAbstract()) {
2187
// For inlined functions, the inlined instance has been already processed
2188
// (all its information is contained in the Symbols section).
2189
// 'Element' points to the created 'abstract' (out-of-line) function.
2190
// Use the parent scope information to allocate it to the correct scope.
2191
if (LVScope *Class = static_cast<LVScope *>(
2192
Shared->TypeRecords.find(StreamTPI, Id.getClassType())))
2193
Class->addElement(FunctionDcl);
2194
}
2195
2196
TypeIndex TIFunctionType = Id.getFunctionType();
2197
CVType CVFunction = types().getType(TIFunctionType);
2198
if (Error Err = finishVisitation(CVFunction, TIFunctionType, Element))
2199
return Err;
2200
2201
return Error::success();
2202
}
2203
2204
// LF_MFUNCTION (TPI)
2205
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2206
MemberFunctionRecord &MF, TypeIndex TI,
2207
LVElement *Element) {
2208
LLVM_DEBUG({
2209
printTypeBegin(Record, TI, Element, StreamTPI);
2210
printTypeIndex("ReturnType", MF.getReturnType(), StreamTPI);
2211
printTypeIndex("ClassType", MF.getClassType(), StreamTPI);
2212
printTypeIndex("ThisType", MF.getThisType(), StreamTPI);
2213
W.printNumber("NumParameters", MF.getParameterCount());
2214
printTypeIndex("ArgListType", MF.getArgumentList(), StreamTPI);
2215
W.printNumber("ThisAdjustment", MF.getThisPointerAdjustment());
2216
printTypeEnd(Record);
2217
});
2218
2219
if (LVScope *MemberFunction = static_cast<LVScope *>(Element)) {
2220
LVElement *Class = getElement(StreamTPI, MF.getClassType());
2221
2222
MemberFunction->setIsFinalized();
2223
MemberFunction->setType(getElement(StreamTPI, MF.getReturnType()));
2224
MemberFunction->setOffset(TI.getIndex());
2225
MemberFunction->setOffsetFromTypeIndex();
2226
2227
if (ProcessArgumentList) {
2228
ProcessArgumentList = false;
2229
2230
if (!MemberFunction->getIsStatic()) {
2231
LVElement *ThisPointer = getElement(StreamTPI, MF.getThisType());
2232
// When creating the 'this' pointer, check if it points to a reference.
2233
ThisPointer->setType(Class);
2234
LVSymbol *This =
2235
createParameter(ThisPointer, StringRef(), MemberFunction);
2236
This->setIsArtificial();
2237
}
2238
2239
// Create formal parameters.
2240
LazyRandomTypeCollection &Types = types();
2241
CVType CVArguments = Types.getType(MF.getArgumentList());
2242
if (Error Err = finishVisitation(CVArguments, MF.getArgumentList(),
2243
MemberFunction))
2244
return Err;
2245
}
2246
}
2247
2248
return Error::success();
2249
}
2250
2251
// LF_METHODLIST (TPI)
2252
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2253
MethodOverloadListRecord &Overloads,
2254
TypeIndex TI, LVElement *Element) {
2255
LLVM_DEBUG({
2256
printTypeBegin(Record, TI, Element, StreamTPI);
2257
printTypeEnd(Record);
2258
});
2259
2260
for (OneMethodRecord &Method : Overloads.Methods) {
2261
CVMemberRecord Record;
2262
Record.Kind = LF_METHOD;
2263
Method.Name = OverloadedMethodName;
2264
if (Error Err = visitKnownMember(Record, Method, TI, Element))
2265
return Err;
2266
}
2267
2268
return Error::success();
2269
}
2270
2271
// LF_MODIFIER (TPI)
2272
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, ModifierRecord &Mod,
2273
TypeIndex TI, LVElement *Element) {
2274
LLVM_DEBUG({
2275
printTypeBegin(Record, TI, Element, StreamTPI);
2276
printTypeIndex("ModifiedType", Mod.getModifiedType(), StreamTPI);
2277
printTypeEnd(Record);
2278
});
2279
2280
// Create the modified type, which will be attached to the type(s) that
2281
// contains the modifiers.
2282
LVElement *ModifiedType = getElement(StreamTPI, Mod.getModifiedType());
2283
2284
// At this point the types recording the qualifiers do not have a
2285
// scope parent. They must be assigned to the current compile unit.
2286
LVScopeCompileUnit *CompileUnit = Reader->getCompileUnit();
2287
2288
// The incoming element does not have a defined kind. Use the given
2289
// modifiers to complete its type. A type can have more than one modifier;
2290
// in that case, we have to create an extra type to have the other modifier.
2291
LVType *LastLink = static_cast<LVType *>(Element);
2292
if (!LastLink->getParentScope())
2293
CompileUnit->addElement(LastLink);
2294
2295
bool SeenModifier = false;
2296
uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
2297
if (Mods & uint16_t(ModifierOptions::Const)) {
2298
SeenModifier = true;
2299
LastLink->setTag(dwarf::DW_TAG_const_type);
2300
LastLink->setIsConst();
2301
LastLink->setName("const");
2302
}
2303
if (Mods & uint16_t(ModifierOptions::Volatile)) {
2304
if (SeenModifier) {
2305
LVType *Volatile = Reader->createType();
2306
Volatile->setIsModifier();
2307
LastLink->setType(Volatile);
2308
LastLink = Volatile;
2309
CompileUnit->addElement(LastLink);
2310
}
2311
LastLink->setTag(dwarf::DW_TAG_volatile_type);
2312
LastLink->setIsVolatile();
2313
LastLink->setName("volatile");
2314
}
2315
if (Mods & uint16_t(ModifierOptions::Unaligned)) {
2316
if (SeenModifier) {
2317
LVType *Unaligned = Reader->createType();
2318
Unaligned->setIsModifier();
2319
LastLink->setType(Unaligned);
2320
LastLink = Unaligned;
2321
CompileUnit->addElement(LastLink);
2322
}
2323
LastLink->setTag(dwarf::DW_TAG_unaligned);
2324
LastLink->setIsUnaligned();
2325
LastLink->setName("unaligned");
2326
}
2327
2328
LastLink->setType(ModifiedType);
2329
return Error::success();
2330
}
2331
2332
// LF_POINTER (TPI)
2333
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, PointerRecord &Ptr,
2334
TypeIndex TI, LVElement *Element) {
2335
LLVM_DEBUG({
2336
printTypeBegin(Record, TI, Element, StreamTPI);
2337
printTypeIndex("PointeeType", Ptr.getReferentType(), StreamTPI);
2338
W.printNumber("IsFlat", Ptr.isFlat());
2339
W.printNumber("IsConst", Ptr.isConst());
2340
W.printNumber("IsVolatile", Ptr.isVolatile());
2341
W.printNumber("IsUnaligned", Ptr.isUnaligned());
2342
W.printNumber("IsRestrict", Ptr.isRestrict());
2343
W.printNumber("IsThisPtr&", Ptr.isLValueReferenceThisPtr());
2344
W.printNumber("IsThisPtr&&", Ptr.isRValueReferenceThisPtr());
2345
W.printNumber("SizeOf", Ptr.getSize());
2346
2347
if (Ptr.isPointerToMember()) {
2348
const MemberPointerInfo &MI = Ptr.getMemberInfo();
2349
printTypeIndex("ClassType", MI.getContainingType(), StreamTPI);
2350
}
2351
printTypeEnd(Record);
2352
});
2353
2354
// Find the pointed-to type.
2355
LVType *Pointer = static_cast<LVType *>(Element);
2356
LVElement *Pointee = nullptr;
2357
2358
PointerMode Mode = Ptr.getMode();
2359
Pointee = Ptr.isPointerToMember()
2360
? Shared->TypeRecords.find(StreamTPI, Ptr.getReferentType())
2361
: getElement(StreamTPI, Ptr.getReferentType());
2362
2363
// At this point the types recording the qualifiers do not have a
2364
// scope parent. They must be assigned to the current compile unit.
2365
LVScopeCompileUnit *CompileUnit = Reader->getCompileUnit();
2366
2367
// Order for the different modifiers:
2368
// <restrict> <pointer, Reference, ValueReference> <const, volatile>
2369
// Const and volatile already processed.
2370
bool SeenModifier = false;
2371
LVType *LastLink = Pointer;
2372
if (!LastLink->getParentScope())
2373
CompileUnit->addElement(LastLink);
2374
2375
if (Ptr.isRestrict()) {
2376
SeenModifier = true;
2377
LVType *Restrict = Reader->createType();
2378
Restrict->setTag(dwarf::DW_TAG_restrict_type);
2379
Restrict->setIsRestrict();
2380
Restrict->setName("restrict");
2381
LastLink->setType(Restrict);
2382
LastLink = Restrict;
2383
CompileUnit->addElement(LastLink);
2384
}
2385
if (Mode == PointerMode::LValueReference) {
2386
if (SeenModifier) {
2387
LVType *LReference = Reader->createType();
2388
LReference->setIsModifier();
2389
LastLink->setType(LReference);
2390
LastLink = LReference;
2391
CompileUnit->addElement(LastLink);
2392
}
2393
LastLink->setTag(dwarf::DW_TAG_reference_type);
2394
LastLink->setIsReference();
2395
LastLink->setName("&");
2396
}
2397
if (Mode == PointerMode::RValueReference) {
2398
if (SeenModifier) {
2399
LVType *RReference = Reader->createType();
2400
RReference->setIsModifier();
2401
LastLink->setType(RReference);
2402
LastLink = RReference;
2403
CompileUnit->addElement(LastLink);
2404
}
2405
LastLink->setTag(dwarf::DW_TAG_rvalue_reference_type);
2406
LastLink->setIsRvalueReference();
2407
LastLink->setName("&&");
2408
}
2409
2410
// When creating the pointer, check if it points to a reference.
2411
LastLink->setType(Pointee);
2412
return Error::success();
2413
}
2414
2415
// LF_PROCEDURE (TPI)
2416
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, ProcedureRecord &Proc,
2417
TypeIndex TI, LVElement *Element) {
2418
LLVM_DEBUG({
2419
printTypeBegin(Record, TI, Element, StreamTPI);
2420
printTypeIndex("ReturnType", Proc.getReturnType(), StreamTPI);
2421
W.printNumber("NumParameters", Proc.getParameterCount());
2422
printTypeIndex("ArgListType", Proc.getArgumentList(), StreamTPI);
2423
printTypeEnd(Record);
2424
});
2425
2426
// There is no need to traverse the argument list, as the CodeView format
2427
// declares the parameters as a 'S_LOCAL' symbol tagged as parameter.
2428
// Only process parameters when dealing with inline functions.
2429
if (LVScope *FunctionDcl = static_cast<LVScope *>(Element)) {
2430
FunctionDcl->setType(getElement(StreamTPI, Proc.getReturnType()));
2431
2432
if (ProcessArgumentList) {
2433
ProcessArgumentList = false;
2434
// Create formal parameters.
2435
LazyRandomTypeCollection &Types = types();
2436
CVType CVArguments = Types.getType(Proc.getArgumentList());
2437
if (Error Err = finishVisitation(CVArguments, Proc.getArgumentList(),
2438
FunctionDcl))
2439
return Err;
2440
}
2441
}
2442
2443
return Error::success();
2444
}
2445
2446
// LF_UNION (TPI)
2447
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, UnionRecord &Union,
2448
TypeIndex TI, LVElement *Element) {
2449
LLVM_DEBUG({
2450
printTypeBegin(Record, TI, Element, StreamTPI);
2451
W.printNumber("MemberCount", Union.getMemberCount());
2452
printTypeIndex("FieldList", Union.getFieldList(), StreamTPI);
2453
W.printNumber("SizeOf", Union.getSize());
2454
W.printString("Name", Union.getName());
2455
if (Union.hasUniqueName())
2456
W.printString("UniqueName", Union.getUniqueName());
2457
printTypeEnd(Record);
2458
});
2459
2460
LVScopeAggregate *Scope = static_cast<LVScopeAggregate *>(Element);
2461
if (!Scope)
2462
return Error::success();
2463
2464
if (Scope->getIsFinalized())
2465
return Error::success();
2466
Scope->setIsFinalized();
2467
2468
Scope->setName(Union.getName());
2469
if (Union.hasUniqueName())
2470
Scope->setLinkageName(Union.getUniqueName());
2471
2472
if (Union.isNested()) {
2473
Scope->setIsNested();
2474
createParents(Union.getName(), Scope);
2475
} else {
2476
if (LVScope *Namespace = Shared->NamespaceDeduction.get(Union.getName()))
2477
Namespace->addElement(Scope);
2478
else
2479
Reader->getCompileUnit()->addElement(Scope);
2480
}
2481
2482
if (!Union.getFieldList().isNoneType()) {
2483
LazyRandomTypeCollection &Types = types();
2484
// Pass down the TypeIndex 'TI' for the aggregate containing the field list.
2485
CVType CVFieldList = Types.getType(Union.getFieldList());
2486
if (Error Err = finishVisitation(CVFieldList, TI, Scope))
2487
return Err;
2488
}
2489
2490
return Error::success();
2491
}
2492
2493
// LF_TYPESERVER2 (TPI)
2494
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, TypeServer2Record &TS,
2495
TypeIndex TI, LVElement *Element) {
2496
LLVM_DEBUG({
2497
printTypeBegin(Record, TI, Element, StreamTPI);
2498
W.printString("Guid", formatv("{0}", TS.getGuid()).str());
2499
W.printNumber("Age", TS.getAge());
2500
W.printString("Name", TS.getName());
2501
printTypeEnd(Record);
2502
});
2503
return Error::success();
2504
}
2505
2506
// LF_VFTABLE (TPI)
2507
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, VFTableRecord &VFT,
2508
TypeIndex TI, LVElement *Element) {
2509
LLVM_DEBUG({
2510
printTypeBegin(Record, TI, Element, StreamTPI);
2511
printTypeIndex("CompleteClass", VFT.getCompleteClass(), StreamTPI);
2512
printTypeIndex("OverriddenVFTable", VFT.getOverriddenVTable(), StreamTPI);
2513
W.printHex("VFPtrOffset", VFT.getVFPtrOffset());
2514
W.printString("VFTableName", VFT.getName());
2515
for (const StringRef &N : VFT.getMethodNames())
2516
W.printString("MethodName", N);
2517
printTypeEnd(Record);
2518
});
2519
return Error::success();
2520
}
2521
2522
// LF_VTSHAPE (TPI)
2523
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2524
VFTableShapeRecord &Shape,
2525
TypeIndex TI, LVElement *Element) {
2526
LLVM_DEBUG({
2527
printTypeBegin(Record, TI, Element, StreamTPI);
2528
W.printNumber("VFEntryCount", Shape.getEntryCount());
2529
printTypeEnd(Record);
2530
});
2531
return Error::success();
2532
}
2533
2534
// LF_SUBSTR_LIST (TPI)/(IPI)
2535
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2536
StringListRecord &Strings,
2537
TypeIndex TI, LVElement *Element) {
2538
// All the indices are references into the TPI/IPI stream.
2539
LLVM_DEBUG({
2540
printTypeBegin(Record, TI, Element, StreamIPI);
2541
ArrayRef<TypeIndex> Indices = Strings.getIndices();
2542
uint32_t Size = Indices.size();
2543
W.printNumber("NumStrings", Size);
2544
ListScope Arguments(W, "Strings");
2545
for (uint32_t I = 0; I < Size; ++I)
2546
printTypeIndex("String", Indices[I], StreamIPI);
2547
printTypeEnd(Record);
2548
});
2549
return Error::success();
2550
}
2551
2552
// LF_STRING_ID (TPI)/(IPI)
2553
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, StringIdRecord &String,
2554
TypeIndex TI, LVElement *Element) {
2555
// All args are references into the TPI/IPI stream.
2556
LLVM_DEBUG({
2557
printTypeIndex("\nTI", TI, StreamIPI);
2558
printTypeIndex("Id", String.getId(), StreamIPI);
2559
W.printString("StringData", String.getString());
2560
});
2561
2562
if (LVScope *Namespace = Shared->NamespaceDeduction.get(
2563
String.getString(), /*CheckScope=*/false)) {
2564
// The function is already at different scope. In order to reflect
2565
// the correct parent, move it to the namespace.
2566
if (LVScope *Scope = Element->getParentScope())
2567
Scope->removeElement(Element);
2568
Namespace->addElement(Element);
2569
}
2570
2571
return Error::success();
2572
}
2573
2574
// LF_UDT_SRC_LINE (TPI)/(IPI)
2575
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2576
UdtSourceLineRecord &SourceLine,
2577
TypeIndex TI, LVElement *Element) {
2578
// All args are references into the TPI/IPI stream.
2579
LLVM_DEBUG({
2580
printTypeIndex("\nTI", TI, StreamIPI);
2581
printTypeIndex("UDT", SourceLine.getUDT(), StreamIPI);
2582
printTypeIndex("SourceFile", SourceLine.getSourceFile(), StreamIPI);
2583
W.printNumber("LineNumber", SourceLine.getLineNumber());
2584
});
2585
return Error::success();
2586
}
2587
2588
// LF_UDT_MOD_SRC_LINE (TPI)/(IPI)
2589
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2590
UdtModSourceLineRecord &ModSourceLine,
2591
TypeIndex TI, LVElement *Element) {
2592
// All args are references into the TPI/IPI stream.
2593
LLVM_DEBUG({
2594
printTypeBegin(Record, TI, Element, StreamIPI);
2595
printTypeIndex("\nTI", TI, StreamIPI);
2596
printTypeIndex("UDT", ModSourceLine.getUDT(), StreamIPI);
2597
printTypeIndex("SourceFile", ModSourceLine.getSourceFile(), StreamIPI);
2598
W.printNumber("LineNumber", ModSourceLine.getLineNumber());
2599
W.printNumber("Module", ModSourceLine.getModule());
2600
printTypeEnd(Record);
2601
});
2602
return Error::success();
2603
}
2604
2605
// LF_PRECOMP (TPI)
2606
Error LVLogicalVisitor::visitKnownRecord(CVType &Record, PrecompRecord &Precomp,
2607
TypeIndex TI, LVElement *Element) {
2608
LLVM_DEBUG({
2609
printTypeBegin(Record, TI, Element, StreamTPI);
2610
W.printHex("StartIndex", Precomp.getStartTypeIndex());
2611
W.printHex("Count", Precomp.getTypesCount());
2612
W.printHex("Signature", Precomp.getSignature());
2613
W.printString("PrecompFile", Precomp.getPrecompFilePath());
2614
printTypeEnd(Record);
2615
});
2616
return Error::success();
2617
}
2618
2619
// LF_ENDPRECOMP (TPI)
2620
Error LVLogicalVisitor::visitKnownRecord(CVType &Record,
2621
EndPrecompRecord &EndPrecomp,
2622
TypeIndex TI, LVElement *Element) {
2623
LLVM_DEBUG({
2624
printTypeBegin(Record, TI, Element, StreamTPI);
2625
W.printHex("Signature", EndPrecomp.getSignature());
2626
printTypeEnd(Record);
2627
});
2628
return Error::success();
2629
}
2630
2631
Error LVLogicalVisitor::visitUnknownMember(CVMemberRecord &Record,
2632
TypeIndex TI) {
2633
LLVM_DEBUG({ W.printHex("UnknownMember", unsigned(Record.Kind)); });
2634
return Error::success();
2635
}
2636
2637
// LF_BCLASS, LF_BINTERFACE
2638
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2639
BaseClassRecord &Base, TypeIndex TI,
2640
LVElement *Element) {
2641
LLVM_DEBUG({
2642
printMemberBegin(Record, TI, Element, StreamTPI);
2643
printTypeIndex("BaseType", Base.getBaseType(), StreamTPI);
2644
W.printHex("BaseOffset", Base.getBaseOffset());
2645
printMemberEnd(Record);
2646
});
2647
2648
createElement(Record.Kind);
2649
if (LVSymbol *Symbol = CurrentSymbol) {
2650
LVElement *BaseClass = getElement(StreamTPI, Base.getBaseType());
2651
Symbol->setName(BaseClass->getName());
2652
Symbol->setType(BaseClass);
2653
Symbol->setAccessibilityCode(Base.getAccess());
2654
static_cast<LVScope *>(Element)->addElement(Symbol);
2655
}
2656
2657
return Error::success();
2658
}
2659
2660
// LF_MEMBER
2661
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2662
DataMemberRecord &Field, TypeIndex TI,
2663
LVElement *Element) {
2664
LLVM_DEBUG({
2665
printMemberBegin(Record, TI, Element, StreamTPI);
2666
printTypeIndex("Type", Field.getType(), StreamTPI);
2667
W.printHex("FieldOffset", Field.getFieldOffset());
2668
W.printString("Name", Field.getName());
2669
printMemberEnd(Record);
2670
});
2671
2672
// Create the data member.
2673
createDataMember(Record, static_cast<LVScope *>(Element), Field.getName(),
2674
Field.getType(), Field.getAccess());
2675
return Error::success();
2676
}
2677
2678
// LF_ENUMERATE
2679
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2680
EnumeratorRecord &Enum, TypeIndex TI,
2681
LVElement *Element) {
2682
LLVM_DEBUG({
2683
printMemberBegin(Record, TI, Element, StreamTPI);
2684
W.printNumber("EnumValue", Enum.getValue());
2685
W.printString("Name", Enum.getName());
2686
printMemberEnd(Record);
2687
});
2688
2689
createElement(Record.Kind);
2690
if (LVType *Type = CurrentType) {
2691
Type->setName(Enum.getName());
2692
SmallString<16> Value;
2693
Enum.getValue().toString(Value, 16, true, true);
2694
Type->setValue(Value);
2695
static_cast<LVScope *>(Element)->addElement(CurrentType);
2696
}
2697
2698
return Error::success();
2699
}
2700
2701
// LF_INDEX
2702
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2703
ListContinuationRecord &Cont,
2704
TypeIndex TI, LVElement *Element) {
2705
LLVM_DEBUG({
2706
printMemberBegin(Record, TI, Element, StreamTPI);
2707
printTypeIndex("ContinuationIndex", Cont.getContinuationIndex(), StreamTPI);
2708
printMemberEnd(Record);
2709
});
2710
return Error::success();
2711
}
2712
2713
// LF_NESTTYPE
2714
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2715
NestedTypeRecord &Nested, TypeIndex TI,
2716
LVElement *Element) {
2717
LLVM_DEBUG({
2718
printMemberBegin(Record, TI, Element, StreamTPI);
2719
printTypeIndex("Type", Nested.getNestedType(), StreamTPI);
2720
W.printString("Name", Nested.getName());
2721
printMemberEnd(Record);
2722
});
2723
2724
if (LVElement *Typedef = createElement(SymbolKind::S_UDT)) {
2725
Typedef->setName(Nested.getName());
2726
LVElement *NestedType = getElement(StreamTPI, Nested.getNestedType());
2727
Typedef->setType(NestedType);
2728
LVScope *Scope = static_cast<LVScope *>(Element);
2729
Scope->addElement(Typedef);
2730
2731
if (NestedType && NestedType->getIsNested()) {
2732
// 'Element' is an aggregate type that may contains this nested type
2733
// definition. Used their scoped names, to decide on their relationship.
2734
StringRef RecordName = getRecordName(types(), TI);
2735
2736
StringRef NestedTypeName = NestedType->getName();
2737
if (NestedTypeName.size() && RecordName.size()) {
2738
StringRef OuterComponent;
2739
std::tie(OuterComponent, std::ignore) =
2740
getInnerComponent(NestedTypeName);
2741
// We have an already created nested type. Add it to the current scope
2742
// and update all its children if any.
2743
if (OuterComponent.size() && OuterComponent == RecordName) {
2744
if (!NestedType->getIsScopedAlready()) {
2745
Scope->addElement(NestedType);
2746
NestedType->setIsScopedAlready();
2747
NestedType->updateLevel(Scope);
2748
}
2749
Typedef->resetIncludeInPrint();
2750
}
2751
}
2752
}
2753
}
2754
2755
return Error::success();
2756
}
2757
2758
// LF_ONEMETHOD
2759
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2760
OneMethodRecord &Method, TypeIndex TI,
2761
LVElement *Element) {
2762
LLVM_DEBUG({
2763
printMemberBegin(Record, TI, Element, StreamTPI);
2764
printTypeIndex("Type", Method.getType(), StreamTPI);
2765
// If virtual, then read the vftable offset.
2766
if (Method.isIntroducingVirtual())
2767
W.printHex("VFTableOffset", Method.getVFTableOffset());
2768
W.printString("Name", Method.getName());
2769
printMemberEnd(Record);
2770
});
2771
2772
// All the LF_ONEMETHOD objects share the same type description.
2773
// We have to create a scope object for each one and get the required
2774
// information from the LF_MFUNCTION object.
2775
ProcessArgumentList = true;
2776
if (LVElement *MemberFunction = createElement(TypeLeafKind::LF_ONEMETHOD)) {
2777
MemberFunction->setIsFinalized();
2778
static_cast<LVScope *>(Element)->addElement(MemberFunction);
2779
2780
MemberFunction->setName(Method.getName());
2781
MemberFunction->setAccessibilityCode(Method.getAccess());
2782
2783
MethodKind Kind = Method.getMethodKind();
2784
if (Kind == MethodKind::Static)
2785
MemberFunction->setIsStatic();
2786
MemberFunction->setVirtualityCode(Kind);
2787
2788
MethodOptions Flags = Method.Attrs.getFlags();
2789
if (MethodOptions::CompilerGenerated ==
2790
(Flags & MethodOptions::CompilerGenerated))
2791
MemberFunction->setIsArtificial();
2792
2793
LazyRandomTypeCollection &Types = types();
2794
CVType CVMethodType = Types.getType(Method.getType());
2795
if (Error Err =
2796
finishVisitation(CVMethodType, Method.getType(), MemberFunction))
2797
return Err;
2798
}
2799
ProcessArgumentList = false;
2800
2801
return Error::success();
2802
}
2803
2804
// LF_METHOD
2805
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2806
OverloadedMethodRecord &Method,
2807
TypeIndex TI, LVElement *Element) {
2808
LLVM_DEBUG({
2809
printMemberBegin(Record, TI, Element, StreamTPI);
2810
W.printHex("MethodCount", Method.getNumOverloads());
2811
printTypeIndex("MethodListIndex", Method.getMethodList(), StreamTPI);
2812
W.printString("Name", Method.getName());
2813
printMemberEnd(Record);
2814
});
2815
2816
// Record the overloaded method name, which will be used during the
2817
// traversal of the method list.
2818
LazyRandomTypeCollection &Types = types();
2819
OverloadedMethodName = Method.getName();
2820
CVType CVMethods = Types.getType(Method.getMethodList());
2821
if (Error Err = finishVisitation(CVMethods, Method.getMethodList(), Element))
2822
return Err;
2823
2824
return Error::success();
2825
}
2826
2827
// LF_STMEMBER
2828
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2829
StaticDataMemberRecord &Field,
2830
TypeIndex TI, LVElement *Element) {
2831
LLVM_DEBUG({
2832
printMemberBegin(Record, TI, Element, StreamTPI);
2833
printTypeIndex("Type", Field.getType(), StreamTPI);
2834
W.printString("Name", Field.getName());
2835
printMemberEnd(Record);
2836
});
2837
2838
// Create the data member.
2839
createDataMember(Record, static_cast<LVScope *>(Element), Field.getName(),
2840
Field.getType(), Field.getAccess());
2841
return Error::success();
2842
}
2843
2844
// LF_VFUNCTAB
2845
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2846
VFPtrRecord &VFTable, TypeIndex TI,
2847
LVElement *Element) {
2848
LLVM_DEBUG({
2849
printMemberBegin(Record, TI, Element, StreamTPI);
2850
printTypeIndex("Type", VFTable.getType(), StreamTPI);
2851
printMemberEnd(Record);
2852
});
2853
return Error::success();
2854
}
2855
2856
// LF_VBCLASS, LF_IVBCLASS
2857
Error LVLogicalVisitor::visitKnownMember(CVMemberRecord &Record,
2858
VirtualBaseClassRecord &Base,
2859
TypeIndex TI, LVElement *Element) {
2860
LLVM_DEBUG({
2861
printMemberBegin(Record, TI, Element, StreamTPI);
2862
printTypeIndex("BaseType", Base.getBaseType(), StreamTPI);
2863
printTypeIndex("VBPtrType", Base.getVBPtrType(), StreamTPI);
2864
W.printHex("VBPtrOffset", Base.getVBPtrOffset());
2865
W.printHex("VBTableIndex", Base.getVTableIndex());
2866
printMemberEnd(Record);
2867
});
2868
2869
createElement(Record.Kind);
2870
if (LVSymbol *Symbol = CurrentSymbol) {
2871
LVElement *BaseClass = getElement(StreamTPI, Base.getBaseType());
2872
Symbol->setName(BaseClass->getName());
2873
Symbol->setType(BaseClass);
2874
Symbol->setAccessibilityCode(Base.getAccess());
2875
Symbol->setVirtualityCode(MethodKind::Virtual);
2876
static_cast<LVScope *>(Element)->addElement(Symbol);
2877
}
2878
2879
return Error::success();
2880
}
2881
2882
Error LVLogicalVisitor::visitMemberRecord(CVMemberRecord &Record,
2883
TypeVisitorCallbacks &Callbacks,
2884
TypeIndex TI, LVElement *Element) {
2885
if (Error Err = Callbacks.visitMemberBegin(Record))
2886
return Err;
2887
2888
switch (Record.Kind) {
2889
default:
2890
if (Error Err = Callbacks.visitUnknownMember(Record))
2891
return Err;
2892
break;
2893
#define MEMBER_RECORD(EnumName, EnumVal, Name) \
2894
case EnumName: { \
2895
if (Error Err = \
2896
visitKnownMember<Name##Record>(Record, Callbacks, TI, Element)) \
2897
return Err; \
2898
break; \
2899
}
2900
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
2901
MEMBER_RECORD(EnumVal, EnumVal, AliasName)
2902
#define TYPE_RECORD(EnumName, EnumVal, Name)
2903
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
2904
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
2905
}
2906
2907
if (Error Err = Callbacks.visitMemberEnd(Record))
2908
return Err;
2909
2910
return Error::success();
2911
}
2912
2913
Error LVLogicalVisitor::finishVisitation(CVType &Record, TypeIndex TI,
2914
LVElement *Element) {
2915
switch (Record.kind()) {
2916
default:
2917
if (Error Err = visitUnknownType(Record, TI))
2918
return Err;
2919
break;
2920
#define TYPE_RECORD(EnumName, EnumVal, Name) \
2921
case EnumName: { \
2922
if (Error Err = visitKnownRecord<Name##Record>(Record, TI, Element)) \
2923
return Err; \
2924
break; \
2925
}
2926
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
2927
TYPE_RECORD(EnumVal, EnumVal, AliasName)
2928
#define MEMBER_RECORD(EnumName, EnumVal, Name)
2929
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
2930
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
2931
}
2932
2933
return Error::success();
2934
}
2935
2936
// Customized version of 'FieldListVisitHelper'.
2937
Error LVLogicalVisitor::visitFieldListMemberStream(
2938
TypeIndex TI, LVElement *Element, ArrayRef<uint8_t> FieldList) {
2939
BinaryByteStream Stream(FieldList, llvm::endianness::little);
2940
BinaryStreamReader Reader(Stream);
2941
FieldListDeserializer Deserializer(Reader);
2942
TypeVisitorCallbackPipeline Pipeline;
2943
Pipeline.addCallbackToPipeline(Deserializer);
2944
2945
TypeLeafKind Leaf;
2946
while (!Reader.empty()) {
2947
if (Error Err = Reader.readEnum(Leaf))
2948
return Err;
2949
2950
CVMemberRecord Record;
2951
Record.Kind = Leaf;
2952
if (Error Err = visitMemberRecord(Record, Pipeline, TI, Element))
2953
return Err;
2954
}
2955
2956
return Error::success();
2957
}
2958
2959
void LVLogicalVisitor::addElement(LVScope *Scope, bool IsCompileUnit) {
2960
// The CodeView specifications does not treat S_COMPILE2 and S_COMPILE3
2961
// as symbols that open a scope. The CodeView reader, treat them in a
2962
// similar way as DWARF. As there is no a symbole S_END to close the
2963
// compile unit, we need to check for the next compile unit.
2964
if (IsCompileUnit) {
2965
if (!ScopeStack.empty())
2966
popScope();
2967
InCompileUnitScope = true;
2968
}
2969
2970
pushScope(Scope);
2971
ReaderParent->addElement(Scope);
2972
}
2973
2974
void LVLogicalVisitor::addElement(LVSymbol *Symbol) {
2975
ReaderScope->addElement(Symbol);
2976
}
2977
2978
void LVLogicalVisitor::addElement(LVType *Type) {
2979
ReaderScope->addElement(Type);
2980
}
2981
2982
LVElement *LVLogicalVisitor::createElement(TypeLeafKind Kind) {
2983
CurrentScope = nullptr;
2984
CurrentSymbol = nullptr;
2985
CurrentType = nullptr;
2986
2987
if (Kind < TypeIndex::FirstNonSimpleIndex) {
2988
CurrentType = Reader->createType();
2989
CurrentType->setIsBase();
2990
CurrentType->setTag(dwarf::DW_TAG_base_type);
2991
if (options().getAttributeBase())
2992
CurrentType->setIncludeInPrint();
2993
return CurrentType;
2994
}
2995
2996
switch (Kind) {
2997
// Types.
2998
case TypeLeafKind::LF_ENUMERATE:
2999
CurrentType = Reader->createTypeEnumerator();
3000
CurrentType->setTag(dwarf::DW_TAG_enumerator);
3001
return CurrentType;
3002
case TypeLeafKind::LF_MODIFIER:
3003
CurrentType = Reader->createType();
3004
CurrentType->setIsModifier();
3005
return CurrentType;
3006
case TypeLeafKind::LF_POINTER:
3007
CurrentType = Reader->createType();
3008
CurrentType->setIsPointer();
3009
CurrentType->setName("*");
3010
CurrentType->setTag(dwarf::DW_TAG_pointer_type);
3011
return CurrentType;
3012
3013
// Symbols.
3014
case TypeLeafKind::LF_BCLASS:
3015
case TypeLeafKind::LF_IVBCLASS:
3016
case TypeLeafKind::LF_VBCLASS:
3017
CurrentSymbol = Reader->createSymbol();
3018
CurrentSymbol->setTag(dwarf::DW_TAG_inheritance);
3019
CurrentSymbol->setIsInheritance();
3020
return CurrentSymbol;
3021
case TypeLeafKind::LF_MEMBER:
3022
case TypeLeafKind::LF_STMEMBER:
3023
CurrentSymbol = Reader->createSymbol();
3024
CurrentSymbol->setIsMember();
3025
CurrentSymbol->setTag(dwarf::DW_TAG_member);
3026
return CurrentSymbol;
3027
3028
// Scopes.
3029
case TypeLeafKind::LF_ARRAY:
3030
CurrentScope = Reader->createScopeArray();
3031
CurrentScope->setTag(dwarf::DW_TAG_array_type);
3032
return CurrentScope;
3033
case TypeLeafKind::LF_CLASS:
3034
CurrentScope = Reader->createScopeAggregate();
3035
CurrentScope->setTag(dwarf::DW_TAG_class_type);
3036
CurrentScope->setIsClass();
3037
return CurrentScope;
3038
case TypeLeafKind::LF_ENUM:
3039
CurrentScope = Reader->createScopeEnumeration();
3040
CurrentScope->setTag(dwarf::DW_TAG_enumeration_type);
3041
return CurrentScope;
3042
case TypeLeafKind::LF_METHOD:
3043
case TypeLeafKind::LF_ONEMETHOD:
3044
case TypeLeafKind::LF_PROCEDURE:
3045
CurrentScope = Reader->createScopeFunction();
3046
CurrentScope->setIsSubprogram();
3047
CurrentScope->setTag(dwarf::DW_TAG_subprogram);
3048
return CurrentScope;
3049
case TypeLeafKind::LF_STRUCTURE:
3050
CurrentScope = Reader->createScopeAggregate();
3051
CurrentScope->setIsStructure();
3052
CurrentScope->setTag(dwarf::DW_TAG_structure_type);
3053
return CurrentScope;
3054
case TypeLeafKind::LF_UNION:
3055
CurrentScope = Reader->createScopeAggregate();
3056
CurrentScope->setIsUnion();
3057
CurrentScope->setTag(dwarf::DW_TAG_union_type);
3058
return CurrentScope;
3059
default:
3060
// If '--internal=tag' and '--print=warning' are specified in the command
3061
// line, we record and print each seen 'TypeLeafKind'.
3062
break;
3063
}
3064
return nullptr;
3065
}
3066
3067
LVElement *LVLogicalVisitor::createElement(SymbolKind Kind) {
3068
CurrentScope = nullptr;
3069
CurrentSymbol = nullptr;
3070
CurrentType = nullptr;
3071
switch (Kind) {
3072
// Types.
3073
case SymbolKind::S_UDT:
3074
CurrentType = Reader->createTypeDefinition();
3075
CurrentType->setTag(dwarf::DW_TAG_typedef);
3076
return CurrentType;
3077
3078
// Symbols.
3079
case SymbolKind::S_CONSTANT:
3080
CurrentSymbol = Reader->createSymbol();
3081
CurrentSymbol->setIsConstant();
3082
CurrentSymbol->setTag(dwarf::DW_TAG_constant);
3083
return CurrentSymbol;
3084
3085
case SymbolKind::S_BPREL32:
3086
case SymbolKind::S_REGREL32:
3087
case SymbolKind::S_GDATA32:
3088
case SymbolKind::S_LDATA32:
3089
case SymbolKind::S_LOCAL:
3090
// During the symbol traversal more information is available to
3091
// determine if the symbol is a parameter or a variable. At this
3092
// stage mark it as variable.
3093
CurrentSymbol = Reader->createSymbol();
3094
CurrentSymbol->setIsVariable();
3095
CurrentSymbol->setTag(dwarf::DW_TAG_variable);
3096
return CurrentSymbol;
3097
3098
// Scopes.
3099
case SymbolKind::S_BLOCK32:
3100
CurrentScope = Reader->createScope();
3101
CurrentScope->setIsLexicalBlock();
3102
CurrentScope->setTag(dwarf::DW_TAG_lexical_block);
3103
return CurrentScope;
3104
case SymbolKind::S_COMPILE2:
3105
case SymbolKind::S_COMPILE3:
3106
CurrentScope = Reader->createScopeCompileUnit();
3107
CurrentScope->setTag(dwarf::DW_TAG_compile_unit);
3108
Reader->setCompileUnit(static_cast<LVScopeCompileUnit *>(CurrentScope));
3109
return CurrentScope;
3110
case SymbolKind::S_INLINESITE:
3111
case SymbolKind::S_INLINESITE2:
3112
CurrentScope = Reader->createScopeFunctionInlined();
3113
CurrentScope->setIsInlinedFunction();
3114
CurrentScope->setTag(dwarf::DW_TAG_inlined_subroutine);
3115
return CurrentScope;
3116
case SymbolKind::S_LPROC32:
3117
case SymbolKind::S_GPROC32:
3118
case SymbolKind::S_LPROC32_ID:
3119
case SymbolKind::S_GPROC32_ID:
3120
case SymbolKind::S_SEPCODE:
3121
case SymbolKind::S_THUNK32:
3122
CurrentScope = Reader->createScopeFunction();
3123
CurrentScope->setIsSubprogram();
3124
CurrentScope->setTag(dwarf::DW_TAG_subprogram);
3125
return CurrentScope;
3126
default:
3127
// If '--internal=tag' and '--print=warning' are specified in the command
3128
// line, we record and print each seen 'SymbolKind'.
3129
break;
3130
}
3131
return nullptr;
3132
}
3133
3134
LVElement *LVLogicalVisitor::createElement(TypeIndex TI, TypeLeafKind Kind) {
3135
LVElement *Element = Shared->TypeRecords.find(StreamTPI, TI);
3136
if (!Element) {
3137
// We are dealing with a base type or pointer to a base type, which are
3138
// not included explicitly in the CodeView format.
3139
if (Kind < TypeIndex::FirstNonSimpleIndex) {
3140
Element = createElement(Kind);
3141
Element->setIsFinalized();
3142
Shared->TypeRecords.add(StreamTPI, (TypeIndex)Kind, Kind, Element);
3143
Element->setOffset(Kind);
3144
return Element;
3145
}
3146
// We are dealing with a pointer to a base type.
3147
if (TI.getIndex() < TypeIndex::FirstNonSimpleIndex) {
3148
Element = createElement(Kind);
3149
Shared->TypeRecords.add(StreamTPI, TI, Kind, Element);
3150
Element->setOffset(TI.getIndex());
3151
Element->setOffsetFromTypeIndex();
3152
return Element;
3153
}
3154
3155
W.printString("** Not implemented. **");
3156
printTypeIndex("TypeIndex", TI, StreamTPI);
3157
W.printString("TypeLeafKind", formatTypeLeafKind(Kind));
3158
return nullptr;
3159
}
3160
3161
Element->setOffset(TI.getIndex());
3162
Element->setOffsetFromTypeIndex();
3163
return Element;
3164
}
3165
3166
void LVLogicalVisitor::createDataMember(CVMemberRecord &Record, LVScope *Parent,
3167
StringRef Name, TypeIndex TI,
3168
MemberAccess Access) {
3169
LLVM_DEBUG({
3170
printTypeIndex("TypeIndex", TI, StreamTPI);
3171
W.printString("TypeName", Name);
3172
});
3173
3174
createElement(Record.Kind);
3175
if (LVSymbol *Symbol = CurrentSymbol) {
3176
Symbol->setName(Name);
3177
if (TI.isNoneType() || TI.isSimple())
3178
Symbol->setType(getElement(StreamTPI, TI));
3179
else {
3180
LazyRandomTypeCollection &Types = types();
3181
CVType CVMemberType = Types.getType(TI);
3182
if (CVMemberType.kind() == LF_BITFIELD) {
3183
if (Error Err = finishVisitation(CVMemberType, TI, Symbol)) {
3184
consumeError(std::move(Err));
3185
return;
3186
}
3187
} else
3188
Symbol->setType(getElement(StreamTPI, TI));
3189
}
3190
Symbol->setAccessibilityCode(Access);
3191
Parent->addElement(Symbol);
3192
}
3193
}
3194
3195
LVSymbol *LVLogicalVisitor::createParameter(LVElement *Element, StringRef Name,
3196
LVScope *Parent) {
3197
LVSymbol *Parameter = Reader->createSymbol();
3198
Parent->addElement(Parameter);
3199
Parameter->setIsParameter();
3200
Parameter->setTag(dwarf::DW_TAG_formal_parameter);
3201
Parameter->setName(Name);
3202
Parameter->setType(Element);
3203
return Parameter;
3204
}
3205
3206
LVSymbol *LVLogicalVisitor::createParameter(TypeIndex TI, StringRef Name,
3207
LVScope *Parent) {
3208
return createParameter(getElement(StreamTPI, TI), Name, Parent);
3209
}
3210
3211
LVType *LVLogicalVisitor::createBaseType(TypeIndex TI, StringRef TypeName) {
3212
TypeLeafKind SimpleKind = (TypeLeafKind)TI.getSimpleKind();
3213
TypeIndex TIR = (TypeIndex)SimpleKind;
3214
LLVM_DEBUG({
3215
printTypeIndex("TypeIndex", TIR, StreamTPI);
3216
W.printString("TypeName", TypeName);
3217
});
3218
3219
if (LVElement *Element = Shared->TypeRecords.find(StreamTPI, TIR))
3220
return static_cast<LVType *>(Element);
3221
3222
if (createElement(TIR, SimpleKind)) {
3223
CurrentType->setName(TypeName);
3224
Reader->getCompileUnit()->addElement(CurrentType);
3225
}
3226
return CurrentType;
3227
}
3228
3229
LVType *LVLogicalVisitor::createPointerType(TypeIndex TI, StringRef TypeName) {
3230
LLVM_DEBUG({
3231
printTypeIndex("TypeIndex", TI, StreamTPI);
3232
W.printString("TypeName", TypeName);
3233
});
3234
3235
if (LVElement *Element = Shared->TypeRecords.find(StreamTPI, TI))
3236
return static_cast<LVType *>(Element);
3237
3238
LVType *Pointee = createBaseType(TI, TypeName.drop_back(1));
3239
if (createElement(TI, TypeLeafKind::LF_POINTER)) {
3240
CurrentType->setIsFinalized();
3241
CurrentType->setType(Pointee);
3242
Reader->getCompileUnit()->addElement(CurrentType);
3243
}
3244
return CurrentType;
3245
}
3246
3247
void LVLogicalVisitor::createParents(StringRef ScopedName, LVElement *Element) {
3248
// For the given test case:
3249
//
3250
// struct S { enum E { ... }; };
3251
// S::E V;
3252
//
3253
// 0 | S_LOCAL `V`
3254
// type=0x1004 (S::E), flags = none
3255
// 0x1004 | LF_ENUM `S::E`
3256
// options: has unique name | is nested
3257
// 0x1009 | LF_STRUCTURE `S`
3258
// options: contains nested class
3259
//
3260
// When the local 'V' is processed, its type 'E' is created. But There is
3261
// no direct reference to its parent 'S'. We use the scoped name for 'E',
3262
// to create its parents.
3263
3264
// The input scoped name must have at least parent and nested names.
3265
// Drop the last element name, as it corresponds to the nested type.
3266
LVStringRefs Components = getAllLexicalComponents(ScopedName);
3267
if (Components.size() < 2)
3268
return;
3269
Components.pop_back();
3270
3271
LVStringRefs::size_type FirstNamespace;
3272
LVStringRefs::size_type FirstAggregate;
3273
std::tie(FirstNamespace, FirstAggregate) =
3274
Shared->NamespaceDeduction.find(Components);
3275
3276
LLVM_DEBUG({
3277
W.printString("First Namespace", Components[FirstNamespace]);
3278
W.printString("First NonNamespace", Components[FirstAggregate]);
3279
});
3280
3281
// Create any referenced namespaces.
3282
if (FirstNamespace < FirstAggregate) {
3283
Shared->NamespaceDeduction.get(
3284
LVStringRefs(Components.begin() + FirstNamespace,
3285
Components.begin() + FirstAggregate));
3286
}
3287
3288
// Traverse the enclosing scopes (aggregates) and create them. In the
3289
// case of nested empty aggregates, MSVC does not emit a full record
3290
// description. It emits only the reference record.
3291
LVScope *Aggregate = nullptr;
3292
TypeIndex TIAggregate;
3293
std::string AggregateName = getScopedName(
3294
LVStringRefs(Components.begin(), Components.begin() + FirstAggregate));
3295
3296
// This traversal is executed at least once.
3297
for (LVStringRefs::size_type Index = FirstAggregate;
3298
Index < Components.size(); ++Index) {
3299
AggregateName = getScopedName(LVStringRefs(Components.begin() + Index,
3300
Components.begin() + Index + 1),
3301
AggregateName);
3302
TIAggregate = Shared->ForwardReferences.remap(
3303
Shared->TypeRecords.find(StreamTPI, AggregateName));
3304
Aggregate =
3305
TIAggregate.isNoneType()
3306
? nullptr
3307
: static_cast<LVScope *>(getElement(StreamTPI, TIAggregate));
3308
}
3309
3310
// Workaround for cases where LF_NESTTYPE is missing for nested templates.
3311
// If we manage to get parent information from the scoped name, we can add
3312
// the nested type without relying on the LF_NESTTYPE.
3313
if (Aggregate && !Element->getIsScopedAlready()) {
3314
Aggregate->addElement(Element);
3315
Element->setIsScopedAlready();
3316
}
3317
}
3318
3319
LVElement *LVLogicalVisitor::getElement(uint32_t StreamIdx, TypeIndex TI,
3320
LVScope *Parent) {
3321
LLVM_DEBUG({ printTypeIndex("TypeIndex", TI, StreamTPI); });
3322
TI = Shared->ForwardReferences.remap(TI);
3323
LLVM_DEBUG({ printTypeIndex("TypeIndex Remap", TI, StreamTPI); });
3324
3325
LVElement *Element = Shared->TypeRecords.find(StreamIdx, TI);
3326
if (!Element) {
3327
if (TI.isNoneType() || TI.isSimple()) {
3328
StringRef TypeName = TypeIndex::simpleTypeName(TI);
3329
// If the name ends with "*", create 2 logical types: a pointer and a
3330
// pointee type. TypeIndex is composed of a SympleTypeMode byte followed
3331
// by a SimpleTypeKind byte. The logical pointer will be identified by
3332
// the full TypeIndex value and the pointee by the SimpleTypeKind.
3333
return (TypeName.back() == '*') ? createPointerType(TI, TypeName)
3334
: createBaseType(TI, TypeName);
3335
}
3336
3337
LLVM_DEBUG({ W.printHex("TypeIndex not implemented: ", TI.getIndex()); });
3338
return nullptr;
3339
}
3340
3341
// The element has been finalized.
3342
if (Element->getIsFinalized())
3343
return Element;
3344
3345
// Add the element in case of a given parent.
3346
if (Parent)
3347
Parent->addElement(Element);
3348
3349
// Check for a composite type.
3350
LazyRandomTypeCollection &Types = types();
3351
CVType CVRecord = Types.getType(TI);
3352
if (Error Err = finishVisitation(CVRecord, TI, Element)) {
3353
consumeError(std::move(Err));
3354
return nullptr;
3355
}
3356
Element->setIsFinalized();
3357
return Element;
3358
}
3359
3360
void LVLogicalVisitor::processLines() {
3361
// Traverse the collected LF_UDT_SRC_LINE records and add the source line
3362
// information to the logical elements.
3363
for (const TypeIndex &Entry : Shared->LineRecords) {
3364
CVType CVRecord = ids().getType(Entry);
3365
UdtSourceLineRecord Line;
3366
if (Error Err = TypeDeserializer::deserializeAs(
3367
const_cast<CVType &>(CVRecord), Line))
3368
consumeError(std::move(Err));
3369
else {
3370
LLVM_DEBUG({
3371
printTypeIndex("UDT", Line.getUDT(), StreamIPI);
3372
printTypeIndex("SourceFile", Line.getSourceFile(), StreamIPI);
3373
W.printNumber("LineNumber", Line.getLineNumber());
3374
});
3375
3376
// The TypeIndex returned by 'getUDT()' must point to an already
3377
// created logical element. If no logical element is found, it means
3378
// the LF_UDT_SRC_LINE is associated with a system TypeIndex.
3379
if (LVElement *Element = Shared->TypeRecords.find(
3380
StreamTPI, Line.getUDT(), /*Create=*/false)) {
3381
Element->setLineNumber(Line.getLineNumber());
3382
Element->setFilenameIndex(
3383
Shared->StringRecords.findIndex(Line.getSourceFile()));
3384
}
3385
}
3386
}
3387
}
3388
3389
void LVLogicalVisitor::processNamespaces() {
3390
// Create namespaces.
3391
Shared->NamespaceDeduction.init();
3392
}
3393
3394
void LVLogicalVisitor::processFiles() { Shared->StringRecords.addFilenames(); }
3395
3396
void LVLogicalVisitor::printRecords(raw_ostream &OS) const {
3397
if (!options().getInternalTag())
3398
return;
3399
3400
unsigned Count = 0;
3401
auto PrintItem = [&](StringRef Name) {
3402
auto NewLine = [&]() {
3403
if (++Count == 4) {
3404
Count = 0;
3405
OS << "\n";
3406
}
3407
};
3408
OS << format("%20s", Name.str().c_str());
3409
NewLine();
3410
};
3411
3412
OS << "\nTypes:\n";
3413
for (const TypeLeafKind &Kind : Shared->TypeKinds)
3414
PrintItem(formatTypeLeafKind(Kind));
3415
Shared->TypeKinds.clear();
3416
3417
Count = 0;
3418
OS << "\nSymbols:\n";
3419
for (const SymbolKind &Kind : Shared->SymbolKinds)
3420
PrintItem(LVCodeViewReader::getSymbolKindName(Kind));
3421
Shared->SymbolKinds.clear();
3422
3423
OS << "\n";
3424
}
3425
3426
Error LVLogicalVisitor::inlineSiteAnnotation(LVScope *AbstractFunction,
3427
LVScope *InlinedFunction,
3428
InlineSiteSym &InlineSite) {
3429
// Get the parent scope to update the address ranges of the nested
3430
// scope representing the inlined function.
3431
LVAddress ParentLowPC = 0;
3432
LVScope *Parent = InlinedFunction->getParentScope();
3433
if (const LVLocations *Locations = Parent->getRanges()) {
3434
if (!Locations->empty())
3435
ParentLowPC = (*Locations->begin())->getLowerAddress();
3436
}
3437
3438
// For the given inlinesite, get the initial line number and its
3439
// source filename. Update the logical scope representing it.
3440
uint32_t LineNumber = 0;
3441
StringRef Filename;
3442
LVInlineeInfo::iterator Iter = InlineeInfo.find(InlineSite.Inlinee);
3443
if (Iter != InlineeInfo.end()) {
3444
LineNumber = Iter->second.first;
3445
Filename = Iter->second.second;
3446
AbstractFunction->setLineNumber(LineNumber);
3447
// TODO: This part needs additional work in order to set properly the
3448
// correct filename in order to detect changes between filenames.
3449
// AbstractFunction->setFilename(Filename);
3450
}
3451
3452
LLVM_DEBUG({
3453
dbgs() << "inlineSiteAnnotation\n"
3454
<< "Abstract: " << AbstractFunction->getName() << "\n"
3455
<< "Inlined: " << InlinedFunction->getName() << "\n"
3456
<< "Parent: " << Parent->getName() << "\n"
3457
<< "Low PC: " << hexValue(ParentLowPC) << "\n";
3458
});
3459
3460
// Get the source lines if requested by command line option.
3461
if (!options().getPrintLines())
3462
return Error::success();
3463
3464
// Limitation: Currently we don't track changes in the FileOffset. The
3465
// side effects are the caller that it is unable to differentiate the
3466
// source filename for the inlined code.
3467
uint64_t CodeOffset = ParentLowPC;
3468
int32_t LineOffset = LineNumber;
3469
uint32_t FileOffset = 0;
3470
3471
auto UpdateClose = [&]() { LLVM_DEBUG({ dbgs() << ("\n"); }); };
3472
auto UpdateCodeOffset = [&](uint32_t Delta) {
3473
CodeOffset += Delta;
3474
LLVM_DEBUG({
3475
dbgs() << formatv(" code 0x{0} (+0x{1})", utohexstr(CodeOffset),
3476
utohexstr(Delta));
3477
});
3478
};
3479
auto UpdateLineOffset = [&](int32_t Delta) {
3480
LineOffset += Delta;
3481
LLVM_DEBUG({
3482
char Sign = Delta > 0 ? '+' : '-';
3483
dbgs() << formatv(" line {0} ({1}{2})", LineOffset, Sign,
3484
std::abs(Delta));
3485
});
3486
};
3487
auto UpdateFileOffset = [&](int32_t Offset) {
3488
FileOffset = Offset;
3489
LLVM_DEBUG({ dbgs() << formatv(" file {0}", FileOffset); });
3490
};
3491
3492
LVLines InlineeLines;
3493
auto CreateLine = [&]() {
3494
// Create the logical line record.
3495
LVLineDebug *Line = Reader->createLineDebug();
3496
Line->setAddress(CodeOffset);
3497
Line->setLineNumber(LineOffset);
3498
// TODO: This part needs additional work in order to set properly the
3499
// correct filename in order to detect changes between filenames.
3500
// Line->setFilename(Filename);
3501
InlineeLines.push_back(Line);
3502
};
3503
3504
bool SeenLowAddress = false;
3505
bool SeenHighAddress = false;
3506
uint64_t LowPC = 0;
3507
uint64_t HighPC = 0;
3508
3509
for (auto &Annot : InlineSite.annotations()) {
3510
LLVM_DEBUG({
3511
dbgs() << formatv(" {0}",
3512
fmt_align(toHex(Annot.Bytes), AlignStyle::Left, 9));
3513
});
3514
3515
// Use the opcode to interpret the integer values.
3516
switch (Annot.OpCode) {
3517
case BinaryAnnotationsOpCode::ChangeCodeOffset:
3518
case BinaryAnnotationsOpCode::CodeOffset:
3519
case BinaryAnnotationsOpCode::ChangeCodeLength:
3520
UpdateCodeOffset(Annot.U1);
3521
UpdateClose();
3522
if (Annot.OpCode == BinaryAnnotationsOpCode::ChangeCodeOffset) {
3523
CreateLine();
3524
LowPC = CodeOffset;
3525
SeenLowAddress = true;
3526
break;
3527
}
3528
if (Annot.OpCode == BinaryAnnotationsOpCode::ChangeCodeLength) {
3529
HighPC = CodeOffset - 1;
3530
SeenHighAddress = true;
3531
}
3532
break;
3533
case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset:
3534
UpdateCodeOffset(Annot.U2);
3535
UpdateClose();
3536
break;
3537
case BinaryAnnotationsOpCode::ChangeLineOffset:
3538
case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset:
3539
UpdateCodeOffset(Annot.U1);
3540
UpdateLineOffset(Annot.S1);
3541
UpdateClose();
3542
if (Annot.OpCode ==
3543
BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset)
3544
CreateLine();
3545
break;
3546
case BinaryAnnotationsOpCode::ChangeFile:
3547
UpdateFileOffset(Annot.U1);
3548
UpdateClose();
3549
break;
3550
default:
3551
break;
3552
}
3553
if (SeenLowAddress && SeenHighAddress) {
3554
SeenLowAddress = false;
3555
SeenHighAddress = false;
3556
InlinedFunction->addObject(LowPC, HighPC);
3557
}
3558
}
3559
3560
Reader->addInlineeLines(InlinedFunction, InlineeLines);
3561
UpdateClose();
3562
3563
return Error::success();
3564
}
3565
3566