[Lldb-commits] [lldb] d043ec8 - [lldb] Avoid trie prefix recompuation (NFC) (#200026)
via lldb-commits
lldb-commits at lists.llvm.org
Fri May 29 09:02:39 PDT 2026
Author: Dave Lee
Date: 2026-05-29T09:02:33-07:00
New Revision: d043ec846b79e30b8de88e601e8c9e36eee771eb
URL: https://github.com/llvm/llvm-project/commit/d043ec846b79e30b8de88e601e8c9e36eee771eb
DIFF: https://github.com/llvm/llvm-project/commit/d043ec846b79e30b8de88e601e8c9e36eee771eb.diff
LOG: [lldb] Avoid trie prefix recompuation (NFC) (#200026)
Avoid O(depth) string concatenations for every symbol in the Mach-O
exports trie.
This change uses a string to track the current trie prefix, instead of a
vector of substrings. Instead of pushing and popping on the vector, the
string is appended and truncated.
Assisted-by: claude
Added:
Modified:
lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 814eb58b7b9b8..9fe9af84ffcbc 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -1997,7 +1997,7 @@ struct TrieEntryWithOffset {
static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
const bool is_arm, addr_t text_seg_base_addr,
- std::vector<llvm::StringRef> &nameSlices,
+ std::string &prefix,
std::set<lldb::addr_t> &resolver_addresses,
std::vector<TrieEntryWithOffset> &reexports,
std::vector<TrieEntryWithOffset> &ext_symbols) {
@@ -2043,14 +2043,9 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
add_this_entry = true;
}
if (add_this_entry) {
- std::string name;
- if (!nameSlices.empty()) {
- for (auto name_slice : nameSlices)
- name.append(name_slice.data(), name_slice.size());
- }
- if (name.size() > 1) {
+ if (prefix.size() > 1) {
// Skip the leading '_'
- e.entry.name.SetCStringWithLength(name.c_str() + 1, name.size() - 1);
+ e.entry.name.SetString(llvm::StringRef(prefix).drop_front());
}
if (import_name) {
// Skip the leading '_'
@@ -2071,19 +2066,19 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
const uint8_t childrenCount = data.GetU8(&children_offset);
for (uint8_t i = 0; i < childrenCount; ++i) {
const char *cstr = data.GetCStr(&children_offset);
- if (cstr)
- nameSlices.push_back(llvm::StringRef(cstr));
- else
+ if (!cstr)
return false; // Corrupt data
+ const size_t prevSize = prefix.size();
+ prefix.append(cstr);
lldb::offset_t childNodeOffset = data.GetULEB128(&children_offset);
if (childNodeOffset) {
if (!ParseTrieEntries(data, childNodeOffset, is_arm, text_seg_base_addr,
- nameSlices, resolver_addresses, reexports,
+ prefix, resolver_addresses, reexports,
ext_symbols)) {
return false;
}
}
- nameSlices.pop_back();
+ prefix.resize(prevSize);
}
return true;
}
@@ -2659,9 +2654,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
lldb::addr_t text_segment_file_addr = LLDB_INVALID_ADDRESS;
if (text_segment_sp)
text_segment_file_addr = text_segment_sp->GetFileAddress();
- std::vector<llvm::StringRef> nameSlices;
- ParseTrieEntries(dyld_trie_data, 0, is_arm, text_segment_file_addr,
- nameSlices, resolver_addresses, reexport_trie_entries,
+ std::string prefix;
+ ParseTrieEntries(dyld_trie_data, 0, is_arm, text_segment_file_addr, prefix,
+ resolver_addresses, reexport_trie_entries,
external_sym_trie_entries);
}
More information about the lldb-commits
mailing list