1 #include "PdbAstBuilder.h"
2
3 #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
4 #include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
5 #include "llvm/DebugInfo/CodeView/RecordName.h"
6 #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
7 #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
8 #include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h"
9 #include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
10 #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
11 #include "llvm/DebugInfo/PDB/Native/DbiStream.h"
12 #include "llvm/DebugInfo/PDB/Native/PublicsStream.h"
13 #include "llvm/DebugInfo/PDB/Native/SymbolStream.h"
14 #include "llvm/DebugInfo/PDB/Native/TpiStream.h"
15 #include "llvm/Demangle/MicrosoftDemangle.h"
16
17 #include "Plugins/ExpressionParser/Clang/ClangASTMetadata.h"
18 #include "Plugins/ExpressionParser/Clang/ClangUtil.h"
19 #include "Plugins/Language/CPlusPlus/MSVCUndecoratedNameParser.h"
20 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
21 #include "lldb/Core/Module.h"
22 #include "lldb/Symbol/ObjectFile.h"
23 #include "lldb/Utility/LLDBAssert.h"
24
25 #include "PdbUtil.h"
26 #include "UdtRecordCompleter.h"
27
28 using namespace lldb_private;
29 using namespace lldb_private::npdb;
30 using namespace llvm::codeview;
31 using namespace llvm::pdb;
32
33 namespace {
34 struct CreateMethodDecl : public TypeVisitorCallbacks {
CreateMethodDecl__anonc2e7a6240111::CreateMethodDecl35 CreateMethodDecl(PdbIndex &m_index, TypeSystemClang &m_clang,
36 TypeIndex func_type_index,
37 clang::FunctionDecl *&function_decl,
38 lldb::opaque_compiler_type_t parent_ty,
39 llvm::StringRef proc_name, CompilerType func_ct)
40 : m_index(m_index), m_clang(m_clang), func_type_index(func_type_index),
41 function_decl(function_decl), parent_ty(parent_ty),
42 proc_name(proc_name), func_ct(func_ct) {}
43 PdbIndex &m_index;
44 TypeSystemClang &m_clang;
45 TypeIndex func_type_index;
46 clang::FunctionDecl *&function_decl;
47 lldb::opaque_compiler_type_t parent_ty;
48 llvm::StringRef proc_name;
49 CompilerType func_ct;
50
visitKnownMember__anonc2e7a6240111::CreateMethodDecl51 llvm::Error visitKnownMember(CVMemberRecord &cvr,
52 OverloadedMethodRecord &overloaded) override {
53 TypeIndex method_list_idx = overloaded.MethodList;
54
55 CVType method_list_type = m_index.tpi().getType(method_list_idx);
56 assert(method_list_type.kind() == LF_METHODLIST);
57
58 MethodOverloadListRecord method_list;
59 llvm::cantFail(TypeDeserializer::deserializeAs<MethodOverloadListRecord>(
60 method_list_type, method_list));
61
62 for (const OneMethodRecord &method : method_list.Methods) {
63 if (method.getType().getIndex() == func_type_index.getIndex())
64 AddMethod(overloaded.Name, method.getAccess(), method.getOptions(),
65 method.Attrs);
66 }
67
68 return llvm::Error::success();
69 }
70
visitKnownMember__anonc2e7a6240111::CreateMethodDecl71 llvm::Error visitKnownMember(CVMemberRecord &cvr,
72 OneMethodRecord &record) override {
73 AddMethod(record.getName(), record.getAccess(), record.getOptions(),
74 record.Attrs);
75 return llvm::Error::success();
76 }
77
AddMethod__anonc2e7a6240111::CreateMethodDecl78 void AddMethod(llvm::StringRef name, MemberAccess access,
79 MethodOptions options, MemberAttributes attrs) {
80 if (name != proc_name || function_decl)
81 return;
82 lldb::AccessType access_type = TranslateMemberAccess(access);
83 bool is_virtual = attrs.isVirtual();
84 bool is_static = attrs.isStatic();
85 bool is_artificial = (options & MethodOptions::CompilerGenerated) ==
86 MethodOptions::CompilerGenerated;
87 function_decl = m_clang.AddMethodToCXXRecordType(
88 parent_ty, proc_name,
89 /*mangled_name=*/nullptr, func_ct, /*access=*/access_type,
90 /*is_virtual=*/is_virtual, /*is_static=*/is_static,
91 /*is_inline=*/false, /*is_explicit=*/false,
92 /*is_attr_used=*/false, /*is_artificial=*/is_artificial);
93 }
94 };
95 } // namespace
96
FindSymbolScope(PdbIndex & index,PdbCompilandSymId id)97 static llvm::Optional<PdbCompilandSymId> FindSymbolScope(PdbIndex &index,
98 PdbCompilandSymId id) {
99 CVSymbol sym = index.ReadSymbolRecord(id);
100 if (symbolOpensScope(sym.kind())) {
101 // If this exact symbol opens a scope, we can just directly access its
102 // parent.
103 id.offset = getScopeParentOffset(sym);
104 // Global symbols have parent offset of 0. Return llvm::None to indicate
105 // this.
106 if (id.offset == 0)
107 return llvm::None;
108 return id;
109 }
110
111 // Otherwise we need to start at the beginning and iterate forward until we
112 // reach (or pass) this particular symbol
113 CompilandIndexItem &cii = index.compilands().GetOrCreateCompiland(id.modi);
114 const CVSymbolArray &syms = cii.m_debug_stream.getSymbolArray();
115
116 auto begin = syms.begin();
117 auto end = syms.at(id.offset);
118 std::vector<PdbCompilandSymId> scope_stack;
119
120 while (begin != end) {
121 if (begin.offset() > id.offset) {
122 // We passed it. We couldn't even find this symbol record.
123 lldbassert(false && "Invalid compiland symbol id!");
124 return llvm::None;
125 }
126
127 // We haven't found the symbol yet. Check if we need to open or close the
128 // scope stack.
129 if (symbolOpensScope(begin->kind())) {
130 // We can use the end offset of the scope to determine whether or not
131 // we can just outright skip this entire scope.
132 uint32_t scope_end = getScopeEndOffset(*begin);
133 if (scope_end < id.offset) {
134 begin = syms.at(scope_end);
135 } else {
136 // The symbol we're looking for is somewhere in this scope.
137 scope_stack.emplace_back(id.modi, begin.offset());
138 }
139 } else if (symbolEndsScope(begin->kind())) {
140 scope_stack.pop_back();
141 }
142 ++begin;
143 }
144 if (scope_stack.empty())
145 return llvm::None;
146 // We have a match! Return the top of the stack
147 return scope_stack.back();
148 }
149
TranslateUdtKind(const TagRecord & cr)150 static clang::TagTypeKind TranslateUdtKind(const TagRecord &cr) {
151 switch (cr.Kind) {
152 case TypeRecordKind::Class:
153 return clang::TTK_Class;
154 case TypeRecordKind::Struct:
155 return clang::TTK_Struct;
156 case TypeRecordKind::Union:
157 return clang::TTK_Union;
158 case TypeRecordKind::Interface:
159 return clang::TTK_Interface;
160 case TypeRecordKind::Enum:
161 return clang::TTK_Enum;
162 default:
163 lldbassert(false && "Invalid tag record kind!");
164 return clang::TTK_Struct;
165 }
166 }
167
IsCVarArgsFunction(llvm::ArrayRef<TypeIndex> args)168 static bool IsCVarArgsFunction(llvm::ArrayRef<TypeIndex> args) {
169 if (args.empty())
170 return false;
171 return args.back() == TypeIndex::None();
172 }
173
174 static bool
AnyScopesHaveTemplateParams(llvm::ArrayRef<llvm::ms_demangle::Node * > scopes)175 AnyScopesHaveTemplateParams(llvm::ArrayRef<llvm::ms_demangle::Node *> scopes) {
176 for (llvm::ms_demangle::Node *n : scopes) {
177 auto *idn = static_cast<llvm::ms_demangle::IdentifierNode *>(n);
178 if (idn->TemplateParams)
179 return true;
180 }
181 return false;
182 }
183
184 static llvm::Optional<clang::CallingConv>
TranslateCallingConvention(llvm::codeview::CallingConvention conv)185 TranslateCallingConvention(llvm::codeview::CallingConvention conv) {
186 using CC = llvm::codeview::CallingConvention;
187 switch (conv) {
188
189 case CC::NearC:
190 case CC::FarC:
191 return clang::CallingConv::CC_C;
192 case CC::NearPascal:
193 case CC::FarPascal:
194 return clang::CallingConv::CC_X86Pascal;
195 case CC::NearFast:
196 case CC::FarFast:
197 return clang::CallingConv::CC_X86FastCall;
198 case CC::NearStdCall:
199 case CC::FarStdCall:
200 return clang::CallingConv::CC_X86StdCall;
201 case CC::ThisCall:
202 return clang::CallingConv::CC_X86ThisCall;
203 case CC::NearVector:
204 return clang::CallingConv::CC_X86VectorCall;
205 default:
206 return llvm::None;
207 }
208 }
209
210 static llvm::Optional<CVTagRecord>
GetNestedTagDefinition(const NestedTypeRecord & Record,const CVTagRecord & parent,TpiStream & tpi)211 GetNestedTagDefinition(const NestedTypeRecord &Record,
212 const CVTagRecord &parent, TpiStream &tpi) {
213 // An LF_NESTTYPE is essentially a nested typedef / using declaration, but it
214 // is also used to indicate the primary definition of a nested class. That is
215 // to say, if you have:
216 // struct A {
217 // struct B {};
218 // using C = B;
219 // };
220 // Then in the debug info, this will appear as:
221 // LF_STRUCTURE `A::B` [type index = N]
222 // LF_STRUCTURE `A`
223 // LF_NESTTYPE [name = `B`, index = N]
224 // LF_NESTTYPE [name = `C`, index = N]
225 // In order to accurately reconstruct the decl context hierarchy, we need to
226 // know which ones are actual definitions and which ones are just aliases.
227
228 // If it's a simple type, then this is something like `using foo = int`.
229 if (Record.Type.isSimple())
230 return llvm::None;
231
232 CVType cvt = tpi.getType(Record.Type);
233
234 if (!IsTagRecord(cvt))
235 return llvm::None;
236
237 // If it's an inner definition, then treat whatever name we have here as a
238 // single component of a mangled name. So we can inject it into the parent's
239 // mangled name to see if it matches.
240 CVTagRecord child = CVTagRecord::create(cvt);
241 std::string qname = std::string(parent.asTag().getUniqueName());
242 if (qname.size() < 4 || child.asTag().getUniqueName().size() < 4)
243 return llvm::None;
244
245 // qname[3] is the tag type identifier (struct, class, union, etc). Since the
246 // inner tag type is not necessarily the same as the outer tag type, re-write
247 // it to match the inner tag type.
248 qname[3] = child.asTag().getUniqueName()[3];
249 std::string piece;
250 if (qname[3] == 'W')
251 piece = "4";
252 piece += Record.Name;
253 piece.push_back('@');
254 qname.insert(4, std::move(piece));
255 if (qname != child.asTag().UniqueName)
256 return llvm::None;
257
258 return std::move(child);
259 }
260
IsAnonymousNamespaceName(llvm::StringRef name)261 static bool IsAnonymousNamespaceName(llvm::StringRef name) {
262 return name == "`anonymous namespace'" || name == "`anonymous-namespace'";
263 }
264
PdbAstBuilder(ObjectFile & obj,PdbIndex & index,TypeSystemClang & clang)265 PdbAstBuilder::PdbAstBuilder(ObjectFile &obj, PdbIndex &index, TypeSystemClang &clang)
266 : m_index(index), m_clang(clang) {
267 BuildParentMap();
268 }
269
GetTranslationUnitDecl()270 lldb_private::CompilerDeclContext PdbAstBuilder::GetTranslationUnitDecl() {
271 return ToCompilerDeclContext(*m_clang.GetTranslationUnitDecl());
272 }
273
274 std::pair<clang::DeclContext *, std::string>
CreateDeclInfoForType(const TagRecord & record,TypeIndex ti)275 PdbAstBuilder::CreateDeclInfoForType(const TagRecord &record, TypeIndex ti) {
276 // FIXME: Move this to GetDeclContextContainingUID.
277 if (!record.hasUniqueName())
278 return CreateDeclInfoForUndecoratedName(record.Name);
279
280 llvm::ms_demangle::Demangler demangler;
281 StringView sv(record.UniqueName.begin(), record.UniqueName.size());
282 llvm::ms_demangle::TagTypeNode *ttn = demangler.parseTagUniqueName(sv);
283 if (demangler.Error)
284 return {m_clang.GetTranslationUnitDecl(), std::string(record.UniqueName)};
285
286 llvm::ms_demangle::IdentifierNode *idn =
287 ttn->QualifiedName->getUnqualifiedIdentifier();
288 std::string uname = idn->toString(llvm::ms_demangle::OF_NoTagSpecifier);
289
290 llvm::ms_demangle::NodeArrayNode *name_components =
291 ttn->QualifiedName->Components;
292 llvm::ArrayRef<llvm::ms_demangle::Node *> scopes(name_components->Nodes,
293 name_components->Count - 1);
294
295 clang::DeclContext *context = m_clang.GetTranslationUnitDecl();
296
297 // If this type doesn't have a parent type in the debug info, then the best we
298 // can do is to say that it's either a series of namespaces (if the scope is
299 // non-empty), or the translation unit (if the scope is empty).
300 auto parent_iter = m_parent_types.find(ti);
301 if (parent_iter == m_parent_types.end()) {
302 if (scopes.empty())
303 return {context, uname};
304
305 // If there is no parent in the debug info, but some of the scopes have
306 // template params, then this is a case of bad debug info. See, for
307 // example, llvm.org/pr39607. We don't want to create an ambiguity between
308 // a NamespaceDecl and a CXXRecordDecl, so instead we create a class at
309 // global scope with the fully qualified name.
310 if (AnyScopesHaveTemplateParams(scopes))
311 return {context, std::string(record.Name)};
312
313 for (llvm::ms_demangle::Node *scope : scopes) {
314 auto *nii = static_cast<llvm::ms_demangle::NamedIdentifierNode *>(scope);
315 std::string str = nii->toString();
316 context = GetOrCreateNamespaceDecl(str.c_str(), *context);
317 }
318 return {context, uname};
319 }
320
321 // Otherwise, all we need to do is get the parent type of this type and
322 // recurse into our lazy type creation / AST reconstruction logic to get an
323 // LLDB TypeSP for the parent. This will cause the AST to automatically get
324 // the right DeclContext created for any parent.
325 clang::QualType parent_qt = GetOrCreateType(parent_iter->second);
326 if (parent_qt.isNull())
327 return {nullptr, ""};
328
329 context = clang::TagDecl::castToDeclContext(parent_qt->getAsTagDecl());
330 return {context, uname};
331 }
332
BuildParentMap()333 void PdbAstBuilder::BuildParentMap() {
334 LazyRandomTypeCollection &types = m_index.tpi().typeCollection();
335
336 llvm::DenseMap<TypeIndex, TypeIndex> forward_to_full;
337 llvm::DenseMap<TypeIndex, TypeIndex> full_to_forward;
338
339 struct RecordIndices {
340 TypeIndex forward;
341 TypeIndex full;
342 };
343
344 llvm::StringMap<RecordIndices> record_indices;
345
346 for (auto ti = types.getFirst(); ti; ti = types.getNext(*ti)) {
347 CVType type = types.getType(*ti);
348 if (!IsTagRecord(type))
349 continue;
350
351 CVTagRecord tag = CVTagRecord::create(type);
352
353 RecordIndices &indices = record_indices[tag.asTag().getUniqueName()];
354 if (tag.asTag().isForwardRef())
355 indices.forward = *ti;
356 else
357 indices.full = *ti;
358
359 if (indices.full != TypeIndex::None() &&
360 indices.forward != TypeIndex::None()) {
361 forward_to_full[indices.forward] = indices.full;
362 full_to_forward[indices.full] = indices.forward;
363 }
364
365 // We're looking for LF_NESTTYPE records in the field list, so ignore
366 // forward references (no field list), and anything without a nested class
367 // (since there won't be any LF_NESTTYPE records).
368 if (tag.asTag().isForwardRef() || !tag.asTag().containsNestedClass())
369 continue;
370
371 struct ProcessTpiStream : public TypeVisitorCallbacks {
372 ProcessTpiStream(PdbIndex &index, TypeIndex parent,
373 const CVTagRecord &parent_cvt,
374 llvm::DenseMap<TypeIndex, TypeIndex> &parents)
375 : index(index), parents(parents), parent(parent),
376 parent_cvt(parent_cvt) {}
377
378 PdbIndex &index;
379 llvm::DenseMap<TypeIndex, TypeIndex> &parents;
380
381 unsigned unnamed_type_index = 1;
382 TypeIndex parent;
383 const CVTagRecord &parent_cvt;
384
385 llvm::Error visitKnownMember(CVMemberRecord &CVR,
386 NestedTypeRecord &Record) override {
387 std::string unnamed_type_name;
388 if (Record.Name.empty()) {
389 unnamed_type_name =
390 llvm::formatv("<unnamed-type-$S{0}>", unnamed_type_index).str();
391 Record.Name = unnamed_type_name;
392 ++unnamed_type_index;
393 }
394 llvm::Optional<CVTagRecord> tag =
395 GetNestedTagDefinition(Record, parent_cvt, index.tpi());
396 if (!tag)
397 return llvm::ErrorSuccess();
398
399 parents[Record.Type] = parent;
400 return llvm::ErrorSuccess();
401 }
402 };
403
404 CVType field_list_cvt = m_index.tpi().getType(tag.asTag().FieldList);
405 ProcessTpiStream process(m_index, *ti, tag, m_parent_types);
406 FieldListRecord field_list;
407 if (llvm::Error error = TypeDeserializer::deserializeAs<FieldListRecord>(
408 field_list_cvt, field_list))
409 llvm::consumeError(std::move(error));
410 if (llvm::Error error = visitMemberRecordStream(field_list.Data, process))
411 llvm::consumeError(std::move(error));
412 }
413
414 // Now that we know the forward -> full mapping of all type indices, we can
415 // re-write all the indices. At the end of this process, we want a mapping
416 // consisting of fwd -> full and full -> full for all child -> parent indices.
417 // We can re-write the values in place, but for the keys, we must save them
418 // off so that we don't modify the map in place while also iterating it.
419 std::vector<TypeIndex> full_keys;
420 std::vector<TypeIndex> fwd_keys;
421 for (auto &entry : m_parent_types) {
422 TypeIndex key = entry.first;
423 TypeIndex value = entry.second;
424
425 auto iter = forward_to_full.find(value);
426 if (iter != forward_to_full.end())
427 entry.second = iter->second;
428
429 iter = forward_to_full.find(key);
430 if (iter != forward_to_full.end())
431 fwd_keys.push_back(key);
432 else
433 full_keys.push_back(key);
434 }
435 for (TypeIndex fwd : fwd_keys) {
436 TypeIndex full = forward_to_full[fwd];
437 m_parent_types[full] = m_parent_types[fwd];
438 }
439 for (TypeIndex full : full_keys) {
440 TypeIndex fwd = full_to_forward[full];
441 m_parent_types[fwd] = m_parent_types[full];
442 }
443
444 // Now that
445 }
446
isLocalVariableType(SymbolKind K)447 static bool isLocalVariableType(SymbolKind K) {
448 switch (K) {
449 case S_REGISTER:
450 case S_REGREL32:
451 case S_LOCAL:
452 return true;
453 default:
454 break;
455 }
456 return false;
457 }
458
459 static std::string
RenderScopeList(llvm::ArrayRef<llvm::ms_demangle::Node * > nodes)460 RenderScopeList(llvm::ArrayRef<llvm::ms_demangle::Node *> nodes) {
461 lldbassert(!nodes.empty());
462
463 std::string result = nodes.front()->toString();
464 nodes = nodes.drop_front();
465 while (!nodes.empty()) {
466 result += "::";
467 result += nodes.front()->toString(llvm::ms_demangle::OF_NoTagSpecifier);
468 nodes = nodes.drop_front();
469 }
470 return result;
471 }
472
FindPublicSym(const SegmentOffset & addr,SymbolStream & syms,PublicsStream & publics)473 static llvm::Optional<PublicSym32> FindPublicSym(const SegmentOffset &addr,
474 SymbolStream &syms,
475 PublicsStream &publics) {
476 llvm::FixedStreamArray<ulittle32_t> addr_map = publics.getAddressMap();
477 auto iter = std::lower_bound(
478 addr_map.begin(), addr_map.end(), addr,
479 [&](const ulittle32_t &x, const SegmentOffset &y) {
480 CVSymbol s1 = syms.readRecord(x);
481 lldbassert(s1.kind() == S_PUB32);
482 PublicSym32 p1;
483 llvm::cantFail(SymbolDeserializer::deserializeAs<PublicSym32>(s1, p1));
484 if (p1.Segment < y.segment)
485 return true;
486 return p1.Offset < y.offset;
487 });
488 if (iter == addr_map.end())
489 return llvm::None;
490 CVSymbol sym = syms.readRecord(*iter);
491 lldbassert(sym.kind() == S_PUB32);
492 PublicSym32 p;
493 llvm::cantFail(SymbolDeserializer::deserializeAs<PublicSym32>(sym, p));
494 if (p.Segment == addr.segment && p.Offset == addr.offset)
495 return p;
496 return llvm::None;
497 }
498
GetOrCreateSymbolForId(PdbCompilandSymId id)499 clang::Decl *PdbAstBuilder::GetOrCreateSymbolForId(PdbCompilandSymId id) {
500 CVSymbol cvs = m_index.ReadSymbolRecord(id);
501
502 if (isLocalVariableType(cvs.kind())) {
503 clang::DeclContext *scope = GetParentDeclContext(id);
504 clang::Decl *scope_decl = clang::Decl::castFromDeclContext(scope);
505 PdbCompilandSymId scope_id =
506 PdbSymUid(m_decl_to_status[scope_decl].uid).asCompilandSym();
507 return GetOrCreateVariableDecl(scope_id, id);
508 }
509
510 switch (cvs.kind()) {
511 case S_GPROC32:
512 case S_LPROC32:
513 return GetOrCreateFunctionDecl(id);
514 case S_GDATA32:
515 case S_LDATA32:
516 case S_GTHREAD32:
517 case S_CONSTANT:
518 // global variable
519 return nullptr;
520 case S_BLOCK32:
521 return GetOrCreateBlockDecl(id);
522 case S_INLINESITE:
523 return GetOrCreateInlinedFunctionDecl(id);
524 default:
525 return nullptr;
526 }
527 }
528
GetOrCreateDeclForUid(PdbSymUid uid)529 llvm::Optional<CompilerDecl> PdbAstBuilder::GetOrCreateDeclForUid(PdbSymUid uid) {
530 if (clang::Decl *result = TryGetDecl(uid))
531 return ToCompilerDecl(*result);
532
533 clang::Decl *result = nullptr;
534 switch (uid.kind()) {
535 case PdbSymUidKind::CompilandSym:
536 result = GetOrCreateSymbolForId(uid.asCompilandSym());
537 break;
538 case PdbSymUidKind::Type: {
539 clang::QualType qt = GetOrCreateType(uid.asTypeSym());
540 if (qt.isNull())
541 return llvm::None;
542 if (auto *tag = qt->getAsTagDecl()) {
543 result = tag;
544 break;
545 }
546 return llvm::None;
547 }
548 default:
549 return llvm::None;
550 }
551
552 if (!result)
553 return llvm::None;
554 m_uid_to_decl[toOpaqueUid(uid)] = result;
555 return ToCompilerDecl(*result);
556 }
557
GetOrCreateDeclContextForUid(PdbSymUid uid)558 clang::DeclContext *PdbAstBuilder::GetOrCreateDeclContextForUid(PdbSymUid uid) {
559 if (uid.kind() == PdbSymUidKind::CompilandSym) {
560 if (uid.asCompilandSym().offset == 0)
561 return FromCompilerDeclContext(GetTranslationUnitDecl());
562 }
563 auto option = GetOrCreateDeclForUid(uid);
564 if (!option)
565 return nullptr;
566 clang::Decl *decl = FromCompilerDecl(*option);
567 if (!decl)
568 return nullptr;
569
570 return clang::Decl::castToDeclContext(decl);
571 }
572
573 std::pair<clang::DeclContext *, std::string>
CreateDeclInfoForUndecoratedName(llvm::StringRef name)574 PdbAstBuilder::CreateDeclInfoForUndecoratedName(llvm::StringRef name) {
575 MSVCUndecoratedNameParser parser(name);
576 llvm::ArrayRef<MSVCUndecoratedNameSpecifier> specs = parser.GetSpecifiers();
577
578 auto context = FromCompilerDeclContext(GetTranslationUnitDecl());
579
580 llvm::StringRef uname = specs.back().GetBaseName();
581 specs = specs.drop_back();
582 if (specs.empty())
583 return {context, std::string(name)};
584
585 llvm::StringRef scope_name = specs.back().GetFullName();
586
587 // It might be a class name, try that first.
588 std::vector<TypeIndex> types = m_index.tpi().findRecordsByName(scope_name);
589 while (!types.empty()) {
590 clang::QualType qt = GetOrCreateType(types.back());
591 if (qt.isNull())
592 continue;
593 clang::TagDecl *tag = qt->getAsTagDecl();
594 if (tag)
595 return {clang::TagDecl::castToDeclContext(tag), std::string(uname)};
596 types.pop_back();
597 }
598
599 // If that fails, treat it as a series of namespaces.
600 for (const MSVCUndecoratedNameSpecifier &spec : specs) {
601 std::string ns_name = spec.GetBaseName().str();
602 context = GetOrCreateNamespaceDecl(ns_name.c_str(), *context);
603 }
604 return {context, std::string(uname)};
605 }
606
607 clang::DeclContext *
GetParentDeclContextForSymbol(const CVSymbol & sym)608 PdbAstBuilder::GetParentDeclContextForSymbol(const CVSymbol &sym) {
609 if (!SymbolHasAddress(sym))
610 return CreateDeclInfoForUndecoratedName(getSymbolName(sym)).first;
611 SegmentOffset addr = GetSegmentAndOffset(sym);
612 llvm::Optional<PublicSym32> pub =
613 FindPublicSym(addr, m_index.symrecords(), m_index.publics());
614 if (!pub)
615 return CreateDeclInfoForUndecoratedName(getSymbolName(sym)).first;
616
617 llvm::ms_demangle::Demangler demangler;
618 StringView name{pub->Name.begin(), pub->Name.size()};
619 llvm::ms_demangle::SymbolNode *node = demangler.parse(name);
620 if (!node)
621 return FromCompilerDeclContext(GetTranslationUnitDecl());
622 llvm::ArrayRef<llvm::ms_demangle::Node *> name_components{
623 node->Name->Components->Nodes, node->Name->Components->Count - 1};
624
625 if (!name_components.empty()) {
626 // Render the current list of scope nodes as a fully qualified name, and
627 // look it up in the debug info as a type name. If we find something,
628 // this is a type (which may itself be prefixed by a namespace). If we
629 // don't, this is a list of namespaces.
630 std::string qname = RenderScopeList(name_components);
631 std::vector<TypeIndex> matches = m_index.tpi().findRecordsByName(qname);
632 while (!matches.empty()) {
633 clang::QualType qt = GetOrCreateType(matches.back());
634 if (qt.isNull())
635 continue;
636 clang::TagDecl *tag = qt->getAsTagDecl();
637 if (tag)
638 return clang::TagDecl::castToDeclContext(tag);
639 matches.pop_back();
640 }
641 }
642
643 // It's not a type. It must be a series of namespaces.
644 auto context = FromCompilerDeclContext(GetTranslationUnitDecl());
645 while (!name_components.empty()) {
646 std::string ns = name_components.front()->toString();
647 context = GetOrCreateNamespaceDecl(ns.c_str(), *context);
648 name_components = name_components.drop_front();
649 }
650 return context;
651 }
652
GetParentDeclContext(PdbSymUid uid)653 clang::DeclContext *PdbAstBuilder::GetParentDeclContext(PdbSymUid uid) {
654 // We must do this *without* calling GetOrCreate on the current uid, as
655 // that would be an infinite recursion.
656 switch (uid.kind()) {
657 case PdbSymUidKind::CompilandSym: {
658 llvm::Optional<PdbCompilandSymId> scope =
659 FindSymbolScope(m_index, uid.asCompilandSym());
660 if (scope)
661 return GetOrCreateDeclContextForUid(*scope);
662
663 CVSymbol sym = m_index.ReadSymbolRecord(uid.asCompilandSym());
664 return GetParentDeclContextForSymbol(sym);
665 }
666 case PdbSymUidKind::Type: {
667 // It could be a namespace, class, or global. We don't support nested
668 // functions yet. Anyway, we just need to consult the parent type map.
669 PdbTypeSymId type_id = uid.asTypeSym();
670 auto iter = m_parent_types.find(type_id.index);
671 if (iter == m_parent_types.end())
672 return FromCompilerDeclContext(GetTranslationUnitDecl());
673 return GetOrCreateDeclContextForUid(PdbTypeSymId(iter->second));
674 }
675 case PdbSymUidKind::FieldListMember:
676 // In this case the parent DeclContext is the one for the class that this
677 // member is inside of.
678 break;
679 case PdbSymUidKind::GlobalSym: {
680 // If this refers to a compiland symbol, just recurse in with that symbol.
681 // The only other possibilities are S_CONSTANT and S_UDT, in which case we
682 // need to parse the undecorated name to figure out the scope, then look
683 // that up in the TPI stream. If it's found, it's a type, othewrise it's
684 // a series of namespaces.
685 // FIXME: do this.
686 CVSymbol global = m_index.ReadSymbolRecord(uid.asGlobalSym());
687 switch (global.kind()) {
688 case SymbolKind::S_GDATA32:
689 case SymbolKind::S_LDATA32:
690 return GetParentDeclContextForSymbol(global);
691 case SymbolKind::S_PROCREF:
692 case SymbolKind::S_LPROCREF: {
693 ProcRefSym ref{global.kind()};
694 llvm::cantFail(
695 SymbolDeserializer::deserializeAs<ProcRefSym>(global, ref));
696 PdbCompilandSymId cu_sym_id{ref.modi(), ref.SymOffset};
697 return GetParentDeclContext(cu_sym_id);
698 }
699 case SymbolKind::S_CONSTANT:
700 case SymbolKind::S_UDT:
701 return CreateDeclInfoForUndecoratedName(getSymbolName(global)).first;
702 default:
703 break;
704 }
705 break;
706 }
707 default:
708 break;
709 }
710 return FromCompilerDeclContext(GetTranslationUnitDecl());
711 }
712
CompleteType(clang::QualType qt)713 bool PdbAstBuilder::CompleteType(clang::QualType qt) {
714 if (qt.isNull())
715 return false;
716 clang::TagDecl *tag = qt->getAsTagDecl();
717 if (qt->isArrayType()) {
718 const clang::Type *element_type = qt->getArrayElementTypeNoTypeQual();
719 tag = element_type->getAsTagDecl();
720 }
721 if (!tag)
722 return false;
723
724 return CompleteTagDecl(*tag);
725 }
726
CompleteTagDecl(clang::TagDecl & tag)727 bool PdbAstBuilder::CompleteTagDecl(clang::TagDecl &tag) {
728 // If this is not in our map, it's an error.
729 auto status_iter = m_decl_to_status.find(&tag);
730 lldbassert(status_iter != m_decl_to_status.end());
731
732 // If it's already complete, just return.
733 DeclStatus &status = status_iter->second;
734 if (status.resolved)
735 return true;
736
737 PdbTypeSymId type_id = PdbSymUid(status.uid).asTypeSym();
738
739 lldbassert(IsTagRecord(type_id, m_index.tpi()));
740
741 clang::QualType tag_qt = m_clang.getASTContext().getTypeDeclType(&tag);
742 TypeSystemClang::SetHasExternalStorage(tag_qt.getAsOpaquePtr(), false);
743
744 TypeIndex tag_ti = type_id.index;
745 CVType cvt = m_index.tpi().getType(tag_ti);
746 if (cvt.kind() == LF_MODIFIER)
747 tag_ti = LookThroughModifierRecord(cvt);
748
749 PdbTypeSymId best_ti = GetBestPossibleDecl(tag_ti, m_index.tpi());
750 cvt = m_index.tpi().getType(best_ti.index);
751 lldbassert(IsTagRecord(cvt));
752
753 if (IsForwardRefUdt(cvt)) {
754 // If we can't find a full decl for this forward ref anywhere in the debug
755 // info, then we have no way to complete it.
756 return false;
757 }
758
759 TypeIndex field_list_ti = GetFieldListIndex(cvt);
760 CVType field_list_cvt = m_index.tpi().getType(field_list_ti);
761 if (field_list_cvt.kind() != LF_FIELDLIST)
762 return false;
763 FieldListRecord field_list;
764 if (llvm::Error error = TypeDeserializer::deserializeAs<FieldListRecord>(
765 field_list_cvt, field_list))
766 llvm::consumeError(std::move(error));
767
768 // Visit all members of this class, then perform any finalization necessary
769 // to complete the class.
770 CompilerType ct = ToCompilerType(tag_qt);
771 UdtRecordCompleter completer(best_ti, ct, tag, *this, m_index,
772 m_cxx_record_map);
773 llvm::Error error =
774 llvm::codeview::visitMemberRecordStream(field_list.Data, completer);
775 completer.complete();
776
777 status.resolved = true;
778 if (error) {
779 llvm::consumeError(std::move(error));
780 return false;
781 }
782 return true;
783 }
784
CreateSimpleType(TypeIndex ti)785 clang::QualType PdbAstBuilder::CreateSimpleType(TypeIndex ti) {
786 if (ti == TypeIndex::NullptrT())
787 return GetBasicType(lldb::eBasicTypeNullPtr);
788
789 if (ti.getSimpleMode() != SimpleTypeMode::Direct) {
790 clang::QualType direct_type = GetOrCreateType(ti.makeDirect());
791 if (direct_type.isNull())
792 return {};
793 return m_clang.getASTContext().getPointerType(direct_type);
794 }
795
796 if (ti.getSimpleKind() == SimpleTypeKind::NotTranslated)
797 return {};
798
799 lldb::BasicType bt = GetCompilerTypeForSimpleKind(ti.getSimpleKind());
800 if (bt == lldb::eBasicTypeInvalid)
801 return {};
802
803 return GetBasicType(bt);
804 }
805
CreatePointerType(const PointerRecord & pointer)806 clang::QualType PdbAstBuilder::CreatePointerType(const PointerRecord &pointer) {
807 clang::QualType pointee_type = GetOrCreateType(pointer.ReferentType);
808
809 // This can happen for pointers to LF_VTSHAPE records, which we shouldn't
810 // create in the AST.
811 if (pointee_type.isNull())
812 return {};
813
814 if (pointer.isPointerToMember()) {
815 MemberPointerInfo mpi = pointer.getMemberInfo();
816 clang::QualType class_type = GetOrCreateType(mpi.ContainingType);
817 if (class_type.isNull())
818 return {};
819 if (clang::TagDecl *tag = class_type->getAsTagDecl()) {
820 clang::MSInheritanceAttr::Spelling spelling;
821 switch (mpi.Representation) {
822 case llvm::codeview::PointerToMemberRepresentation::SingleInheritanceData:
823 case llvm::codeview::PointerToMemberRepresentation::
824 SingleInheritanceFunction:
825 spelling =
826 clang::MSInheritanceAttr::Spelling::Keyword_single_inheritance;
827 break;
828 case llvm::codeview::PointerToMemberRepresentation::
829 MultipleInheritanceData:
830 case llvm::codeview::PointerToMemberRepresentation::
831 MultipleInheritanceFunction:
832 spelling =
833 clang::MSInheritanceAttr::Spelling::Keyword_multiple_inheritance;
834 break;
835 case llvm::codeview::PointerToMemberRepresentation::
836 VirtualInheritanceData:
837 case llvm::codeview::PointerToMemberRepresentation::
838 VirtualInheritanceFunction:
839 spelling =
840 clang::MSInheritanceAttr::Spelling::Keyword_virtual_inheritance;
841 break;
842 case llvm::codeview::PointerToMemberRepresentation::Unknown:
843 spelling =
844 clang::MSInheritanceAttr::Spelling::Keyword_unspecified_inheritance;
845 break;
846 default:
847 spelling = clang::MSInheritanceAttr::Spelling::SpellingNotCalculated;
848 break;
849 }
850 tag->addAttr(clang::MSInheritanceAttr::CreateImplicit(
851 m_clang.getASTContext(), spelling));
852 }
853 return m_clang.getASTContext().getMemberPointerType(
854 pointee_type, class_type.getTypePtr());
855 }
856
857 clang::QualType pointer_type;
858 if (pointer.getMode() == PointerMode::LValueReference)
859 pointer_type = m_clang.getASTContext().getLValueReferenceType(pointee_type);
860 else if (pointer.getMode() == PointerMode::RValueReference)
861 pointer_type = m_clang.getASTContext().getRValueReferenceType(pointee_type);
862 else
863 pointer_type = m_clang.getASTContext().getPointerType(pointee_type);
864
865 if ((pointer.getOptions() & PointerOptions::Const) != PointerOptions::None)
866 pointer_type.addConst();
867
868 if ((pointer.getOptions() & PointerOptions::Volatile) != PointerOptions::None)
869 pointer_type.addVolatile();
870
871 if ((pointer.getOptions() & PointerOptions::Restrict) != PointerOptions::None)
872 pointer_type.addRestrict();
873
874 return pointer_type;
875 }
876
877 clang::QualType
CreateModifierType(const ModifierRecord & modifier)878 PdbAstBuilder::CreateModifierType(const ModifierRecord &modifier) {
879 clang::QualType unmodified_type = GetOrCreateType(modifier.ModifiedType);
880 if (unmodified_type.isNull())
881 return {};
882
883 if ((modifier.Modifiers & ModifierOptions::Const) != ModifierOptions::None)
884 unmodified_type.addConst();
885 if ((modifier.Modifiers & ModifierOptions::Volatile) != ModifierOptions::None)
886 unmodified_type.addVolatile();
887
888 return unmodified_type;
889 }
890
CreateRecordType(PdbTypeSymId id,const TagRecord & record)891 clang::QualType PdbAstBuilder::CreateRecordType(PdbTypeSymId id,
892 const TagRecord &record) {
893 clang::DeclContext *context = nullptr;
894 std::string uname;
895 std::tie(context, uname) = CreateDeclInfoForType(record, id.index);
896 if (!context)
897 return {};
898
899 clang::TagTypeKind ttk = TranslateUdtKind(record);
900 lldb::AccessType access =
901 (ttk == clang::TTK_Class) ? lldb::eAccessPrivate : lldb::eAccessPublic;
902
903 ClangASTMetadata metadata;
904 metadata.SetUserID(toOpaqueUid(id));
905 metadata.SetIsDynamicCXXType(false);
906
907 CompilerType ct =
908 m_clang.CreateRecordType(context, OptionalClangModuleID(), access, uname,
909 ttk, lldb::eLanguageTypeC_plus_plus, &metadata);
910
911 lldbassert(ct.IsValid());
912
913 TypeSystemClang::StartTagDeclarationDefinition(ct);
914
915 // Even if it's possible, don't complete it at this point. Just mark it
916 // forward resolved, and if/when LLDB needs the full definition, it can
917 // ask us.
918 clang::QualType result =
919 clang::QualType::getFromOpaquePtr(ct.GetOpaqueQualType());
920
921 TypeSystemClang::SetHasExternalStorage(result.getAsOpaquePtr(), true);
922 return result;
923 }
924
TryGetDecl(PdbSymUid uid) const925 clang::Decl *PdbAstBuilder::TryGetDecl(PdbSymUid uid) const {
926 auto iter = m_uid_to_decl.find(toOpaqueUid(uid));
927 if (iter != m_uid_to_decl.end())
928 return iter->second;
929 return nullptr;
930 }
931
932 clang::NamespaceDecl *
GetOrCreateNamespaceDecl(const char * name,clang::DeclContext & context)933 PdbAstBuilder::GetOrCreateNamespaceDecl(const char *name,
934 clang::DeclContext &context) {
935 return m_clang.GetUniqueNamespaceDeclaration(
936 IsAnonymousNamespaceName(name) ? nullptr : name, &context,
937 OptionalClangModuleID());
938 }
939
940 clang::BlockDecl *
GetOrCreateBlockDecl(PdbCompilandSymId block_id)941 PdbAstBuilder::GetOrCreateBlockDecl(PdbCompilandSymId block_id) {
942 if (clang::Decl *decl = TryGetDecl(block_id))
943 return llvm::dyn_cast<clang::BlockDecl>(decl);
944
945 clang::DeclContext *scope = GetParentDeclContext(block_id);
946
947 clang::BlockDecl *block_decl =
948 m_clang.CreateBlockDeclaration(scope, OptionalClangModuleID());
949 m_uid_to_decl.insert({toOpaqueUid(block_id), block_decl});
950
951 DeclStatus status;
952 status.resolved = true;
953 status.uid = toOpaqueUid(block_id);
954 m_decl_to_status.insert({block_decl, status});
955
956 return block_decl;
957 }
958
CreateVariableDecl(PdbSymUid uid,CVSymbol sym,clang::DeclContext & scope)959 clang::VarDecl *PdbAstBuilder::CreateVariableDecl(PdbSymUid uid, CVSymbol sym,
960 clang::DeclContext &scope) {
961 VariableInfo var_info = GetVariableNameInfo(sym);
962 clang::QualType qt = GetOrCreateType(var_info.type);
963 if (qt.isNull())
964 return nullptr;
965
966 clang::VarDecl *var_decl = m_clang.CreateVariableDeclaration(
967 &scope, OptionalClangModuleID(), var_info.name.str().c_str(), qt);
968
969 m_uid_to_decl[toOpaqueUid(uid)] = var_decl;
970 DeclStatus status;
971 status.resolved = true;
972 status.uid = toOpaqueUid(uid);
973 m_decl_to_status.insert({var_decl, status});
974 return var_decl;
975 }
976
977 clang::VarDecl *
GetOrCreateVariableDecl(PdbCompilandSymId scope_id,PdbCompilandSymId var_id)978 PdbAstBuilder::GetOrCreateVariableDecl(PdbCompilandSymId scope_id,
979 PdbCompilandSymId var_id) {
980 if (clang::Decl *decl = TryGetDecl(var_id))
981 return llvm::dyn_cast<clang::VarDecl>(decl);
982
983 clang::DeclContext *scope = GetOrCreateDeclContextForUid(scope_id);
984 if (!scope)
985 return nullptr;
986
987 CVSymbol sym = m_index.ReadSymbolRecord(var_id);
988 return CreateVariableDecl(PdbSymUid(var_id), sym, *scope);
989 }
990
GetOrCreateVariableDecl(PdbGlobalSymId var_id)991 clang::VarDecl *PdbAstBuilder::GetOrCreateVariableDecl(PdbGlobalSymId var_id) {
992 if (clang::Decl *decl = TryGetDecl(var_id))
993 return llvm::dyn_cast<clang::VarDecl>(decl);
994
995 CVSymbol sym = m_index.ReadSymbolRecord(var_id);
996 auto context = FromCompilerDeclContext(GetTranslationUnitDecl());
997 return CreateVariableDecl(PdbSymUid(var_id), sym, *context);
998 }
999
1000 clang::TypedefNameDecl *
GetOrCreateTypedefDecl(PdbGlobalSymId id)1001 PdbAstBuilder::GetOrCreateTypedefDecl(PdbGlobalSymId id) {
1002 if (clang::Decl *decl = TryGetDecl(id))
1003 return llvm::dyn_cast<clang::TypedefNameDecl>(decl);
1004
1005 CVSymbol sym = m_index.ReadSymbolRecord(id);
1006 lldbassert(sym.kind() == S_UDT);
1007 UDTSym udt = llvm::cantFail(SymbolDeserializer::deserializeAs<UDTSym>(sym));
1008
1009 clang::DeclContext *scope = GetParentDeclContext(id);
1010
1011 PdbTypeSymId real_type_id{udt.Type, false};
1012 clang::QualType qt = GetOrCreateType(real_type_id);
1013 if (qt.isNull())
1014 return nullptr;
1015
1016 std::string uname = std::string(DropNameScope(udt.Name));
1017
1018 CompilerType ct = ToCompilerType(qt).CreateTypedef(
1019 uname.c_str(), ToCompilerDeclContext(*scope), 0);
1020 clang::TypedefNameDecl *tnd = m_clang.GetAsTypedefDecl(ct);
1021 DeclStatus status;
1022 status.resolved = true;
1023 status.uid = toOpaqueUid(id);
1024 m_decl_to_status.insert({tnd, status});
1025 return tnd;
1026 }
1027
GetBasicType(lldb::BasicType type)1028 clang::QualType PdbAstBuilder::GetBasicType(lldb::BasicType type) {
1029 CompilerType ct = m_clang.GetBasicType(type);
1030 return clang::QualType::getFromOpaquePtr(ct.GetOpaqueQualType());
1031 }
1032
CreateType(PdbTypeSymId type)1033 clang::QualType PdbAstBuilder::CreateType(PdbTypeSymId type) {
1034 if (type.index.isSimple())
1035 return CreateSimpleType(type.index);
1036
1037 CVType cvt = m_index.tpi().getType(type.index);
1038
1039 if (cvt.kind() == LF_MODIFIER) {
1040 ModifierRecord modifier;
1041 llvm::cantFail(
1042 TypeDeserializer::deserializeAs<ModifierRecord>(cvt, modifier));
1043 return CreateModifierType(modifier);
1044 }
1045
1046 if (cvt.kind() == LF_POINTER) {
1047 PointerRecord pointer;
1048 llvm::cantFail(
1049 TypeDeserializer::deserializeAs<PointerRecord>(cvt, pointer));
1050 return CreatePointerType(pointer);
1051 }
1052
1053 if (IsTagRecord(cvt)) {
1054 CVTagRecord tag = CVTagRecord::create(cvt);
1055 if (tag.kind() == CVTagRecord::Union)
1056 return CreateRecordType(type.index, tag.asUnion());
1057 if (tag.kind() == CVTagRecord::Enum)
1058 return CreateEnumType(type.index, tag.asEnum());
1059 return CreateRecordType(type.index, tag.asClass());
1060 }
1061
1062 if (cvt.kind() == LF_ARRAY) {
1063 ArrayRecord ar;
1064 llvm::cantFail(TypeDeserializer::deserializeAs<ArrayRecord>(cvt, ar));
1065 return CreateArrayType(ar);
1066 }
1067
1068 if (cvt.kind() == LF_PROCEDURE) {
1069 ProcedureRecord pr;
1070 llvm::cantFail(TypeDeserializer::deserializeAs<ProcedureRecord>(cvt, pr));
1071 return CreateFunctionType(pr.ArgumentList, pr.ReturnType, pr.CallConv);
1072 }
1073
1074 if (cvt.kind() == LF_MFUNCTION) {
1075 MemberFunctionRecord mfr;
1076 llvm::cantFail(
1077 TypeDeserializer::deserializeAs<MemberFunctionRecord>(cvt, mfr));
1078 return CreateFunctionType(mfr.ArgumentList, mfr.ReturnType, mfr.CallConv);
1079 }
1080
1081 return {};
1082 }
1083
GetOrCreateType(PdbTypeSymId type)1084 clang::QualType PdbAstBuilder::GetOrCreateType(PdbTypeSymId type) {
1085 if (type.index.isNoneType())
1086 return {};
1087
1088 lldb::user_id_t uid = toOpaqueUid(type);
1089 auto iter = m_uid_to_type.find(uid);
1090 if (iter != m_uid_to_type.end())
1091 return iter->second;
1092
1093 PdbTypeSymId best_type = GetBestPossibleDecl(type, m_index.tpi());
1094
1095 clang::QualType qt;
1096 if (best_type.index != type.index) {
1097 // This is a forward decl. Call GetOrCreate on the full decl, then map the
1098 // forward decl id to the full decl QualType.
1099 clang::QualType qt = GetOrCreateType(best_type);
1100 if (qt.isNull())
1101 return {};
1102 m_uid_to_type[toOpaqueUid(type)] = qt;
1103 return qt;
1104 }
1105
1106 // This is either a full decl, or a forward decl with no matching full decl
1107 // in the debug info.
1108 qt = CreateType(type);
1109 if (qt.isNull())
1110 return {};
1111
1112 m_uid_to_type[toOpaqueUid(type)] = qt;
1113 if (IsTagRecord(type, m_index.tpi())) {
1114 clang::TagDecl *tag = qt->getAsTagDecl();
1115 lldbassert(m_decl_to_status.count(tag) == 0);
1116
1117 DeclStatus &status = m_decl_to_status[tag];
1118 status.uid = uid;
1119 status.resolved = false;
1120 }
1121 return qt;
1122 }
1123
1124 clang::FunctionDecl *
CreateFunctionDecl(PdbCompilandSymId func_id,llvm::StringRef func_name,TypeIndex func_ti,CompilerType func_ct,uint32_t param_count,clang::StorageClass func_storage,bool is_inline,clang::DeclContext * parent)1125 PdbAstBuilder::CreateFunctionDecl(PdbCompilandSymId func_id,
1126 llvm::StringRef func_name, TypeIndex func_ti,
1127 CompilerType func_ct, uint32_t param_count,
1128 clang::StorageClass func_storage,
1129 bool is_inline, clang::DeclContext *parent) {
1130 clang::FunctionDecl *function_decl = nullptr;
1131 if (parent->isRecord()) {
1132 clang::QualType parent_qt = llvm::cast<clang::TypeDecl>(parent)
1133 ->getTypeForDecl()
1134 ->getCanonicalTypeInternal();
1135 lldb::opaque_compiler_type_t parent_opaque_ty =
1136 ToCompilerType(parent_qt).GetOpaqueQualType();
1137 // FIXME: Remove this workaround.
1138 auto iter = m_cxx_record_map.find(parent_opaque_ty);
1139 if (iter != m_cxx_record_map.end()) {
1140 if (iter->getSecond().contains({func_name, func_ct})) {
1141 return nullptr;
1142 }
1143 }
1144
1145 CVType cvt = m_index.tpi().getType(func_ti);
1146 MemberFunctionRecord func_record(static_cast<TypeRecordKind>(cvt.kind()));
1147 llvm::cantFail(TypeDeserializer::deserializeAs<MemberFunctionRecord>(
1148 cvt, func_record));
1149 TypeIndex class_index = func_record.getClassType();
1150
1151 CVType parent_cvt = m_index.tpi().getType(class_index);
1152 TagRecord tag_record = CVTagRecord::create(parent_cvt).asTag();
1153 // If it's a forward reference, try to get the real TypeIndex.
1154 if (tag_record.isForwardRef()) {
1155 llvm::Expected<TypeIndex> eti =
1156 m_index.tpi().findFullDeclForForwardRef(class_index);
1157 if (eti) {
1158 tag_record = CVTagRecord::create(m_index.tpi().getType(*eti)).asTag();
1159 }
1160 }
1161 if (!tag_record.FieldList.isSimple()) {
1162 CVType field_list_cvt = m_index.tpi().getType(tag_record.FieldList);
1163 FieldListRecord field_list;
1164 if (llvm::Error error = TypeDeserializer::deserializeAs<FieldListRecord>(
1165 field_list_cvt, field_list))
1166 llvm::consumeError(std::move(error));
1167 CreateMethodDecl process(m_index, m_clang, func_ti, function_decl,
1168 parent_opaque_ty, func_name, func_ct);
1169 if (llvm::Error err = visitMemberRecordStream(field_list.Data, process))
1170 llvm::consumeError(std::move(err));
1171 }
1172
1173 if (!function_decl) {
1174 function_decl = m_clang.AddMethodToCXXRecordType(
1175 parent_opaque_ty, func_name,
1176 /*mangled_name=*/nullptr, func_ct,
1177 /*access=*/lldb::AccessType::eAccessPublic,
1178 /*is_virtual=*/false, /*is_static=*/false,
1179 /*is_inline=*/false, /*is_explicit=*/false,
1180 /*is_attr_used=*/false, /*is_artificial=*/false);
1181 }
1182 m_cxx_record_map[parent_opaque_ty].insert({func_name, func_ct});
1183 } else {
1184 function_decl = m_clang.CreateFunctionDeclaration(
1185 parent, OptionalClangModuleID(), func_name, func_ct, func_storage,
1186 is_inline);
1187 CreateFunctionParameters(func_id, *function_decl, param_count);
1188 }
1189 return function_decl;
1190 }
1191
1192 clang::FunctionDecl *
GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id)1193 PdbAstBuilder::GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id) {
1194 CompilandIndexItem *cii =
1195 m_index.compilands().GetCompiland(inlinesite_id.modi);
1196 CVSymbol sym = cii->m_debug_stream.readSymbolAtOffset(inlinesite_id.offset);
1197 InlineSiteSym inline_site(static_cast<SymbolRecordKind>(sym.kind()));
1198 cantFail(SymbolDeserializer::deserializeAs<InlineSiteSym>(sym, inline_site));
1199
1200 // Inlinee is the id index to the function id record that is inlined.
1201 PdbTypeSymId func_id(inline_site.Inlinee, true);
1202 // Look up the function decl by the id index to see if we have created a
1203 // function decl for a different inlinesite that refers the same function.
1204 if (clang::Decl *decl = TryGetDecl(func_id))
1205 return llvm::dyn_cast<clang::FunctionDecl>(decl);
1206 clang::FunctionDecl *function_decl =
1207 CreateFunctionDeclFromId(func_id, inlinesite_id);
1208 if (function_decl == nullptr)
1209 return nullptr;
1210
1211 // Use inline site id in m_decl_to_status because it's expected to be a
1212 // PdbCompilandSymId so that we can parse local variables info after it.
1213 uint64_t inlinesite_uid = toOpaqueUid(inlinesite_id);
1214 DeclStatus status;
1215 status.resolved = true;
1216 status.uid = inlinesite_uid;
1217 m_decl_to_status.insert({function_decl, status});
1218 // Use the index in IPI stream as uid in m_uid_to_decl, because index in IPI
1219 // stream are unique and there could be multiple inline sites (different ids)
1220 // referring the same inline function. This avoid creating multiple same
1221 // inline function delcs.
1222 uint64_t func_uid = toOpaqueUid(func_id);
1223 lldbassert(m_uid_to_decl.count(func_uid) == 0);
1224 m_uid_to_decl[func_uid] = function_decl;
1225 return function_decl;
1226 }
1227
1228 clang::FunctionDecl *
CreateFunctionDeclFromId(PdbTypeSymId func_tid,PdbCompilandSymId func_sid)1229 PdbAstBuilder::CreateFunctionDeclFromId(PdbTypeSymId func_tid,
1230 PdbCompilandSymId func_sid) {
1231 lldbassert(func_tid.is_ipi);
1232 CVType func_cvt = m_index.ipi().getType(func_tid.index);
1233 llvm::StringRef func_name;
1234 TypeIndex func_ti;
1235 clang::DeclContext *parent = nullptr;
1236 switch (func_cvt.kind()) {
1237 case LF_MFUNC_ID: {
1238 MemberFuncIdRecord mfr;
1239 cantFail(
1240 TypeDeserializer::deserializeAs<MemberFuncIdRecord>(func_cvt, mfr));
1241 func_name = mfr.getName();
1242 func_ti = mfr.getFunctionType();
1243 PdbTypeSymId class_type_id(mfr.ClassType, false);
1244 parent = GetOrCreateDeclContextForUid(class_type_id);
1245 break;
1246 }
1247 case LF_FUNC_ID: {
1248 FuncIdRecord fir;
1249 cantFail(TypeDeserializer::deserializeAs<FuncIdRecord>(func_cvt, fir));
1250 func_name = fir.getName();
1251 func_ti = fir.getFunctionType();
1252 parent = FromCompilerDeclContext(GetTranslationUnitDecl());
1253 if (!fir.ParentScope.isNoneType()) {
1254 CVType parent_cvt = m_index.ipi().getType(fir.ParentScope);
1255 if (parent_cvt.kind() == LF_STRING_ID) {
1256 StringIdRecord sir;
1257 cantFail(
1258 TypeDeserializer::deserializeAs<StringIdRecord>(parent_cvt, sir));
1259 parent = GetOrCreateNamespaceDecl(sir.String.data(), *parent);
1260 }
1261 }
1262 break;
1263 }
1264 default:
1265 lldbassert(false && "Invalid function id type!");
1266 }
1267 clang::QualType func_qt = GetOrCreateType(func_ti);
1268 if (func_qt.isNull())
1269 return nullptr;
1270 CompilerType func_ct = ToCompilerType(func_qt);
1271 uint32_t param_count =
1272 llvm::cast<clang::FunctionProtoType>(func_qt)->getNumParams();
1273 return CreateFunctionDecl(func_sid, func_name, func_ti, func_ct, param_count,
1274 clang::SC_None, true, parent);
1275 }
1276
1277 clang::FunctionDecl *
GetOrCreateFunctionDecl(PdbCompilandSymId func_id)1278 PdbAstBuilder::GetOrCreateFunctionDecl(PdbCompilandSymId func_id) {
1279 if (clang::Decl *decl = TryGetDecl(func_id))
1280 return llvm::dyn_cast<clang::FunctionDecl>(decl);
1281
1282 clang::DeclContext *parent = GetParentDeclContext(PdbSymUid(func_id));
1283 std::string context_name;
1284 if (clang::NamespaceDecl *ns = llvm::dyn_cast<clang::NamespaceDecl>(parent)) {
1285 context_name = ns->getQualifiedNameAsString();
1286 } else if (clang::TagDecl *tag = llvm::dyn_cast<clang::TagDecl>(parent)) {
1287 context_name = tag->getQualifiedNameAsString();
1288 }
1289
1290 CVSymbol cvs = m_index.ReadSymbolRecord(func_id);
1291 ProcSym proc(static_cast<SymbolRecordKind>(cvs.kind()));
1292 llvm::cantFail(SymbolDeserializer::deserializeAs<ProcSym>(cvs, proc));
1293
1294 PdbTypeSymId type_id(proc.FunctionType);
1295 clang::QualType qt = GetOrCreateType(type_id);
1296 if (qt.isNull())
1297 return nullptr;
1298
1299 clang::StorageClass storage = clang::SC_None;
1300 if (proc.Kind == SymbolRecordKind::ProcSym)
1301 storage = clang::SC_Static;
1302
1303 const clang::FunctionProtoType *func_type =
1304 llvm::dyn_cast<clang::FunctionProtoType>(qt);
1305
1306 CompilerType func_ct = ToCompilerType(qt);
1307
1308 llvm::StringRef proc_name = proc.Name;
1309 proc_name.consume_front(context_name);
1310 proc_name.consume_front("::");
1311
1312 clang::FunctionDecl *function_decl =
1313 CreateFunctionDecl(func_id, proc_name, proc.FunctionType, func_ct,
1314 func_type->getNumParams(), storage, false, parent);
1315 if (function_decl == nullptr)
1316 return nullptr;
1317
1318 lldbassert(m_uid_to_decl.count(toOpaqueUid(func_id)) == 0);
1319 m_uid_to_decl[toOpaqueUid(func_id)] = function_decl;
1320 DeclStatus status;
1321 status.resolved = true;
1322 status.uid = toOpaqueUid(func_id);
1323 m_decl_to_status.insert({function_decl, status});
1324
1325 return function_decl;
1326 }
1327
CreateFunctionParameters(PdbCompilandSymId func_id,clang::FunctionDecl & function_decl,uint32_t param_count)1328 void PdbAstBuilder::CreateFunctionParameters(PdbCompilandSymId func_id,
1329 clang::FunctionDecl &function_decl,
1330 uint32_t param_count) {
1331 CompilandIndexItem *cii = m_index.compilands().GetCompiland(func_id.modi);
1332 CVSymbolArray scope =
1333 cii->m_debug_stream.getSymbolArrayForScope(func_id.offset);
1334
1335 scope.drop_front();
1336 auto begin = scope.begin();
1337 auto end = scope.end();
1338 std::vector<clang::ParmVarDecl *> params;
1339 for (uint32_t i = 0; i < param_count && begin != end;) {
1340 uint32_t record_offset = begin.offset();
1341 CVSymbol sym = *begin++;
1342
1343 TypeIndex param_type;
1344 llvm::StringRef param_name;
1345 switch (sym.kind()) {
1346 case S_REGREL32: {
1347 RegRelativeSym reg(SymbolRecordKind::RegRelativeSym);
1348 cantFail(SymbolDeserializer::deserializeAs<RegRelativeSym>(sym, reg));
1349 param_type = reg.Type;
1350 param_name = reg.Name;
1351 break;
1352 }
1353 case S_REGISTER: {
1354 RegisterSym reg(SymbolRecordKind::RegisterSym);
1355 cantFail(SymbolDeserializer::deserializeAs<RegisterSym>(sym, reg));
1356 param_type = reg.Index;
1357 param_name = reg.Name;
1358 break;
1359 }
1360 case S_LOCAL: {
1361 LocalSym local(SymbolRecordKind::LocalSym);
1362 cantFail(SymbolDeserializer::deserializeAs<LocalSym>(sym, local));
1363 if ((local.Flags & LocalSymFlags::IsParameter) == LocalSymFlags::None)
1364 continue;
1365 param_type = local.Type;
1366 param_name = local.Name;
1367 break;
1368 }
1369 case S_BLOCK32:
1370 case S_INLINESITE:
1371 case S_INLINESITE2:
1372 // All parameters should come before the first block/inlinesite. If that
1373 // isn't the case, then perhaps this is bad debug info that doesn't
1374 // contain information about all parameters.
1375 return;
1376 default:
1377 continue;
1378 }
1379
1380 PdbCompilandSymId param_uid(func_id.modi, record_offset);
1381 clang::QualType qt = GetOrCreateType(param_type);
1382 if (qt.isNull())
1383 return;
1384
1385 CompilerType param_type_ct = m_clang.GetType(qt);
1386 clang::ParmVarDecl *param = m_clang.CreateParameterDeclaration(
1387 &function_decl, OptionalClangModuleID(), param_name.str().c_str(),
1388 param_type_ct, clang::SC_None, true);
1389 lldbassert(m_uid_to_decl.count(toOpaqueUid(param_uid)) == 0);
1390
1391 m_uid_to_decl[toOpaqueUid(param_uid)] = param;
1392 params.push_back(param);
1393 ++i;
1394 }
1395
1396 if (!params.empty() && params.size() == param_count)
1397 m_clang.SetFunctionParameters(&function_decl, params);
1398 }
1399
CreateEnumType(PdbTypeSymId id,const EnumRecord & er)1400 clang::QualType PdbAstBuilder::CreateEnumType(PdbTypeSymId id,
1401 const EnumRecord &er) {
1402 clang::DeclContext *decl_context = nullptr;
1403 std::string uname;
1404 std::tie(decl_context, uname) = CreateDeclInfoForType(er, id.index);
1405 if (!decl_context)
1406 return {};
1407
1408 clang::QualType underlying_type = GetOrCreateType(er.UnderlyingType);
1409 if (underlying_type.isNull())
1410 return {};
1411
1412 Declaration declaration;
1413 CompilerType enum_ct = m_clang.CreateEnumerationType(
1414 uname, decl_context, OptionalClangModuleID(), declaration,
1415 ToCompilerType(underlying_type), er.isScoped());
1416
1417 TypeSystemClang::StartTagDeclarationDefinition(enum_ct);
1418 TypeSystemClang::SetHasExternalStorage(enum_ct.GetOpaqueQualType(), true);
1419
1420 return clang::QualType::getFromOpaquePtr(enum_ct.GetOpaqueQualType());
1421 }
1422
CreateArrayType(const ArrayRecord & ar)1423 clang::QualType PdbAstBuilder::CreateArrayType(const ArrayRecord &ar) {
1424 clang::QualType element_type = GetOrCreateType(ar.ElementType);
1425
1426 uint64_t element_size = GetSizeOfType({ar.ElementType}, m_index.tpi());
1427 if (element_type.isNull() || element_size == 0)
1428 return {};
1429 uint64_t element_count = ar.Size / element_size;
1430
1431 CompilerType array_ct = m_clang.CreateArrayType(ToCompilerType(element_type),
1432 element_count, false);
1433 return clang::QualType::getFromOpaquePtr(array_ct.GetOpaqueQualType());
1434 }
1435
CreateFunctionType(TypeIndex args_type_idx,TypeIndex return_type_idx,llvm::codeview::CallingConvention calling_convention)1436 clang::QualType PdbAstBuilder::CreateFunctionType(
1437 TypeIndex args_type_idx, TypeIndex return_type_idx,
1438 llvm::codeview::CallingConvention calling_convention) {
1439 TpiStream &stream = m_index.tpi();
1440 CVType args_cvt = stream.getType(args_type_idx);
1441 ArgListRecord args;
1442 llvm::cantFail(
1443 TypeDeserializer::deserializeAs<ArgListRecord>(args_cvt, args));
1444
1445 llvm::ArrayRef<TypeIndex> arg_indices = llvm::makeArrayRef(args.ArgIndices);
1446 bool is_variadic = IsCVarArgsFunction(arg_indices);
1447 if (is_variadic)
1448 arg_indices = arg_indices.drop_back();
1449
1450 std::vector<CompilerType> arg_types;
1451 arg_types.reserve(arg_indices.size());
1452
1453 for (TypeIndex arg_index : arg_indices) {
1454 clang::QualType arg_type = GetOrCreateType(arg_index);
1455 if (arg_type.isNull())
1456 continue;
1457 arg_types.push_back(ToCompilerType(arg_type));
1458 }
1459
1460 clang::QualType return_type = GetOrCreateType(return_type_idx);
1461 if (return_type.isNull())
1462 return {};
1463
1464 llvm::Optional<clang::CallingConv> cc =
1465 TranslateCallingConvention(calling_convention);
1466 if (!cc)
1467 return {};
1468
1469 CompilerType return_ct = ToCompilerType(return_type);
1470 CompilerType func_sig_ast_type = m_clang.CreateFunctionType(
1471 return_ct, arg_types.data(), arg_types.size(), is_variadic, 0, *cc);
1472
1473 return clang::QualType::getFromOpaquePtr(
1474 func_sig_ast_type.GetOpaqueQualType());
1475 }
1476
isTagDecl(clang::DeclContext & context)1477 static bool isTagDecl(clang::DeclContext &context) {
1478 return llvm::isa<clang::TagDecl>(&context);
1479 }
1480
isFunctionDecl(clang::DeclContext & context)1481 static bool isFunctionDecl(clang::DeclContext &context) {
1482 return llvm::isa<clang::FunctionDecl>(&context);
1483 }
1484
isBlockDecl(clang::DeclContext & context)1485 static bool isBlockDecl(clang::DeclContext &context) {
1486 return llvm::isa<clang::BlockDecl>(&context);
1487 }
1488
ParseAllNamespacesPlusChildrenOf(llvm::Optional<llvm::StringRef> parent)1489 void PdbAstBuilder::ParseAllNamespacesPlusChildrenOf(
1490 llvm::Optional<llvm::StringRef> parent) {
1491 TypeIndex ti{m_index.tpi().TypeIndexBegin()};
1492 for (const CVType &cvt : m_index.tpi().typeArray()) {
1493 PdbTypeSymId tid{ti};
1494 ++ti;
1495
1496 if (!IsTagRecord(cvt))
1497 continue;
1498
1499 CVTagRecord tag = CVTagRecord::create(cvt);
1500
1501 if (!parent) {
1502 clang::QualType qt = GetOrCreateType(tid);
1503 CompleteType(qt);
1504 continue;
1505 }
1506
1507 // Call CreateDeclInfoForType unconditionally so that the namespace info
1508 // gets created. But only call CreateRecordType if the namespace name
1509 // matches.
1510 clang::DeclContext *context = nullptr;
1511 std::string uname;
1512 std::tie(context, uname) = CreateDeclInfoForType(tag.asTag(), tid.index);
1513 if (!context || !context->isNamespace())
1514 continue;
1515
1516 clang::NamespaceDecl *ns = llvm::cast<clang::NamespaceDecl>(context);
1517 std::string actual_ns = ns->getQualifiedNameAsString();
1518 if (llvm::StringRef(actual_ns).startswith(*parent)) {
1519 clang::QualType qt = GetOrCreateType(tid);
1520 CompleteType(qt);
1521 continue;
1522 }
1523 }
1524
1525 uint32_t module_count = m_index.dbi().modules().getModuleCount();
1526 for (uint16_t modi = 0; modi < module_count; ++modi) {
1527 CompilandIndexItem &cii = m_index.compilands().GetOrCreateCompiland(modi);
1528 const CVSymbolArray &symbols = cii.m_debug_stream.getSymbolArray();
1529 auto iter = symbols.begin();
1530 while (iter != symbols.end()) {
1531 PdbCompilandSymId sym_id{modi, iter.offset()};
1532
1533 switch (iter->kind()) {
1534 case S_GPROC32:
1535 case S_LPROC32:
1536 GetOrCreateFunctionDecl(sym_id);
1537 iter = symbols.at(getScopeEndOffset(*iter));
1538 break;
1539 case S_GDATA32:
1540 case S_GTHREAD32:
1541 case S_LDATA32:
1542 case S_LTHREAD32:
1543 GetOrCreateVariableDecl(PdbCompilandSymId(modi, 0), sym_id);
1544 ++iter;
1545 break;
1546 default:
1547 ++iter;
1548 continue;
1549 }
1550 }
1551 }
1552 }
1553
skipFunctionParameters(clang::Decl & decl,const CVSymbolArray & symbols)1554 static CVSymbolArray skipFunctionParameters(clang::Decl &decl,
1555 const CVSymbolArray &symbols) {
1556 clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>(&decl);
1557 if (!func_decl)
1558 return symbols;
1559 unsigned int params = func_decl->getNumParams();
1560 if (params == 0)
1561 return symbols;
1562
1563 CVSymbolArray result = symbols;
1564
1565 while (!result.empty()) {
1566 if (params == 0)
1567 return result;
1568
1569 CVSymbol sym = *result.begin();
1570 result.drop_front();
1571
1572 if (!isLocalVariableType(sym.kind()))
1573 continue;
1574
1575 --params;
1576 }
1577 return result;
1578 }
1579
ParseBlockChildren(PdbCompilandSymId block_id)1580 void PdbAstBuilder::ParseBlockChildren(PdbCompilandSymId block_id) {
1581 CVSymbol sym = m_index.ReadSymbolRecord(block_id);
1582 lldbassert(sym.kind() == S_GPROC32 || sym.kind() == S_LPROC32 ||
1583 sym.kind() == S_BLOCK32 || sym.kind() == S_INLINESITE);
1584 CompilandIndexItem &cii =
1585 m_index.compilands().GetOrCreateCompiland(block_id.modi);
1586 CVSymbolArray symbols =
1587 cii.m_debug_stream.getSymbolArrayForScope(block_id.offset);
1588
1589 // Function parameters should already have been created when the function was
1590 // parsed.
1591 if (sym.kind() == S_GPROC32 || sym.kind() == S_LPROC32)
1592 symbols =
1593 skipFunctionParameters(*m_uid_to_decl[toOpaqueUid(block_id)], symbols);
1594
1595 symbols.drop_front();
1596 auto begin = symbols.begin();
1597 while (begin != symbols.end()) {
1598 PdbCompilandSymId child_sym_id(block_id.modi, begin.offset());
1599 GetOrCreateSymbolForId(child_sym_id);
1600 if (begin->kind() == S_BLOCK32 || begin->kind() == S_INLINESITE) {
1601 ParseBlockChildren(child_sym_id);
1602 begin = symbols.at(getScopeEndOffset(*begin));
1603 }
1604 ++begin;
1605 }
1606 }
1607
ParseDeclsForSimpleContext(clang::DeclContext & context)1608 void PdbAstBuilder::ParseDeclsForSimpleContext(clang::DeclContext &context) {
1609
1610 clang::Decl *decl = clang::Decl::castFromDeclContext(&context);
1611 lldbassert(decl);
1612
1613 auto iter = m_decl_to_status.find(decl);
1614 lldbassert(iter != m_decl_to_status.end());
1615
1616 if (auto *tag = llvm::dyn_cast<clang::TagDecl>(&context)) {
1617 CompleteTagDecl(*tag);
1618 return;
1619 }
1620
1621 if (isFunctionDecl(context) || isBlockDecl(context)) {
1622 PdbCompilandSymId block_id = PdbSymUid(iter->second.uid).asCompilandSym();
1623 ParseBlockChildren(block_id);
1624 }
1625 }
1626
ParseDeclsForContext(clang::DeclContext & context)1627 void PdbAstBuilder::ParseDeclsForContext(clang::DeclContext &context) {
1628 // Namespaces aren't explicitly represented in the debug info, and the only
1629 // way to parse them is to parse all type info, demangling every single type
1630 // and trying to reconstruct the DeclContext hierarchy this way. Since this
1631 // is an expensive operation, we have to special case it so that we do other
1632 // work (such as parsing the items that appear within the namespaces) at the
1633 // same time.
1634 if (context.isTranslationUnit()) {
1635 ParseAllNamespacesPlusChildrenOf(llvm::None);
1636 return;
1637 }
1638
1639 if (context.isNamespace()) {
1640 clang::NamespaceDecl &ns = *llvm::dyn_cast<clang::NamespaceDecl>(&context);
1641 std::string qname = ns.getQualifiedNameAsString();
1642 ParseAllNamespacesPlusChildrenOf(llvm::StringRef{qname});
1643 return;
1644 }
1645
1646 if (isTagDecl(context) || isFunctionDecl(context) || isBlockDecl(context)) {
1647 ParseDeclsForSimpleContext(context);
1648 return;
1649 }
1650 }
1651
ToCompilerDecl(clang::Decl & decl)1652 CompilerDecl PdbAstBuilder::ToCompilerDecl(clang::Decl &decl) {
1653 return m_clang.GetCompilerDecl(&decl);
1654 }
1655
ToCompilerType(clang::QualType qt)1656 CompilerType PdbAstBuilder::ToCompilerType(clang::QualType qt) {
1657 return {&m_clang, qt.getAsOpaquePtr()};
1658 }
1659
1660 CompilerDeclContext
ToCompilerDeclContext(clang::DeclContext & context)1661 PdbAstBuilder::ToCompilerDeclContext(clang::DeclContext &context) {
1662 return m_clang.CreateDeclContext(&context);
1663 }
1664
FromCompilerDecl(CompilerDecl decl)1665 clang::Decl * PdbAstBuilder::FromCompilerDecl(CompilerDecl decl) {
1666 return ClangUtil::GetDecl(decl);
1667 }
1668
1669 clang::DeclContext *
FromCompilerDeclContext(CompilerDeclContext context)1670 PdbAstBuilder::FromCompilerDeclContext(CompilerDeclContext context) {
1671 return static_cast<clang::DeclContext *>(context.GetOpaqueDeclContext());
1672 }
1673
Dump(Stream & stream)1674 void PdbAstBuilder::Dump(Stream &stream) {
1675 m_clang.Dump(stream.AsRawOstream());
1676 }
1677