When support for DWO files was added, there were two ways to pass lldb::user_id_t...
authorGreg Clayton <gclayton@apple.com>
Wed, 30 Mar 2016 20:14:35 +0000 (20:14 +0000)
committerGreg Clayton <gclayton@apple.com>
Wed, 30 Mar 2016 20:14:35 +0000 (20:14 +0000)
1 - DWARF in .o files with debug map in executable: we would place the compile unit index in the upper 32 bits of the 64 bit value and the lower 32 bits would be the DIE offset
2 - DWO: we would place the compile unit offset in the upper 32 bits of the 64 bit value and the lower 32 bits would be the DIE offset

There was a mixing and matching of this and it wasn't done consistently.

Major changes include:

The DIERef constructor that takes a lldb::user_id_t now requires a SymbolFileDWARF:

DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf)

It is needed so that it can be decoded correctly. If it is DWARF in .o files with debug map in executable, then we get the right compile unit from the SymbolFileDWARFDebugMap, otherwise, we use the compile unit offset and DIE offset for DWO or normal DWARF.

The function:

lldb::user_id_t DIERef::GetUID() const;

Now becomes

lldb::user_id_t DIERef::GetUID(SymbolFileDWARF *dwarf) const;

Again, we need the DWARF file to encode it correctly.

This removes the need for "lldb::user_id_t SymbolFileDWARF::MakeUserID() const" and for bool SymbolFileDWARF::UserIDMatches (lldb::user_id_t uid) const". There were also many places were doing things inneficiently like:

1 - encode a dw_offset_t into a lldb::user_id_t
2 - call the public SymbolFile interface to resolve types using the lldb::user_id_t
3 - This would then decode the lldb::user_id_t into a DIERef, and then try to find that type.

There are many places that are now doing this more efficiently by storing DW_AT_type form values as DWARFFormValue objects and then making a DIERef from them and directly calling the underlying function to resolve the lldb_private::Type, lldb_private::CompilerType, lldb_private::CompilerDecl, lldb_private::CompilerDeclContext.

If there are any regressions in DWARF with DWO, we will need to fix any issues that arise since the original patch wasn't functional for the much more widely used DWARF in .o files with debug map.

<rdar://problem/25200976>

llvm-svn: 264909

18 files changed:
lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp
lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h
lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h

index c0754a1..5fe0cc4 100644 (file)
 #include "DIERef.h"
 #include "DWARFCompileUnit.h"
 #include "DWARFFormValue.h"
+#include "DWARFDebugInfo.h"
+#include "SymbolFileDWARF.h"
+#include "SymbolFileDWARFDebugMap.h"
 
 DIERef::DIERef() :
     cu_offset(DW_INVALID_OFFSET),
     die_offset(DW_INVALID_OFFSET)
 {}
 
-DIERef::DIERef(dw_offset_t d) :
-    cu_offset(DW_INVALID_OFFSET),
-    die_offset(d)
-{}
-
 DIERef::DIERef(dw_offset_t c, dw_offset_t d) :
     cu_offset(c),
     die_offset(d)
 {}
 
-DIERef::DIERef(lldb::user_id_t uid) :
-    cu_offset(uid>>32),
+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)
+            {
+                DWARFCompileUnit *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),
@@ -50,7 +73,19 @@ DIERef::DIERef(const DWARFFormValue& form_value) :
 }
 
 lldb::user_id_t
-DIERef::GetUID() const
+DIERef::GetUID(SymbolFileDWARF *dwarf) const
 {
-    return ((lldb::user_id_t)cu_offset) << 32 | die_offset;
+    //----------------------------------------------------------------------
+    // 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)
+        return dwarf->GetID() | die_offset;
+    else
+        return LLDB_INVALID_UID;
 }
+
index 3df07d5..ad4ad45 100644 (file)
 #include "lldb/lldb-defines.h"
 
 class DWARFFormValue;
+class SymbolFileDWARF;
 
 struct DIERef
 {
     DIERef();
 
-    explicit
-    DIERef(dw_offset_t d);
-
     DIERef(dw_offset_t c, dw_offset_t 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);
+    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() const;
+    GetUID(SymbolFileDWARF *dwarf) const;
 
     bool
     operator< (const DIERef &ref) const
index 0af10c7..871079b 100644 (file)
@@ -293,7 +293,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
 
                     const size_t num_attributes = die.GetAttributes (attributes);
                     uint32_t encoding = 0;
-                    lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
+                    DWARFFormValue encoding_uid;
 
                     if (num_attributes > 0)
                     {
@@ -323,7 +323,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                         break;
                                     case DW_AT_byte_size:   byte_size = form_value.Unsigned(); break;
                                     case DW_AT_encoding:    encoding = form_value.Unsigned(); break;
-                                    case DW_AT_type:        encoding_uid = DIERef(form_value).GetUID(); break;
+                                    case DW_AT_type:        encoding_uid = form_value; break;
                                     default:
                                     case DW_AT_sibling:
                                         break;
@@ -332,7 +332,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                         }
                     }
 
-                    DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid);
+                    DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid.Reference());
 
                     switch (tag)
                     {
@@ -388,7 +388,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                                                                          die.GetName());
                                     clang_type = m_ast.GetBasicType(eBasicTypeObjCID);
                                     encoding_data_type = Type::eEncodingIsUID;
-                                    encoding_uid = LLDB_INVALID_UID;
+                                    encoding_uid.Clear();
                                     resolve_state = Type::eResolveStateFull;
 
                                 }
@@ -402,7 +402,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                                                                          die.GetName());
                                     clang_type = m_ast.GetBasicType(eBasicTypeObjCClass);
                                     encoding_data_type = Type::eEncodingIsUID;
-                                    encoding_uid = LLDB_INVALID_UID;
+                                    encoding_uid.Clear();
                                     resolve_state = Type::eResolveStateFull;
                                 }
                                 else if (type_name_const_str == g_objc_type_name_selector)
@@ -415,15 +415,15 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                                                                          die.GetName());
                                     clang_type = m_ast.GetBasicType(eBasicTypeObjCSel);
                                     encoding_data_type = Type::eEncodingIsUID;
-                                    encoding_uid = LLDB_INVALID_UID;
+                                    encoding_uid.Clear();
                                     resolve_state = Type::eResolveStateFull;
                                 }
                             }
-                            else if (encoding_data_type == Type::eEncodingIsPointerUID && encoding_uid != LLDB_INVALID_UID)
+                            else if (encoding_data_type == Type::eEncodingIsPointerUID && encoding_uid.IsValid())
                             {
                                 // Clang sometimes erroneously emits id as objc_object*.  In that case we fix up the type to "id".
 
-                                const DWARFDIE encoding_die = die.GetDIE(encoding_uid);
+                                const DWARFDIE encoding_die = dwarf->GetDIE(DIERef(encoding_uid));
 
                                 if (encoding_die && encoding_die.Tag() == DW_TAG_structure_type)
                                 {
@@ -439,7 +439,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                                                                                  die.GetName());
                                             clang_type = m_ast.GetBasicType(eBasicTypeObjCID);
                                             encoding_data_type = Type::eEncodingIsUID;
-                                            encoding_uid = LLDB_INVALID_UID;
+                                            encoding_uid.Clear();
                                             resolve_state = Type::eResolveStateFull;
                                         }
                                     }
@@ -453,7 +453,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                              type_name_const_str,
                                              byte_size,
                                              NULL,
-                                             encoding_uid,
+                                             DIERef(encoding_uid).GetUID(dwarf),
                                              encoding_data_type,
                                              &decl,
                                              clang_type,
@@ -732,7 +732,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                             // 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->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf)));
                             if (defn_decl_ctx)
                                 LinkDeclContextToDIE(defn_decl_ctx, die);
                             return type_sp;
@@ -895,8 +895,6 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                    "Type already in the forward declaration map!");
                             // Can't assume m_ast.GetSymbolFile() is actually a SymbolFileDWARF, it can be a
                             // SymbolFileDWARFDebugMap for Apple binaries.
-                            //assert(((SymbolFileDWARF*)m_ast.GetSymbolFile())->UserIDMatches(die.GetDIERef().GetUID()) &&
-                            //       "Adding incorrect type to forward declaration map");
                             dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] = clang_type.GetOpaqueQualType();
                             dwarf->GetForwardDeclClangTypeToDie()[ClangUtil::RemoveFastQualifiers(clang_type)
                                                                       .GetOpaqueQualType()] = die.GetDIERef();
@@ -992,8 +990,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                 // so lets use 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())));
+                                clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf)));
                                 if (defn_decl_ctx)
                                     LinkDeclContextToDIE(defn_decl_ctx, die);
                                 return type_sp;
@@ -1008,7 +1005,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                         {
                             if (encoding_form.IsValid())
                             {
-                                Type *enumerator_type = dwarf->ResolveTypeUID(DIERef(encoding_form).GetUID());
+                                Type *enumerator_type = dwarf->ResolveTypeUID(DIERef(encoding_form));
                                 if (enumerator_type)
                                     enumerator_clang_type = enumerator_type->GetFullCompilerType ();
                             }
@@ -1035,7 +1032,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                                  type_name_const_str,
                                                  byte_size,
                                                  NULL,
-                                                 DIERef(encoding_form).GetUID(),
+                                                 DIERef(encoding_form).GetUID(dwarf),
                                                  Type::eEncodingIsUID,
                                                  &decl,
                                                  clang_type,
@@ -1176,7 +1173,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                     Type *func_type = NULL;
 
                     if (type_die_form.IsValid())
-                        func_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID());
+                        func_type = dwarf->ResolveTypeUID(DIERef(type_die_form));
 
                     if (func_type)
                         return_clang_type = func_type->GetForwardCompilerType ();
@@ -1311,12 +1308,12 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                         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()));
+                                            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()));
+                                            class_type_die = dwarf->DebugInfo()->GetDIE (DIERef(class_type->GetID(), dwarf));
                                         }
                                         if (class_type_die)
                                         {
@@ -1659,7 +1656,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
 
                         DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
 
-                        Type *element_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID());
+                        Type *element_type = dwarf->ResolveTypeUID(DIERef(type_die_form));
 
                         if (element_type)
                         {
@@ -1696,7 +1693,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                                                      empty_name,
                                                      array_element_bit_stride / 8,
                                                      NULL,
-                                                     DIERef(type_die_form).GetUID(),
+                                                     DIERef(type_die_form).GetUID(dwarf),
                                                      Type::eEncodingIsUID,
                                                      &decl,
                                                      clang_type,
@@ -1731,8 +1728,8 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
                             }
                         }
 
-                        Type *pointee_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID());
-                        Type *class_type = dwarf->ResolveTypeUID(DIERef(containing_type_die_form).GetUID());
+                        Type *pointee_type = dwarf->ResolveTypeUID(DIERef(type_die_form));
+                        Type *class_type = dwarf->ResolveTypeUID(DIERef(containing_type_die_form));
 
                         CompilerType pointee_clang_type = pointee_type->GetForwardCompilerType ();
                         CompilerType class_clang_type = class_type->GetLayoutCompilerType ();
@@ -1902,7 +1899,7 @@ DWARFASTParserClang::ParseTemplateDIE (const DWARFDIE &die,
                         case DW_AT_type:
                             if (attributes.ExtractFormValueAtIndex(i, form_value))
                             {
-                                lldb_type = die.ResolveTypeUID(DIERef(form_value).GetUID());
+                                lldb_type = die.ResolveTypeUID(DIERef(form_value));
                                 if (lldb_type)
                                     clang_type = lldb_type->GetForwardCompilerType ();
                             }
@@ -2803,7 +2800,7 @@ DWARFASTParserClang::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &
                     // Handle static members
                     if (is_external && member_byte_offset == UINT32_MAX)
                     {
-                        Type *var_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID());
+                        Type *var_type = die.ResolveTypeUID(DIERef(encoding_form));
 
                         if (var_type)
                         {
@@ -2819,7 +2816,7 @@ DWARFASTParserClang::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &
 
                     if (is_artificial == false)
                     {
-                        Type *member_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID());
+                        Type *member_type = die.ResolveTypeUID(DIERef(encoding_form));
 
                         clang::FieldDecl *field_decl = NULL;
                         if (tag == DW_TAG_member)
@@ -3146,7 +3143,7 @@ DWARFASTParserClang::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &
                         }
                     }
 
-                    Type *base_class_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID());
+                    Type *base_class_type = die.ResolveTypeUID(DIERef(encoding_form));
                     if (base_class_type == NULL)
                     {
                         module_sp->ReportError("0x%8.8x: DW_TAG_inheritance failed to resolve the base class at 0x%8.8" PRIx64 " from enclosing type 0x%8.8x. \nPlease file a bug and attach the file at the start of this error message",
@@ -3292,7 +3289,7 @@ DWARFASTParserClang::ParseChildParameters (const SymbolContext& sc,
                                     // being in the formal parameter DIE...
                                     if (name == NULL || ::strcmp(name, "this")==0)
                                     {
-                                        Type *this_type = die.ResolveTypeUID (DIERef(param_type_die_form).GetUID());
+                                        Type *this_type = die.ResolveTypeUID (DIERef(param_type_die_form));
                                         if (this_type)
                                         {
                                             uint32_t encoding_mask = this_type->GetEncodingMask();
@@ -3335,7 +3332,7 @@ DWARFASTParserClang::ParseChildParameters (const SymbolContext& sc,
 
                     if (!skip)
                     {
-                        Type *type = die.ResolveTypeUID(DIERef(param_type_die_form).GetUID());
+                        Type *type = die.ResolveTypeUID(DIERef(param_type_die_form));
                         if (type)
                         {
                             function_param_types.push_back (type->GetForwardCompilerType ());
@@ -3482,7 +3479,7 @@ DWARFASTParserClang::GetTypeForDIE (const DWARFDIE &die)
                 DWARFFormValue form_value;
 
                 if (attr == DW_AT_type && attributes.ExtractFormValueAtIndex(i, form_value))
-                    return dwarf->ResolveTypeUID(DIERef(form_value).GetUID());
+                    return dwarf->ResolveTypeUID(dwarf->GetDIE (DIERef(form_value)), true);
             }
         }
     }
@@ -3538,11 +3535,10 @@ DWARFASTParserClang::GetClangDeclForDIE (const DWARFDIE &die)
         case DW_TAG_imported_declaration:
         {
             SymbolFileDWARF *dwarf = die.GetDWARF();
-            lldb::user_id_t imported_uid = die.GetAttributeValueAsReference(DW_AT_import, DW_INVALID_OFFSET);
-
-            if (dwarf->UserIDMatches(imported_uid))
+            DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import);
+            if (imported_uid)
             {
-                CompilerDecl imported_decl = dwarf->GetDeclForUID(imported_uid);
+                CompilerDecl imported_decl = imported_uid.GetDecl();
                 if (imported_decl)
                 {
                     clang::DeclContext *decl_context = ClangASTContext::DeclContextGetAsDeclContext(dwarf->GetDeclContextContainingUID(die.GetID()));
@@ -3555,15 +3551,15 @@ DWARFASTParserClang::GetClangDeclForDIE (const DWARFDIE &die)
         case DW_TAG_imported_module:
         {
             SymbolFileDWARF *dwarf = die.GetDWARF();
-            lldb::user_id_t imported_uid = die.GetAttributeValueAsReference(DW_AT_import, DW_INVALID_OFFSET);
+            DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import);
 
-            if (dwarf->UserIDMatches(imported_uid))
+            if (imported_uid)
             {
-                CompilerDeclContext imported_decl = dwarf->GetDeclContextForUID(imported_uid);
-                if (imported_decl)
+                CompilerDeclContext imported_decl_ctx = imported_uid.GetDeclContext();
+                if (imported_decl_ctx)
                 {
                     clang::DeclContext *decl_context = ClangASTContext::DeclContextGetAsDeclContext(dwarf->GetDeclContextContainingUID(die.GetID()));
-                    if (clang::NamespaceDecl *ns_decl = ClangASTContext::DeclContextGetAsNamespaceDecl(imported_decl))
+                    if (clang::NamespaceDecl *ns_decl = ClangASTContext::DeclContextGetAsNamespaceDecl(imported_decl_ctx))
                         decl = m_ast.CreateUsingDirectiveDeclaration(decl_context, ns_decl);
                 }
             }
index 12f14ee..346e2d6 100644 (file)
@@ -144,7 +144,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                         }
                     }
 
-                    DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", dwarf->MakeUserID(die.GetOffset()),
+                    DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", die.GetID(),
                                  DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid);
 
                     switch (tag)
@@ -183,7 +183,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                             break;
                     }
 
-                    type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str, byte_size,
+                    type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_size,
                                            NULL, encoding_uid, encoding_data_type, &decl, compiler_type, resolve_state));
 
                     dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
@@ -254,7 +254,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                         }
                     }
 
-                    DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die.GetOffset()),
+                    DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
                                  DW_TAG_value_to_name(tag), type_name_cstr);
 
                     bool compiler_type_was_created = false;
@@ -265,7 +265,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                         compiler_type = m_ast.CreateStructType(go_kind, type_name_const_str, byte_size);
                     }
 
-                    type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str, byte_size,
+                    type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_size,
                                            NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type,
                                            Type::eResolveStateForward));
 
@@ -347,7 +347,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                         }
                     }
 
-                    DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die.GetOffset()),
+                    DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
                                  DW_TAG_value_to_name(tag), type_name_cstr);
 
                     std::vector<CompilerType> function_param_types;
@@ -363,7 +363,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                     compiler_type = m_ast.CreateFunctionType(type_name_const_str, function_param_types.data(),
                                                           function_param_types.size(), is_variadic);
 
-                    type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str, 0, NULL,
+                    type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, 0, NULL,
                                            LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type,
                                            Type::eResolveStateFull));
                     assert(type_sp.get());
@@ -410,7 +410,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                             }
                         }
 
-                        DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die.GetOffset()),
+                        DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
                                      DW_TAG_value_to_name(tag), type_name_cstr);
 
                         Type *element_type = dwarf->ResolveTypeUID(type_die_offset);
@@ -433,7 +433,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                             {
                                 compiler_type = m_ast.CreateArrayType(type_name_const_str, array_element_type, 0);
                             }
-                            type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str,
+                            type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str,
                                                    byte_stride, NULL, type_die_offset, Type::eEncodingIsUID, &decl,
                                                    compiler_type, Type::eResolveStateFull));
                             type_sp->SetEncodingType(element_type);
@@ -463,7 +463,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons
                 else if (sc.function != NULL && sc_parent_die)
                 {
                     symbol_context_scope =
-                        sc.function->GetBlock(true).FindBlockByID(dwarf->MakeUserID(sc_parent_die.GetOffset()));
+                        sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
                     if (symbol_context_scope == NULL)
                         symbol_context_scope = sc.function;
                 }
@@ -510,7 +510,7 @@ DWARFASTParserGo::ParseChildParameters(const SymbolContext &sc,
                 if (num_attributes > 0)
                 {
                     Declaration decl;
-                    dw_offset_t param_type_die_offset = DW_INVALID_OFFSET;
+                    DWARFFormValue param_type_die_offset;
 
                     uint32_t i;
                     for (i = 0; i < num_attributes; ++i)
@@ -525,7 +525,7 @@ DWARFASTParserGo::ParseChildParameters(const SymbolContext &sc,
                                     // = form_value.AsCString();
                                     break;
                                 case DW_AT_type:
-                                    param_type_die_offset = form_value.Reference();
+                                    param_type_die_offset = form_value;
                                     break;
                                 case DW_AT_location:
                                 //                          if (form_value.BlockData())
@@ -547,7 +547,7 @@ DWARFASTParserGo::ParseChildParameters(const SymbolContext &sc,
                         }
                     }
 
-                    Type *type = parent_die.ResolveTypeUID(param_type_die_offset);
+                    Type *type = parent_die.ResolveTypeUID(DIERef(param_type_die_offset));
                     if (type)
                     {
                         function_param_types.push_back(type->GetForwardCompilerType());
@@ -628,7 +628,7 @@ DWARFASTParserGo::CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type
     Log *log = nullptr; // (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
     if (log)
         dwarf->GetObjectFile()->GetModule()->LogMessageVerboseBacktrace(
-            log, "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", dwarf->MakeUserID(die.GetOffset()),
+            log, "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", die.GetID(),
             DW_TAG_value_to_name(tag), type->GetName().AsCString());
     assert(compiler_type);
     DWARFAttributes attributes;
@@ -683,7 +683,7 @@ DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &par
                     Declaration decl;
                     const char *name = NULL;
 
-                    lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
+                    DWARFFormValue encoding_uid;
                     uint32_t member_byte_offset = UINT32_MAX;
                     uint32_t i;
                     for (i = 0; i < num_attributes; ++i)
@@ -698,7 +698,7 @@ DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &par
                                     name = form_value.AsCString();
                                     break;
                                 case DW_AT_type:
-                                    encoding_uid = form_value.Reference();
+                                    encoding_uid = form_value;
                                     break;
                                 case DW_AT_data_member_location:
                                     if (form_value.BlockData())
@@ -735,7 +735,7 @@ DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &par
                         }
                     }
 
-                    Type *member_type = die.ResolveTypeUID(encoding_uid);
+                    Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid));
                     if (member_type)
                     {
                         CompilerType member_go_type = member_type->GetFullCompilerType();
@@ -808,10 +808,12 @@ DWARFASTParserGo::ParseFunctionFromDWARF(const SymbolContext &sc, const DWARFDIE
 
             if (dwarf->FixupAddress(func_range.GetBaseAddress()))
             {
-                const user_id_t func_user_id = dwarf->MakeUserID(die.GetOffset());
+                const user_id_t func_user_id = die.GetID();
                 func_sp.reset(new Function(sc.comp_unit,
-                                           dwarf->MakeUserID(func_user_id), // UserID is the DIE offset
-                                           dwarf->MakeUserID(func_user_id), func_name, func_type,
+                                           func_user_id, // UserID is the DIE offset
+                                           func_user_id,
+                                           func_name,
+                                           func_type,
                                            func_range)); // first address range
 
                 if (func_sp.get() != NULL)
index a126549..1bb1079 100644 (file)
@@ -77,7 +77,7 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die)
     dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
 
     ConstString linkage_name;
-    lldb::user_id_t type_die_offset = DW_INVALID_OFFSET;
+    DWARFFormValue type_attr_value;
     lldb::addr_t data_offset = LLDB_INVALID_ADDRESS;
     DWARFExpression length_expression(die.GetCU());
 
@@ -95,7 +95,7 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die)
                     linkage_name.SetCString(form_value.AsCString());
                     break;
                 case DW_AT_type:
-                    type_die_offset = form_value.Reference();
+                    type_attr_value = form_value;
                     break;
                 case DW_AT_data_member_location:
                     data_offset = form_value.Unsigned();
@@ -140,7 +140,8 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die)
         }
     }
 
-    Type *element_type = dwarf->ResolveTypeUID(type_die_offset);
+    DIERef type_die_ref(type_attr_value);
+    Type *element_type = dwarf->ResolveTypeUID(type_die_ref);
     if (!element_type)
         return nullptr;
 
@@ -150,7 +151,7 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die)
 
     Declaration decl;
     TypeSP type_sp(new Type(die.GetID(), dwarf, array_compiler_type.GetTypeName(), -1, nullptr,
-                            dwarf->MakeUserID(type_die_offset), Type::eEncodingIsUID, &decl,
+                            type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl,
                             array_compiler_type, Type::eResolveStateFull));
     type_sp->SetEncodingType(element_type);
     return type_sp;
@@ -163,7 +164,7 @@ DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die)
     dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
 
     Declaration decl;
-    lldb::user_id_t type_die_offset = DW_INVALID_OFFSET;
+    DWARFFormValue type_attr_value;
 
     DWARFAttributes attributes;
     const size_t num_attributes = die.GetAttributes(attributes);
@@ -176,7 +177,7 @@ DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die)
             switch (attr)
             {
                 case DW_AT_type:
-                    type_die_offset = form_value.Reference();
+                    type_attr_value = form_value;
                     break;
                 default:
                     assert(false && "Unsupported attribute for DW_TAG_array_type");
@@ -184,14 +185,15 @@ DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die)
         }
     }
 
-    Type *pointee_type = dwarf->ResolveTypeUID(type_die_offset);
+    DIERef type_die_ref(type_attr_value);
+    Type *pointee_type = dwarf->ResolveTypeUID(type_die_ref);
     if (!pointee_type)
         return nullptr;
 
     CompilerType pointee_compiler_type = pointee_type->GetForwardCompilerType();
     CompilerType reference_compiler_type = m_ast.CreateReferenceType(pointee_compiler_type);
     TypeSP type_sp(new Type(die.GetID(), dwarf, reference_compiler_type.GetTypeName(), -1, nullptr,
-                            dwarf->MakeUserID(type_die_offset), Type::eEncodingIsUID, &decl,
+                            type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl,
                             reference_compiler_type, Type::eResolveStateFull));
     type_sp->SetEncodingType(pointee_type);
     return type_sp;
@@ -463,7 +465,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType &
             case DW_TAG_member:
             {
                 const char *name = nullptr;
-                lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
+                DWARFFormValue encoding_uid;
                 uint32_t member_byte_offset = UINT32_MAX;
                 DWARFExpression member_location_expression(dwarf_cu);
                 bool artificial = true;
@@ -481,7 +483,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType &
                                 name = form_value.AsCString();
                                 break;
                             case DW_AT_type:
-                                encoding_uid = form_value.Reference();
+                                encoding_uid = form_value;
                                 break;
                             case DW_AT_data_member_location:
                                 if (form_value.BlockData())
@@ -508,7 +510,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType &
                     m_ast.SetDynamicTypeId(compiler_type, member_location_expression);
                 else
                 {
-                    if (Type *member_type = die.ResolveTypeUID(encoding_uid))
+                    if (Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid)))
                         m_ast.AddMemberToObject(compiler_type, ConstString(name), member_type->GetFullCompilerType(),
                                                 member_byte_offset);
                 }
@@ -516,7 +518,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType &
             }
             case DW_TAG_inheritance:
             {
-                lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
+                DWARFFormValue encoding_uid;
                 uint32_t member_byte_offset = UINT32_MAX;
 
                 DWARFAttributes attributes;
@@ -529,7 +531,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType &
                         switch (attributes.AttributeAtIndex(i))
                         {
                             case DW_AT_type:
-                                encoding_uid = form_value.Reference();
+                                encoding_uid = form_value;
                                 break;
                             case DW_AT_data_member_location:
                                 member_byte_offset = form_value.Unsigned();
@@ -543,7 +545,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType &
                         }
                     }
                 }
-                if (Type *base_type = die.ResolveTypeUID(encoding_uid))
+                if (Type *base_type = die.ResolveTypeUID(DIERef(encoding_uid)))
                     m_ast.AddBaseClassToObject(compiler_type, base_type->GetFullCompilerType(), member_byte_offset);
                 break;
             }
index 51dcb7c..d132801 100644 (file)
@@ -433,7 +433,7 @@ DWARFCompileUnit::GetID () const
 {
     dw_offset_t local_id = m_base_obj_offset != DW_INVALID_OFFSET ? m_base_obj_offset : m_offset;
     if (m_dwarf2Data)
-        return m_dwarf2Data->MakeUserID(local_id);
+        return DIERef(local_id, local_id).GetUID(m_dwarf2Data);
     else
         return local_id;
 }
@@ -631,7 +631,7 @@ DWARFCompileUnit::GetDIE (dw_offset_t die_offset)
         {
             // Don't specify the compile unit offset as we don't know it because the DIE belongs to
             // a different compile unit in the same symbol file.
-            return m_dwarf2Data->DebugInfo()->GetDIE (DIERef(die_offset));
+            return m_dwarf2Data->DebugInfo()->GetDIEForDIEOffset(die_offset);
         }
     }
     return DWARFDIE(); // Not found
index 0564de9..4963f85 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "DWARFDIE.h"
 
+#include "DWARFASTParser.h"
 #include "DWARFCompileUnit.h"
 #include "DWARFDebugAbbrev.h"
 #include "DWARFDebugAranges.h"
@@ -127,6 +128,21 @@ DWARFDIE::GetAttributeValueAsSigned (const dw_attr_t attr, int64_t fail_value) c
         return fail_value;
 }
 
+DWARFDIE
+DWARFDIE::GetAttributeValueAsReferenceDIE (const dw_attr_t attr) const
+{
+    if (IsValid())
+    {
+        DWARFCompileUnit *cu = GetCU();
+        SymbolFileDWARF *dwarf = cu->GetSymbolFileDWARF();
+        const bool check_specification_or_abstract_origin = true;
+        DWARFFormValue form_value;
+        if (m_die->GetAttributeValue(dwarf, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
+            return dwarf->GetDIE(DIERef(form_value));
+    }
+    return DWARFDIE();
+}
+
 uint64_t
 DWARFDIE::GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const
 {
@@ -166,7 +182,7 @@ DWARFDIE::LookupDeepestBlock (lldb::addr_t file_addr) const
                 if (cu->ContainsDIEOffset(block_die->GetOffset()))
                     return DWARFDIE(cu, block_die);
                 else
-                    return DWARFDIE(dwarf->DebugInfo()->GetCompileUnitContainingDIE(DIERef(cu->GetOffset(), block_die->GetOffset())), block_die);
+                    return DWARFDIE(dwarf->DebugInfo()->GetCompileUnit(DIERef(cu->GetOffset(), block_die->GetOffset())), block_die);
             }
         }
     }
@@ -176,27 +192,7 @@ DWARFDIE::LookupDeepestBlock (lldb::addr_t file_addr) const
 lldb::user_id_t
 DWARFDIE::GetID () const
 {
-    const dw_offset_t die_offset = GetOffset();
-    if (die_offset != DW_INVALID_OFFSET)
-    {
-        lldb::user_id_t id = 0;
-        SymbolFileDWARF *dwarf = GetDWARF();
-        if (dwarf)
-            id = dwarf->MakeUserID(die_offset);
-        else
-            id = die_offset;
-
-        if (m_cu)
-        {
-            lldb::user_id_t cu_id = m_cu->GetID()&0xffffffff00000000ull;
-            assert ((id&0xffffffff00000000ull) == 0 ||
-                    (cu_id&0xffffffff00000000ll) == 0 ||
-                    (id&0xffffffff00000000ull) == (cu_id&0xffffffff00000000ll));
-            id |= cu_id;
-        }
-        return id;
-    }
-    return LLDB_INVALID_UID;
+    return GetDIERef().GetUID(GetDWARF());
 }
 
 const char *
@@ -274,11 +270,11 @@ DWARFDIE::ResolveType () const
 }
 
 lldb_private::Type *
-DWARFDIE::ResolveTypeUID (lldb::user_id_t uid) const
+DWARFDIE::ResolveTypeUID (const DIERef &die_ref) const
 {
     SymbolFileDWARF *dwarf = GetDWARF();
     if (dwarf)
-        return dwarf->ResolveTypeUID(uid);
+        return dwarf->ResolveTypeUID(dwarf->GetDIE(die_ref), true);
     else
         return nullptr;
 }
@@ -530,6 +526,36 @@ DWARFDIE::Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const
 }
 
 
+CompilerDecl
+DWARFDIE::GetDecl () const
+{
+    DWARFASTParser *dwarf_ast = GetDWARFParser();
+    if (dwarf_ast)
+        return dwarf_ast->GetDeclForUIDFromDWARF(*this);
+    else
+        return CompilerDecl();
+}
+
+CompilerDeclContext
+DWARFDIE::GetDeclContext () const
+{
+    DWARFASTParser *dwarf_ast = GetDWARFParser();
+    if (dwarf_ast)
+        return dwarf_ast->GetDeclContextForUIDFromDWARF(*this);
+    else
+        return CompilerDeclContext();
+}
+
+CompilerDeclContext
+DWARFDIE::GetContainingDeclContext () const
+{
+    DWARFASTParser *dwarf_ast = GetDWARFParser();
+    if (dwarf_ast)
+        return dwarf_ast->GetDeclContextContainingUIDFromDWARF(*this);
+    else
+        return CompilerDeclContext();
+}
+
 bool operator == (const DWARFDIE &lhs, const DWARFDIE &rhs)
 {
     return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU();
index db37a45..2dcd1d7 100644 (file)
@@ -58,7 +58,7 @@ public:
     //----------------------------------------------------------------------
     // Tests
     //----------------------------------------------------------------------
-    operator bool () const
+    explicit operator bool () const
     {
         return IsValid();
     }
@@ -180,9 +180,11 @@ public:
     lldb_private::Type *
     ResolveType () const;
 
+    //----------------------------------------------------------------------
     // Resolve a type by UID using this DIE's DWARF file
+    //----------------------------------------------------------------------
     lldb_private::Type *
-    ResolveTypeUID (lldb::user_id_t uid) const;
+    ResolveTypeUID (const DIERef &die_ref) const;
 
     //----------------------------------------------------------------------
     // Functions for obtaining DIE relations and references
@@ -245,6 +247,9 @@ public:
     uint64_t
     GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const;
 
+    DWARFDIE
+    GetAttributeValueAsReferenceDIE (const dw_attr_t attr) const;
+
     uint64_t
     GetAttributeValueAsAddress (const dw_attr_t attr, uint64_t fail_value) const;
 
@@ -270,6 +275,15 @@ public:
     void
     Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const;
 
+    lldb_private::CompilerDecl
+    GetDecl () const;
+
+    lldb_private::CompilerDeclContext
+    GetDeclContext() const;
+
+    lldb_private::CompilerDeclContext
+    GetContainingDeclContext() const;
+
 protected:
     DWARFCompileUnit *m_cu;
     DWARFDebugInfoEntry *m_die;
index 9e021c7..e9f09fd 100644 (file)
 using namespace lldb_private;
 using namespace std;
 
-bool
-DWARFDIECollection::Insert(const DWARFDIE &die)
-{
-    iterator end_pos = m_dies.end();
-    iterator insert_pos = upper_bound(m_dies.begin(), end_pos, die);
-    if (insert_pos != end_pos && (*insert_pos == die))
-        return false;
-    m_dies.insert(insert_pos, die);
-    return true;
-}
-
 void
 DWARFDIECollection::Append (const DWARFDIE &die)
 {
index e39e1aa..83d58ec 100644 (file)
@@ -33,9 +33,6 @@ public:
     DWARFDIE
     GetDIEAtIndex (uint32_t idx) const;
 
-    bool
-    Insert(const DWARFDIE &die);
-
     size_t
     Size() const;
 
index a1b00d1..417f2cd 100644 (file)
@@ -209,48 +209,51 @@ DWARFDebugInfo::GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr)
 }
 
 DWARFCompileUnit *
-DWARFDebugInfo::GetCompileUnitContainingDIE (const DIERef& die_ref)
+DWARFDebugInfo::GetCompileUnit (const DIERef& die_ref)
 {
-    dw_offset_t search_offset = die_ref.die_offset;
-    bool is_cu_offset = false;
-    if (m_dwarf2Data->GetID() == 0 && die_ref.cu_offset != DW_INVALID_OFFSET)
-    {
-        is_cu_offset = true;
-        search_offset = die_ref.cu_offset;
-    }
+    if (die_ref.cu_offset == DW_INVALID_OFFSET)
+        return GetCompileUnitContainingDIEOffset(die_ref.die_offset);
+    else
+        return GetCompileUnit(die_ref.cu_offset);
+}
+
+DWARFCompileUnit*
+DWARFDebugInfo::GetCompileUnitContainingDIEOffset(dw_offset_t die_offset)
+{
+    ParseCompileUnitHeadersIfNeeded();
 
     DWARFCompileUnitSP cu_sp;
-    if (search_offset != DW_INVALID_OFFSET)
-    {
-        ParseCompileUnitHeadersIfNeeded();
 
-        // Watch out for single compile unit executable as they are pretty common
-        const size_t num_cus = m_compile_units.size();
-        if (num_cus == 1)
-        {
-            if ((is_cu_offset && m_compile_units[0]->GetOffset() == search_offset) ||
-                (!is_cu_offset && m_compile_units[0]->ContainsDIEOffset(search_offset)))
-            {
-                cu_sp = m_compile_units[0];
-            }
-        }
-        else if (num_cus)
+    // Watch out for single compile unit executable as they are pretty common
+    const size_t num_cus = m_compile_units.size();
+    if (num_cus == 1)
+    {
+        if (m_compile_units[0]->ContainsDIEOffset(die_offset))
+            return m_compile_units[0].get();
+    }
+    else if (num_cus)
+    {
+        CompileUnitColl::const_iterator end_pos = m_compile_units.end();
+        CompileUnitColl::const_iterator begin_pos = m_compile_units.begin();
+        CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, die_offset, OffsetLessThanCompileUnitOffset);
+        if (pos != begin_pos)
         {
-            CompileUnitColl::const_iterator end_pos = m_compile_units.end();
-            CompileUnitColl::const_iterator begin_pos = m_compile_units.begin();
-            CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, search_offset, OffsetLessThanCompileUnitOffset);
-            if (pos != begin_pos)
-            {
-                --pos;
-                if ((is_cu_offset && (*pos)->GetOffset() == search_offset) ||
-                    (!is_cu_offset && (*pos)->ContainsDIEOffset(search_offset)))
-                {
-                    cu_sp = *pos;
-                }
-            }
+            --pos;
+            if ((*pos)->ContainsDIEOffset(die_offset))
+                return (*pos).get();
         }
     }
-    return cu_sp.get();
+
+    return nullptr;
+}
+
+DWARFDIE
+DWARFDebugInfo::GetDIEForDIEOffset(dw_offset_t die_offset)
+{
+    DWARFCompileUnit* cu = GetCompileUnitContainingDIEOffset(die_offset);
+    if (cu)
+        return cu->GetDIE(die_offset);
+    return DWARFDIE();
 }
 
 //----------------------------------------------------------------------
@@ -261,7 +264,7 @@ DWARFDebugInfo::GetCompileUnitContainingDIE (const DIERef& die_ref)
 DWARFDIE
 DWARFDebugInfo::GetDIE(const DIERef& die_ref)
 {
-    DWARFCompileUnit *cu = GetCompileUnitContainingDIE(die_ref);
+    DWARFCompileUnit *cu = GetCompileUnit(die_ref);
     if (cu)
         return cu->GetDIE (die_ref.die_offset);
     return DWARFDIE();    // Not found
index ea2e204..7783135 100644 (file)
@@ -39,9 +39,10 @@ public:
     size_t GetNumCompileUnits();
     bool ContainsCompileUnit (const DWARFCompileUnit *cu) const;
     DWARFCompileUnit* GetCompileUnitAtIndex (uint32_t idx);
-    DWARFCompileUnit* GetCompileUnit (dw_offset_t cu_offset, uint32_t* idx_ptr = NULL);
-    DWARFCompileUnit* GetCompileUnitContainingDIE (const DIERef& die_ref);
-
+    DWARFCompileUnit* GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr = NULL);
+    DWARFCompileUnit* GetCompileUnitContainingDIEOffset (dw_offset_t die_offset);
+    DWARFCompileUnit* GetCompileUnit(const DIERef& die_ref);
+    DWARFDIE GetDIEForDIEOffset(dw_offset_t die_offset);
     DWARFDIE GetDIE (const DIERef& die_ref);
 
     void Dump(lldb_private::Stream *s, const uint32_t die_offset, const uint32_t recurse_depth);
index 02bbff8..27b4fe9 100644 (file)
@@ -115,6 +115,13 @@ public:
                     DWARFAttributes& attrs,
                     uint32_t curr_depth = 0) const; // "curr_depth" for internal use only, don't set this yourself!!!
 
+    dw_offset_t GetAttributeValue(SymbolFileDWARF* dwarf2Data,
+                                  const DWARFCompileUnit* cu,
+                                  const dw_attr_t attr,
+                                  DWARFFormValue& formValue,
+                                  dw_offset_t* end_attr_offset_ptr = nullptr,
+                                  bool check_specification_or_abstract_origin = false) const;
+
     const char* GetAttributeValueAsString(
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
@@ -382,12 +389,6 @@ public:
                        DWARFDebugInfoEntry::collection &die_collection);
 
 protected:
-    dw_offset_t GetAttributeValue(SymbolFileDWARF* dwarf2Data,
-                                  const DWARFCompileUnit* cu,
-                                  const dw_attr_t attr,
-                                  DWARFFormValue& formValue,
-                                  dw_offset_t* end_attr_offset_ptr = nullptr,
-                                  bool check_specification_or_abstract_origin = false) const;
 
     dw_offset_t m_offset;           // Offset within the .debug_info of the start of this entry
     uint32_t    m_parent_idx;       // How many to subtract from "this" to get the parent. If zero this die has no parent
index a0ed973..addc148 100644 (file)
@@ -167,6 +167,14 @@ DWARFFormValue::DWARFFormValue(const DWARFCompileUnit* cu, dw_form_t form) :
 {
 }
 
+void
+DWARFFormValue::Clear()
+{
+    m_cu = nullptr;
+    m_form = 0;
+    memset(&m_value, 0, sizeof(m_value));
+}
+
 bool
 DWARFFormValue::ExtractValue(const DWARFDataExtractor& data, lldb::offset_t* offset_ptr)
 {
index b10f4d3..07bd038 100644 (file)
@@ -101,6 +101,7 @@ public:
     static FixedFormSizes GetFixedFormSizesForAddressSize (uint8_t addr_size, bool is_dwarf64);
     static int          Compare (const DWARFFormValue& a, 
                                  const DWARFFormValue& b);
+    void                Clear();
 protected:
     const DWARFCompileUnit* m_cu; // Compile unit for this form
     dw_form_t   m_form;     // Form for this value
index e161c08..36f4d2b 100644 (file)
@@ -279,9 +279,11 @@ SymbolFileDWARF::CreateInstance (ObjectFile* obj_file)
 TypeList *          
 SymbolFileDWARF::GetTypeList ()
 {
-    if (GetDebugMapSymfile ())
-        return m_debug_map_symfile->GetTypeList();
-    return m_obj_file->GetModule()->GetTypeList();
+    SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+    if (debug_map_symfile)
+        return debug_map_symfile->GetTypeList();
+    else
+        return m_obj_file->GetModule()->GetTypeList();
 
 }
 void
@@ -485,15 +487,17 @@ GetDWARFMachOSegmentName ()
 UniqueDWARFASTTypeMap &
 SymbolFileDWARF::GetUniqueDWARFASTTypeMap ()
 {
-    if (GetDebugMapSymfile ())
-        return m_debug_map_symfile->GetUniqueDWARFASTTypeMap ();
-    return m_unique_ast_type_map;
+    SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+    if (debug_map_symfile)
+        return debug_map_symfile->GetUniqueDWARFASTTypeMap ();
+    else
+        return m_unique_ast_type_map;
 }
 
 TypeSystem *
 SymbolFileDWARF::GetTypeSystemForLanguage (LanguageType language)
 {
-    SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile ();
+    SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
     TypeSystem *type_system;
     if (debug_map_symfile)
     {
@@ -825,30 +829,13 @@ SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit)
     DWARFDebugInfo* info = DebugInfo();
     if (info)
     {
-        if (GetDebugMapSymfile ())
-        {
-            // The debug map symbol file made the compile units for this DWARF
-            // file which is .o file with DWARF in it, and we should have
-            // only 1 compile unit which is at offset zero in the DWARF.
-            // TODO: modify to support LTO .o files where each .o file might
-            // have multiple DW_TAG_compile_unit tags.
-            
-            DWARFCompileUnit *dwarf_cu = info->GetCompileUnit(0);
-            if (dwarf_cu && dwarf_cu->GetUserData() == NULL)
-                dwarf_cu->SetUserData(comp_unit);
-            return dwarf_cu;
-        }
-        else
-        {
-            // Just a normal DWARF file whose user ID for the compile unit is
-            // the DWARF offset itself
-
-            DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID());
-            if (dwarf_cu && dwarf_cu->GetUserData() == NULL)
-                dwarf_cu->SetUserData(comp_unit);
-            return dwarf_cu;
+        // Just a normal DWARF file whose user ID for the compile unit is
+        // the DWARF offset itself
 
-        }
+        DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID());
+        if (dwarf_cu && dwarf_cu->GetUserData() == NULL)
+            dwarf_cu->SetUserData(comp_unit);
+        return dwarf_cu;
     }
     return NULL;
 }
@@ -895,7 +882,7 @@ SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
             {
                 return dwarf_cu->GetSymbolFileDWARF()->ParseCompileUnit(dwarf_cu, cu_idx);
             }
-            else if (GetDebugMapSymfile ())
+            else if (dwarf_cu->GetOffset() == 0 && GetDebugMapSymfile ())
             {
                 // Let the debug map create the compile unit
                 cu_sp = m_debug_map_symfile->GetCompileUnit(this);
@@ -1009,7 +996,7 @@ SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, const DWARFD
 bool
 SymbolFileDWARF::FixupAddress (Address &addr)
 {
-    SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile ();
+    SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile();
     if (debug_map_symfile)
     {
         return debug_map_symfile->LinkOSOAddress(addr);
@@ -1230,13 +1217,14 @@ SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc)
 
                     lldb::offset_t offset = cu_line_offset;
                     DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset, ParseDWARFLineTableCallback, &info);
-                    if (m_debug_map_symfile)
+                    SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+                    if (debug_map_symfile)
                     {
                         // We have an object file that has a line table with addresses
                         // that are not linked. We need to link the line table and convert
                         // the addresses that are relative to the .o file into addresses
                         // for the main executable.
-                        sc.comp_unit->SetLineTable (m_debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get()));
+                        sc.comp_unit->SetLineTable (debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get()));
                     }
                     else
                     {
@@ -1474,60 +1462,27 @@ SymbolFileDWARF::ParseDeclsForContext (CompilerDeclContext decl_ctx)
 CompilerDecl
 SymbolFileDWARF::GetDeclForUID (lldb::user_id_t type_uid)
 {
-    if (UserIDMatches(type_uid))
-    {
-        DWARFDebugInfo* debug_info = DebugInfo();
-        if (debug_info)
-        {
-            DWARFDIE die = debug_info->GetDIE(DIERef(type_uid));
-            if (die)
-            {
-                DWARFASTParser *dwarf_ast = die.GetDWARFParser();
-                if (dwarf_ast)
-                    return dwarf_ast->GetDeclForUIDFromDWARF(die);
-            }
-        }
-    }
+    DWARFDIE die = GetDIE(DIERef(type_uid, this));
+    if (die)
+        return die.GetDecl();
     return CompilerDecl();
 }
 
 CompilerDeclContext
 SymbolFileDWARF::GetDeclContextForUID (lldb::user_id_t type_uid)
 {
-    if (UserIDMatches(type_uid))
-    {
-        DWARFDebugInfo* debug_info = DebugInfo();
-        if (debug_info)
-        {
-            DWARFDIE die = debug_info->GetDIE(DIERef(type_uid));
-            if (die)
-            {
-                DWARFASTParser *dwarf_ast = die.GetDWARFParser();
-                if (dwarf_ast)
-                    return dwarf_ast->GetDeclContextForUIDFromDWARF(die);
-            }
-        }
-    }
+    DWARFDIE die = GetDIE(DIERef(type_uid, this));
+    if (die)
+        return die.GetDeclContext();
     return CompilerDeclContext();
 }
 
 CompilerDeclContext
 SymbolFileDWARF::GetDeclContextContainingUID (lldb::user_id_t type_uid)
 {
-    if (UserIDMatches(type_uid))
-    {
-        DWARFDebugInfo* debug_info = DebugInfo();
-        if (debug_info)
-        {
-            DWARFDIE die = debug_info->GetDIE(DIERef(type_uid));
-            if (die)
-            {
-                DWARFASTParser *dwarf_ast = die.GetDWARFParser();
-                if (dwarf_ast)
-                    return dwarf_ast->GetDeclContextContainingUIDFromDWARF(die);
-            }
-        }
-    }
+    DWARFDIE die = GetDIE (DIERef(type_uid, this));
+    if (die)
+        return die.GetContainingDeclContext();
     return CompilerDeclContext();
 }
 
@@ -1535,23 +1490,22 @@ SymbolFileDWARF::GetDeclContextContainingUID (lldb::user_id_t type_uid)
 Type*
 SymbolFileDWARF::ResolveTypeUID (lldb::user_id_t type_uid)
 {
-    if (UserIDMatches(type_uid))
+    DWARFDIE type_die = GetDIE (DIERef(type_uid, this));
+    if (type_die)
     {
-        DWARFDebugInfo* debug_info = DebugInfo();
-        if (debug_info)
-        {
-            DWARFDIE type_die = debug_info->GetDIE (DIERef(type_uid));
-            if (type_die)
-            {
-                const bool assert_not_being_parsed = true;
-                return ResolveTypeUID (type_die, assert_not_being_parsed);
-            }
-        }
+        const bool assert_not_being_parsed = true;
+        return ResolveTypeUID (type_die, assert_not_being_parsed);
     }
     return NULL;
 }
 
 Type*
+SymbolFileDWARF::ResolveTypeUID (const DIERef &die_ref)
+{
+    return ResolveType (GetDIE(die_ref), true);
+}
+
+Type*
 SymbolFileDWARF::ResolveTypeUID (const DWARFDIE &die, bool assert_not_being_parsed)
 {    
     if (die)
@@ -1642,30 +1596,29 @@ SymbolFileDWARF::CompleteType (CompilerType &compiler_type)
         return true;
     }
 
-    DWARFDebugInfo* debug_info = DebugInfo();
-    DWARFDIE dwarf_die = debug_info->GetDIE(die_it->getSecond());
-
-    assert(UserIDMatches(die_it->getSecond().GetUID()) && "CompleteType called on the wrong SymbolFile");
-
-    // Once we start resolving this type, remove it from the forward declaration
-    // map in case anyone child members or other types require this type to get resolved.
-    // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition
-    // are done.
-    GetForwardDeclClangTypeToDie().erase (die_it);
+    DWARFDIE dwarf_die = GetDIE(die_it->getSecond());
+    if (dwarf_die)
+    {
+        // Once we start resolving this type, remove it from the forward declaration
+        // map in case anyone child members or other types require this type to get resolved.
+        // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition
+        // are done.
+        GetForwardDeclClangTypeToDie().erase (die_it);
 
-    Type *type = GetDIEToType().lookup (dwarf_die.GetDIE());
+        Type *type = GetDIEToType().lookup (dwarf_die.GetDIE());
 
-    Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
-    if (log)
-        GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
-                                                                  "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...",
-                                                                  dwarf_die.GetID(),
-                                                                  dwarf_die.GetTagAsCString(),
-                                                                  type->GetName().AsCString());
-    assert (compiler_type);
-    DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser();
-    if (dwarf_ast)
-        return dwarf_ast->CompleteTypeFromDWARF (dwarf_die, type, compiler_type);
+        Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
+        if (log)
+            GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
+                                                                      "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...",
+                                                                      dwarf_die.GetID(),
+                                                                      dwarf_die.GetTagAsCString(),
+                                                                      type->GetName().AsCString());
+        assert (compiler_type);
+        DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser();
+        if (dwarf_ast)
+            return dwarf_ast->CompleteTypeFromDWARF (dwarf_die, type, compiler_type);
+    }
     return false;
 }
 
@@ -1674,10 +1627,7 @@ SymbolFileDWARF::ResolveType (const DWARFDIE &die, bool assert_not_being_parsed,
 {
     if (die)
     {
-        Type *type = GetDIEToType().lookup (die.GetDIE());
-
-        if (type == NULL)
-            type = GetTypeForDIE (die, resolve_function_context).get();
+        Type *type = GetTypeForDIE (die, resolve_function_context).get();
 
         if (assert_not_being_parsed)
         { 
@@ -1763,6 +1713,17 @@ SymbolFileDWARF::GetDWOModule (ConstString name)
         return lldb::ModuleSP();
 }
 
+DWARFDIE
+SymbolFileDWARF::GetDIE (const DIERef &die_ref)
+{
+    DWARFDebugInfo * debug_info = DebugInfo();
+    if (debug_info)
+        return debug_info->GetDIE(die_ref);
+    else
+        return DWARFDIE();
+}
+
+
 std::unique_ptr<SymbolFileDWARFDwo>
 SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die)
 {
@@ -2330,12 +2291,11 @@ SymbolFileDWARF::FindGlobalVariables (const ConstString &name, const CompilerDec
         sc.module_sp = m_obj_file->GetModule();
         assert (sc.module_sp);
 
-        DWARFDebugInfo* debug_info = DebugInfo();
         bool done = false;
         for (size_t i=0; i<num_die_matches && !done; ++i)
         {
             const DIERef& die_ref = die_offsets[i];
-            DWARFDIE die = debug_info->GetDIE (die_ref);
+            DWARFDIE die = GetDIE (die_ref);
 
             if (die)
             {
@@ -2448,11 +2408,10 @@ SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append
     const size_t num_matches = die_offsets.size();
     if (num_matches)
     {
-        DWARFDebugInfo* debug_info = DebugInfo();
         for (size_t i=0; i<num_matches; ++i)
         {
             const DIERef& die_ref = die_offsets[i];
-            DWARFDIE die = debug_info->GetDIE (die_ref);
+            DWARFDIE die = GetDIE (die_ref);
             
             if (die)
             {
@@ -3098,11 +3057,10 @@ SymbolFileDWARF::FindTypes (const SymbolContext& sc,
     if (num_die_matches)
     {
         const uint32_t initial_types_size = types.GetSize();
-        DWARFDebugInfo* debug_info = DebugInfo();
         for (size_t i=0; i<num_die_matches; ++i)
         {
             const DIERef& die_ref = die_offsets[i];
-            DWARFDIE die = debug_info->GetDIE (die_ref);
+            DWARFDIE die = GetDIE (die_ref);
 
             if (die)
             {
@@ -3221,11 +3179,10 @@ SymbolFileDWARF::FindTypes (const std::vector<CompilerContext> &context,
     if (num_die_matches)
     {
         size_t num_matches = 0;
-        DWARFDebugInfo* debug_info = DebugInfo();
         for (size_t i=0; i<num_die_matches; ++i)
         {
             const DIERef& die_ref = die_offsets[i];
-            DWARFDIE die = debug_info->GetDIE (die_ref);
+            DWARFDIE die = GetDIE (die_ref);
 
             if (die)
             {
@@ -3304,11 +3261,10 @@ SymbolFileDWARF::FindNamespace (const SymbolContext& sc,
         const size_t num_matches = die_offsets.size();
         if (num_matches)
         {
-            DWARFDebugInfo* debug_info = DebugInfo();
             for (size_t i=0; i<num_matches; ++i)
             {
                 const DIERef& die_ref = die_offsets[i];
-                DWARFDIE die = debug_info->GetDIE (die_ref);
+                DWARFDIE die = GetDIE (die_ref);
 
                 if (die)
                 {
@@ -3523,11 +3479,10 @@ SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
     
     if (num_matches)
     {
-        DWARFDebugInfo* debug_info = DebugInfo();
         for (size_t i=0; i<num_matches; ++i)
         {
             const DIERef& die_ref = die_offsets[i];
-            DWARFDIE type_die = debug_info->GetDIE (die_ref);
+            DWARFDIE type_die = GetDIE (die_ref);
             
             if (type_die)
             {
@@ -3747,11 +3702,10 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &
             
             if (num_matches)
             {
-                DWARFDebugInfo* debug_info = DebugInfo();
                 for (size_t i=0; i<num_matches; ++i)
                 {
                     const DIERef& die_ref = die_offsets[i];
-                    DWARFDIE type_die = debug_info->GetDIE (die_ref);
+                    DWARFDIE type_die = GetDIE (die_ref);
                     
                     if (type_die)
                     {
@@ -3995,7 +3949,7 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc)
         
         if (sc.function)
         {
-            DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID()));
+            DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID(), this));
             
             const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress (DW_AT_low_pc, LLDB_INVALID_ADDRESS);
             if (func_lo_pc != LLDB_INVALID_ADDRESS)
@@ -4050,11 +4004,10 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc)
                 const size_t num_matches = die_offsets.size();
                 if (num_matches)
                 {
-                    DWARFDebugInfo* debug_info = DebugInfo();
                     for (size_t i=0; i<num_matches; ++i)
                     {
                         const DIERef& die_ref = die_offsets[i];
-                        DWARFDIE die = debug_info->GetDIE (die_ref);
+                        DWARFDIE die = GetDIE (die_ref);
                         if (die)
                         {
                             VariableSP var_sp (ParseVariableDIE(sc, die, LLDB_INVALID_ADDRESS));
@@ -4233,11 +4186,7 @@ SymbolFileDWARF::ParseVariableDIE
                         }
                         break;
                     case DW_AT_specification:
-                        {
-                            DWARFDebugInfo* debug_info = DebugInfo();
-                            if (debug_info)
-                                spec_die = debug_info->GetDIE(DIERef(form_value));
-                        }
+                        spec_die = GetDIE(DIERef(form_value));
                         break;
                     case DW_AT_start_scope:
                         {
@@ -4350,7 +4299,7 @@ SymbolFileDWARF::ParseVariableDIE
                         scope = eValueTypeVariableStatic;
                     
                     
-                    SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile ();
+                    SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
                     
                     if (debug_map_symfile)
                     {
@@ -4456,7 +4405,7 @@ SymbolFileDWARF::ParseVariableDIE
 
             if (symbol_context_scope)
             {
-                SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID()));
+                SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID(this)));
 
                 if (const_value.Form() && type_sp && type_sp->GetType())
                     location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), die.GetCU()->GetAddressByteSize());
@@ -4615,7 +4564,7 @@ SymbolFileDWARF::ParseVariables (const SymbolContext& sc,
                                     // a concrete block counterpart in the current function. We need
                                     // to find the concrete block so we can correctly add the 
                                     // variable to it
-                                    const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID()),
+                                    const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID(), this),
                                                                                                           sc_parent_die.GetOffset());
                                     if (concrete_block_die)
                                         block = sc.function->GetBlock(true).FindBlockByID(concrete_block_die.GetID());
@@ -4706,7 +4655,7 @@ SymbolFileDWARF::DumpIndexes ()
 
 
 SymbolFileDWARFDebugMap *
-SymbolFileDWARF::GetDebugMapSymfile ()
+SymbolFileDWARF::GetDebugMapSymfile()
 {
     if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired())
     {
index fa7f12d..529284e 100644 (file)
@@ -68,7 +68,9 @@ public:
     friend class SymbolFileDWARFDebugMap;
     friend class SymbolFileDWARFDwo;
     friend class DebugMapModule;
+    friend class DIERef;
     friend class DWARFCompileUnit;
+    friend class DWARFDIE;
     friend class DWARFASTParserClang;
     friend class DWARFASTParserGo;
     friend class DWARFASTParserJava;
@@ -302,12 +304,6 @@ public:
     GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu,
                                 uint32_t cu_idx = UINT32_MAX);
 
-    lldb::user_id_t
-    MakeUserID (dw_offset_t die_offset) const
-    {
-        return GetID() | die_offset;
-    }
-
     size_t
     GetObjCMethodDIEOffsets (lldb_private::ConstString class_name,
                              DIEArray &method_die_offsets);
@@ -330,6 +326,9 @@ public:
     lldb::ModuleSP
     GetDWOModule (lldb_private::ConstString name);
 
+    DWARFDIE
+    GetDIE(const DIERef &die_ref);
+
     virtual std::unique_ptr<SymbolFileDWARFDwo>
     GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die);
 
@@ -393,8 +392,10 @@ protected:
                bool *type_is_new);
 
     lldb_private::Type *
-    ResolveTypeUID (const DWARFDIE &die,
-                    bool assert_not_being_parsed);
+    ResolveTypeUID(const DWARFDIE &die, bool assert_not_being_parsed);
+
+    lldb_private::Type *
+    ResolveTypeUID(const DIERef &die_ref);
 
     lldb::VariableSP
     ParseVariableDIE(const lldb_private::SymbolContext& sc,
@@ -489,15 +490,6 @@ protected:
     GetUniqueDWARFASTTypeMap ();
     
     bool
-    UserIDMatches (lldb::user_id_t uid) const
-    {
-        const lldb::user_id_t high_uid = uid & 0xffffffff00000000ull;
-        if (high_uid != 0 && GetID() != 0)
-            return high_uid == GetID();
-        return true;
-    }
-    
-    bool
     DIEDeclContextsMatch (const DWARFDIE &die1,
                           const DWARFDIE &die2);
     
index 25a4e19..a9929ef 100644 (file)
@@ -107,10 +107,11 @@ protected:
         kNumFlags
     };
 
-    friend class DWARFCompileUnit;
-    friend class SymbolFileDWARF;
     friend class DebugMapModule;
+    friend class DIERef;
     friend class DWARFASTParserClang;
+    friend class DWARFCompileUnit;
+    friend class SymbolFileDWARF;
     struct OSOInfo
     {
         lldb::ModuleSP module_sp;