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
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to