forked from OSchip/llvm-project
[Symbol] Search symbols with name and type in a symbol file
Summary: This patch adds possibility of searching a public symbol with name and type in a symbol file. It is helpful when working with PE, because PE's symtabs contain only imported / exported symbols only. Such a search is required for e.g. evaluation of an expression that calls some function of the debuggee. Reviewers: zturner, asmith, labath, clayborg, espindola Reviewed By: clayborg Subscribers: emaste, arichardson, aleksandr.urakov, jingham, lldb-commits, stella.stamenova Tags: #lldb Differential Revision: https://reviews.llvm.org/D53368 llvm-svn: 345957
This commit is contained in:
parent
54bb316185
commit
15da7684db
|
@ -214,6 +214,8 @@ public:
|
|||
return {};
|
||||
}
|
||||
|
||||
virtual void AddSymbols(Symtab &symtab) {}
|
||||
|
||||
//------------------------------------------------------------------
|
||||
/// Notify the SymbolFile that the file addresses in the Sections
|
||||
/// for this module have been changed.
|
||||
|
|
|
@ -165,6 +165,8 @@ protected:
|
|||
// file)
|
||||
std::unique_ptr<SymbolFile> m_sym_file_ap; // A single symbol file. Subclasses
|
||||
// can add more of these if needed.
|
||||
Symtab *m_symtab; // Save a symtab once to not pass it through `AddSymbols` of
|
||||
// the symbol file each time when it is needed
|
||||
|
||||
private:
|
||||
//------------------------------------------------------------------
|
||||
|
|
|
@ -2876,8 +2876,6 @@ Symtab *ObjectFileELF::GetSymtab() {
|
|||
// do the section lookup next time.
|
||||
if (m_symtab_ap == nullptr)
|
||||
m_symtab_ap.reset(new Symtab(this));
|
||||
|
||||
m_symtab_ap->CalculateSymbolSizes();
|
||||
}
|
||||
|
||||
return m_symtab_ap.get();
|
||||
|
|
|
@ -124,7 +124,6 @@ Symtab *ObjectFileJIT::GetSymtab() {
|
|||
if (delegate_sp)
|
||||
delegate_sp->PopulateSymtab(this, *m_symtab_ap);
|
||||
// TODO: get symbols from delegate
|
||||
m_symtab_ap->Finalize();
|
||||
}
|
||||
}
|
||||
return m_symtab_ap.get();
|
||||
|
|
|
@ -1315,7 +1315,6 @@ Symtab *ObjectFileMachO::GetSymtab() {
|
|||
std::lock_guard<std::recursive_mutex> symtab_guard(
|
||||
m_symtab_ap->GetMutex());
|
||||
ParseSymtab();
|
||||
m_symtab_ap->Finalize();
|
||||
}
|
||||
}
|
||||
return m_symtab_ap.get();
|
||||
|
@ -4807,16 +4806,6 @@ size_t ObjectFileMachO::ParseSymtab() {
|
|||
}
|
||||
}
|
||||
|
||||
// StreamFile s(stdout, false);
|
||||
// s.Printf ("Symbol table before CalculateSymbolSizes():\n");
|
||||
// symtab->Dump(&s, NULL, eSortOrderNone);
|
||||
// Set symbol byte sizes correctly since mach-o nlist entries don't have
|
||||
// sizes
|
||||
symtab->CalculateSymbolSizes();
|
||||
|
||||
// s.Printf ("Symbol table after CalculateSymbolSizes():\n");
|
||||
// symtab->Dump(&s, NULL, eSortOrderNone);
|
||||
|
||||
return symtab->GetNumSymbols();
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -651,7 +651,6 @@ Symtab *ObjectFilePECOFF::GetSymtab() {
|
|||
symbols[i].SetDebug(true);
|
||||
}
|
||||
}
|
||||
m_symtab_ap->CalculateSymbolSizes();
|
||||
}
|
||||
}
|
||||
return m_symtab_ap.get();
|
||||
|
|
|
@ -1331,6 +1331,55 @@ void SymbolFilePDB::GetMangledNamesForFunction(
|
|||
const std::string &scope_qualified_name,
|
||||
std::vector<lldb_private::ConstString> &mangled_names) {}
|
||||
|
||||
void SymbolFilePDB::AddSymbols(lldb_private::Symtab &symtab) {
|
||||
std::set<lldb::addr_t> sym_addresses;
|
||||
for (size_t i = 0; i < symtab.GetNumSymbols(); i++)
|
||||
sym_addresses.insert(symtab.SymbolAtIndex(i)->GetFileAddress());
|
||||
|
||||
auto results = m_global_scope_up->findAllChildren<PDBSymbolPublicSymbol>();
|
||||
if (!results)
|
||||
return;
|
||||
|
||||
auto section_list = m_obj_file->GetSectionList();
|
||||
if (!section_list)
|
||||
return;
|
||||
|
||||
while (auto pub_symbol = results->getNext()) {
|
||||
auto section_idx = pub_symbol->getAddressSection() - 1;
|
||||
if (section_idx >= section_list->GetSize())
|
||||
continue;
|
||||
|
||||
auto section = section_list->GetSectionAtIndex(section_idx);
|
||||
if (!section)
|
||||
continue;
|
||||
|
||||
auto offset = pub_symbol->getAddressOffset();
|
||||
|
||||
auto file_addr = section->GetFileAddress() + offset;
|
||||
if (sym_addresses.find(file_addr) != sym_addresses.end())
|
||||
continue;
|
||||
sym_addresses.insert(file_addr);
|
||||
|
||||
auto size = pub_symbol->getLength();
|
||||
symtab.AddSymbol(
|
||||
Symbol(pub_symbol->getSymIndexId(), // symID
|
||||
pub_symbol->getName().c_str(), // name
|
||||
true, // name_is_mangled
|
||||
pub_symbol->isCode() ? eSymbolTypeCode : eSymbolTypeData, // type
|
||||
true, // external
|
||||
false, // is_debug
|
||||
false, // is_trampoline
|
||||
false, // is_artificial
|
||||
section, // section_sp
|
||||
offset, // value
|
||||
size, // size
|
||||
size != 0, // size_is_valid
|
||||
false, // contains_linker_annotations
|
||||
0 // flags
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t SymbolFilePDB::FindTypes(
|
||||
const lldb_private::SymbolContext &sc,
|
||||
const lldb_private::ConstString &name,
|
||||
|
|
|
@ -133,6 +133,8 @@ public:
|
|||
const std::string &scope_qualified_name,
|
||||
std::vector<lldb_private::ConstString> &mangled_names) override;
|
||||
|
||||
void AddSymbols(lldb_private::Symtab &symtab) override;
|
||||
|
||||
uint32_t
|
||||
FindTypes(const lldb_private::SymbolContext &sc,
|
||||
const lldb_private::ConstString &name,
|
||||
|
|
|
@ -61,7 +61,7 @@ SymbolVendor *SymbolVendor::FindPlugin(const lldb::ModuleSP &module_sp,
|
|||
//----------------------------------------------------------------------
|
||||
SymbolVendor::SymbolVendor(const lldb::ModuleSP &module_sp)
|
||||
: ModuleChild(module_sp), m_type_list(), m_compile_units(),
|
||||
m_sym_file_ap() {}
|
||||
m_sym_file_ap(), m_symtab() {}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Destructor
|
||||
|
@ -438,14 +438,26 @@ FileSpec SymbolVendor::GetMainFileSpec() const {
|
|||
|
||||
Symtab *SymbolVendor::GetSymtab() {
|
||||
ModuleSP module_sp(GetModule());
|
||||
if (module_sp) {
|
||||
ObjectFile *objfile = module_sp->GetObjectFile();
|
||||
if (objfile) {
|
||||
// Get symbol table from unified section list.
|
||||
return objfile->GetSymtab();
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
if (!module_sp)
|
||||
return nullptr;
|
||||
|
||||
std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
|
||||
|
||||
if (m_symtab)
|
||||
return m_symtab;
|
||||
|
||||
ObjectFile *objfile = module_sp->GetObjectFile();
|
||||
if (!objfile)
|
||||
return nullptr;
|
||||
|
||||
m_symtab = objfile->GetSymtab();
|
||||
if (m_symtab && m_sym_file_ap)
|
||||
m_sym_file_ap->AddSymbols(*m_symtab);
|
||||
|
||||
m_symtab->CalculateSymbolSizes();
|
||||
m_symtab->Finalize();
|
||||
|
||||
return m_symtab;
|
||||
}
|
||||
|
||||
void SymbolVendor::ClearSymtab() {
|
||||
|
|
|
@ -621,3 +621,20 @@ TEST_F(SymbolFilePDBTests, TestNullName) {
|
|||
EXPECT_EQ(0u, num_results);
|
||||
EXPECT_EQ(0u, results.GetSize());
|
||||
}
|
||||
|
||||
TEST_F(SymbolFilePDBTests, TestFindSymbolsWithNameAndType) {
|
||||
FileSpec fspec(m_pdb_test_exe.c_str(), false);
|
||||
ArchSpec aspec("i686-pc-windows");
|
||||
lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
|
||||
|
||||
SymbolContextList sc_list;
|
||||
EXPECT_EQ(1u,
|
||||
module->FindSymbolsWithNameAndType(ConstString("?foo@@YAHH@Z"),
|
||||
lldb::eSymbolTypeAny, sc_list));
|
||||
EXPECT_EQ(1u, sc_list.GetSize());
|
||||
|
||||
SymbolContext sc;
|
||||
EXPECT_TRUE(sc_list.GetContextAtIndex(0, sc));
|
||||
EXPECT_STREQ("int foo(int)",
|
||||
sc.GetFunctionName(Mangled::ePreferDemangled).AsCString());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue