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