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