Skip to content

[lldb][ELF] Move address class map into the symbol table #91603

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions lldb/include/lldb/Symbol/Symtab.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ class Symtab {
public:
typedef std::vector<uint32_t> IndexCollection;
typedef UniqueCStringMap<uint32_t> NameToIndexMap;
typedef std::map<lldb::addr_t, lldb_private::AddressClass>
FileAddressToAddressClassMap;

enum Debug {
eDebugNo, // Not a debug symbol
Expand Down Expand Up @@ -239,6 +241,16 @@ class Symtab {
}
/// \}

/// Set the address class for the given address.
void SetAddressClass(lldb::addr_t addr,
lldb_private::AddressClass addr_class);

/// Lookup the address class of the given address.
///
/// \return
/// The address' class, if it is known, otherwise AddressClass::eCode.
lldb_private::AddressClass GetAddressClass(lldb::addr_t addr);

protected:
typedef std::vector<Symbol> collection;
typedef collection::iterator iterator;
Expand Down Expand Up @@ -274,6 +286,9 @@ class Symtab {
collection m_symbols;
FileRangeToIndexMap m_file_addr_to_index;

/// The address class for each symbol in the elf file
FileAddressToAddressClassMap m_address_class_map;

/// Maps function names to symbol indices (grouped by FunctionNameTypes)
std::map<lldb::FunctionNameType, UniqueCStringMap<uint32_t>>
m_name_to_symbol_indices;
Expand Down
48 changes: 20 additions & 28 deletions lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -769,17 +769,7 @@ AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) {
if (res != AddressClass::eCode)
return res;

auto ub = m_address_class_map.upper_bound(file_addr);
if (ub == m_address_class_map.begin()) {
// No entry in the address class map before the address. Return default
// address class for an address in a code section.
return AddressClass::eCode;
}

// Move iterator to the address class entry preceding address
--ub;

return ub->second;
return symtab->GetAddressClass(file_addr);
}

size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
Expand Down Expand Up @@ -2213,18 +2203,18 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
switch (mapping_symbol) {
case 'a':
// $a[.<any>]* - marks an ARM instruction sequence
m_address_class_map[symbol.st_value] = AddressClass::eCode;
symtab->SetAddressClass(symbol.st_value, AddressClass::eCode);
break;
case 'b':
case 't':
// $b[.<any>]* - marks a THUMB BL instruction sequence
// $t[.<any>]* - marks a THUMB instruction sequence
m_address_class_map[symbol.st_value] =
AddressClass::eCodeAlternateISA;
symtab->SetAddressClass(symbol.st_value,
AddressClass::eCodeAlternateISA);
break;
case 'd':
// $d[.<any>]* - marks a data item sequence (e.g. lit pool)
m_address_class_map[symbol.st_value] = AddressClass::eData;
symtab->SetAddressClass(symbol.st_value, AddressClass::eData);
break;
}
}
Expand All @@ -2238,11 +2228,11 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
switch (mapping_symbol) {
case 'x':
// $x[.<any>]* - marks an A64 instruction sequence
m_address_class_map[symbol.st_value] = AddressClass::eCode;
symtab->SetAddressClass(symbol.st_value, AddressClass::eCode);
break;
case 'd':
// $d[.<any>]* - marks a data item sequence (e.g. lit pool)
m_address_class_map[symbol.st_value] = AddressClass::eData;
symtab->SetAddressClass(symbol.st_value, AddressClass::eData);
break;
}
}
Expand All @@ -2260,11 +2250,11 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
// conjunction with symbol.st_value to produce the final
// symbol_value that we store in the symtab.
symbol_value_offset = -1;
m_address_class_map[symbol.st_value ^ 1] =
AddressClass::eCodeAlternateISA;
symtab->SetAddressClass(symbol.st_value ^ 1,
AddressClass::eCodeAlternateISA);
} else {
// This address is ARM
m_address_class_map[symbol.st_value] = AddressClass::eCode;
symtab->SetAddressClass(symbol.st_value, AddressClass::eCode);
}
}
}
Expand All @@ -2285,17 +2275,19 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
*/
if (arch.IsMIPS()) {
if (IS_MICROMIPS(symbol.st_other))
m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
symtab->SetAddressClass(symbol.st_value,
AddressClass::eCodeAlternateISA);
else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) {
symbol.st_value = symbol.st_value & (~1ull);
m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
symtab->SetAddressClass(symbol.st_value,
AddressClass::eCodeAlternateISA);
} else {
if (symbol_type == eSymbolTypeCode)
m_address_class_map[symbol.st_value] = AddressClass::eCode;
symtab->SetAddressClass(symbol.st_value, AddressClass::eCode);
else if (symbol_type == eSymbolTypeData)
m_address_class_map[symbol.st_value] = AddressClass::eData;
symtab->SetAddressClass(symbol.st_value, AddressClass::eData);
else
m_address_class_map[symbol.st_value] = AddressClass::eUnknown;
symtab->SetAddressClass(symbol.st_value, AddressClass::eUnknown);
}
}
}
Expand Down Expand Up @@ -3060,10 +3052,10 @@ void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) {
if (arch.GetMachine() == llvm::Triple::arm &&
(entry_point_file_addr & 1)) {
symbol.GetAddressRef().SetOffset(entry_point_addr.GetOffset() ^ 1);
m_address_class_map[entry_point_file_addr ^ 1] =
AddressClass::eCodeAlternateISA;
lldb_symtab.SetAddressClass(entry_point_file_addr ^ 1,
AddressClass::eCodeAlternateISA);
} else {
m_address_class_map[entry_point_file_addr] = AddressClass::eCode;
lldb_symtab.SetAddressClass(entry_point_file_addr, AddressClass::eCode);
}
lldb_symtab.AddSymbol(symbol);
}
Expand Down
6 changes: 0 additions & 6 deletions lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,6 @@ class ObjectFileELF : public lldb_private::ObjectFile {
typedef DynamicSymbolColl::iterator DynamicSymbolCollIter;
typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter;

typedef std::map<lldb::addr_t, lldb_private::AddressClass>
FileAddressToAddressClassMap;

/// Version of this reader common to all plugins based on this class.
static const uint32_t m_plugin_version = 1;
static const uint32_t g_core_uuid_magic;
Expand Down Expand Up @@ -227,9 +224,6 @@ class ObjectFileELF : public lldb_private::ObjectFile {
/// The architecture detected from parsing elf file contents.
lldb_private::ArchSpec m_arch_spec;

/// The address class for each symbol in the elf file
FileAddressToAddressClassMap m_address_class_map;

/// Returns the index of the given section header.
size_t SectionIndex(const SectionHeaderCollIter &I);

Expand Down
19 changes: 19 additions & 0 deletions lldb/source/Symbol/Symtab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1372,3 +1372,22 @@ bool Symtab::LoadFromCache() {
SetWasLoadedFromCache();
return result;
}

void Symtab::SetAddressClass(lldb::addr_t addr,
lldb_private::AddressClass addr_class) {
m_address_class_map.insert_or_assign(addr, addr_class);
}

lldb_private::AddressClass Symtab::GetAddressClass(lldb::addr_t addr) {
auto ub = m_address_class_map.upper_bound(addr);
if (ub == m_address_class_map.begin()) {
// No entry in the address class map before the address. Return default
// address class for an address in a code section.
return AddressClass::eCode;
}

// Move iterator to the address class entry preceding address
--ub;

return ub->second;
}
Loading