[Lldb-commits] [lldb] [lldb] Add LineTable::{upper, lower}_bound (PR #127519)

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Tue Feb 18 02:37:57 PST 2025


================
@@ -185,6 +185,48 @@ bool LineTable::GetLineEntryAtIndex(uint32_t idx, LineEntry &line_entry) {
   return false;
 }
 
+uint32_t LineTable::lower_bound(const Address &so_addr) const {
+  if (so_addr.GetModule() != m_comp_unit->GetModule())
+    return GetSize();
+
+  Entry search_entry;
+  search_entry.file_addr = so_addr.GetFileAddress();
+  if (search_entry.file_addr == LLDB_INVALID_ADDRESS)
+    return GetSize();
+
+  // This is not a typo. upper_bound returns the first entry which definitely
+  // does not contain this address, which means the entry before it *might*
+  // contain it -- if it is not a termination entry.
+  auto pos =
+      llvm::upper_bound(m_entries, search_entry, Entry::EntryAddressLessThan);
+
+  if (pos != m_entries.begin() && !std::prev(pos)->is_terminal_entry)
+    --pos;
+
+  return std::distance(m_entries.begin(), pos);
----------------
labath wrote:

Mainly because all of the other LineTable API work with indexes. So like, I wouldn't actually have a way with the returned iterator. Part of the reason for that is that the internal LineTable representation does not match what gets returned by functions like `FindLineEntryByAddress`. That could be dealt with by building a fancy iterator class which converts the values on the fly, but that's a much larger change..

https://github.com/llvm/llvm-project/pull/127519


More information about the lldb-commits mailing list