diff options
Diffstat (limited to 'source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp')
| -rw-r--r-- | source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp | 143 | 
1 files changed, 73 insertions, 70 deletions
diff --git a/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index e27d4699ae2f..33b8da3b543b 100644 --- a/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -20,7 +20,6 @@  #include "lldb/Core/StreamBuffer.h"  #include "lldb/Core/StreamFile.h"  #include "lldb/Symbol/ClangASTContext.h" -#include "lldb/Symbol/ClangASTImporter.h"  #include "lldb/Symbol/ClangExternalASTSourceCommon.h"  #include "lldb/Symbol/ClangUtil.h"  #include "lldb/Symbol/CompileUnit.h" @@ -30,6 +29,7 @@  #include "lldb/Symbol/SymbolVendor.h"  #include "lldb/Symbol/Variable.h"  #include "lldb/Symbol/VariableList.h" +#include "lldb/Utility/Log.h"  #include "llvm/DebugInfo/CodeView/CVRecord.h"  #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" @@ -90,10 +90,10 @@ static std::unique_ptr<PDBFile> loadPDBFile(std::string PdbPath,    std::unique_ptr<llvm::MemoryBuffer> Buffer = std::move(*ErrorOrBuffer);    llvm::StringRef Path = Buffer->getBufferIdentifier(); -  auto Stream = llvm::make_unique<llvm::MemoryBufferByteStream>( +  auto Stream = std::make_unique<llvm::MemoryBufferByteStream>(        std::move(Buffer), llvm::support::little); -  auto File = llvm::make_unique<PDBFile>(Path, std::move(Stream), Allocator); +  auto File = std::make_unique<PDBFile>(Path, std::move(Stream), Allocator);    if (auto EC = File->parseFileHeaders()) {      llvm::consumeError(std::move(EC));      return nullptr; @@ -119,6 +119,8 @@ loadMatchingPDBFile(std::string exe_path, llvm::BumpPtrAllocator &allocator) {    }    OwningBinary<Binary> binary = std::move(*expected_binary); +  // TODO: Avoid opening the PE/COFF binary twice by reading this information +  // directly from the lldb_private::ObjectFile.    auto *obj = llvm::dyn_cast<llvm::object::COFFObjectFile>(binary.getBinary());    if (!obj)      return nullptr; @@ -264,27 +266,27 @@ const char *SymbolFileNativePDB::GetPluginDescriptionStatic() {    return "Microsoft PDB debug symbol cross-platform file reader.";  } -SymbolFile *SymbolFileNativePDB::CreateInstance(ObjectFile *obj_file) { -  return new SymbolFileNativePDB(obj_file); +SymbolFile *SymbolFileNativePDB::CreateInstance(ObjectFileSP objfile_sp) { +  return new SymbolFileNativePDB(std::move(objfile_sp));  } -SymbolFileNativePDB::SymbolFileNativePDB(ObjectFile *object_file) -    : SymbolFile(object_file) {} +SymbolFileNativePDB::SymbolFileNativePDB(ObjectFileSP objfile_sp) +    : SymbolFile(std::move(objfile_sp)) {}  SymbolFileNativePDB::~SymbolFileNativePDB() {}  uint32_t SymbolFileNativePDB::CalculateAbilities() {    uint32_t abilities = 0; -  if (!m_obj_file) +  if (!m_objfile_sp)      return 0;    if (!m_index) {      // Lazily load and match the PDB file, but only do this once.      std::unique_ptr<PDBFile> file_up = -        loadMatchingPDBFile(m_obj_file->GetFileSpec().GetPath(), m_allocator); +        loadMatchingPDBFile(m_objfile_sp->GetFileSpec().GetPath(), m_allocator);      if (!file_up) { -      auto module_sp = m_obj_file->GetModule(); +      auto module_sp = m_objfile_sp->GetModule();        if (!module_sp)          return 0;        // See if any symbol file is specified through `--symfile` option. @@ -317,19 +319,24 @@ uint32_t SymbolFileNativePDB::CalculateAbilities() {  }  void SymbolFileNativePDB::InitializeObject() { -  m_obj_load_address = m_obj_file->GetBaseAddress().GetFileAddress(); +  m_obj_load_address = m_objfile_sp->GetBaseAddress().GetFileAddress();    m_index->SetLoadAddress(m_obj_load_address);    m_index->ParseSectionContribs(); -  TypeSystem *ts = m_obj_file->GetModule()->GetTypeSystemForLanguage( +  auto ts_or_err = m_objfile_sp->GetModule()->GetTypeSystemForLanguage(        lldb::eLanguageTypeC_plus_plus); -  if (ts) -    ts->SetSymbolFile(this); - -  m_ast = llvm::make_unique<PdbAstBuilder>(*m_obj_file, *m_index); +  if (auto err = ts_or_err.takeError()) { +    LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_SYMBOLS), +                   std::move(err), "Failed to initialize"); +  } else { +    ts_or_err->SetSymbolFile(this); +    auto *clang = llvm::cast_or_null<ClangASTContext>(&ts_or_err.get()); +    lldbassert(clang); +    m_ast = std::make_unique<PdbAstBuilder>(*m_objfile_sp, *m_index, *clang); +  }  } -uint32_t SymbolFileNativePDB::GetNumCompileUnits() { +uint32_t SymbolFileNativePDB::CalculateNumCompileUnits() {    const DbiModuleList &modules = m_index->dbi().modules();    uint32_t count = modules.getModuleCount();    if (count == 0) @@ -430,11 +437,10 @@ SymbolFileNativePDB::CreateCompileUnit(const CompilandIndexItem &cci) {    FileSpec fs(source_file_name);    CompUnitSP cu_sp = -      std::make_shared<CompileUnit>(m_obj_file->GetModule(), nullptr, fs, +      std::make_shared<CompileUnit>(m_objfile_sp->GetModule(), nullptr, fs,                                      toOpaqueUid(cci.m_id), lang, optimized); -  m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex( -      cci.m_id.modi, cu_sp); +  SetCompileUnitAtIndex(cci.m_id.modi, cu_sp);    return cu_sp;  } @@ -730,7 +736,7 @@ TypeSP SymbolFileNativePDB::GetOrCreateType(PdbTypeSymId type_id) {    TypeSP type = CreateAndCacheType(type_id);    if (type) -    m_obj_file->GetModule()->GetTypeList()->Insert(type); +    GetTypeList().Insert(type);    return type;  } @@ -900,6 +906,7 @@ lldb::CompUnitSP SymbolFileNativePDB::ParseCompileUnitAtIndex(uint32_t index) {  }  lldb::LanguageType SymbolFileNativePDB::ParseLanguage(CompileUnit &comp_unit) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    PdbSymUid uid(comp_unit.GetID());    lldbassert(uid.kind() == PdbSymUidKind::Compiland); @@ -915,6 +922,7 @@ lldb::LanguageType SymbolFileNativePDB::ParseLanguage(CompileUnit &comp_unit) {  void SymbolFileNativePDB::AddSymbols(Symtab &symtab) { return; }  size_t SymbolFileNativePDB::ParseFunctions(CompileUnit &comp_unit) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    PdbSymUid uid{comp_unit.GetID()};    lldbassert(uid.kind() == PdbSymUidKind::Compiland);    uint16_t modi = uid.asCompiland().modi; @@ -948,6 +956,7 @@ static bool NeedsResolvedCompileUnit(uint32_t resolve_scope) {  uint32_t SymbolFileNativePDB::ResolveSymbolContext(      const Address &addr, SymbolContextItem resolve_scope, SymbolContext &sc) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    uint32_t resolved_flags = 0;    lldb::addr_t file_addr = addr.GetFileAddress(); @@ -1052,12 +1061,13 @@ bool SymbolFileNativePDB::ParseLineTable(CompileUnit &comp_unit) {    // all at once, even if all it really needs is line info for a specific    // function.  In the future it would be nice if it could set the sc.m_function    // member, and we could only get the line info for the function in question. +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    PdbSymUid cu_id(comp_unit.GetID());    lldbassert(cu_id.kind() == PdbSymUidKind::Compiland);    CompilandIndexItem *cci =        m_index->compilands().GetCompiland(cu_id.asCompiland().modi);    lldbassert(cci); -  auto line_table = llvm::make_unique<LineTable>(&comp_unit); +  auto line_table = std::make_unique<LineTable>(&comp_unit);    // This is basically a copy of the .debug$S subsections from all original COFF    // object files merged together with address relocations applied.  We are @@ -1130,6 +1140,7 @@ bool SymbolFileNativePDB::ParseDebugMacros(CompileUnit &comp_unit) {  bool SymbolFileNativePDB::ParseSupportFiles(CompileUnit &comp_unit,                                              FileSpecList &support_files) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    PdbSymUid cu_id(comp_unit.GetID());    lldbassert(cu_id.kind() == PdbSymUidKind::Compiland);    CompilandIndexItem *cci = @@ -1160,6 +1171,7 @@ bool SymbolFileNativePDB::ParseImportedModules(  }  size_t SymbolFileNativePDB::ParseBlocksRecursive(Function &func) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    GetOrCreateBlock(PdbSymUid(func.GetID()).asCompilandSym());    // FIXME: Parse child blocks    return 1; @@ -1167,9 +1179,10 @@ size_t SymbolFileNativePDB::ParseBlocksRecursive(Function &func) {  void SymbolFileNativePDB::DumpClangAST(Stream &s) { m_ast->Dump(s); } -uint32_t SymbolFileNativePDB::FindGlobalVariables( +void SymbolFileNativePDB::FindGlobalVariables(      ConstString name, const CompilerDeclContext *parent_decl_ctx,      uint32_t max_matches, VariableList &variables) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    using SymbolAndOffset = std::pair<uint32_t, llvm::codeview::CVSymbol>;    std::vector<SymbolAndOffset> results = m_index->globals().findRecordsByName( @@ -1191,16 +1204,16 @@ uint32_t SymbolFileNativePDB::FindGlobalVariables(        continue;      }    } -  return variables.GetSize();  } -uint32_t SymbolFileNativePDB::FindFunctions( +void SymbolFileNativePDB::FindFunctions(      ConstString name, const CompilerDeclContext *parent_decl_ctx, -    FunctionNameType name_type_mask, bool include_inlines, bool append, +    FunctionNameType name_type_mask, bool include_inlines,      SymbolContextList &sc_list) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    // For now we only support lookup by method name.    if (!(name_type_mask & eFunctionNameTypeMethod)) -    return 0; +    return;    using SymbolAndOffset = std::pair<uint32_t, llvm::codeview::CVSymbol>; @@ -1225,45 +1238,34 @@ uint32_t SymbolFileNativePDB::FindFunctions(      sc_list.Append(sc);    } - -  return sc_list.GetSize();  } -uint32_t SymbolFileNativePDB::FindFunctions(const RegularExpression ®ex, -                                            bool include_inlines, bool append, -                                            SymbolContextList &sc_list) { -  return 0; -} +void SymbolFileNativePDB::FindFunctions(const RegularExpression ®ex, +                                        bool include_inlines, +                                        SymbolContextList &sc_list) {} -uint32_t SymbolFileNativePDB::FindTypes( +void SymbolFileNativePDB::FindTypes(      ConstString name, const CompilerDeclContext *parent_decl_ctx, -    bool append, uint32_t max_matches, -    llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) { -  if (!append) -    types.Clear(); +    uint32_t max_matches, llvm::DenseSet<SymbolFile *> &searched_symbol_files, +    TypeMap &types) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    if (!name) -    return 0; +    return;    searched_symbol_files.clear();    searched_symbol_files.insert(this);    // There is an assumption 'name' is not a regex -  size_t match_count = FindTypesByName(name.GetStringRef(), max_matches, types); - -  return match_count; +  FindTypesByName(name.GetStringRef(), max_matches, types);  } -size_t -SymbolFileNativePDB::FindTypes(const std::vector<CompilerContext> &context, -                               bool append, TypeMap &types) { -  return 0; -} +void SymbolFileNativePDB::FindTypes(llvm::ArrayRef<CompilerContext> pattern, +                                    LanguageSet languages, TypeMap &types) {} -size_t SymbolFileNativePDB::FindTypesByName(llvm::StringRef name, -                                            uint32_t max_matches, -                                            TypeMap &types) { +void SymbolFileNativePDB::FindTypesByName(llvm::StringRef name, +                                          uint32_t max_matches, +                                          TypeMap &types) { -  size_t match_count = 0;    std::vector<TypeIndex> matches = m_index->tpi().findRecordsByName(name);    if (max_matches > 0 && max_matches < matches.size())      matches.resize(max_matches); @@ -1274,17 +1276,16 @@ size_t SymbolFileNativePDB::FindTypesByName(llvm::StringRef name,        continue;      types.Insert(type); -    ++match_count;    } -  return match_count;  }  size_t SymbolFileNativePDB::ParseTypes(CompileUnit &comp_unit) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    // Only do the full type scan the first time.    if (m_done_full_type_scan)      return 0; -  size_t old_count = m_obj_file->GetModule()->GetTypeList()->GetSize(); +  const size_t old_count = GetTypeList().GetSize();    LazyRandomTypeCollection &types = m_index->tpi().typeCollection();    // First process the entire TPI stream. @@ -1314,7 +1315,7 @@ size_t SymbolFileNativePDB::ParseTypes(CompileUnit &comp_unit) {        GetOrCreateTypedef(global);    } -  size_t new_count = m_obj_file->GetModule()->GetTypeList()->GetSize(); +  const size_t new_count = GetTypeList().GetSize();    m_done_full_type_scan = true; @@ -1476,6 +1477,7 @@ size_t SymbolFileNativePDB::ParseVariablesForBlock(PdbCompilandSymId block_id) {  }  size_t SymbolFileNativePDB::ParseVariablesForContext(const SymbolContext &sc) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    lldbassert(sc.function || sc.comp_unit);    VariableListSP variables; @@ -1506,9 +1508,10 @@ size_t SymbolFileNativePDB::ParseVariablesForContext(const SymbolContext &sc) {  }  CompilerDecl SymbolFileNativePDB::GetDeclForUID(lldb::user_id_t uid) { -  clang::Decl *decl = m_ast->GetOrCreateDeclForUid(PdbSymUid(uid)); - -  return m_ast->ToCompilerDecl(*decl); +  if (auto decl = m_ast->GetOrCreateDeclForUid(uid)) +    return decl.getValue(); +  else +    return CompilerDecl();  }  CompilerDeclContext @@ -1528,6 +1531,7 @@ SymbolFileNativePDB::GetDeclContextContainingUID(lldb::user_id_t uid) {  }  Type *SymbolFileNativePDB::ResolveTypeUID(lldb::user_id_t type_uid) { +  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());    auto iter = m_types.find(type_uid);    // lldb should not be passing us non-sensical type uids.  the only way it    // could have a type uid in the first place is if we handed it out, in which @@ -1561,11 +1565,9 @@ bool SymbolFileNativePDB::CompleteType(CompilerType &compiler_type) {    return m_ast->CompleteType(qt);  } -size_t SymbolFileNativePDB::GetTypes(lldb_private::SymbolContextScope *sc_scope, -                                     TypeClass type_mask, -                                     lldb_private::TypeList &type_list) { -  return 0; -} +void SymbolFileNativePDB::GetTypes(lldb_private::SymbolContextScope *sc_scope, +                                   TypeClass type_mask, +                                   lldb_private::TypeList &type_list) {}  CompilerDeclContext  SymbolFileNativePDB::FindNamespace(ConstString name, @@ -1573,13 +1575,14 @@ SymbolFileNativePDB::FindNamespace(ConstString name,    return {};  } -TypeSystem * +llvm::Expected<TypeSystem &>  SymbolFileNativePDB::GetTypeSystemForLanguage(lldb::LanguageType language) { -  auto type_system = -      m_obj_file->GetModule()->GetTypeSystemForLanguage(language); -  if (type_system) -    type_system->SetSymbolFile(this); -  return type_system; +  auto type_system_or_err = +      m_objfile_sp->GetModule()->GetTypeSystemForLanguage(language); +  if (type_system_or_err) { +    type_system_or_err->SetSymbolFile(this); +  } +  return type_system_or_err;  }  ConstString SymbolFileNativePDB::GetPluginName() {  | 
