ayermolo updated this revision to Diff 492842.
ayermolo marked an inline comment as done.
ayermolo added a comment.
addressed comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139957/new/
https://reviews.llvm.org/D139957
Files:
lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
lldb/test/Shell/SymbolFile/DWARF/x86/debug_rnglists-dwo.s
Index: lldb/test/Shell/SymbolFile/DWARF/x86/debug_rnglists-dwo.s
===================================================================
--- lldb/test/Shell/SymbolFile/DWARF/x86/debug_rnglists-dwo.s
+++ lldb/test/Shell/SymbolFile/DWARF/x86/debug_rnglists-dwo.s
@@ -4,9 +4,9 @@
# RUN: -o exit | FileCheck %s
# CHECK-LABEL: image lookup -v -s lookup_rnglists
-# CHECK: Function: id = {0x4000000000000028}, name = "rnglists", range = [0x0000000000000000-0x0000000000000003)
-# CHECK: Blocks: id = {0x4000000000000028}, range = [0x00000000-0x00000003)
-# CHECK-NEXT: id = {0x4000000000000037}, range = [0x00000001-0x00000002)
+# CHECK: Function: id = {0x2000000000000028}, name = "rnglists", range = [0x0000000000000000-0x0000000000000003)
+# CHECK: Blocks: id = {0x2000000000000028}, range = [0x00000000-0x00000003)
+# CHECK-NEXT: id = {0x2000000000000037}, range = [0x00000001-0x00000002)
.text
rnglists:
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -9,6 +9,7 @@
#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARFDEBUGMAP_H
#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARFDEBUGMAP_H
+#include "DIERef.h"
#include "lldb/Symbol/SymbolFile.h"
#include "lldb/Utility/RangeMap.h"
#include "llvm/Support/Chrono.h"
@@ -209,7 +210,9 @@
lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
static uint32_t GetOSOIndexFromUserID(lldb::user_id_t uid) {
- return (uint32_t)((uid >> 32ull) - 1ull);
+ std::optional<uint32_t> OsoNum = DIERef(uid).oso_num();
+ lldbassert(OsoNum && "Invalid OSO Index");
+ return *OsoNum;
}
static SymbolFileDWARF *GetSymbolFileAsSymbolFileDWARF(SymbolFile *sym_file);
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -211,7 +211,7 @@
// Set the ID of the symbol file DWARF to the index of the OSO
// shifted left by 32 bits to provide a unique prefix for any
// UserID's that get created in the symbol file.
- oso_symfile->SetID(((uint64_t)m_cu_idx + 1ull) << 32ull);
+ oso_symfile->SetID((uint64_t)m_cu_idx + 1ull);
}
return symfile;
}
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1405,9 +1405,6 @@
}
user_id_t SymbolFileDWARF::GetUID(DIERef ref) {
- if (GetDebugMapSymfile())
- return GetID() | ref.die_offset();
-
return DIERef(GetID(), ref.section(), ref.die_offset()).get_id();
}
Index: lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
+++ lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
@@ -27,18 +27,21 @@
class DIERef {
public:
enum Section : uint8_t { DebugInfo, DebugTypes };
+ enum IndexType : uint8_t { DWONum, OSONum };
- DIERef(std::optional<uint32_t> dwo_num, Section section,
+ DIERef(std::optional<uint32_t> dwo_oso_num, Section section,
dw_offset_t die_offset)
- : m_die_offset(die_offset), m_dwo_num(dwo_num.value_or(0)),
- m_dwo_num_valid(dwo_num ? true : false), m_section(section) {
- assert(this->dwo_num() == dwo_num && "Dwo number out of range?");
+ : m_die_offset(die_offset), m_dwo_oso_num(dwo_oso_num.value_or(0)),
+ m_dwo_num_valid(dwo_oso_num ? true : false), m_oso_num_valid(0),
+ m_section(section) {
+ assert(this->dwo_num() == dwo_oso_num && "Dwo number out of range?");
}
explicit DIERef(lldb::user_id_t uid) {
m_die_offset = uid & k_die_offset_mask;
m_dwo_num_valid = (uid & k_dwo_num_valid_bit) != 0;
- m_dwo_num =
+ m_oso_num_valid = (uid & k_oso_num_valid_bit) != 0;
+ m_dwo_oso_num =
m_dwo_num_valid ? (uid >> k_die_offset_bit_size) & k_dwo_num_mask : 0;
m_section =
(uid & k_section_bit) != 0 ? Section::DebugTypes : Section::DebugInfo;
@@ -47,12 +50,19 @@
lldb::user_id_t get_id() const {
return lldb::user_id_t(dwo_num().value_or(0)) << k_die_offset_bit_size |
die_offset() | (m_dwo_num_valid ? k_dwo_num_valid_bit : 0) |
+ (m_oso_num_valid ? k_oso_num_valid_bit : 0) |
(section() == Section::DebugTypes ? k_section_bit : 0);
}
std::optional<uint32_t> dwo_num() const {
if (m_dwo_num_valid)
- return m_dwo_num;
+ return m_dwo_oso_num;
+ return std::nullopt;
+ }
+
+ std::optional<uint32_t> oso_num() const {
+ if (m_oso_num_valid)
+ return m_dwo_oso_num;
return std::nullopt;
}
@@ -63,8 +73,10 @@
bool operator<(DIERef other) const {
if (m_dwo_num_valid != other.m_dwo_num_valid)
return m_dwo_num_valid < other.m_dwo_num_valid;
- if (m_dwo_num_valid && (m_dwo_num != other.m_dwo_num))
- return m_dwo_num < other.m_dwo_num;
+ if (m_oso_num_valid != other.m_oso_num_valid)
+ return m_oso_num_valid < other.m_oso_num_valid;
+ if (m_dwo_num_valid && (m_dwo_oso_num != other.m_dwo_oso_num))
+ return m_dwo_oso_num < other.m_dwo_oso_num;
if (m_section != other.m_section)
return m_section < other.m_section;
return m_die_offset < other.m_die_offset;
@@ -103,12 +115,14 @@
static constexpr uint64_t k_die_offset_bit_size = DW_DIE_OFFSET_MAX_BITSIZE;
static constexpr uint64_t k_dwo_num_bit_size =
- 64 - DW_DIE_OFFSET_MAX_BITSIZE - /* size of control bits */ 2;
+ 64 - DW_DIE_OFFSET_MAX_BITSIZE - /* size of control bits */ 3;
static constexpr uint64_t k_dwo_num_valid_bit =
(1ull << (k_dwo_num_bit_size + k_die_offset_bit_size));
- static constexpr uint64_t k_section_bit =
+ static constexpr uint64_t k_oso_num_valid_bit =
(1ull << (k_dwo_num_bit_size + k_die_offset_bit_size + 1));
+ static constexpr uint64_t k_section_bit =
+ (1ull << (k_dwo_num_bit_size + k_die_offset_bit_size + 2));
static constexpr uint64_t
k_dwo_num_mask = (~0ull) >> (64 - k_dwo_num_bit_size); // 0x1fffff;
@@ -119,9 +133,12 @@
// Allow 2TB of .debug_info/.debug_types offset
dw_offset_t m_die_offset : k_die_offset_bit_size;
// Used for DWO index or for .o file index on mac
- dw_offset_t m_dwo_num : k_dwo_num_bit_size;
+ dw_offset_t m_dwo_oso_num : k_dwo_num_bit_size;
// Set to 1 if m_file_index is a DWO number
dw_offset_t m_dwo_num_valid : 1;
+ // Set to 1 if m_file_index is a N_OSO index for mac debugging without a dSYM
+ // file
+ dw_offset_t m_oso_num_valid : 1;
// Set to 0 for .debug_info 1 for .debug_types,
dw_offset_t m_section : 1;
};
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits