summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/SymbolFile
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/SymbolFile')
-rw-r--r--lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp40
-rw-r--r--lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h4
-rw-r--r--lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp44
3 files changed, 27 insertions, 61 deletions
diff --git a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp
index 2c7a1a045d5..145587ac5be 100644
--- a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp
+++ b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp
@@ -921,26 +921,6 @@ PDBASTParser::GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol) {
decl_context, name.c_str(), type->GetForwardCompilerType(), storage,
func->hasInlineAttribute());
- std::vector<clang::ParmVarDecl *> params;
- if (std::unique_ptr<PDBSymbolTypeFunctionSig> sig = func->getSignature()) {
- if (std::unique_ptr<ConcreteSymbolEnumerator<PDBSymbolTypeFunctionArg>>
- arg_enum = sig->findAllChildren<PDBSymbolTypeFunctionArg>()) {
- while (std::unique_ptr<PDBSymbolTypeFunctionArg> arg =
- arg_enum->getNext()) {
- Type *arg_type = symbol_file->ResolveTypeUID(arg->getTypeId());
- if (!arg_type)
- continue;
-
- clang::ParmVarDecl *param = m_ast.CreateParameterDeclaration(
- nullptr, arg_type->GetForwardCompilerType(), clang::SC_None);
- if (param)
- params.push_back(param);
- }
- }
- }
- if (params.size())
- m_ast.SetFunctionParameters(decl, params.data(), params.size());
-
m_uid_to_decl[sym_id] = decl;
return decl;
@@ -1050,7 +1030,6 @@ clang::DeclContext *PDBASTParser::GetDeclContextContainingSymbol(
curr_context);
m_parent_to_namespaces[curr_context].insert(namespace_decl);
- m_namespaces.insert(namespace_decl);
curr_context = namespace_decl;
}
@@ -1086,23 +1065,18 @@ void PDBASTParser::ParseDeclsForDeclContext(
clang::NamespaceDecl *
PDBASTParser::FindNamespaceDecl(const clang::DeclContext *parent,
llvm::StringRef name) {
- NamespacesSet *set;
- if (parent) {
- auto pit = m_parent_to_namespaces.find(parent);
- if (pit == m_parent_to_namespaces.end())
- return nullptr;
+ if (!parent)
+ parent = m_ast.GetTranslationUnitDecl();
- set = &pit->second;
- } else {
- set = &m_namespaces;
- }
- assert(set);
+ auto it = m_parent_to_namespaces.find(parent);
+ if (it == m_parent_to_namespaces.end())
+ return nullptr;
- for (clang::NamespaceDecl *namespace_decl : *set)
+ for (auto namespace_decl : it->second)
if (namespace_decl->getName().equals(name))
return namespace_decl;
- for (clang::NamespaceDecl *namespace_decl : *set)
+ for (auto namespace_decl : it->second)
if (namespace_decl->isAnonymousNamespace())
return FindNamespaceDecl(namespace_decl, name);
diff --git a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h
index 02353870ab6..28de07fd8cd 100644
--- a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h
+++ b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h
@@ -69,8 +69,7 @@ private:
typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
CXXRecordDeclToUidMap;
typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
- typedef std::set<clang::NamespaceDecl *> NamespacesSet;
- typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet>
+ typedef llvm::DenseMap<clang::DeclContext *, std::set<clang::NamespaceDecl *>>
ParentToNamespacesMap;
typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
DeclContextToUidMap;
@@ -110,7 +109,6 @@ private:
CXXRecordDeclToUidMap m_forward_decl_to_uid;
UidToDeclMap m_uid_to_decl;
ParentToNamespacesMap m_parent_to_namespaces;
- NamespacesSet m_namespaces;
DeclContextToUidMap m_decl_context_to_uid;
};
diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp
index bdb5436d50d..da878a9c0d1 100644
--- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp
+++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp
@@ -286,10 +286,6 @@ lldb_private::Function *SymbolFilePDB::ParseCompileUnitFunctionForPDBFunc(
const PDBSymbolFunc &pdb_func, const lldb_private::SymbolContext &sc) {
lldbassert(sc.comp_unit && sc.module_sp.get());
- if (FunctionSP result =
- sc.comp_unit->FindFunctionByUID(pdb_func.getSymIndexId()))
- return result.get();
-
auto file_vm_addr = pdb_func.getVirtualAddress();
if (file_vm_addr == LLDB_INVALID_ADDRESS || file_vm_addr == 0)
return nullptr;
@@ -1051,6 +1047,8 @@ uint32_t SymbolFilePDB::FindGlobalVariables(
const lldb_private::ConstString &name,
const lldb_private::CompilerDeclContext *parent_decl_ctx,
uint32_t max_matches, lldb_private::VariableList &variables) {
+ if (!parent_decl_ctx)
+ parent_decl_ctx = m_tu_decl_ctx_up.get();
if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
return 0;
if (name.IsEmpty())
@@ -1080,8 +1078,9 @@ uint32_t SymbolFilePDB::FindGlobalVariables(
if (sc.comp_unit == nullptr)
continue;
- if (parent_decl_ctx && GetDeclContextContainingUID(
- result->getSymIndexId()) != *parent_decl_ctx)
+ auto actual_parent_decl_ctx =
+ GetDeclContextContainingUID(result->getSymIndexId());
+ if (actual_parent_decl_ctx != *parent_decl_ctx)
continue;
ParseVariables(sc, *pdb_data, &variables);
@@ -1270,28 +1269,20 @@ uint32_t SymbolFilePDB::FindFunctions(
CacheFunctionNames();
std::set<uint32_t> resolved_ids;
- auto ResolveFn = [this, &name, parent_decl_ctx, include_inlines, &sc_list,
- &resolved_ids](UniqueCStringMap<uint32_t> &Names) {
+ auto ResolveFn = [include_inlines, &name, &sc_list, &resolved_ids,
+ this](UniqueCStringMap<uint32_t> &Names) {
std::vector<uint32_t> ids;
- if (!Names.GetValues(name, ids))
- return;
-
- for (uint32_t id : ids) {
- if (resolved_ids.find(id) != resolved_ids.end())
- continue;
-
- if (parent_decl_ctx &&
- GetDeclContextContainingUID(id) != *parent_decl_ctx)
- continue;
-
- if (ResolveFunction(id, include_inlines, sc_list))
- resolved_ids.insert(id);
+ if (Names.GetValues(name, ids)) {
+ for (auto id : ids) {
+ if (resolved_ids.find(id) == resolved_ids.end()) {
+ if (ResolveFunction(id, include_inlines, sc_list))
+ resolved_ids.insert(id);
+ }
+ }
}
};
if (name_type_mask & eFunctionNameTypeFull) {
ResolveFn(m_func_full_names);
- ResolveFn(m_func_base_names);
- ResolveFn(m_func_method_names);
}
if (name_type_mask & eFunctionNameTypeBase) {
ResolveFn(m_func_base_names);
@@ -1479,6 +1470,8 @@ void SymbolFilePDB::FindTypesByName(
llvm::StringRef name,
const lldb_private::CompilerDeclContext *parent_decl_ctx,
uint32_t max_matches, lldb_private::TypeMap &types) {
+ if (!parent_decl_ctx)
+ parent_decl_ctx = m_tu_decl_ctx_up.get();
std::unique_ptr<IPDBEnumSymbols> results;
if (name.empty())
return;
@@ -1512,8 +1505,9 @@ void SymbolFilePDB::FindTypesByName(
if (!ResolveTypeUID(result->getSymIndexId()))
continue;
- if (parent_decl_ctx && GetDeclContextContainingUID(
- result->getSymIndexId()) != *parent_decl_ctx)
+ auto actual_parent_decl_ctx =
+ GetDeclContextContainingUID(result->getSymIndexId());
+ if (actual_parent_decl_ctx != *parent_decl_ctx)
continue;
auto iter = m_types.find(result->getSymIndexId());
OpenPOWER on IntegriCloud