[Lldb-commits] [lldb] r360246 - [DWARF] Centralize user_id <-> DWARFDIE conversions

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Wed May 8 04:43:05 PDT 2019


Author: labath
Date: Wed May  8 04:43:05 2019
New Revision: 360246

URL: http://llvm.org/viewvc/llvm-project?rev=360246&view=rev
Log:
[DWARF] Centralize user_id <-> DWARFDIE conversions

Summary:
The logic for translating a user_id into a DWARFDIE was replicated in
several places. This removes that redundancy and settles on a single
implementation in SymbolFileDWARF.

The reason for choosing that instead of DIERef was that we were
always immediately converting the returned DIERef into a DWARFDIE
anyway, which meant that one had to specify the SymbolFileDWARF argument
twice (once to get the DIERef, and once to get the actual DIE). Also,
passing a higher-level object (SymbolFileDWARF) into a lower-level one
(DIERef) seemed like a less intuitive arrangement than doing things the
other way around.

Reviewers: JDevlieghere, clayborg, aprantl

Subscribers: tberghammer, jankratochvil, lldb-commits

Differential Revision: https://reviews.llvm.org/D61648

Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp?rev=360246&r1=360245&r2=360246&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp Wed May  8 04:43:05 2019
@@ -13,29 +13,6 @@
 #include "SymbolFileDWARF.h"
 #include "SymbolFileDWARFDebugMap.h"
 
-DIERef::DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf)
-    : cu_offset(DW_INVALID_OFFSET), die_offset(uid & 0xffffffff) {
-  SymbolFileDWARFDebugMap *debug_map = dwarf->GetDebugMapSymfile();
-  if (debug_map) {
-    const uint32_t oso_idx = debug_map->GetOSOIndexFromUserID(uid);
-    SymbolFileDWARF *actual_dwarf = debug_map->GetSymbolFileByOSOIndex(oso_idx);
-    if (actual_dwarf) {
-      DWARFDebugInfo *debug_info = actual_dwarf->DebugInfo();
-      if (debug_info) {
-        DWARFUnit *dwarf_cu =
-            debug_info->GetCompileUnitContainingDIEOffset(die_offset);
-        if (dwarf_cu) {
-          cu_offset = dwarf_cu->GetOffset();
-          return;
-        }
-      }
-    }
-    die_offset = DW_INVALID_OFFSET;
-  } else {
-    cu_offset = uid >> 32;
-  }
-}
-
 DIERef::DIERef(const DWARFFormValue &form_value)
     : cu_offset(DW_INVALID_OFFSET), die_offset(DW_INVALID_OFFSET) {
   if (form_value.IsValid()) {
@@ -49,16 +26,3 @@ DIERef::DIERef(const DWARFFormValue &for
     die_offset = form_value.Reference();
   }
 }
-
-lldb::user_id_t DIERef::GetUID(SymbolFileDWARF *dwarf) const {
-  // Each SymbolFileDWARF will set its ID to what is expected.
-  //
-  // SymbolFileDWARF, when used for DWARF with .o files on MacOSX, has the
-  // ID set to the compile unit index.
-  //
-  // SymbolFileDWARFDwo sets the ID to the compile unit offset.
-  if (dwarf && die_offset != DW_INVALID_OFFSET)
-    return dwarf->GetID() | die_offset;
-  else
-    return LLDB_INVALID_UID;
-}

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h?rev=360246&r1=360245&r2=360246&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h Wed May  8 04:43:05 2019
@@ -20,20 +20,8 @@ struct DIERef {
 
   DIERef(dw_offset_t c, dw_offset_t d) : cu_offset(c), die_offset(d) {}
 
-  // In order to properly decode a lldb::user_id_t back into a DIERef we
-  // need the DWARF file since it knows if DWARF in .o files is being used
-  // (MacOSX) or if DWO files are being used. The encoding of the user ID
-  // differs between the two types of DWARF.
-  explicit DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf);
-
   explicit DIERef(const DWARFFormValue &form_value);
 
-  // In order to properly encode a DIERef unto a lldb::user_id_t we need
-  // the DWARF file since it knows if DWARF in .o files is being used
-  // (MacOSX) or if DWO files are being used. The encoding of the user ID
-  // differs between the two types of DWARF.
-  lldb::user_id_t GetUID(SymbolFileDWARF *dwarf) const;
-
   bool operator<(const DIERef &ref) const {
     return die_offset < ref.die_offset;
   }

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=360246&r1=360245&r2=360246&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Wed May  8 04:43:05 2019
@@ -524,7 +524,7 @@ TypeSP DWARFASTParserClang::ParseTypeFro
 
         type_sp = std::make_shared<Type>(
             die.GetID(), dwarf, type_name_const_str, byte_size, nullptr,
-            DIERef(encoding_uid).GetUID(dwarf), encoding_data_type, &decl,
+            dwarf->GetUID(DIERef(encoding_uid)), encoding_data_type, &decl,
             clang_type, resolve_state);
 
         dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
@@ -763,7 +763,7 @@ TypeSP DWARFASTParserClang::ParseTypeFro
             // it and cache the fact that we found a complete type for this die
             dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
             clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(
-                dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf)));
+                dwarf->GetDIE(type_sp->GetID()));
             if (defn_decl_ctx)
               LinkDeclContextToDIE(defn_decl_ctx, die);
             return type_sp;
@@ -1067,8 +1067,8 @@ TypeSP DWARFASTParserClang::ParseTypeFro
               // die
               dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
               clang::DeclContext *defn_decl_ctx =
-                  GetCachedClangDeclContextForDIE(dwarf->DebugInfo()->GetDIE(
-                      DIERef(type_sp->GetID(), dwarf)));
+                  GetCachedClangDeclContextForDIE(
+                      dwarf->GetDIE(type_sp->GetID()));
               if (defn_decl_ctx)
                 LinkDeclContextToDIE(defn_decl_ctx, die);
               return type_sp;
@@ -1112,7 +1112,7 @@ TypeSP DWARFASTParserClang::ParseTypeFro
 
           type_sp = std::make_shared<Type>(
               die.GetID(), dwarf, type_name_const_str, byte_size, nullptr,
-              DIERef(encoding_form).GetUID(dwarf), Type::eEncodingIsUID, &decl,
+              dwarf->GetUID(DIERef(encoding_form)), Type::eEncodingIsUID, &decl,
               clang_type, Type::eResolveStateForward);
 
           if (ClangASTContext::StartTagDeclarationDefinition(clang_type)) {
@@ -1383,22 +1383,8 @@ TypeSP DWARFASTParserClang::ParseTypeFro
                   // We uniqued the parent class of this function to another
                   // class so we now need to associate all dies under
                   // "decl_ctx_die" to DIEs in the DIE for "class_type"...
-                  SymbolFileDWARF *class_symfile = NULL;
-                  DWARFDIE class_type_die;
+                  DWARFDIE class_type_die = dwarf->GetDIE(class_type->GetID());
 
-                  SymbolFileDWARFDebugMap *debug_map_symfile =
-                      dwarf->GetDebugMapSymfile();
-                  if (debug_map_symfile) {
-                    class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(
-                        SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(
-                            class_type->GetID()));
-                    class_type_die = class_symfile->DebugInfo()->GetDIE(
-                        DIERef(class_type->GetID(), dwarf));
-                  } else {
-                    class_symfile = dwarf;
-                    class_type_die = dwarf->DebugInfo()->GetDIE(
-                        DIERef(class_type->GetID(), dwarf));
-                  }
                   if (class_type_die) {
                     std::vector<DWARFDIE> failures;
 
@@ -1822,7 +1808,7 @@ TypeSP DWARFASTParserClang::ParseTypeFro
             ConstString empty_name;
             type_sp = std::make_shared<Type>(
                 die.GetID(), dwarf, empty_name, array_element_bit_stride / 8,
-                nullptr, DIERef(type_die_form).GetUID(dwarf),
+                nullptr, dwarf->GetUID(DIERef(type_die_form)),
                 Type::eEncodingIsUID, &decl, clang_type,
                 Type::eResolveStateFull);
             type_sp->SetEncodingType(element_type);

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.cpp?rev=360246&r1=360245&r2=360246&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.cpp Wed May  8 04:43:05 2019
@@ -75,7 +75,9 @@ uint64_t DWARFBaseDIE::GetAttributeValue
 }
 
 lldb::user_id_t DWARFBaseDIE::GetID() const {
-  return GetDIERef().GetUID(GetDWARF());
+  if (IsValid())
+    return GetDWARF()->GetUID(*this);
+  return LLDB_INVALID_UID;
 }
 
 const char *DWARFBaseDIE::GetName() const {

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=360246&r1=360245&r2=360246&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Wed May  8 04:43:05 2019
@@ -1243,7 +1243,7 @@ void SymbolFileDWARF::ParseDeclsForConte
       ast_parser->GetDeclForUIDFromDWARF(decl);
 }
 
-SymbolFileDWARF *SymbolFileDWARF::GetDWARFForUID(lldb::user_id_t uid) {
+SymbolFileDWARF::DecodedUID SymbolFileDWARF::DecodeUID(lldb::user_id_t uid) {
   // This method can be called without going through the symbol vendor so we
   // need to lock the module.
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
@@ -1254,28 +1254,25 @@ SymbolFileDWARF *SymbolFileDWARF::GetDWA
   // references to other DWARF objects and we must be ready to receive a
   // "lldb::user_id_t" that specifies a DIE from another SymbolFileDWARF
   // instance.
-  SymbolFileDWARFDebugMap *debug_map = GetDebugMapSymfile();
-  if (debug_map)
-    return debug_map->GetSymbolFileByOSOIndex(
+  if (SymbolFileDWARFDebugMap *debug_map = GetDebugMapSymfile()) {
+    SymbolFileDWARF *dwarf = debug_map->GetSymbolFileByOSOIndex(
         debug_map->GetOSOIndexFromUserID(uid));
-  return this;
+    return {dwarf, {DW_INVALID_OFFSET, dw_offset_t(uid)}};
+  }
+  return {this, {dw_offset_t(uid >> 32), dw_offset_t(uid)}};
 }
 
 DWARFDIE
-SymbolFileDWARF::GetDIEFromUID(lldb::user_id_t uid) {
+SymbolFileDWARF::GetDIE(lldb::user_id_t uid) {
   // This method can be called without going through the symbol vendor so we
   // need to lock the module.
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
-  // Anytime we get a "lldb::user_id_t" from an lldb_private::SymbolFile API we
-  // must make sure we use the correct DWARF file when resolving things. On
-  // MacOSX, when using SymbolFileDWARFDebugMap, we will use multiple
-  // SymbolFileDWARF classes, one for each .o file. We can often end up with
-  // references to other DWARF objects and we must be ready to receive a
-  // "lldb::user_id_t" that specifies a DIE from another SymbolFileDWARF
-  // instance.
-  SymbolFileDWARF *dwarf = GetDWARFForUID(uid);
-  if (dwarf)
-    return dwarf->GetDIE(DIERef(uid, dwarf));
+
+  DecodedUID decoded = DecodeUID(uid);
+
+  if (decoded.dwarf)
+    return decoded.dwarf->GetDIE(decoded.ref);
+
   return DWARFDIE();
 }
 
@@ -1284,10 +1281,9 @@ CompilerDecl SymbolFileDWARF::GetDeclFor
   // need to lock the module.
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
   // Anytime we have a lldb::user_id_t, we must get the DIE by calling
-  // SymbolFileDWARF::GetDIEFromUID(). See comments inside the
-  // SymbolFileDWARF::GetDIEFromUID() for details.
-  DWARFDIE die = GetDIEFromUID(type_uid);
-  if (die)
+  // SymbolFileDWARF::GetDIE(). See comments inside the
+  // SymbolFileDWARF::GetDIE() for details.
+  if (DWARFDIE die = GetDIE(type_uid))
     return die.GetDecl();
   return CompilerDecl();
 }
@@ -1298,10 +1294,9 @@ SymbolFileDWARF::GetDeclContextForUID(ll
   // need to lock the module.
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
   // Anytime we have a lldb::user_id_t, we must get the DIE by calling
-  // SymbolFileDWARF::GetDIEFromUID(). See comments inside the
-  // SymbolFileDWARF::GetDIEFromUID() for details.
-  DWARFDIE die = GetDIEFromUID(type_uid);
-  if (die)
+  // SymbolFileDWARF::GetDIE(). See comments inside the
+  // SymbolFileDWARF::GetDIE() for details.
+  if (DWARFDIE die = GetDIE(type_uid))
     return die.GetDeclContext();
   return CompilerDeclContext();
 }
@@ -1312,10 +1307,9 @@ SymbolFileDWARF::GetDeclContextContainin
   // need to lock the module.
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
   // Anytime we have a lldb::user_id_t, we must get the DIE by calling
-  // SymbolFileDWARF::GetDIEFromUID(). See comments inside the
-  // SymbolFileDWARF::GetDIEFromUID() for details.
-  DWARFDIE die = GetDIEFromUID(type_uid);
-  if (die)
+  // SymbolFileDWARF::GetDIE(). See comments inside the
+  // SymbolFileDWARF::GetDIE() for details.
+  if (DWARFDIE die = GetDIE(type_uid))
     return die.GetContainingDeclContext();
   return CompilerDeclContext();
 }
@@ -1325,10 +1319,9 @@ Type *SymbolFileDWARF::ResolveTypeUID(ll
   // need to lock the module.
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
   // Anytime we have a lldb::user_id_t, we must get the DIE by calling
-  // SymbolFileDWARF::GetDIEFromUID(). See comments inside the
-  // SymbolFileDWARF::GetDIEFromUID() for details.
-  DWARFDIE type_die = GetDIEFromUID(type_uid);
-  if (type_die)
+  // SymbolFileDWARF::GetDIE(). See comments inside the
+  // SymbolFileDWARF::GetDIE() for details.
+  if (DWARFDIE type_die = GetDIE(type_uid))
     return type_die.ResolveType();
   else
     return nullptr;
@@ -1338,8 +1331,7 @@ llvm::Optional<SymbolFile::ArrayInfo>
 SymbolFileDWARF::GetDynamicArrayInfoForUID(
     lldb::user_id_t type_uid, const lldb_private::ExecutionContext *exe_ctx) {
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
-  DWARFDIE type_die = GetDIEFromUID(type_uid);
-  if (type_die)
+  if (DWARFDIE type_die = GetDIE(type_uid))
     return DWARFASTParser::ParseChildArrayInfo(type_die, exe_ctx);
   else
     return llvm::None;
@@ -3105,7 +3097,7 @@ size_t SymbolFileDWARF::ParseVariablesFo
       return 0;
 
     if (sc.function) {
-      DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID(), this));
+      DWARFDIE function_die = GetDIE(sc.function->GetID());
 
       const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress(
           DW_AT_low_pc, LLDB_INVALID_ADDRESS);
@@ -3531,7 +3523,7 @@ VariableSP SymbolFileDWARF::ParseVariabl
 
       if (symbol_context_scope) {
         SymbolFileTypeSP type_sp(
-            new SymbolFileType(*this, DIERef(type_die_form).GetUID(this)));
+            new SymbolFileType(*this, GetUID(DIERef(type_die_form))));
 
         if (const_value.Form() && type_sp && type_sp->GetType())
           location.CopyOpcodeData(
@@ -3668,7 +3660,7 @@ size_t SymbolFileDWARF::ParseVariables(c
                 // variable to it
                 const DWARFDIE concrete_block_die =
                     FindBlockContainingSpecification(
-                        DIERef(sc.function->GetID(), this),
+                        GetDIE(sc.function->GetID()),
                         sc_parent_die.GetOffset());
                 if (concrete_block_die)
                   block = sc.function->GetBlock(true).FindBlockByID(
@@ -3770,7 +3762,7 @@ CollectCallEdges(DWARFDIE function_die)
 
 std::vector<lldb_private::CallEdge>
 SymbolFileDWARF::ParseCallEdgesInFunction(UserID func_id) {
-  DWARFDIE func_die = GetDIEFromUID(func_id.GetID());
+  DWARFDIE func_die = GetDIE(func_id.GetID());
   if (func_die.IsValid())
     return CollectCallEdges(func_die);
   return {};

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=360246&r1=360245&r2=360246&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Wed May  8 04:43:05 2019
@@ -134,11 +134,6 @@ public:
                                   bool assert_not_being_parsed = true,
                                   bool resolve_function_context = false);
 
-  SymbolFileDWARF *GetDWARFForUID(lldb::user_id_t uid);
-
-  DWARFDIE
-  GetDIEFromUID(lldb::user_id_t uid);
-
   lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override;
 
   lldb_private::CompilerDeclContext
@@ -289,6 +284,14 @@ public:
 
   virtual DWARFDIE GetDIE(const DIERef &die_ref);
 
+  DWARFDIE GetDIE(lldb::user_id_t uid);
+
+  lldb::user_id_t GetUID(const DWARFBaseDIE &die) {
+    return GetID() | die.GetOffset();
+  }
+
+  lldb::user_id_t GetUID(const DIERef &ref) { return GetID() | ref.die_offset; }
+
   virtual std::unique_ptr<SymbolFileDWARFDwo>
   GetDwoSymbolFileForCompileUnit(DWARFUnit &dwarf_cu,
                                  const DWARFDebugInfoEntry &cu_die);
@@ -440,6 +443,12 @@ protected:
     return m_forward_decl_clang_type_to_die;
   }
 
+  struct DecodedUID {
+    SymbolFileDWARF *dwarf;
+    DIERef ref;
+  };
+  DecodedUID DecodeUID(lldb::user_id_t uid);
+
   SymbolFileDWARFDwp *GetDwpSymbolFile();
 
   lldb::ModuleWP m_debug_map_module_wp;




More information about the lldb-commits mailing list