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 
getTrueType(TypeIndex & TI)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.
getRecordName(LazyRandomTypeCollection & Types,TypeIndex TI)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:
LVTypeRecords(LVShared * Shared)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.
add(TypeIndex TIForward,TypeIndex TIReference)158   void add(TypeIndex TIForward, TypeIndex TIReference) {
159     ForwardTypes.emplace(TIForward, TIReference);
160   }
161 
add(StringRef Name,TypeIndex TIForward)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.
update(StringRef Name,TypeIndex TIReference)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 
record(bool IsForwardRef,StringRef Name,TypeIndex TI)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 
find(TypeIndex TIForward)198   TypeIndex find(TypeIndex TIForward) {
199     return (ForwardTypes.find(TIForward) != ForwardTypes.end())
200                ? ForwardTypes[TIForward]
201                : TypeIndex::None();
202   }
203 
find(StringRef Name)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.
remap(TypeIndex 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 
add(StringRef Name,LVScope * Namespace)230   void add(StringRef Name, LVScope *Namespace) {
231     if (NamespaceNames.find(Name) == NamespaceNames.end())
232       NamespaceNames.emplace(Name, Namespace);
233   }
234 
235 public:
LVNamespaceDeduction(LVShared * Shared)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.
find(StringRef Name)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.
find(LVStringRefs Components)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 
add(TypeIndex TI,StringRef String)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 
find(TypeIndex TI)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 
findIndex(TypeIndex TI)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 
LVSharedllvm::logicalview::LVShared328   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 
add(uint32_t StreamIdx,TypeIndex TI,TypeLeafKind Kind,LVElement * Element)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 
add(uint32_t StreamIdx,TypeIndex TI,StringRef Name)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 
find(uint32_t StreamIdx,TypeIndex TI,bool Create)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 
find(uint32_t StreamIdx,StringRef Name)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 
addFilenames()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 
addFilenames(LVScopeCompileUnit * Scope)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 
add(StringRef String)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 
init()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 
get(LVStringRefs Components)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 
get(StringRef ScopedName,bool CheckScope)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 //===----------------------------------------------------------------------===//
printTypeIndex(StringRef FieldName,TypeIndex TI,uint32_t StreamIdx) const485 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 
visitTypeBegin(CVType & Record)491 Error LVTypeVisitor::visitTypeBegin(CVType &Record) {
492   return visitTypeBegin(Record, TypeIndex::fromArrayIndex(Types.size()));
493 }
494 
visitTypeBegin(CVType & Record,TypeIndex TI)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 
visitUnknownType(CVType & Record)511 Error LVTypeVisitor::visitUnknownType(CVType &Record) {
512   LLVM_DEBUG({ W.printNumber("Length", uint32_t(Record.content().size())); });
513   return Error::success();
514 }
515 
visitMemberBegin(CVMemberRecord & Record)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 
visitMemberEnd(CVMemberRecord & Record)525 Error LVTypeVisitor::visitMemberEnd(CVMemberRecord &Record) {
526   LLVM_DEBUG({
527     W.unindent();
528     W.startLine() << "}\n";
529   });
530   return Error::success();
531 }
532 
visitUnknownMember(CVMemberRecord & Record)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)
visitKnownRecord(CVType & Record,BuildInfoRecord & Args)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)
visitKnownRecord(CVType & Record,ClassRecord & Class)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)
visitKnownRecord(CVType & Record,EnumRecord & Enum)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)
visitKnownRecord(CVType & Record,FuncIdRecord & Func)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)
visitKnownRecord(CVType & Record,ProcedureRecord & Proc)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)
visitKnownRecord(CVType & Record,StringIdRecord & String)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)
visitKnownRecord(CVType & Record,UdtSourceLineRecord & Line)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)
visitKnownRecord(CVType & Record,UnionRecord & Union)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 //===----------------------------------------------------------------------===//
printRelocatedField(StringRef Label,uint32_t RelocOffset,uint32_t Offset,StringRef * RelocSym)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 
getLinkageName(uint32_t RelocOffset,uint32_t Offset,StringRef * RelocSym)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
getFileNameForFileOffset(uint32_t FileOffset)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 
getStringTable()704 DebugStringTableSubsectionRef LVSymbolVisitorDelegate::getStringTable() {
705   return Reader->CVStringTable;
706 }
707 
printLocalVariableAddrRange(const LocalVariableAddrRange & Range,uint32_t RelocationOffset)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 
printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps)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 
printTypeIndex(StringRef FieldName,TypeIndex TI) const727 void LVSymbolVisitor::printTypeIndex(StringRef FieldName, TypeIndex TI) const {
728   codeview::printTypeIndex(W, FieldName, TI, Types);
729 }
730 
visitSymbolBegin(CVSymbol & Record)731 Error LVSymbolVisitor::visitSymbolBegin(CVSymbol &Record) {
732   return visitSymbolBegin(Record, 0);
733 }
734 
visitSymbolBegin(CVSymbol & Record,uint32_t Offset)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 
visitSymbolEnd(CVSymbol & Record)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 
visitUnknownSymbol(CVSymbol & Record)784 Error LVSymbolVisitor::visitUnknownSymbol(CVSymbol &Record) {
785   LLVM_DEBUG({ W.printNumber("Length", Record.length()); });
786   return Error::success();
787 }
788 
789 // S_BLOCK32
visitKnownRecord(CVSymbol & Record,BlockSym & Block)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
visitKnownRecord(CVSymbol & Record,BPRelativeSym & Local)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.equals("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
visitKnownRecord(CVSymbol & Record,RegRelativeSym & Local)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.equals("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
visitKnownRecord(CVSymbol & CVR,BuildInfoSym & 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
visitKnownRecord(CVSymbol & Record,Compile2Sym & 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
visitKnownRecord(CVSymbol & Record,Compile3Sym & 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
visitKnownRecord(CVSymbol & Record,ConstantSym & Constant)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
visitKnownRecord(CVSymbol & Record,DefRangeFramePointerRelFullScopeSym & DefRangeFramePointerRelFullScope)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
visitKnownRecord(CVSymbol & Record,DefRangeFramePointerRelSym & DefRangeFramePointerRel)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
visitKnownRecord(CVSymbol & Record,DefRangeRegisterRelSym & DefRangeRegisterRel)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
visitKnownRecord(CVSymbol & Record,DefRangeRegisterSym & DefRangeRegister)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
visitKnownRecord(CVSymbol & Record,DefRangeSubfieldRegisterSym & DefRangeSubfieldRegister)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
visitKnownRecord(CVSymbol & Record,DefRangeSubfieldSym & DefRangeSubfield)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
visitKnownRecord(CVSymbol & Record,DefRangeSym & 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
visitKnownRecord(CVSymbol & Record,FrameProcSym & 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
visitKnownRecord(CVSymbol & Record,DataSym & Data)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
visitKnownRecord(CVSymbol & Record,InlineSiteSym & 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
visitKnownRecord(CVSymbol & Record,LocalSym & 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.equals("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
visitKnownRecord(CVSymbol & Record,ObjNameSym & 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
visitKnownRecord(CVSymbol & Record,ProcSym & Proc)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
visitKnownRecord(CVSymbol & Record,ScopeEndSym & ScopeEnd)1621 Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record,
1622                                         ScopeEndSym &ScopeEnd) {
1623   InFunctionScope = false;
1624   return Error::success();
1625 }
1626 
1627 // S_THUNK32
visitKnownRecord(CVSymbol & Record,Thunk32Sym & Thunk)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
visitKnownRecord(CVSymbol & Record,UDTSym & UDT)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.equals(RecordName))
1673         Type->resetIncludeInPrint();
1674       Type->setType(LogicalVisitor->getElement(StreamTPI, UDT.Type));
1675     }
1676   }
1677 
1678   return Error::success();
1679 }
1680 
1681 // S_UNAMESPACE
visitKnownRecord(CVSymbol & Record,UsingNamespaceSym & UN)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
visitKnownRecord(CVSymbol & CVR,JumpTableSym & JumpTable)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
visitKnownRecord(CVSymbol & Record,CallerSym & Caller)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 //===----------------------------------------------------------------------===//
LVLogicalVisitor(LVCodeViewReader * Reader,ScopedPrinter & W,InputFile & Input)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 
printTypeIndex(StringRef FieldName,TypeIndex TI,uint32_t StreamIdx)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 
printTypeBegin(CVType & Record,TypeIndex TI,LVElement * Element,uint32_t StreamIdx)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 
printTypeEnd(CVType & Record)1763 void LVLogicalVisitor::printTypeEnd(CVType &Record) {
1764   W.unindent();
1765   W.startLine() << "}\n";
1766 }
1767 
printMemberBegin(CVMemberRecord & Record,TypeIndex TI,LVElement * Element,uint32_t StreamIdx)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 
printMemberEnd(CVMemberRecord & Record)1782 void LVLogicalVisitor::printMemberEnd(CVMemberRecord &Record) {
1783   W.unindent();
1784   W.startLine() << "}\n";
1785 }
1786 
visitUnknownType(CVType & Record,TypeIndex TI)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)
visitKnownRecord(CVType & Record,ArgListRecord & Args,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,ArrayRecord & AT,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,BitFieldRecord & BF,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,BuildInfoRecord & BI,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,ClassRecord & Class,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,EnumRecord & Enum,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,FieldListRecord & FieldList,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,FuncIdRecord & Func,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,LabelRecord & LR,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,MemberFuncIdRecord & Id,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,MemberFunctionRecord & MF,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,MethodOverloadListRecord & Overloads,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,ModifierRecord & Mod,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,PointerRecord & Ptr,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,ProcedureRecord & Proc,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,UnionRecord & Union,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,TypeServer2Record & TS,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,VFTableRecord & VFT,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,VFTableShapeRecord & Shape,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,StringListRecord & Strings,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,StringIdRecord & String,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,UdtSourceLineRecord & SourceLine,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,UdtModSourceLineRecord & ModSourceLine,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,PrecompRecord & Precomp,TypeIndex TI,LVElement * Element)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)
visitKnownRecord(CVType & Record,EndPrecompRecord & EndPrecomp,TypeIndex TI,LVElement * Element)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 
visitUnknownMember(CVMemberRecord & Record,TypeIndex TI)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
visitKnownMember(CVMemberRecord & Record,BaseClassRecord & Base,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,DataMemberRecord & Field,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,EnumeratorRecord & Enum,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,ListContinuationRecord & Cont,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,NestedTypeRecord & Nested,TypeIndex TI,LVElement * Element)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.equals(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
visitKnownMember(CVMemberRecord & Record,OneMethodRecord & Method,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,OverloadedMethodRecord & Method,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,StaticDataMemberRecord & Field,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,VFPtrRecord & VFTable,TypeIndex TI,LVElement * Element)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
visitKnownMember(CVMemberRecord & Record,VirtualBaseClassRecord & Base,TypeIndex TI,LVElement * Element)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 
visitMemberRecord(CVMemberRecord & Record,TypeVisitorCallbacks & Callbacks,TypeIndex TI,LVElement * Element)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 
finishVisitation(CVType & Record,TypeIndex TI,LVElement * Element)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'.
visitFieldListMemberStream(TypeIndex TI,LVElement * Element,ArrayRef<uint8_t> FieldList)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 
addElement(LVScope * Scope,bool IsCompileUnit)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 
addElement(LVSymbol * Symbol)2974 void LVLogicalVisitor::addElement(LVSymbol *Symbol) {
2975   ReaderScope->addElement(Symbol);
2976 }
2977 
addElement(LVType * Type)2978 void LVLogicalVisitor::addElement(LVType *Type) {
2979   ReaderScope->addElement(Type);
2980 }
2981 
createElement(TypeLeafKind Kind)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 
createElement(SymbolKind Kind)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 
createElement(TypeIndex TI,TypeLeafKind Kind)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 
createDataMember(CVMemberRecord & Record,LVScope * Parent,StringRef Name,TypeIndex TI,MemberAccess Access)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 
createParameter(LVElement * Element,StringRef Name,LVScope * Parent)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 
createParameter(TypeIndex TI,StringRef Name,LVScope * Parent)3206 LVSymbol *LVLogicalVisitor::createParameter(TypeIndex TI, StringRef Name,
3207                                             LVScope *Parent) {
3208   return createParameter(getElement(StreamTPI, TI), Name, Parent);
3209 }
3210 
createBaseType(TypeIndex TI,StringRef TypeName)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 
createPointerType(TypeIndex TI,StringRef TypeName)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 
createParents(StringRef ScopedName,LVElement * Element)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 
getElement(uint32_t StreamIdx,TypeIndex TI,LVScope * Parent)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 
processLines()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 
processNamespaces()3389 void LVLogicalVisitor::processNamespaces() {
3390   // Create namespaces.
3391   Shared->NamespaceDeduction.init();
3392 }
3393 
processFiles()3394 void LVLogicalVisitor::processFiles() { Shared->StringRecords.addFilenames(); }
3395 
printRecords(raw_ostream & OS) const3396 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 
inlineSiteAnnotation(LVScope * AbstractFunction,LVScope * InlinedFunction,InlineSiteSym & InlineSite)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