[Lldb-commits] [lldb] r247132 - Add basic fission support to SymbolFileDWARF

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Wed Sep 9 03:20:48 PDT 2015


Author: tberghammer
Date: Wed Sep  9 05:20:48 2015
New Revision: 247132

URL: http://llvm.org/viewvc/llvm-project?rev=247132&view=rev
Log:
Add basic fission support to SymbolFileDWARF

* Create new dwo symbol file class
* Add handling for .dwo sections
* Change indexes in SymbolFileDWARF to store compile unit offset next to
  DIE offset
* Propagate queries from dwarf compile unit to the dwo compile unit
  where applicable

Differential revision: http://reviews.llvm.org/D12291

Added:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
Modified:
    lldb/trunk/include/lldb/Symbol/ObjectFile.h
    lldb/trunk/lldb.xcodeproj/project.pbxproj
    lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
    lldb/trunk/source/Symbol/ObjectFile.cpp

Modified: lldb/trunk/include/lldb/Symbol/ObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ObjectFile.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ObjectFile.h (original)
+++ lldb/trunk/include/lldb/Symbol/ObjectFile.h Wed Sep  9 05:20:48 2015
@@ -368,7 +368,7 @@ public:
     ///     The list of sections contained in this object file.
     //------------------------------------------------------------------
     virtual SectionList *
-    GetSectionList ();
+    GetSectionList (bool update_module_section_list = true);
 
     virtual void
     CreateSections (SectionList &unified_section_list) = 0;

Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Wed Sep  9 05:20:48 2015
@@ -708,6 +708,9 @@
 		6D55BAEE1A8CD0B200A70529 /* PlatformAndroidRemoteGDBServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D55BAEB1A8CD08C00A70529 /* PlatformAndroidRemoteGDBServer.cpp */; };
 		6D762BEE1B1605D2006C929D /* LLDBServerUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D762BEC1B1605CD006C929D /* LLDBServerUtilities.cpp */; };
 		6D86CEA01B440F8500A7FBFA /* CommandObjectBugreport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D86CE9E1B440F6B00A7FBFA /* CommandObjectBugreport.cpp */; };
+		6D95DC001B9DC057000E318A /* DIERef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D95DBFD1B9DC057000E318A /* DIERef.cpp */; };
+		6D95DC011B9DC057000E318A /* HashedNameToDIE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D95DBFE1B9DC057000E318A /* HashedNameToDIE.cpp */; };
+		6D95DC021B9DC057000E318A /* SymbolFileDWARFDwo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D95DBFF1B9DC057000E318A /* SymbolFileDWARFDwo.cpp */; };
 		8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; };
 		8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; };
 		8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */; };
@@ -2385,6 +2388,11 @@
 		6D762BED1B1605CD006C929D /* LLDBServerUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LLDBServerUtilities.h; path = "tools/lldb-server/LLDBServerUtilities.h"; sourceTree = "<group>"; };
 		6D86CE9E1B440F6B00A7FBFA /* CommandObjectBugreport.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CommandObjectBugreport.cpp; path = source/Commands/CommandObjectBugreport.cpp; sourceTree = "<group>"; };
 		6D86CE9F1B440F6B00A7FBFA /* CommandObjectBugreport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CommandObjectBugreport.h; path = source/Commands/CommandObjectBugreport.h; sourceTree = "<group>"; };
+		6D95DBFD1B9DC057000E318A /* DIERef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DIERef.cpp; sourceTree = "<group>"; };
+		6D95DBFE1B9DC057000E318A /* HashedNameToDIE.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashedNameToDIE.cpp; sourceTree = "<group>"; };
+		6D95DBFF1B9DC057000E318A /* SymbolFileDWARFDwo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SymbolFileDWARFDwo.cpp; sourceTree = "<group>"; };
+		6D95DC031B9DC06F000E318A /* DIERef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DIERef.h; sourceTree = "<group>"; };
+		6D95DC041B9DC06F000E318A /* SymbolFileDWARFDwo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolFileDWARFDwo.h; sourceTree = "<group>"; };
 		8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MemoryHistory.cpp; path = source/Target/MemoryHistory.cpp; sourceTree = "<group>"; };
 		8C2D6A54197A1EBE006989C9 /* MemoryHistory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MemoryHistory.h; path = include/lldb/Target/MemoryHistory.h; sourceTree = "<group>"; };
 		8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryHistoryASan.cpp; sourceTree = "<group>"; };
@@ -3115,6 +3123,11 @@
 		260C89B210F57C5600BB2B04 /* DWARF */ = {
 			isa = PBXGroup;
 			children = (
+				6D95DC031B9DC06F000E318A /* DIERef.h */,
+				6D95DC041B9DC06F000E318A /* SymbolFileDWARFDwo.h */,
+				6D95DBFD1B9DC057000E318A /* DIERef.cpp */,
+				6D95DBFE1B9DC057000E318A /* HashedNameToDIE.cpp */,
+				6D95DBFF1B9DC057000E318A /* SymbolFileDWARFDwo.cpp */,
 				260C89B310F57C5600BB2B04 /* DWARFAbbreviationDeclaration.cpp */,
 				260C89B410F57C5600BB2B04 /* DWARFAbbreviationDeclaration.h */,
 				269DDD451B8FD01A00D0DBD8 /* DWARFASTParser.h */,
@@ -6258,6 +6271,7 @@
 				2689005C13353E0400698AC0 /* ValueObjectVariable.cpp in Sources */,
 				264A58EE1A7DBCAD00A6B1B0 /* OptionValueFormatEntity.cpp in Sources */,
 				8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */,
+				6D95DC021B9DC057000E318A /* SymbolFileDWARFDwo.cpp in Sources */,
 				942612F71B95000000EF842E /* LanguageCategory.cpp in Sources */,
 				2689005D13353E0400698AC0 /* VMRange.cpp in Sources */,
 				2689005E13353E0E00698AC0 /* ClangASTSource.cpp in Sources */,
@@ -6319,6 +6333,7 @@
 				2689008313353E2200698AC0 /* CommandObjectMultiword.cpp in Sources */,
 				2689008413353E2200698AC0 /* CommandObjectRegexCommand.cpp in Sources */,
 				2689008513353E2200698AC0 /* CommandReturnObject.cpp in Sources */,
+				6D95DC001B9DC057000E318A /* DIERef.cpp in Sources */,
 				3FDFE53519A29327009756A7 /* HostInfoBase.cpp in Sources */,
 				26474CBE18D0CB2D0073DEBA /* RegisterContextMach_i386.cpp in Sources */,
 				2689008613353E2200698AC0 /* Options.cpp in Sources */,
@@ -6487,6 +6502,7 @@
 				26744EF31338317700EF765A /* GDBRemoteCommunicationServer.cpp in Sources */,
 				264A97BF133918BC0017F0BE /* PlatformRemoteGDBServer.cpp in Sources */,
 				EB8375E71B553DE800BA907D /* ThreadPlanCallFunctionUsingABI.cpp in Sources */,
+				6D95DC011B9DC057000E318A /* HashedNameToDIE.cpp in Sources */,
 				2697A54D133A6305004E4240 /* PlatformDarwin.cpp in Sources */,
 				26651A18133BF9E0005B64B7 /* Opcode.cpp in Sources */,
 				3FDFED0B19B7C8DE009756A7 /* HostThreadMacOSX.mm in Sources */,

Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Wed Sep  9 05:20:48 2015
@@ -1684,6 +1684,12 @@ ObjectFileELF::CreateSections(SectionLis
             static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
             static ConstString g_sect_name_dwarf_debug_str (".debug_str");
             static ConstString g_sect_name_dwarf_debug_str_offsets (".debug_str_offsets");
+            static ConstString g_sect_name_dwarf_debug_abbrev_dwo (".debug_abbrev.dwo");
+            static ConstString g_sect_name_dwarf_debug_info_dwo (".debug_info.dwo");
+            static ConstString g_sect_name_dwarf_debug_line_dwo (".debug_line.dwo");
+            static ConstString g_sect_name_dwarf_debug_loc_dwo (".debug_loc.dwo");
+            static ConstString g_sect_name_dwarf_debug_str_dwo (".debug_str.dwo");
+            static ConstString g_sect_name_dwarf_debug_str_offsets_dwo (".debug_str_offsets.dwo");
             static ConstString g_sect_name_eh_frame (".eh_frame");
 
             SectionType sect_type = eSectionTypeOther;
@@ -1717,20 +1723,26 @@ ObjectFileELF::CreateSections(SectionLis
             // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
             // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
             // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
-            else if (name == g_sect_name_dwarf_debug_abbrev)      sect_type = eSectionTypeDWARFDebugAbbrev;
-            else if (name == g_sect_name_dwarf_debug_addr)        sect_type = eSectionTypeDWARFDebugAddr;
-            else if (name == g_sect_name_dwarf_debug_aranges)     sect_type = eSectionTypeDWARFDebugAranges;
-            else if (name == g_sect_name_dwarf_debug_frame)       sect_type = eSectionTypeDWARFDebugFrame;
-            else if (name == g_sect_name_dwarf_debug_info)        sect_type = eSectionTypeDWARFDebugInfo;
-            else if (name == g_sect_name_dwarf_debug_line)        sect_type = eSectionTypeDWARFDebugLine;
-            else if (name == g_sect_name_dwarf_debug_loc)         sect_type = eSectionTypeDWARFDebugLoc;
-            else if (name == g_sect_name_dwarf_debug_macinfo)     sect_type = eSectionTypeDWARFDebugMacInfo;
-            else if (name == g_sect_name_dwarf_debug_pubnames)    sect_type = eSectionTypeDWARFDebugPubNames;
-            else if (name == g_sect_name_dwarf_debug_pubtypes)    sect_type = eSectionTypeDWARFDebugPubTypes;
-            else if (name == g_sect_name_dwarf_debug_ranges)      sect_type = eSectionTypeDWARFDebugRanges;
-            else if (name == g_sect_name_dwarf_debug_str)         sect_type = eSectionTypeDWARFDebugStr;
-            else if (name == g_sect_name_dwarf_debug_str_offsets) sect_type = eSectionTypeDWARFDebugStrOffsets;
-            else if (name == g_sect_name_eh_frame)                sect_type = eSectionTypeEHFrame;
+            else if (name == g_sect_name_dwarf_debug_abbrev)          sect_type = eSectionTypeDWARFDebugAbbrev;
+            else if (name == g_sect_name_dwarf_debug_addr)            sect_type = eSectionTypeDWARFDebugAddr;
+            else if (name == g_sect_name_dwarf_debug_aranges)         sect_type = eSectionTypeDWARFDebugAranges;
+            else if (name == g_sect_name_dwarf_debug_frame)           sect_type = eSectionTypeDWARFDebugFrame;
+            else if (name == g_sect_name_dwarf_debug_info)            sect_type = eSectionTypeDWARFDebugInfo;
+            else if (name == g_sect_name_dwarf_debug_line)            sect_type = eSectionTypeDWARFDebugLine;
+            else if (name == g_sect_name_dwarf_debug_loc)             sect_type = eSectionTypeDWARFDebugLoc;
+            else if (name == g_sect_name_dwarf_debug_macinfo)         sect_type = eSectionTypeDWARFDebugMacInfo;
+            else if (name == g_sect_name_dwarf_debug_pubnames)        sect_type = eSectionTypeDWARFDebugPubNames;
+            else if (name == g_sect_name_dwarf_debug_pubtypes)        sect_type = eSectionTypeDWARFDebugPubTypes;
+            else if (name == g_sect_name_dwarf_debug_ranges)          sect_type = eSectionTypeDWARFDebugRanges;
+            else if (name == g_sect_name_dwarf_debug_str)             sect_type = eSectionTypeDWARFDebugStr;
+            else if (name == g_sect_name_dwarf_debug_str_offsets)     sect_type = eSectionTypeDWARFDebugStrOffsets;
+            else if (name == g_sect_name_dwarf_debug_abbrev_dwo)      sect_type = eSectionTypeDWARFDebugAbbrev;
+            else if (name == g_sect_name_dwarf_debug_info_dwo)        sect_type = eSectionTypeDWARFDebugInfo;
+            else if (name == g_sect_name_dwarf_debug_line_dwo)        sect_type = eSectionTypeDWARFDebugLine;
+            else if (name == g_sect_name_dwarf_debug_loc_dwo)         sect_type = eSectionTypeDWARFDebugLoc;
+            else if (name == g_sect_name_dwarf_debug_str_dwo)         sect_type = eSectionTypeDWARFDebugStr;
+            else if (name == g_sect_name_dwarf_debug_str_offsets_dwo) sect_type = eSectionTypeDWARFDebugStrOffsets;
+            else if (name == g_sect_name_eh_frame)                    sect_type = eSectionTypeEHFrame;
 
             switch (header.sh_type)
             {

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt Wed Sep  9 05:20:48 2015
@@ -1,4 +1,5 @@
 add_lldb_library(lldbPluginSymbolFileDWARF
+  DIERef.cpp
   DWARFAbbreviationDeclaration.cpp
   DWARFASTParserClang.cpp
   DWARFAttribute.cpp
@@ -26,6 +27,7 @@ add_lldb_library(lldbPluginSymbolFileDWA
   LogChannelDWARF.cpp
   NameToDIE.cpp
   SymbolFileDWARF.cpp
+  SymbolFileDWARFDwo.cpp
   SymbolFileDWARFDebugMap.cpp
   UniqueDWARFASTType.cpp
   )

Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp?rev=247132&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp (added)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.cpp Wed Sep  9 05:20:48 2015
@@ -0,0 +1,56 @@
+//===-- DIERef.cpp ----------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DIERef.h"
+#include "DWARFCompileUnit.h"
+#include "DWARFFormValue.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),
+    die_offset(uid&0xffffffff)
+{}
+
+DIERef::DIERef(const DWARFFormValue& form_value) :
+    cu_offset(DW_INVALID_OFFSET),
+    die_offset(DW_INVALID_OFFSET)
+{
+    if (form_value.IsValid())
+    {
+        const DWARFCompileUnit* dwarf_cu = form_value.GetCompileUnit();
+        if (dwarf_cu)
+        {
+            if (dwarf_cu->GetBaseObjOffset() != DW_INVALID_OFFSET)
+                cu_offset = dwarf_cu->GetBaseObjOffset();
+            else
+                cu_offset = dwarf_cu->GetOffset();
+        }
+        die_offset = form_value.Reference();
+    }
+}
+
+lldb::user_id_t
+DIERef::GetUID() const
+{
+    return ((lldb::user_id_t)cu_offset) << 32 | die_offset;
+}

Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h?rev=247132&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h (added)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DIERef.h Wed Sep  9 05:20:48 2015
@@ -0,0 +1,42 @@
+//===-- DIERef.h ------------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SymbolFileDWARF_DIERef_h_
+#define SymbolFileDWARF_DIERef_h_
+
+#include "lldb/Core/dwarf.h"
+#include "lldb/lldb-defines.h"
+
+class DWARFFormValue;
+
+struct DIERef
+{
+    DIERef();
+
+    explicit
+    DIERef(dw_offset_t d);
+
+    DIERef(dw_offset_t c, dw_offset_t d);
+
+    explicit
+    DIERef(lldb::user_id_t uid);
+
+    explicit
+    DIERef(const DWARFFormValue& form_value);
+
+    lldb::user_id_t
+    GetUID() const;
+
+    dw_offset_t cu_offset;
+    dw_offset_t die_offset;
+};
+
+typedef std::vector<DIERef> DIEArray;
+
+#endif  // SymbolFileDWARF_DIERef_h_

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=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Wed Sep  9 05:20:48 2015
@@ -150,7 +150,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
         //
         //        }
 
-        Type *type_ptr = dwarf->m_die_to_type.lookup (die.GetDIE());
+        Type *type_ptr = dwarf->GetDIEToType().lookup (die.GetDIE());
         TypeList* type_list = dwarf->GetTypeList();
         if (type_ptr == NULL)
         {
@@ -186,7 +186,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                 case DW_TAG_unspecified_type:
                 {
                     // Set a bit that lets us know that we are currently parsing this
-                    dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+                    dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
 
                     const size_t num_attributes = die.GetAttributes (attributes);
                     uint32_t encoding = 0;
@@ -220,7 +220,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         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 = form_value.Reference(); break;
+                                    case DW_AT_type:        encoding_uid = DIERef(form_value).GetUID(); break;
                                     default:
                                     case DW_AT_sibling:
                                         break;
@@ -355,7 +355,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                              clang_type,
                                              resolve_state));
 
-                    dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+                    dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
 
                     //                  Type* encoding_type = GetUniquedTypeForDIEOffset(encoding_uid, type_sp, NULL, 0, 0, false);
                     //                  if (encoding_type != NULL)
@@ -373,7 +373,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                 case DW_TAG_class_type:
                 {
                     // Set a bit that lets us know that we are currently parsing this
-                    dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+                    dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
                     bool byte_size_valid = false;
 
                     LanguageType class_language = eLanguageTypeUnknown;
@@ -471,7 +471,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                         type_sp = unique_ast_entry_ap->m_type_sp;
                         if (type_sp)
                         {
-                            dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+                            dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
                             return type_sp;
                         }
                     }
@@ -554,7 +554,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                 // We found a real definition for this type elsewhere
                                 // so lets use it and cache the fact that we found
                                 // a complete type for this die
-                                dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+                                dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
                                 return type_sp;
                             }
                         }
@@ -612,13 +612,13 @@ DWARFASTParserClang::ParseTypeFromDWARF
                             // We found a real definition for this type elsewhere
                             // so lets use it and cache the fact that we found
                             // a complete type for this die
-                            dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+                            dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
                             return type_sp;
                         }
                     }
                     assert (tag_decl_kind != -1);
                     bool clang_type_was_created = false;
-                    clang_type.SetCompilerType(&m_ast, dwarf->m_forward_decl_die_to_clang_type.lookup (die.GetDIE()));
+                    clang_type.SetCompilerType(&m_ast, dwarf->GetForwardDeclDieToClangType().lookup (die.GetDIE()));
                     if (!clang_type)
                     {
                         clang::DeclContext *decl_ctx = GetClangDeclContextContainingDIE (die, nullptr);
@@ -766,21 +766,20 @@ DWARFASTParserClang::ParseTypeFromDWARF
                             // will automatically call the SymbolFile virtual function
                             // "SymbolFileDWARF::CompleteType(Type *)"
                             // When the definition needs to be defined.
-                            dwarf->m_forward_decl_die_to_clang_type[die.GetDIE()] = clang_type.GetOpaqueQualType();
-                            dwarf->m_forward_decl_clang_type_to_die[ClangASTContext::RemoveFastQualifiers(clang_type).GetOpaqueQualType()] = die.GetDIE();
+                            dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] = clang_type.GetOpaqueQualType();
+                            dwarf->GetForwardDeclClangTypeToDie()[ClangASTContext::RemoveFastQualifiers(clang_type).GetOpaqueQualType()] = die.GetDIERef();
                             m_ast.SetHasExternalStorage (clang_type.GetOpaqueQualType(), true);
                         }
                     }
-
                 }
                     break;
 
                 case DW_TAG_enumeration_type:
                 {
                     // Set a bit that lets us know that we are currently parsing this
-                    dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+                    dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
 
-                    lldb::user_id_t encoding_uid = DW_INVALID_OFFSET;
+                    DWARFFormValue encoding_form;
 
                     const size_t num_attributes = die.GetAttributes (attributes);
                     if (num_attributes > 0)
@@ -801,7 +800,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         type_name_cstr = form_value.AsCString();
                                         type_name_const_str.SetCString(type_name_cstr);
                                         break;
-                                    case DW_AT_type:            encoding_uid = form_value.Reference(); break;
+                                    case DW_AT_type:            encoding_form = form_value; break;
                                     case DW_AT_byte_size:       byte_size = form_value.Unsigned(); break;
                                     case DW_AT_accessibility:   break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
                                     case DW_AT_declaration:     break; //is_forward_declaration = form_value.Boolean(); break;
@@ -824,12 +823,12 @@ DWARFASTParserClang::ParseTypeFromDWARF
                         DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
 
                         CompilerType enumerator_clang_type;
-                        clang_type.SetCompilerType (&m_ast, dwarf->m_forward_decl_die_to_clang_type.lookup (die.GetDIE()));
+                        clang_type.SetCompilerType (&m_ast, dwarf->GetForwardDeclDieToClangType().lookup (die.GetDIE()));
                         if (!clang_type)
                         {
-                            if (encoding_uid != DW_INVALID_OFFSET)
+                            if (encoding_form.IsValid())
                             {
-                                Type *enumerator_type = dwarf->ResolveTypeUID(encoding_uid);
+                                Type *enumerator_type = dwarf->ResolveTypeUID(DIERef(encoding_form).GetUID());
                                 if (enumerator_type)
                                     enumerator_clang_type = enumerator_type->GetFullCompilerType ();
                             }
@@ -856,7 +855,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                                  type_name_const_str,
                                                  byte_size,
                                                  NULL,
-                                                 encoding_uid,
+                                                 DIERef(encoding_form).GetUID(),
                                                  Type::eEncodingIsUID,
                                                  &decl,
                                                  clang_type,
@@ -880,18 +879,17 @@ DWARFASTParserClang::ParseTypeFromDWARF
                 case DW_TAG_subroutine_type:
                 {
                     // Set a bit that lets us know that we are currently parsing this
-                    dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+                    dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
 
-                    //const char *mangled = NULL;
-                    dw_offset_t type_die_offset = DW_INVALID_OFFSET;
+                    DWARFFormValue type_die_form;
                     bool is_variadic = false;
                     bool is_inline = false;
                     bool is_static = false;
                     bool is_virtual = false;
                     bool is_explicit = false;
                     bool is_artificial = false;
-                    dw_offset_t specification_die_offset = DW_INVALID_OFFSET;
-                    dw_offset_t abstract_origin_die_offset = DW_INVALID_OFFSET;
+                    DWARFFormValue specification_die_form;
+                    DWARFFormValue abstract_origin_die_form;
                     dw_offset_t object_pointer_die_offset = DW_INVALID_OFFSET;
 
                     unsigned type_quals = 0;
@@ -919,7 +917,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
 
                                     case DW_AT_linkage_name:
                                     case DW_AT_MIPS_linkage_name:   break; // mangled = form_value.AsCString(&dwarf->get_debug_str_data()); break;
-                                    case DW_AT_type:                type_die_offset = form_value.Reference(); break;
+                                    case DW_AT_type:                type_die_form = form_value; break;
                                     case DW_AT_accessibility:       accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
                                     case DW_AT_declaration:         break; // is_forward_declaration = form_value.Boolean(); break;
                                     case DW_AT_inline:              is_inline = form_value.Boolean(); break;
@@ -939,11 +937,11 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         break;
 
                                     case DW_AT_specification:
-                                        specification_die_offset = form_value.Reference();
+                                        specification_die_form = form_value;
                                         break;
 
                                     case DW_AT_abstract_origin:
-                                        abstract_origin_die_offset = form_value.Reference();
+                                        abstract_origin_die_form = form_value;
                                         break;
 
                                     case DW_AT_object_pointer:
@@ -996,8 +994,8 @@ DWARFASTParserClang::ParseTypeFromDWARF
                     CompilerType return_clang_type;
                     Type *func_type = NULL;
 
-                    if (type_die_offset != DW_INVALID_OFFSET)
-                        func_type = dwarf->ResolveTypeUID(type_die_offset);
+                    if (type_die_form.IsValid())
+                        func_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID());
 
                     if (func_type)
                         return_clang_type = func_type->GetForwardCompilerType ();
@@ -1113,12 +1111,12 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         if (debug_map_symfile)
                                         {
                                             class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(class_type->GetID()));
-                                            class_type_die = class_symfile->DebugInfo()->GetDIE (class_type->GetID());
+                                            class_type_die = class_symfile->DebugInfo()->GetDIE (DIERef(class_type->GetID()));
                                         }
                                         else
                                         {
                                             class_symfile = dwarf;
-                                            class_type_die = dwarf->DebugInfo()->GetDIE (class_type->GetID());
+                                            class_type_die = dwarf->DebugInfo()->GetDIE (DIERef(class_type->GetID()));
                                         }
                                         if (class_type_die)
                                         {
@@ -1134,7 +1132,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                             // like having stuff added to them after their definitions are
                                             // complete...
 
-                                            type_ptr = dwarf->m_die_to_type[die.GetDIE()];
+                                            type_ptr = dwarf->GetDIEToType()[die.GetDIE()];
                                             if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
                                             {
                                                 type_sp = type_ptr->shared_from_this();
@@ -1143,7 +1141,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         }
                                     }
 
-                                    if (specification_die_offset != DW_INVALID_OFFSET)
+                                    if (specification_die_form.IsValid())
                                     {
                                         // We have a specification which we are going to base our function
                                         // prototype off of, so we need this type to be completed so that the
@@ -1152,7 +1150,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         class_type->GetForwardCompilerType ();
                                         // If we have a specification, then the function type should have been
                                         // made with the specification and not with this die.
-                                        DWARFDIE spec_die = dwarf->DebugInfo()->GetDIE(specification_die_offset);
+                                        DWARFDIE spec_die = dwarf->DebugInfo()->GetDIE(DIERef(specification_die_form));
                                         clang::DeclContext *spec_clang_decl_ctx = GetClangDeclContextForDIE (spec_die);
                                         if (spec_clang_decl_ctx)
                                         {
@@ -1160,13 +1158,13 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         }
                                         else
                                         {
-                                            dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_specification(0x%8.8x) has no decl\n",
+                                            dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_specification(0x%8.8" PRIx64 ") has no decl\n",
                                                                                                 die.GetID(),
-                                                                                                specification_die_offset);
+                                                                                                specification_die_form.Reference());
                                         }
                                         type_handled = true;
                                     }
-                                    else if (abstract_origin_die_offset != DW_INVALID_OFFSET)
+                                    else if (abstract_origin_die_form.IsValid())
                                     {
                                         // We have a specification which we are going to base our function
                                         // prototype off of, so we need this type to be completed so that the
@@ -1174,7 +1172,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         // clang decl context.
                                         class_type->GetForwardCompilerType ();
 
-                                        DWARFDIE abs_die = dwarf->DebugInfo()->GetDIE (abstract_origin_die_offset);
+                                        DWARFDIE abs_die = dwarf->DebugInfo()->GetDIE (DIERef(abstract_origin_die_form));
                                         clang::DeclContext *abs_clang_decl_ctx = GetClangDeclContextForDIE (abs_die);
                                         if (abs_clang_decl_ctx)
                                         {
@@ -1182,9 +1180,9 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         }
                                         else
                                         {
-                                            dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_abstract_origin(0x%8.8x) has no decl\n",
+                                            dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_abstract_origin(0x%8.8" PRIx64 ") has no decl\n",
                                                                                                 die.GetID(),
-                                                                                                abstract_origin_die_offset);
+                                                                                                abstract_origin_die_form.Reference());
                                         }
                                         type_handled = true;
                                     }
@@ -1264,10 +1262,10 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                                 // class hasn't been asked to complete itself through the
                                                 // clang::ExternalASTSource protocol, so we need to just have the
                                                 // class complete itself and do things the right way, then our
-                                                // DIE should then have an entry in the dwarf->m_die_to_type map. First
-                                                // we need to modify the dwarf->m_die_to_type so it doesn't think we are
+                                                // DIE should then have an entry in the dwarf->GetDIEToType() map. First
+                                                // we need to modify the dwarf->GetDIEToType() so it doesn't think we are
                                                 // trying to parse this DIE anymore...
-                                                dwarf->m_die_to_type[die.GetDIE()] = NULL;
+                                                dwarf->GetDIEToType()[die.GetDIE()] = NULL;
 
                                                 // Now we get the full type to force our class type to complete itself
                                                 // using the clang::ExternalASTSource protocol which will parse all
@@ -1275,7 +1273,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                                 class_type->GetFullCompilerType ();
 
                                                 // The type for this DIE should have been filled in the function call above
-                                                type_ptr = dwarf->m_die_to_type[die.GetDIE()];
+                                                type_ptr = dwarf->GetDIEToType()[die.GetDIE()];
                                                 if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
                                                 {
                                                     type_sp = type_ptr->shared_from_this();
@@ -1352,9 +1350,9 @@ DWARFASTParserClang::ParseTypeFromDWARF
                 case DW_TAG_array_type:
                 {
                     // Set a bit that lets us know that we are currently parsing this
-                    dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+                    dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
 
-                    lldb::user_id_t type_die_offset = DW_INVALID_OFFSET;
+                    DWARFFormValue type_die_form;
                     int64_t first_index = 0;
                     uint32_t byte_stride = 0;
                     uint32_t bit_stride = 0;
@@ -1379,7 +1377,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                         type_name_const_str.SetCString(type_name_cstr);
                                         break;
 
-                                    case DW_AT_type:            type_die_offset = form_value.Reference(); break;
+                                    case DW_AT_type:            type_die_form = form_value; break;
                                     case DW_AT_byte_size:       break; // byte_size = form_value.Unsigned(); break;
                                     case DW_AT_byte_stride:     byte_stride = form_value.Unsigned(); break;
                                     case DW_AT_bit_stride:      bit_stride = form_value.Unsigned(); break;
@@ -1403,7 +1401,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
 
                         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);
+                        Type *element_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID());
 
                         if (element_type)
                         {
@@ -1440,7 +1438,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                                      empty_name,
                                                      array_element_bit_stride / 8,
                                                      NULL,
-                                                     type_die_offset,
+                                                     DIERef(type_die_form).GetUID(),
                                                      Type::eEncodingIsUID,
                                                      &decl,
                                                      clang_type,
@@ -1453,8 +1451,8 @@ DWARFASTParserClang::ParseTypeFromDWARF
 
                 case DW_TAG_ptr_to_member_type:
                 {
-                    dw_offset_t type_die_offset = DW_INVALID_OFFSET;
-                    dw_offset_t containing_type_die_offset = DW_INVALID_OFFSET;
+                    DWARFFormValue type_die_form;
+                    DWARFFormValue containing_type_die_form;
 
                     const size_t num_attributes = die.GetAttributes (attributes);
 
@@ -1468,15 +1466,15 @@ DWARFASTParserClang::ParseTypeFromDWARF
                                 switch (attr)
                                 {
                                     case DW_AT_type:
-                                        type_die_offset = form_value.Reference(); break;
+                                        type_die_form = form_value; break;
                                     case DW_AT_containing_type:
-                                        containing_type_die_offset = form_value.Reference(); break;
+                                        containing_type_die_form = form_value; break;
                                 }
                             }
                         }
                         
-                        Type *pointee_type = dwarf->ResolveTypeUID(type_die_offset);
-                        Type *class_type = dwarf->ResolveTypeUID(containing_type_die_offset);
+                        Type *pointee_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID());
+                        Type *class_type = dwarf->ResolveTypeUID(DIERef(containing_type_die_form).GetUID());
                         
                         CompilerType pointee_clang_type = pointee_type->GetForwardCompilerType ();
                         CompilerType class_clang_type = class_type->GetLayoutCompilerType ();
@@ -1532,7 +1530,7 @@ DWARFASTParserClang::ParseTypeFromDWARF
                 // We are ready to put this type into the uniqued list up at the module level
                 type_list->Insert (type_sp);
                 
-                dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+                dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
             }
         }
         else if (type_ptr != DIE_IS_BEING_PARSED)
@@ -1654,8 +1652,7 @@ DWARFASTParserClang::ParseTemplateDIE (c
                         case DW_AT_type:
                             if (attributes.ExtractFormValueAtIndex(i, form_value))
                             {
-                                const dw_offset_t type_die_offset = form_value.Reference();
-                                lldb_type = die.ResolveTypeUID(type_die_offset);
+                                lldb_type = die.ResolveTypeUID(DIERef(form_value).GetUID());
                                 if (lldb_type)
                                     clang_type = lldb_type->GetForwardCompilerType ();
                             }
@@ -1855,8 +1852,8 @@ DWARFASTParserClang::CompleteTypeFromDWA
                                 const size_t num_matches = method_die_offsets.size();
                                 for (size_t i=0; i<num_matches; ++i)
                                 {
-                                    const dw_offset_t die_offset = method_die_offsets[i];
-                                    DWARFDIE method_die = debug_info->GetDIE (die_offset);
+                                    const DIERef& die_ref = method_die_offsets[i];
+                                    DWARFDIE method_die = debug_info->GetDIE (die_ref);
 
                                     if (method_die)
                                         method_die.ResolveType ();
@@ -2310,7 +2307,7 @@ DWARFASTParserClang::ParseFunctionFromDW
 
             SymbolFileDWARF *dwarf = die.GetDWARF();
             // Supply the type _only_ if it has already been parsed
-            Type *func_type = dwarf->m_die_to_type.lookup (die.GetDIE());
+            Type *func_type = dwarf->GetDIEToType().lookup (die.GetDIE());
 
             assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
 
@@ -2386,7 +2383,7 @@ DWARFASTParserClang::ParseChildMembers (
 
 
                     bool is_artificial = false;
-                    lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
+                    DWARFFormValue encoding_form;
                     AccessType accessibility = eAccessNone;
                     uint32_t member_byte_offset = UINT32_MAX;
                     size_t byte_size = 0;
@@ -2406,7 +2403,7 @@ DWARFASTParserClang::ParseChildMembers (
                                 case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
                                 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
                                 case DW_AT_name:        name = form_value.AsCString(); break;
-                                case DW_AT_type:        encoding_uid = form_value.Reference(); break;
+                                case DW_AT_type:        encoding_form = form_value; break;
                                 case DW_AT_bit_offset:  bit_offset = form_value.Unsigned(); break;
                                 case DW_AT_bit_size:    bit_size = form_value.Unsigned(); break;
                                 case DW_AT_byte_size:   byte_size = form_value.Unsigned(); break;
@@ -2545,7 +2542,7 @@ DWARFASTParserClang::ParseChildMembers (
                     // Handle static members
                     if (is_external && member_byte_offset == UINT32_MAX)
                     {
-                        Type *var_type = die.ResolveTypeUID(encoding_uid);
+                        Type *var_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID());
 
                         if (var_type)
                         {
@@ -2561,7 +2558,7 @@ DWARFASTParserClang::ParseChildMembers (
 
                     if (is_artificial == false)
                     {
-                        Type *member_type = die.ResolveTypeUID(encoding_uid);
+                        Type *member_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID());
 
                         clang::FieldDecl *field_decl = NULL;
                         if (tag == DW_TAG_member)
@@ -2712,7 +2709,7 @@ DWARFASTParserClang::ParseChildMembers (
                                                 module_sp->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which extends beyond the bounds of 0x%8.8" PRIx64,
                                                                         die.GetID(),
                                                                         name,
-                                                                        encoding_uid,
+                                                                        encoding_form.Reference(),
                                                                         parent_die.GetID());
                                             }
 
@@ -2737,11 +2734,11 @@ DWARFASTParserClang::ParseChildMembers (
                                     module_sp->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which was unable to be parsed",
                                                             die.GetID(),
                                                             name,
-                                                            encoding_uid);
+                                                            encoding_form.Reference());
                                 else
                                     module_sp->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member refers to type 0x%8.8" PRIx64 " which was unable to be parsed",
                                                             die.GetID(),
-                                                            encoding_uid);
+                                                            encoding_form.Reference());
                             }
                         }
 
@@ -2792,7 +2789,7 @@ DWARFASTParserClang::ParseChildMembers (
                 {
                     Declaration decl;
                     DWARFExpression location(die.GetCU());
-                    lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
+                    DWARFFormValue encoding_form;
                     AccessType accessibility = default_accessibility;
                     bool is_virtual = false;
                     bool is_base_of_class = true;
@@ -2809,7 +2806,7 @@ DWARFASTParserClang::ParseChildMembers (
                                 case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
                                 case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
                                 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
-                                case DW_AT_type:        encoding_uid = form_value.Reference(); break;
+                                case DW_AT_type:        encoding_form = form_value; break;
                                 case DW_AT_data_member_location:
                                     if (form_value.BlockData())
                                     {
@@ -2861,12 +2858,12 @@ DWARFASTParserClang::ParseChildMembers (
                         }
                     }
 
-                    Type *base_class_type = die.ResolveTypeUID(encoding_uid);
+                    Type *base_class_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID());
                     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",
                                                die.GetOffset(),
-                                               encoding_uid,
+                                               encoding_form.Reference(),
                                                parent_die.GetOffset());
                         break;
                     }
@@ -2942,7 +2939,7 @@ DWARFASTParserClang::ParseChildParameter
                 {
                     const char *name = NULL;
                     Declaration decl;
-                    dw_offset_t param_type_die_offset = DW_INVALID_OFFSET;
+                    DWARFFormValue param_type_die_form;
                     bool is_artificial = false;
                     // one of None, Auto, Register, Extern, Static, PrivateExtern
 
@@ -2961,7 +2958,7 @@ DWARFASTParserClang::ParseChildParameter
                                 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
                                 case DW_AT_name:        name = form_value.AsCString();
                                     break;
-                                case DW_AT_type:        param_type_die_offset = form_value.Reference(); break;
+                                case DW_AT_type:        param_type_die_form = form_value; break;
                                 case DW_AT_artificial:  is_artificial = form_value.Boolean(); break;
                                 case DW_AT_location:
                                     //                          if (form_value.BlockData())
@@ -3006,7 +3003,7 @@ DWARFASTParserClang::ParseChildParameter
                                     // being in the formal parameter DIE...
                                     if (name == NULL || ::strcmp(name, "this")==0)
                                     {
-                                        Type *this_type = die.ResolveTypeUID (param_type_die_offset);
+                                        Type *this_type = die.ResolveTypeUID (DIERef(param_type_die_form).GetUID());
                                         if (this_type)
                                         {
                                             uint32_t encoding_mask = this_type->GetEncodingMask();
@@ -3049,7 +3046,7 @@ DWARFASTParserClang::ParseChildParameter
 
                     if (!skip)
                     {
-                        Type *type = die.ResolveTypeUID(param_type_die_offset);
+                        Type *type = die.ResolveTypeUID(DIERef(param_type_die_form).GetUID());
                         if (type)
                         {
                             function_param_types.push_back (type->GetForwardCompilerType ());
@@ -3471,7 +3468,7 @@ DWARFASTParserClang::CopyUniqueClassMeth
                                  src_die.GetOffset(), dst_die.GetOffset());
             }
 
-            Type *src_child_type = dst_die.GetDWARF()->m_die_to_type[src_die.GetDIE()];
+            Type *src_child_type = dst_die.GetDWARF()->GetDIEToType()[src_die.GetDIE()];
             if (src_child_type)
             {
                 if (log)
@@ -3479,7 +3476,7 @@ DWARFASTParserClang::CopyUniqueClassMeth
                                  static_cast<void*>(src_child_type),
                                  src_child_type->GetID(),
                                  src_die.GetOffset(), dst_die.GetOffset());
-                dst_die.GetDWARF()->m_die_to_type[dst_die.GetDIE()] = src_child_type;
+                dst_die.GetDWARF()->GetDIEToType()[dst_die.GetDIE()] = src_child_type;
             }
             else
             {
@@ -3522,7 +3519,7 @@ DWARFASTParserClang::CopyUniqueClassMeth
                             log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die.GetOffset(), dst_die.GetOffset());
                     }
 
-                    Type *src_child_type = dst_die.GetDWARF()->m_die_to_type[src_die.GetDIE()];
+                    Type *src_child_type = dst_die.GetDWARF()->GetDIEToType()[src_die.GetDIE()];
                     if (src_child_type)
                     {
                         if (log)
@@ -3531,7 +3528,7 @@ DWARFASTParserClang::CopyUniqueClassMeth
                                          src_child_type->GetID(),
                                          src_die.GetOffset(),
                                          dst_die.GetOffset());
-                        dst_die.GetDWARF()->m_die_to_type[dst_die.GetDIE()] = src_child_type;
+                        dst_die.GetDWARF()->GetDIEToType()[dst_die.GetDIE()] = src_child_type;
                     }
                     else
                     {
@@ -3581,7 +3578,7 @@ DWARFASTParserClang::CopyUniqueClassMeth
                         log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die.GetOffset(), dst_die.GetOffset());
                 }
                 
-                Type *src_child_type = dst_die.GetDWARF()->m_die_to_type[src_die.GetDIE()];
+                Type *src_child_type = dst_die.GetDWARF()->GetDIEToType()[src_die.GetDIE()];
                 if (src_child_type)
                 {
                     if (log)
@@ -3589,7 +3586,7 @@ DWARFASTParserClang::CopyUniqueClassMeth
                                      static_cast<void*>(src_child_type),
                                      src_child_type->GetID(),
                                      src_die.GetOffset(), dst_die.GetOffset());
-                    dst_die.GetDWARF()->m_die_to_type[dst_die.GetDIE()] = src_child_type;
+                    dst_die.GetDWARF()->GetDIEToType()[dst_die.GetDIE()] = src_child_type;
                 }
                 else
                 {

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp Wed Sep  9 05:20:48 2015
@@ -28,6 +28,7 @@
 #include "LogChannelDWARF.h"
 #include "NameToDIE.h"
 #include "SymbolFileDWARF.h"
+#include "SymbolFileDWARFDwo.h"
 #include "SymbolFileDWARFDebugMap.h"
 
 using namespace lldb;
@@ -54,10 +55,15 @@ DWARFCompileUnit::DWARFCompileUnit(Symbo
     m_producer_version_update (0),
     m_language_type (eLanguageTypeUnknown),
     m_is_dwarf64    (false),
-    m_is_optimized  (eLazyBoolCalculate)
+    m_is_optimized  (eLazyBoolCalculate),
+    m_addr_base (0),
+    m_base_obj_offset (DW_INVALID_OFFSET)
 {
 }
 
+DWARFCompileUnit::~DWARFCompileUnit()
+{}
+
 void
 DWARFCompileUnit::Clear()
 {
@@ -74,6 +80,8 @@ DWARFCompileUnit::Clear()
     m_language_type = eLanguageTypeUnknown;
     m_is_dwarf64    = false;
     m_is_optimized  = eLazyBoolCalculate;
+    m_addr_base     = 0;
+    m_base_obj_offset = DW_INVALID_OFFSET;
 }
 
 bool
@@ -131,6 +139,9 @@ DWARFCompileUnit::ClearDIEs(bool keep_co
         if (keep_compile_unit_die)
             m_die_array.push_back(tmp_array.front());
     }
+
+    if (m_dwo_symbol_file)
+        m_dwo_symbol_file->GetCompileUnit()->ClearDIEs(keep_compile_unit_die);
 }
 
 //----------------------------------------------------------------------
@@ -192,12 +203,12 @@ DWARFCompileUnit::ExtractDIEsIfNeeded (b
         const bool null_die = die.IsNULL();
         if (depth == 0)
         {
-            uint64_t base_addr = die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
+            if (initial_die_array_size == 0)
+                AddCompileUnitDIE(die);
+            uint64_t base_addr = die.GetAttributeValueAsAddress(m_dwarf2Data, this, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
             if (base_addr == LLDB_INVALID_ADDRESS)
-                base_addr = die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_entry_pc, 0);
+                base_addr = die.GetAttributeValueAsAddress(m_dwarf2Data, this, DW_AT_entry_pc, 0);
             SetBaseAddress (base_addr);
-            if (initial_die_array_size == 0)
-                AddDIE (die);
             if (cu_die_only)
                 return 1;
         }
@@ -287,9 +298,83 @@ DWARFCompileUnit::ExtractDIEsIfNeeded (b
         verbose_log->PutCString (strm.GetString().c_str());
     }
 
-    return m_die_array.size();
+    if (!m_dwo_symbol_file)
+        return m_die_array.size();
+
+    DWARFCompileUnit* dwo_cu = m_dwo_symbol_file->GetCompileUnit();
+    size_t dwo_die_count = dwo_cu->ExtractDIEsIfNeeded(cu_die_only);
+    return m_die_array.size() + dwo_die_count - 1; // We have 2 CU die, but we waht to count it only as one
 }
 
+void
+DWARFCompileUnit::AddCompileUnitDIE(DWARFDebugInfoEntry& die)
+{
+    assert (m_die_array.empty() && "Compile unit DIE already added");
+    AddDIE(die);
+    
+    DWARFDebugInfoEntry& cu_die = m_die_array.front();
+
+    const char* dwo_name = cu_die.GetAttributeValueAsString(m_dwarf2Data,
+                                                            this,
+                                                            DW_AT_GNU_dwo_name,
+                                                            nullptr);
+    if (!dwo_name)
+        return;
+
+    FileSpec dwo_file(dwo_name, true);
+    if (dwo_file.IsRelative())
+    {
+        const char* comp_dir = cu_die.GetAttributeValueAsString(m_dwarf2Data,
+                                                                this,
+                                                                DW_AT_comp_dir,
+                                                                nullptr);
+        if (!comp_dir)
+            return;
+
+        dwo_file.SetFile(comp_dir, true);
+        dwo_file.AppendPathComponent(dwo_name);
+    }
+
+    if (!dwo_file.Exists())
+        return;
+
+    DataBufferSP dwo_file_data_sp;
+    lldb::offset_t dwo_file_data_offset = 0;
+    ObjectFileSP dwo_obj_file = ObjectFile::FindPlugin(m_dwarf2Data->GetObjectFile()->GetModule(),
+                                                       &dwo_file,
+                                                       0 /* file_offset */,
+                                                       dwo_file.GetByteSize(),
+                                                       dwo_file_data_sp,
+                                                       dwo_file_data_offset);
+    if (dwo_obj_file == nullptr)
+        return;
+
+    std::unique_ptr<SymbolFileDWARFDwo> dwo_symbol_file(new SymbolFileDWARFDwo(dwo_obj_file, this));
+
+    DWARFCompileUnit* dwo_cu = dwo_symbol_file->GetCompileUnit();
+    if (!dwo_cu)
+        return; // Can't fetch the compile unit from the dwo file.
+
+    DWARFDIE dwo_cu_die = dwo_cu->GetCompileUnitDIEOnly();
+    if (!dwo_cu_die.IsValid())
+        return; // Can't fetch the compile unit DIE from the dwo file.
+
+    uint64_t main_dwo_id = cu_die.GetAttributeValueAsUnsigned(m_dwarf2Data,
+                                                              this,
+                                                              DW_AT_GNU_dwo_id,
+                                                              0);
+    uint64_t sub_dwo_id = dwo_cu_die.GetAttributeValueAsUnsigned(DW_AT_GNU_dwo_id, 0);
+    if (main_dwo_id != sub_dwo_id)
+        return; // The 2 dwo ID isn't match. Don't use the dwo file as it belongs to a differectn compilation.
+
+    m_dwo_symbol_file = std::move(dwo_symbol_file);
+    
+    dw_addr_t addr_base = cu_die.GetAttributeValueAsUnsigned(m_dwarf2Data,
+                                                             this,
+                                                             DW_AT_GNU_addr_base,
+                                                             0);
+    dwo_cu->SetAddrBase(addr_base, m_offset);
+}
 
 dw_offset_t
 DWARFCompileUnit::GetAbbrevOffset() const
@@ -380,10 +465,11 @@ DWARFCompileUnit::SetDefaultAddressSize(
 lldb::user_id_t
 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(GetOffset());
+        return m_dwarf2Data->MakeUserID(local_id);
     else
-        return GetOffset();
+        return local_id;
 }
 
 void
@@ -509,6 +595,17 @@ DWARFCompileUnit::GetFunctionAranges ()
         const DWARFDebugInfoEntry* die = DIEPtr();
         if (die)
             die->BuildFunctionAddressRangeTable (m_dwarf2Data, this, m_func_aranges_ap.get());
+
+        if (m_dwo_symbol_file)
+        {
+            DWARFCompileUnit* dwo_cu = m_dwo_symbol_file->GetCompileUnit();
+            const DWARFDebugInfoEntry* dwo_die = dwo_cu->DIEPtr();
+            if (dwo_die)
+                dwo_die->BuildFunctionAddressRangeTable (m_dwo_symbol_file.get(),
+                                                         dwo_cu,
+                                                         m_func_aranges_ap.get());
+        }
+        
         const bool minimize = false;
         m_func_aranges_ap->Sort(minimize);
     }
@@ -550,6 +647,9 @@ DWARFCompileUnit::GetDIE (dw_offset_t di
 {
     if (die_offset != DW_INVALID_OFFSET)
     {
+        if (m_dwo_symbol_file)
+            return m_dwo_symbol_file->GetCompileUnit()->GetDIE(die_offset);
+
         if (ContainsDIEOffset(die_offset))
         {
             ExtractDIEsIfNeeded (false);
@@ -563,7 +663,9 @@ DWARFCompileUnit::GetDIE (dw_offset_t di
         }
         else
         {
-            return m_dwarf2Data->DebugInfo()->GetDIE (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 DWARFDIE(); // Not found
@@ -609,8 +711,7 @@ DWARFCompileUnit::AppendDIEsWithTag (con
 
 
 void
-DWARFCompileUnit::Index (const uint32_t cu_idx,
-                         NameToDIE& func_basenames,
+DWARFCompileUnit::Index (NameToDIE& func_basenames,
                          NameToDIE& func_fullnames,
                          NameToDIE& func_methods,
                          NameToDIE& func_selectors,
@@ -619,9 +720,6 @@ DWARFCompileUnit::Index (const uint32_t
                          NameToDIE& types,
                          NameToDIE& namespaces)
 {
-    DWARFFormValue::FixedFormSizes fixed_form_sizes =
-        DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize(), m_is_dwarf64);
-
     Log *log (LogChannelDWARF::GetLogIfAll (DWARF_LOG_LOOKUPS));
     
     if (log)
@@ -632,9 +730,57 @@ DWARFCompileUnit::Index (const uint32_t
     }
 
     const LanguageType cu_language = GetLanguageType();
+    DWARFFormValue::FixedFormSizes fixed_form_sizes =
+        DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize(), m_is_dwarf64);
+    
+    IndexPrivate(this,
+                 cu_language,
+                 fixed_form_sizes,
+                 GetOffset(),
+                 func_basenames,
+                 func_fullnames,
+                 func_methods,
+                 func_selectors,
+                 objc_class_selectors,
+                 globals,
+                 types,
+                 namespaces);
+
+    SymbolFileDWARFDwo* dwo_symbol_file = GetDwoSymbolFile();
+    if (dwo_symbol_file)
+    {
+        IndexPrivate(dwo_symbol_file->GetCompileUnit(),
+                     cu_language,
+                     fixed_form_sizes,
+                     GetOffset(),
+                     func_basenames,
+                     func_fullnames,
+                     func_methods,
+                     func_selectors,
+                     objc_class_selectors,
+                     globals,
+                     types,
+                     namespaces);
+    }
+}
+
+void
+DWARFCompileUnit::IndexPrivate (DWARFCompileUnit* dwarf_cu,
+                                const LanguageType cu_language,
+                                const DWARFFormValue::FixedFormSizes& fixed_form_sizes,
+                                const dw_offset_t cu_offset,
+                                NameToDIE& func_basenames,
+                                NameToDIE& func_fullnames,
+                                NameToDIE& func_methods,
+                                NameToDIE& func_selectors,
+                                NameToDIE& objc_class_selectors,
+                                NameToDIE& globals,
+                                NameToDIE& types,
+                                NameToDIE& namespaces)
+{
     DWARFDebugInfoEntry::const_iterator pos;
-    DWARFDebugInfoEntry::const_iterator begin = m_die_array.begin();
-    DWARFDebugInfoEntry::const_iterator end = m_die_array.end();
+    DWARFDebugInfoEntry::const_iterator begin = dwarf_cu->m_die_array.begin();
+    DWARFDebugInfoEntry::const_iterator end = dwarf_cu->m_die_array.end();
     for (pos = begin; pos != end; ++pos)
     {
         const DWARFDebugInfoEntry &die = *pos;
@@ -672,8 +818,8 @@ DWARFCompileUnit::Index (const uint32_t
         bool has_location = false;
         bool is_global_or_static_variable = false;
         
-        dw_offset_t specification_die_offset = DW_INVALID_OFFSET;
-        const size_t num_attributes = die.GetAttributes(this, fixed_form_sizes, attributes);
+        DWARFFormValue specification_die_form;
+        const size_t num_attributes = die.GetAttributes(dwarf_cu, fixed_form_sizes, attributes);
         if (num_attributes > 0)
         {
             for (uint32_t i=0; i<num_attributes; ++i)
@@ -763,7 +909,7 @@ DWARFCompileUnit::Index (const uint32_t
                     
                 case DW_AT_specification:
                     if (attributes.ExtractFormValueAtIndex(i, form_value))
-                        specification_die_offset = form_value.Reference();
+                        specification_die_form = form_value;
                     break;
                 }
             }
@@ -783,15 +929,15 @@ DWARFCompileUnit::Index (const uint32_t
                         ConstString objc_selector_name (objc_method.GetSelector());
                         ConstString objc_fullname_no_category_name (objc_method.GetFullNameWithoutCategory(true));
                         ConstString objc_class_name_no_category (objc_method.GetClassName());
-                        func_fullnames.Insert (ConstString(name), die.GetOffset());
+                        func_fullnames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
                         if (objc_class_name_with_category)
-                            objc_class_selectors.Insert(objc_class_name_with_category, die.GetOffset());
+                            objc_class_selectors.Insert(objc_class_name_with_category, DIERef(cu_offset, die.GetOffset()));
                         if (objc_class_name_no_category && objc_class_name_no_category != objc_class_name_with_category)
-                            objc_class_selectors.Insert(objc_class_name_no_category, die.GetOffset());
+                            objc_class_selectors.Insert(objc_class_name_no_category, DIERef(cu_offset, die.GetOffset()));
                         if (objc_selector_name)
-                            func_selectors.Insert (objc_selector_name, die.GetOffset());
+                            func_selectors.Insert (objc_selector_name, DIERef(cu_offset, die.GetOffset()));
                         if (objc_fullname_no_category_name)
-                            func_fullnames.Insert (objc_fullname_no_category_name, die.GetOffset());
+                            func_fullnames.Insert (objc_fullname_no_category_name, DIERef(cu_offset, die.GetOffset()));
                     }
                     // If we have a mangled name, then the DW_AT_name attribute
                     // is usually the method name without the class or any parameters
@@ -806,9 +952,9 @@ DWARFCompileUnit::Index (const uint32_t
                         }
                         else
                         {
-                            if (specification_die_offset != DW_INVALID_OFFSET)
+                            if (specification_die_form.IsValid())
                             {
-                                DWARFDIE specification_die = m_dwarf2Data->DebugInfo()->GetDIE (specification_die_offset);
+                                DWARFDIE specification_die = dwarf_cu->GetSymbolFileDWARF()->DebugInfo()->GetDIE (DIERef(specification_die_form));
                                 if (specification_die.GetParent().IsStructOrClass())
                                     is_method = true;
                             }
@@ -817,12 +963,12 @@ DWARFCompileUnit::Index (const uint32_t
 
 
                     if (is_method)
-                        func_methods.Insert (ConstString(name), die.GetOffset());
+                        func_methods.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
                     else
-                        func_basenames.Insert (ConstString(name), die.GetOffset());
+                        func_basenames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
 
                     if (!is_method && !mangled_cstr && !objc_method.IsValid(true))
-                        func_fullnames.Insert (ConstString(name), die.GetOffset());
+                        func_fullnames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
                 }
                 if (mangled_cstr)
                 {
@@ -833,10 +979,10 @@ DWARFCompileUnit::Index (const uint32_t
                     if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (name && ::strcmp(name, mangled_cstr) != 0)))
                     {
                         Mangled mangled (ConstString(mangled_cstr), true);
-                        func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset());
+                        func_fullnames.Insert (mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset()));
                         ConstString demangled = mangled.GetDemangledName(cu_language);
                         if (demangled)
-                            func_fullnames.Insert (demangled, die.GetOffset());
+                            func_fullnames.Insert (demangled, DIERef(cu_offset, die.GetOffset()));
                     }
                 }
             }
@@ -846,7 +992,7 @@ DWARFCompileUnit::Index (const uint32_t
             if (has_address)
             {
                 if (name)
-                    func_basenames.Insert (ConstString(name), die.GetOffset());
+                    func_basenames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
                 if (mangled_cstr)
                 {
                     // Make sure our mangled name isn't the same string table entry
@@ -856,14 +1002,14 @@ DWARFCompileUnit::Index (const uint32_t
                     if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
                     {
                         Mangled mangled (ConstString(mangled_cstr), true);
-                        func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset());
+                        func_fullnames.Insert (mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset()));
                         ConstString demangled = mangled.GetDemangledName(cu_language);
                         if (demangled)
-                            func_fullnames.Insert (demangled, die.GetOffset());
+                            func_fullnames.Insert (demangled, DIERef(cu_offset, die.GetOffset()));
                     }
                 }
                 else
-                    func_fullnames.Insert (ConstString(name), die.GetOffset());
+                    func_fullnames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
             }
             break;
         
@@ -879,19 +1025,19 @@ DWARFCompileUnit::Index (const uint32_t
         case DW_TAG_unspecified_type:
             if (name && is_declaration == false)
             {
-                types.Insert (ConstString(name), die.GetOffset());
+                types.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
             }
             break;
 
         case DW_TAG_namespace:
             if (name)
-                namespaces.Insert (ConstString(name), die.GetOffset());
+                namespaces.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
             break;
 
         case DW_TAG_variable:
             if (name && has_location && is_global_or_static_variable)
             {
-                globals.Insert (ConstString(name), die.GetOffset());
+                globals.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
                 // Be sure to include variables by their mangled and demangled
                 // names if they have any since a variable can have a basename
                 // "i", a mangled named "_ZN12_GLOBAL__N_11iE" and a demangled 
@@ -904,10 +1050,10 @@ DWARFCompileUnit::Index (const uint32_t
                 if (mangled_cstr && name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
                 {
                     Mangled mangled (ConstString(mangled_cstr), true);
-                    globals.Insert (mangled.GetMangledName(), die.GetOffset());
+                    globals.Insert (mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset()));
                     ConstString demangled = mangled.GetDemangledName(cu_language);
                     if (demangled)
-                        globals.Insert (demangled, die.GetOffset());
+                        globals.Insert (demangled, DIERef(cu_offset, die.GetOffset()));
                 }
             }
             break;
@@ -1097,3 +1243,18 @@ DWARFCompileUnit::GetTypeSystem ()
     else
         return nullptr;
 }
+
+void
+DWARFCompileUnit::SetUserData(void *d)
+{
+    m_user_data = d;
+    if (m_dwo_symbol_file)
+        m_dwo_symbol_file->GetCompileUnit()->SetUserData(d);
+}
+
+void
+DWARFCompileUnit::SetAddrBase(dw_addr_t addr_base, dw_offset_t base_obj_offset)
+{
+    m_addr_base = addr_base;
+    m_base_obj_offset = base_obj_offset;
+}

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h Wed Sep  9 05:20:48 2015
@@ -13,9 +13,10 @@
 #include "lldb/lldb-enumerations.h"
 #include "DWARFDebugInfoEntry.h"
 #include "DWARFDIE.h"
-#include "SymbolFileDWARF.h"
 
 class NameToDIE;
+class SymbolFileDWARF;
+class SymbolFileDWARFDwo;
 
 class DWARFCompileUnit
 {
@@ -30,6 +31,7 @@ public:
     };
 
     DWARFCompileUnit(SymbolFileDWARF* dwarf2Data);
+    ~DWARFCompileUnit();
 
     bool        Extract(const lldb_private::DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr);
     size_t      ExtractDIEsIfNeeded (bool cu_die_only);
@@ -51,11 +53,13 @@ public:
     dw_offset_t GetAbbrevOffset() const;
     uint8_t     GetAddressByteSize() const { return m_addr_size; }
     dw_addr_t   GetBaseAddress() const { return m_base_addr; }
-    dw_addr_t   GetAddrBase() const { return 0; } // TODO: Read out DW_AT_addr_base from the parent compile unit
+    dw_addr_t   GetAddrBase() const { return m_addr_base; }
+    void        SetAddrBase(dw_addr_t addr_base, dw_offset_t base_obj_offset);
     void        ClearDIEs(bool keep_compile_unit_die);
     void        BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
                                         DWARFDebugAranges* debug_aranges);
 
+
     lldb_private::TypeSystem *
                 GetTypeSystem();
 
@@ -96,6 +100,9 @@ public:
             m_die_array.reserve(GetDebugInfoSize() / 24);
         m_die_array.push_back(die);
     }
+    
+    void
+    AddCompileUnitDIE (DWARFDebugInfoEntry& die);
 
     bool
     HasDIEsParsed () const
@@ -125,10 +132,7 @@ public:
     }
 
     void
-    SetUserData(void *d)
-    {
-        m_user_data = d;
-    }
+    SetUserData(void *d);
 
     bool
     Supports_DW_AT_APPLE_objc_complete_type ();
@@ -140,8 +144,7 @@ public:
     Supports_unnamed_objc_bitfields ();
 
     void
-    Index (const uint32_t cu_idx,
-           NameToDIE& func_basenames,
+    Index (NameToDIE& func_basenames,
            NameToDIE& func_fullnames,
            NameToDIE& func_methods,
            NameToDIE& func_selectors,
@@ -183,8 +186,21 @@ public:
     bool
     GetIsOptimized ();
 
+    SymbolFileDWARFDwo*
+    GetDwoSymbolFile() const
+    {
+        return m_dwo_symbol_file.get();
+    }
+
+    dw_offset_t
+    GetBaseObjOffset() const
+    {
+        return m_base_obj_offset;
+    }
+
 protected:
     SymbolFileDWARF*    m_dwarf2Data;
+    std::unique_ptr<SymbolFileDWARFDwo> m_dwo_symbol_file;
     const DWARFAbbreviationDeclarationSet *m_abbrevs;
     void *              m_user_data;
     DWARFDebugInfoEntry::collection m_die_array;    // The compile unit debug information entry item
@@ -201,9 +217,27 @@ protected:
     lldb::LanguageType  m_language_type;
     bool                m_is_dwarf64;
     lldb_private::LazyBool m_is_optimized;
-    
+    dw_addr_t           m_addr_base;       // Value of DW_AT_addr_base
+    dw_offset_t         m_base_obj_offset; // If this is a dwo compile unit this is the offset of
+                                           // the base compile unit in the main object file
+
     void
     ParseProducerInfo ();
+
+    static void
+    IndexPrivate (DWARFCompileUnit* dwarf_cu,
+                  const lldb::LanguageType cu_language,
+                  const DWARFFormValue::FixedFormSizes& fixed_form_sizes,
+                  const dw_offset_t cu_offset,
+                  NameToDIE& func_basenames,
+                  NameToDIE& func_fullnames,
+                  NameToDIE& func_methods,
+                  NameToDIE& func_selectors,
+                  NameToDIE& objc_class_selectors,
+                  NameToDIE& globals,
+                  NameToDIE& types,
+                  NameToDIE& namespaces);
+
 private:
 
     const DWARFDebugInfoEntry*

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp Wed Sep  9 05:20:48 2015
@@ -25,6 +25,18 @@
 #include "lldb/Core/Module.h"
 #include "lldb/Symbol/ObjectFile.h"
 
+DIERef
+DWARFDIE::GetDIERef() const
+{
+    if (!IsValid())
+        return DIERef();
+
+    dw_offset_t cu_offset = m_cu->GetOffset();
+    if (m_cu->GetBaseObjOffset() != DW_INVALID_OFFSET)
+        cu_offset = m_cu->GetBaseObjOffset();
+    return DIERef(cu_offset, m_die->GetOffset());
+}
+
 dw_tag_t
 DWARFDIE::Tag() const
 {
@@ -122,6 +134,15 @@ DWARFDIE::GetAttributeValueAsReference (
         return fail_value;
 }
 
+uint64_t
+DWARFDIE::GetAttributeValueAsAddress (const dw_attr_t attr, uint64_t fail_value) const
+{
+    if (IsValid())
+        return m_die->GetAttributeValueAsAddress(GetDWARF(), GetCU(), attr, fail_value);
+    else
+        return fail_value;
+}
+
 
 DWARFDIE
 DWARFDIE::LookupDeepestBlock (lldb::addr_t file_addr) const
@@ -143,7 +164,7 @@ DWARFDIE::LookupDeepestBlock (lldb::addr
                 if (cu->ContainsDIEOffset(block_die->GetOffset()))
                     return DWARFDIE(cu, block_die);
                 else
-                    return DWARFDIE(dwarf->DebugInfo()->GetCompileUnitContainingDIE(block_die->GetOffset()), block_die);
+                    return DWARFDIE(dwarf->DebugInfo()->GetCompileUnitContainingDIE(DIERef(cu->GetOffset(), block_die->GetOffset())), block_die);
             }
         }
     }
@@ -156,11 +177,19 @@ 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)
-            return dwarf->MakeUserID(die_offset);
+            id = dwarf->MakeUserID(die_offset);
         else
-            return die_offset;
+            id = die_offset;
+
+        if (m_cu)
+        {
+            assert ((id&0xffffffff00000000ull) == 0 || m_cu->GetOffset() == 0);
+            id |= ((lldb::user_id_t)m_cu->GetOffset()) << 32;
+        }
+        return id;
     }
     return LLDB_INVALID_UID;
 }

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h Wed Sep  9 05:20:48 2015
@@ -13,6 +13,7 @@
 #include "lldb/lldb-types.h"
 #include "lldb/Core/dwarf.h"
 
+struct DIERef;
 class DWARFASTParser;
 class DWARFAttributes;
 class DWARFCompileUnit;
@@ -95,6 +96,9 @@ public:
         return m_die;
     }
 
+    DIERef
+    GetDIERef() const;
+
     lldb_private::TypeSystem *
     GetTypeSystem () const;
 
@@ -232,6 +236,9 @@ public:
     uint64_t
     GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const;
 
+    uint64_t
+    GetAttributeValueAsAddress (const dw_attr_t attr, uint64_t fail_value) const;
+
     size_t
     GetAttributes (DWARFAttributes &attributes, uint32_t depth = 0) const;
 

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp Wed Sep  9 05:20:48 2015
@@ -103,48 +103,6 @@ DWARFDebugInfo::GetCompileUnitAranges ()
     return *m_cu_aranges_ap.get();
 }
 
-
-//----------------------------------------------------------------------
-// LookupAddress
-//----------------------------------------------------------------------
-DWARFDIE
-DWARFDebugInfo::LookupAddress (const dw_addr_t address,
-                               const dw_offset_t hint_die_offset)
-{
-    DWARFDIE die;
-    DWARFCompileUnit *cu = nullptr;
-    if (hint_die_offset != DW_INVALID_OFFSET)
-    {
-        cu = GetCompileUnit(hint_die_offset);
-    }
-    else
-    {
-        DWARFDebugAranges &cu_aranges = GetCompileUnitAranges ();
-        const dw_offset_t cu_offset = cu_aranges.FindAddress (address);
-        cu = GetCompileUnit(cu_offset);
-    }
-
-    if (cu)
-    {
-        die = cu->LookupAddress(address);
-    }
-    else
-    {
-        // The hint_die_offset may have been a pointer to the actual item that
-        // we are looking for
-        die = GetDIE(hint_die_offset);
-        if (die)
-        {
-            DWARFDebugInfoEntry* function_die = nullptr;
-
-            if (die.GetDIE()->LookupAddress (address, die.GetDWARF(), die.GetCU(), &function_die, nullptr))
-                die.Set (die.GetCU(), function_die);
-        }
-    }
-    return die;
-}
-
-
 void
 DWARFDebugInfo::ParseCompileUnitHeadersIfNeeded()
 {
@@ -251,10 +209,18 @@ DWARFDebugInfo::GetCompileUnit(dw_offset
 }
 
 DWARFCompileUnit *
-DWARFDebugInfo::GetCompileUnitContainingDIE (dw_offset_t die_offset)
+DWARFDebugInfo::GetCompileUnitContainingDIE (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;
+    }
+
     DWARFCompileUnitSP cu_sp;
-    if (die_offset != DW_INVALID_OFFSET)
+    if (search_offset != DW_INVALID_OFFSET)
     {
         ParseCompileUnitHeadersIfNeeded();
 
@@ -262,19 +228,25 @@ DWARFDebugInfo::GetCompileUnitContaining
         const size_t num_cus = m_compile_units.size();
         if (num_cus == 1)
         {
-            if (m_compile_units[0]->ContainsDIEOffset(die_offset))
+            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)
         {
             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);
+            CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, search_offset, OffsetLessThanCompileUnitOffset);
             if (pos != begin_pos)
             {
                 --pos;
-                if ((*pos)->ContainsDIEOffset(die_offset))
+                if ((is_cu_offset && (*pos)->GetOffset() == search_offset) ||
+                    (!is_cu_offset && (*pos)->ContainsDIEOffset(search_offset)))
+                {
                     cu_sp = *pos;
+                }
             }
         }
     }
@@ -287,11 +259,11 @@ DWARFDebugInfo::GetCompileUnitContaining
 // Get the DIE (Debug Information Entry) with the specified offset.
 //----------------------------------------------------------------------
 DWARFDIE
-DWARFDebugInfo::GetDIE(dw_offset_t die_offset)
+DWARFDebugInfo::GetDIE(const DIERef& die_ref)
 {
-    DWARFCompileUnit *cu = GetCompileUnitContainingDIE(die_offset);
+    DWARFCompileUnit *cu = GetCompileUnitContainingDIE(die_ref);
     if (cu)
-        return cu->GetDIE (die_offset);
+        return cu->GetDIE (die_ref.die_offset);
     return DWARFDIE();    // Not found
 }
 

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h Wed Sep  9 05:20:48 2015
@@ -36,18 +36,13 @@ public:
     DWARFDebugInfo();
     void SetDwarfData(SymbolFileDWARF* dwarf2Data);
 
-    DWARFDIE
-    LookupAddress(const dw_addr_t address,
-                  const dw_offset_t cu_offset);    // Can be valid (find in .debug_aranges), or DW_INVALID_OFFSET if we need to search manually
-
     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 (dw_offset_t die_offset);
+    DWARFCompileUnit* GetCompileUnitContainingDIE (const DIERef& die_ref);
 
-    DWARFDIE GetDIE (dw_offset_t die_offset);
-    DWARFDIE GetDIEContainingOffset (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);
     static void Parse(SymbolFileDWARF* parser, Callback callback, void* userData);

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp Wed Sep  9 05:20:48 2015
@@ -19,7 +19,6 @@
 #include "lldb/Symbol/ObjectFile.h"
 
 #include "DWARFCompileUnit.h"
-#include "SymbolFileDWARF.h"
 #include "DWARFDebugAbbrev.h"
 #include "DWARFDebugAranges.h"
 #include "DWARFDebugInfo.h"
@@ -29,6 +28,8 @@
 #include "DWARFLocationDescription.h"
 #include "DWARFLocationList.h"
 #include "DWARFDebugRanges.h"
+#include "SymbolFileDWARF.h"
+#include "SymbolFileDWARFDwo.h"
 
 using namespace lldb_private;
 using namespace std;
@@ -245,7 +246,7 @@ DWARFDebugInfoEntry::Extract
                         if (form_value.ExtractValue(debug_info_data, &offset))
                         {
                             if (attr == DW_AT_low_pc || attr == DW_AT_entry_pc)
-                                ((DWARFCompileUnit*)cu)->SetBaseAddress(form_value.Unsigned());
+                                const_cast<DWARFCompileUnit*>(cu)->SetBaseAddress(form_value.Address());
                         }
                     }
                     else
@@ -403,12 +404,27 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
     DWARFExpression *frame_base
 ) const
 {
-    if (dwarf2Data == NULL)
+    if (dwarf2Data == nullptr)
         return false;
 
+    SymbolFileDWARFDwo* dwo_symbol_file = cu->GetDwoSymbolFile();
+    if (dwo_symbol_file)
+        return GetDIENamesAndRanges(dwo_symbol_file,
+                                    dwo_symbol_file->GetCompileUnit(),
+                                    name,
+                                    mangled,
+                                    ranges,
+                                    decl_file,
+                                    decl_line,
+                                    decl_column,
+                                    call_file,
+                                    call_line,
+                                    call_column,
+                                    frame_base);
+
     dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
     dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
-    std::vector<dw_offset_t> die_offsets;
+    std::vector<DIERef> die_refs;
     bool set_frame_base_loclist_addr = false;
     
     lldb::offset_t offset;
@@ -438,7 +454,7 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
                 switch (attr)
                 {
                 case DW_AT_low_pc:
-                    lo_pc = form_value.Unsigned();
+                    lo_pc = form_value.Address();
 
                     if (do_offset)
                         hi_pc += lo_pc;
@@ -446,13 +462,18 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
                     break;
 
                 case DW_AT_entry_pc:
-                    lo_pc = form_value.Unsigned();
+                    lo_pc = form_value.Address();
                     break;
 
                 case DW_AT_high_pc:
-                    hi_pc = form_value.Unsigned();
-                    if (form_value.Form() != DW_FORM_addr)
+                    if (form_value.Form() == DW_FORM_addr ||
+                        form_value.Form() == DW_FORM_GNU_addr_index)
                     {
+                        hi_pc = form_value.Address();
+                    }
+                    else
+                    {
+                        hi_pc = form_value.Unsigned();
                         if (lo_pc == LLDB_INVALID_ADDRESS)
                             do_offset = hi_pc != LLDB_INVALID_ADDRESS;
                         else
@@ -483,11 +504,11 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
                     break;
 
                 case DW_AT_abstract_origin:
-                    die_offsets.push_back(form_value.Reference());
+                    die_refs.emplace_back(form_value);
                     break;
 
                 case DW_AT_specification:
-                    die_offsets.push_back(form_value.Reference());
+                    die_refs.emplace_back(form_value);
                     break;
 
                 case DW_AT_decl_file:
@@ -579,14 +600,11 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
 
     if (ranges.IsEmpty() || name == NULL || mangled == NULL)
     {
-        std::vector<dw_offset_t>::const_iterator pos;
-        std::vector<dw_offset_t>::const_iterator end = die_offsets.end();
-        for (pos = die_offsets.begin(); pos != end; ++pos)
+        for (const DIERef& die_ref : die_refs)
         {
-            dw_offset_t die_offset = *pos;
-            if (die_offset != DW_INVALID_OFFSET)
+            if (die_ref.die_offset != DW_INVALID_OFFSET)
             {
-                DWARFDIE die = dwarf2Data->DebugInfo()->GetDIE(die_offset);
+                DWARFDIE die = dwarf2Data->DebugInfo()->GetDIE(die_ref);
                 if (die)
                     die.GetDIE()->GetDIENamesAndRanges(die.GetDWARF(), die.GetCU(), name, mangled, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column);
             }
@@ -867,6 +885,16 @@ DWARFDebugInfoEntry::GetAttributes (cons
     lldb::offset_t offset = 0;
     if (cu)
     {
+        if (m_tag != DW_TAG_compile_unit)
+        {
+            SymbolFileDWARFDwo* dwo_symbol_file = cu->GetDwoSymbolFile();
+            if (dwo_symbol_file)
+                return GetAttributes(dwo_symbol_file->GetCompileUnit(),
+                                     fixed_form_sizes,
+                                     attributes,
+                                     curr_depth);
+        }
+
         dwarf2Data = cu->GetSymbolFileDWARF();
         abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
     }
@@ -951,9 +979,19 @@ DWARFDebugInfoEntry::GetAttributeValue
     const DWARFCompileUnit* cu,
     const dw_attr_t attr,
     DWARFFormValue& form_value,
-    dw_offset_t* end_attr_offset_ptr
+    dw_offset_t* end_attr_offset_ptr,
+    bool check_specification_or_abstract_origin
 ) const
 {
+    SymbolFileDWARFDwo* dwo_symbol_file = cu->GetDwoSymbolFile();
+    if (dwo_symbol_file && m_tag != DW_TAG_compile_unit)
+        return GetAttributeValue(dwo_symbol_file,
+                                 dwo_symbol_file->GetCompileUnit(),
+                                 attr,
+                                 form_value,
+                                 end_attr_offset_ptr,
+                                 check_specification_or_abstract_origin);
+
     lldb::offset_t offset;
     const DWARFAbbreviationDeclaration* abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
 
@@ -981,7 +1019,58 @@ DWARFDebugInfoEntry::GetAttributeValue
         }
     }
 
-    return 0;
+    if (check_specification_or_abstract_origin)
+    {
+        if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value))
+        {
+            DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
+            if (die)
+            {
+                dw_offset_t die_offset = die.GetDIE()->GetAttributeValue(die.GetDWARF(),
+                                                                         die.GetCU(),
+                                                                         attr,
+                                                                         form_value,
+                                                                         end_attr_offset_ptr,
+                                                                         false);
+                if (die_offset)
+                    return die_offset;
+            }
+        }
+
+        if (GetAttributeValue(dwarf2Data, cu, DW_AT_abstract_origin, form_value))
+        {
+            DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
+            if (die)
+            {
+                dw_offset_t die_offset = die.GetDIE()->GetAttributeValue(die.GetDWARF(),
+                                                                         die.GetCU(),
+                                                                         attr,
+                                                                         form_value,
+                                                                         end_attr_offset_ptr,
+                                                                         false);
+                if (die_offset)
+                    return die_offset;
+            }
+        }
+    }
+
+    if (!dwo_symbol_file)
+        return 0;
+
+    DWARFCompileUnit* dwo_cu = dwo_symbol_file->GetCompileUnit();
+    if (!dwo_cu)
+        return 0;
+
+    DWARFDIE dwo_cu_die = dwo_cu->GetCompileUnitDIEOnly();
+    if (!dwo_cu_die.IsValid())
+        return 0;
+
+    return dwo_cu_die.GetDIE()->GetAttributeValue(dwo_symbol_file,
+                                                  dwo_cu,
+                                                  attr,
+                                                  form_value,
+                                                  end_attr_offset_ptr,
+                                                  check_specification_or_abstract_origin);
 }
 
 //----------------------------------------------------------------------
@@ -998,10 +1087,11 @@ DWARFDebugInfoEntry::GetAttributeValueAs
     SymbolFileDWARF* dwarf2Data,
     const DWARFCompileUnit* cu,
     const dw_attr_t attr,
-    const char* fail_value) const
+    const char* fail_value,
+    bool check_specification_or_abstract_origin) const
 {
     DWARFFormValue form_value;
-    if (GetAttributeValue(dwarf2Data, cu, attr, form_value))
+    if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
         return form_value.AsCString();
     return fail_value;
 }
@@ -1017,11 +1107,12 @@ DWARFDebugInfoEntry::GetAttributeValueAs
     SymbolFileDWARF* dwarf2Data,
     const DWARFCompileUnit* cu,
     const dw_attr_t attr,
-    uint64_t fail_value
+    uint64_t fail_value,
+    bool check_specification_or_abstract_origin
 ) const
 {
     DWARFFormValue form_value;
-    if (GetAttributeValue(dwarf2Data, cu, attr, form_value))
+    if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
         return form_value.Unsigned();
     return fail_value;
 }
@@ -1037,11 +1128,12 @@ DWARFDebugInfoEntry::GetAttributeValueAs
     SymbolFileDWARF* dwarf2Data,
     const DWARFCompileUnit* cu,
     const dw_attr_t attr,
-    int64_t fail_value
+    int64_t fail_value,
+    bool check_specification_or_abstract_origin
 ) const
 {
     DWARFFormValue form_value;
-    if (GetAttributeValue(dwarf2Data, cu, attr, form_value))
+    if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
         return form_value.Signed();
     return fail_value;
 }
@@ -1058,15 +1150,32 @@ DWARFDebugInfoEntry::GetAttributeValueAs
     SymbolFileDWARF* dwarf2Data,
     const DWARFCompileUnit* cu,
     const dw_attr_t attr,
-    uint64_t fail_value
+    uint64_t fail_value,
+    bool check_specification_or_abstract_origin
 ) const
 {
     DWARFFormValue form_value;
-    if (GetAttributeValue(dwarf2Data, cu, attr, form_value))
+    if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
         return form_value.Reference();
     return fail_value;
 }
 
+uint64_t
+DWARFDebugInfoEntry::GetAttributeValueAsAddress
+(
+    SymbolFileDWARF* dwarf2Data,
+    const DWARFCompileUnit* cu,
+    const dw_attr_t attr,
+    uint64_t fail_value,
+    bool check_specification_or_abstract_origin
+) const
+{
+    DWARFFormValue form_value;
+    if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
+        return form_value.Address();
+    return fail_value;
+}
+
 //----------------------------------------------------------------------
 // GetAttributeHighPC
 //
@@ -1081,11 +1190,12 @@ DWARFDebugInfoEntry::GetAttributeHighPC
     SymbolFileDWARF* dwarf2Data,
     const DWARFCompileUnit* cu,
     dw_addr_t lo_pc,
-    uint64_t fail_value
+    uint64_t fail_value,
+    bool check_specification_or_abstract_origin
 ) const
 {
     DWARFFormValue form_value;
-    if (GetAttributeValue(dwarf2Data, cu, DW_AT_high_pc, form_value))
+    if (GetAttributeValue(dwarf2Data, cu, DW_AT_high_pc, form_value, nullptr, check_specification_or_abstract_origin))
     {
         dw_form_t form = form_value.Form();
         if (form == DW_FORM_addr || form == DW_FORM_GNU_addr_index)
@@ -1112,13 +1222,14 @@ DWARFDebugInfoEntry::GetAttributeAddress
     const DWARFCompileUnit* cu,
     dw_addr_t& lo_pc,
     dw_addr_t& hi_pc,
-    uint64_t fail_value
+    uint64_t fail_value,
+    bool check_specification_or_abstract_origin
 ) const
 {
-    lo_pc = GetAttributeValueAsUnsigned(dwarf2Data, cu, DW_AT_low_pc, fail_value);
+    lo_pc = GetAttributeValueAsAddress(dwarf2Data, cu, DW_AT_low_pc, fail_value, check_specification_or_abstract_origin);
     if (lo_pc != fail_value)
     {
-        hi_pc = GetAttributeHighPC(dwarf2Data, cu, lo_pc, fail_value);
+        hi_pc = GetAttributeHighPC(dwarf2Data, cu, lo_pc, fail_value, check_specification_or_abstract_origin);
         if (hi_pc != fail_value)
           return true;
     }
@@ -1131,11 +1242,16 @@ size_t
 DWARFDebugInfoEntry::GetAttributeAddressRanges (SymbolFileDWARF* dwarf2Data,
                                                 const DWARFCompileUnit* cu,
                                                 DWARFRangeList &ranges,
-                                                bool check_hi_lo_pc) const
+                                                bool check_hi_lo_pc,
+                                                bool check_specification_or_abstract_origin) const
 {
     ranges.Clear();
     
-    dw_offset_t debug_ranges_offset = GetAttributeValueAsUnsigned(dwarf2Data, cu, DW_AT_ranges, DW_INVALID_OFFSET);
+    dw_offset_t debug_ranges_offset = GetAttributeValueAsUnsigned(dwarf2Data,
+                                                                  cu,
+                                                                  DW_AT_ranges,
+                                                                  DW_INVALID_OFFSET,
+                                                                  check_specification_or_abstract_origin);
     if (debug_ranges_offset != DW_INVALID_OFFSET)
     {
         DWARFDebugRanges* debug_ranges = dwarf2Data->DebugRanges();
@@ -1147,7 +1263,7 @@ DWARFDebugInfoEntry::GetAttributeAddress
     {
         dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
         dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
-        if (GetAttributeAddressRange (dwarf2Data, cu, lo_pc, hi_pc, LLDB_INVALID_ADDRESS))
+        if (GetAttributeAddressRange (dwarf2Data, cu, lo_pc, hi_pc, LLDB_INVALID_ADDRESS, check_specification_or_abstract_origin))
         {
             if (lo_pc < hi_pc)
                 ranges.Append(DWARFRangeList::Entry(lo_pc, hi_pc - lo_pc));
@@ -1157,56 +1273,6 @@ DWARFDebugInfoEntry::GetAttributeAddress
 }
 
 //----------------------------------------------------------------------
-// GetAttributeValueAsLocation
-//
-// Get the value of an attribute as reference and fix up and compile
-// unit relative offsets as needed.
-//----------------------------------------------------------------------
-dw_offset_t
-DWARFDebugInfoEntry::GetAttributeValueAsLocation
-(
-    SymbolFileDWARF* dwarf2Data,
-    const DWARFCompileUnit* cu,
-    const dw_attr_t attr,
-    DWARFDataExtractor& location_data,
-    uint32_t &block_size
-) const
-{
-    block_size = 0;
-    DWARFFormValue form_value;
-
-    // Empty out data in case we don't find anything
-    location_data.Clear();
-    dw_offset_t end_addr_offset = DW_INVALID_OFFSET;
-    const dw_offset_t attr_offset = GetAttributeValue(dwarf2Data, cu, attr, form_value, &end_addr_offset);
-    if (attr_offset)
-    {
-        const uint8_t* blockData = form_value.BlockData();
-        if (blockData)
-        {
-            // We have an inlined location list in the .debug_info section
-            const DWARFDataExtractor& debug_info = dwarf2Data->get_debug_info_data();
-            dw_offset_t block_offset = blockData - debug_info.GetDataStart();
-            block_size = (end_addr_offset - attr_offset) - form_value.Unsigned();
-            location_data.SetData(debug_info, block_offset, block_size);
-        }
-        else
-        {
-            // We have a location list offset as the value that is
-            // the offset into the .debug_loc section that describes
-            // the value over it's lifetime
-            lldb::offset_t debug_loc_offset = form_value.Unsigned();
-            if (dwarf2Data)
-            {
-                assert(dwarf2Data->get_debug_loc_data().GetAddressByteSize() == cu->GetAddressByteSize());
-                return DWARFLocationList::Extract(dwarf2Data->get_debug_loc_data(), &debug_loc_offset, location_data);
-            }
-        }
-    }
-    return attr_offset;
-}
-
-//----------------------------------------------------------------------
 // GetName
 //
 // Get value of the DW_AT_name attribute and return it if one exists,
@@ -1219,25 +1285,9 @@ DWARFDebugInfoEntry::GetName
     const DWARFCompileUnit* cu
 ) const
 {
-    DWARFFormValue form_value;
-    if (GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
-        return form_value.AsCString();
-    else if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value))
-    {
-        DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
-        if (die)
-            return die.GetName();
-    }
-    else if (GetAttributeValue(dwarf2Data, cu, DW_AT_abstract_origin, form_value))
-    {
-        DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
-        if (die)
-            return die.GetName();
-    }
-    return nullptr;
+    return GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
 }
 
-
 //----------------------------------------------------------------------
 // GetMangledName
 //
@@ -1253,19 +1303,19 @@ DWARFDebugInfoEntry::GetMangledName
 ) const
 {
     const char* name = nullptr;
-    DWARFFormValue form_value;
 
-    if (GetAttributeValue(dwarf2Data, cu, DW_AT_MIPS_linkage_name, form_value))
-        name = form_value.AsCString();
+    name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_MIPS_linkage_name, nullptr, true);
+    if (name)
+        return name;
 
-    if (GetAttributeValue(dwarf2Data, cu, DW_AT_linkage_name, form_value))
-        name = form_value.AsCString();
+    name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_linkage_name, nullptr, true);
+    if (name)
+        return name;
 
-    if (substitute_name_allowed && name == nullptr)
-    {
-        if (GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
-            name = form_value.AsCString();
-    }
+    if (!substitute_name_allowed)
+        return nullptr;
+
+    name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
     return name;
 }
 
@@ -1283,24 +1333,19 @@ DWARFDebugInfoEntry::GetPubname
     const DWARFCompileUnit* cu
 ) const
 {
-    const char* name = NULL;
+    const char* name = nullptr;
     if (!dwarf2Data)
         return name;
-    
-    DWARFFormValue form_value;
 
-    if (GetAttributeValue(dwarf2Data, cu, DW_AT_MIPS_linkage_name, form_value))
-        name = form_value.AsCString();
-    else if (GetAttributeValue(dwarf2Data, cu, DW_AT_linkage_name, form_value))
-        name = form_value.AsCString();
-    else if (GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
-        name = form_value.AsCString();
-    else if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value))
-    {
-        DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
-        if (die)
-            name = die.GetPubname();
-    }
+    name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_MIPS_linkage_name, nullptr, true);
+    if (name)
+        return name;
+
+    name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_linkage_name, nullptr, true);
+    if (name)
+        return name;
+
+    name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
     return name;
 }
 
@@ -1340,15 +1385,11 @@ DWARFDebugInfoEntry::GetName
         }
         else
         {
-            DWARFFormValue form_value;
-            if (die.GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
+            const char* name = die.GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
+            if (name)
             {
-                const char* name = form_value.AsCString();
-                if (name)
-                {
-                    s.PutCString(name);
-                    return true;
-                }
+                s.PutCString(name);
+                return true;
             }
         }
     }
@@ -1390,8 +1431,6 @@ DWARFDebugInfoEntry::AppendTypeName
         else
         {
             const char* name = die.GetPubname(dwarf2Data, cu);
-        //  if (die.GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
-        //      name = form_value.AsCString(&dwarf2Data->get_debug_str_data());
             if (name)
                 s.PutCString(name);
             else
@@ -1810,7 +1849,7 @@ DWARFDebugInfoEntry::LookupAddress
 
         if (match_addr_range)
         {
-            dw_addr_t lo_pc = GetAttributeValueAsUnsigned(dwarf2Data, cu, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
+            dw_addr_t lo_pc = GetAttributeValueAsAddress(dwarf2Data, cu, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
             if (lo_pc != LLDB_INVALID_ADDRESS)
             {
                 dw_addr_t hi_pc = GetAttributeHighPC(dwarf2Data, cu, lo_pc, LLDB_INVALID_ADDRESS);

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h Wed Sep  9 05:20:48 2015
@@ -115,62 +115,62 @@ 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 = NULL) const;
-
     const char* GetAttributeValueAsString(
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
                     const dw_attr_t attr,
-                    const char* fail_value) const;
+                    const char* fail_value,
+                    bool check_specification_or_abstract_origin = false) const;
 
     uint64_t    GetAttributeValueAsUnsigned(
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
                     const dw_attr_t attr,
-                    uint64_t fail_value) const;
+                    uint64_t fail_value,
+                    bool check_specification_or_abstract_origin = false) const;
 
     uint64_t    GetAttributeValueAsReference(
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
                     const dw_attr_t attr,
-                    uint64_t fail_value) const;
+                    uint64_t fail_value,
+                    bool check_specification_or_abstract_origin = false) const;
 
     int64_t     GetAttributeValueAsSigned(
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
                     const dw_attr_t attr,
-                    int64_t fail_value) const;
+                    int64_t fail_value,
+                    bool check_specification_or_abstract_origin = false) const;
+
+    uint64_t    GetAttributeValueAsAddress(
+                    SymbolFileDWARF* dwarf2Data,
+                    const DWARFCompileUnit* cu,
+                    const dw_attr_t attr,
+                    uint64_t fail_value,
+                    bool check_specification_or_abstract_origin = false) const;
 
     dw_addr_t   GetAttributeHighPC(
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
                     dw_addr_t lo_pc,
-                    uint64_t fail_value) const;
+                    uint64_t fail_value,
+                    bool check_specification_or_abstract_origin = false) const;
 
     bool        GetAttributeAddressRange(
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
                     dw_addr_t& lo_pc,
                     dw_addr_t& hi_pc,
-                    uint64_t fail_value) const;
+                    uint64_t fail_value,
+                    bool check_specification_or_abstract_origin = false) const;
     
     size_t      GetAttributeAddressRanges (
                     SymbolFileDWARF* dwarf2Data,
                     const DWARFCompileUnit* cu,
                     DWARFRangeList &ranges,
-                    bool check_hi_lo_pc) const;
-    
-    dw_offset_t GetAttributeValueAsLocation(
-                    SymbolFileDWARF* dwarf2Data,
-                    const DWARFCompileUnit* cu,
-                    const dw_attr_t attr,
-                    lldb_private::DWARFDataExtractor& data,
-                    uint32_t &block_size) const;
+                    bool check_hi_lo_pc,
+                    bool check_specification_or_abstract_origin = false) const;
 
     const char* GetName(
                     SymbolFileDWARF* dwarf2Data,
@@ -382,6 +382,13 @@ 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
     uint32_t    m_sibling_idx:31,   // How many to add to "this" to get the sibling.
@@ -389,7 +396,6 @@ protected:
     uint32_t    m_abbr_idx:DIE_ABBR_IDX_BITSIZE,
                 m_has_children:1,   // Set to 1 if this DIE has children
                 m_tag:16;           // A copy of the DW_TAG value so we don't have to go through the compile unit abbrev table
-                
 };
 
 #endif  // SymbolFileDWARF_DWARFDebugInfoEntry_h_

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h Wed Sep  9 05:20:48 2015
@@ -93,6 +93,7 @@ public:
     void                SetSigned(int64_t sval) { m_value.value.sval = sval; }
     const char*         AsCString() const;
     dw_addr_t           Address() const;
+    bool                IsValid() const { return m_form != 0; }
     bool                SkipValue(const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr) const;
     static bool         SkipValue(const dw_form_t form, const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu);
     static bool         IsBlockForm(const dw_form_t form);

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp Wed Sep  9 05:20:48 2015
@@ -14,7 +14,7 @@ DWARFMappedHash::ExtractDIEArray (const
 {
     const size_t count = die_info_array.size();
     for (size_t i=0; i<count; ++i)
-        die_offsets.push_back (die_info_array[i].offset);
+        die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
 }
 
 void
@@ -39,7 +39,7 @@ DWARFMappedHash::ExtractDIEArray (const
                     tag_matches = tag == DW_TAG_structure_type || tag == DW_TAG_class_type;
             }
             if (tag_matches)
-                die_offsets.push_back (die_info_array[i].offset);
+                die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
         }
     }
 }
@@ -69,7 +69,7 @@ DWARFMappedHash::ExtractDIEArray (const
                     tag_matches = tag == DW_TAG_structure_type || tag == DW_TAG_class_type;
             }
             if (tag_matches)
-                die_offsets.push_back (die_info_array[i].offset);
+                die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
         }
     }
 }
@@ -92,19 +92,19 @@ DWARFMappedHash::ExtractClassOrStructDIE
                     // We found the one true definition for this class, so
                     // only return that
                     die_offsets.clear();                        
-                    die_offsets.push_back (die_info_array[i].offset);
+                    die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
                     return;
                 }
                 else
                 {
                     // Put the one true definition as the first entry so it
                     // matches first
-                    die_offsets.insert (die_offsets.begin(), die_info_array[i].offset);
+                    die_offsets.emplace(die_offsets.begin(), die_info_array[i].cu_offset, die_info_array[i].offset);
                 }
             }
             else
             {
-                die_offsets.push_back (die_info_array[i].offset);
+                die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
             }
         }
     }
@@ -120,7 +120,7 @@ DWARFMappedHash::ExtractTypesFromDIEArra
     for (size_t i=0; i<count; ++i)
     {
         if ((die_info_array[i].type_flags & type_flag_mask) == type_flag_value)
-            die_offsets.push_back (die_info_array[i].offset);
+            die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
     }
 }
 
@@ -141,6 +141,7 @@ DWARFMappedHash::GetAtomTypeName (uint16
 }
 
 DWARFMappedHash::DIEInfo::DIEInfo () :
+    cu_offset (DW_INVALID_OFFSET),
     offset (DW_INVALID_OFFSET),
     tag (0),
     type_flags (0),
@@ -148,7 +149,12 @@ DWARFMappedHash::DIEInfo::DIEInfo () :
 {
 }
 
-DWARFMappedHash::DIEInfo::DIEInfo (dw_offset_t o, dw_tag_t t, uint32_t f, uint32_t h) :
+DWARFMappedHash::DIEInfo::DIEInfo (dw_offset_t c,
+                                   dw_offset_t o,
+                                   dw_tag_t t,
+                                   uint32_t f,
+                                   uint32_t h) :
+    cu_offset (c),
     offset (o),
     tag (t),
     type_flags (f),

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h Wed Sep  9 05:20:48 2015
@@ -52,13 +52,14 @@ public:
 
     struct DIEInfo
     {
+        dw_offset_t cu_offset;
         dw_offset_t offset;  // The DIE offset
         dw_tag_t tag;
         uint32_t type_flags; // Any flags for this DIEInfo
         uint32_t qualified_name_hash; // A 32 bit hash of the fully qualified name
 
         DIEInfo ();
-        DIEInfo (dw_offset_t o, dw_tag_t t, uint32_t f, uint32_t h);
+        DIEInfo (dw_offset_t c, dw_offset_t o, dw_tag_t t, uint32_t f, uint32_t h);
     };
 
     struct Atom
@@ -178,7 +179,7 @@ public:
         Result
         GetHashDataForName (const char *name,
                             lldb::offset_t* hash_data_offset_ptr,
-                            Pair &pair) const;
+                            Pair &pair) const override;
 
         const lldb_private::DWARFDataExtractor &m_data;
         const lldb_private::DWARFDataExtractor &m_string_table;
@@ -200,8 +201,6 @@ protected:
                      const uint32_t qualified_name_hash,
                      DIEArray &die_offsets);
 
-    
-
     static void
     ExtractClassOrStructDIEArray (const DIEInfoArray &die_info_array,
                                   bool return_implementation_only_if_available,
@@ -217,5 +216,4 @@ protected:
     GetAtomTypeName (uint16_t atom);
 };
 
-
 #endif  // SymbolFileDWARF_HashedNameToDIE_h_

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp Wed Sep  9 05:20:48 2015
@@ -18,6 +18,7 @@
 #include "DWARFDebugInfo.h"
 #include "DWARFDebugInfoEntry.h"
 #include "SymbolFileDWARF.h"
+
 using namespace lldb;
 using namespace lldb_private;
 
@@ -29,9 +30,9 @@ NameToDIE::Finalize()
 }
 
 void
-NameToDIE::Insert (const ConstString& name, uint32_t die_offset)
+NameToDIE::Insert (const ConstString& name, const DIERef& die_ref)
 {
-    m_map.Append(name.GetCString(), die_offset);
+    m_map.Append(name.GetCString(), die_ref);
 }
 
 size_t
@@ -47,17 +48,15 @@ NameToDIE::Find (const RegularExpression
 }
 
 size_t
-NameToDIE::FindAllEntriesForCompileUnit (uint32_t cu_offset, 
-                                         uint32_t cu_end_offset, 
-                                         DIEArray &info_array) const
+NameToDIE::FindAllEntriesForCompileUnit (dw_offset_t cu_offset, DIEArray &info_array) const
 {
     const size_t initial_size = info_array.size();
     const uint32_t size = m_map.GetSize();
     for (uint32_t i=0; i<size; ++i)
     {
-        const uint32_t die_offset = m_map.GetValueAtIndexUnchecked(i);
-        if (cu_offset < die_offset && die_offset < cu_end_offset)
-            info_array.push_back (die_offset);
+        const DIERef& die_ref = m_map.GetValueAtIndexUnchecked(i);
+        if (cu_offset == die_ref.cu_offset)
+            info_array.push_back (die_ref);
     }
     return info_array.size() - initial_size;
 }
@@ -69,18 +68,18 @@ NameToDIE::Dump (Stream *s)
     for (uint32_t i=0; i<size; ++i)
     {
         const char *cstr = m_map.GetCStringAtIndex(i);
-        s->Printf("%p: {0x%8.8x} \"%s\"\n", (const void *)cstr, m_map.GetValueAtIndexUnchecked(i), cstr);
+        const DIERef& die_ref = m_map.GetValueAtIndexUnchecked(i);
+        s->Printf("%p: {0x%8.8x/0x%8.8x} \"%s\"\n", cstr, die_ref.cu_offset, die_ref.die_offset, cstr);
     }
 }
 
 void
-NameToDIE::ForEach (std::function <bool(const char *name, uint32_t die_offset)> const &callback) const
+NameToDIE::ForEach (std::function <bool(const char *name, const DIERef& die_ref)> const &callback) const
 {
     const uint32_t size = m_map.GetSize();
     for (uint32_t i=0; i<size; ++i)
     {
-        if (!callback(m_map.GetCStringAtIndexUnchecked(i),
-                      m_map.GetValueAtIndexUnchecked (i)))
+        if (!callback(m_map.GetCStringAtIndexUnchecked(i), m_map.GetValueAtIndexUnchecked (i)))
             break;
     }
 }

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h Wed Sep  9 05:20:48 2015
@@ -10,56 +10,50 @@
 #ifndef SymbolFileDWARF_NameToDIE_h_
 #define SymbolFileDWARF_NameToDIE_h_
 
-#include "lldb/Core/UniqueCStringMap.h"
-
 #include <functional>
 
+#include "lldb/Core/dwarf.h"
+#include "lldb/Core/UniqueCStringMap.h"
 #include "lldb/lldb-defines.h"
+#include "DIERef.h"
 
 class SymbolFileDWARF;
 
-typedef std::vector<uint32_t> DIEArray;
-
 class NameToDIE
 {
 public:
-    NameToDIE () :   
+    NameToDIE () :
         m_map()
     {
     }
-    
+
     ~NameToDIE ()
     {
     }
-    
+
     void
     Dump (lldb_private::Stream *s);
 
     void
-    Insert (const lldb_private::ConstString& name, uint32_t die_offset);
+    Insert (const lldb_private::ConstString& name, const DIERef& die_ref);
 
     void
     Finalize();
 
     size_t
-    Find (const lldb_private::ConstString &name, 
-          DIEArray &info_array) const;
+    Find (const lldb_private::ConstString &name, DIEArray &info_array) const;
     
     size_t
-    Find (const lldb_private::RegularExpression& regex, 
-          DIEArray &info_array) const;
+    Find (const lldb_private::RegularExpression& regex, DIEArray &info_array) const;
 
     size_t
-    FindAllEntriesForCompileUnit (uint32_t cu_offset, 
-                                  uint32_t cu_end_offset, 
-                                  DIEArray &info_array) const;
+    FindAllEntriesForCompileUnit (dw_offset_t cu_offset, DIEArray &info_array) const;
 
     void
-    ForEach (std::function <bool(const char *name, uint32_t die_offset)> const &callback) const;
+    ForEach (std::function <bool(const char *name, const DIERef& die_ref)> const &callback) const;
 
 protected:
-    lldb_private::UniqueCStringMap<uint32_t> m_map;
-
+    lldb_private::UniqueCStringMap<DIERef> m_map;
 };
 
 #endif  // SymbolFileDWARF_NameToDIE_h_

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=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Wed Sep  9 05:20:48 2015
@@ -72,6 +72,7 @@
 #include "DWARFFormValue.h"
 #include "DWARFLocationList.h"
 #include "LogChannelDWARF.h"
+#include "SymbolFileDWARFDwo.h"
 #include "SymbolFileDWARFDebugMap.h"
 
 #include <map>
@@ -917,7 +918,11 @@ SymbolFileDWARF::ParseCompileUnit (DWARF
         }
         else
         {
-            if (GetDebugMapSymfile ())
+            if (dwarf_cu->GetSymbolFileDWARF() != this)
+            {
+                return dwarf_cu->GetSymbolFileDWARF()->ParseCompileUnit(dwarf_cu, cu_idx);
+            }
+            else if (GetDebugMapSymfile ())
             {
                 // Let the debug map create the compile unit
                 cu_sp = m_debug_map_symfile->GetCompileUnit(this);
@@ -1386,7 +1391,7 @@ SymbolFileDWARF::GetDeclContextForUID (l
         DWARFDebugInfo* debug_info = DebugInfo();
         if (debug_info)
         {
-            DWARFDIE die = debug_info->GetDIE(type_uid);
+            DWARFDIE die = debug_info->GetDIE(DIERef(type_uid));
             if (die)
             {
                 DWARFASTParser *dwarf_ast = die.GetDWARFParser();
@@ -1406,7 +1411,7 @@ SymbolFileDWARF::GetDeclContextContainin
         DWARFDebugInfo* debug_info = DebugInfo();
         if (debug_info)
         {
-            DWARFDIE die = debug_info->GetDIE(type_uid);
+            DWARFDIE die = debug_info->GetDIE(DIERef(type_uid));
             if (die)
             {
                 DWARFASTParser *dwarf_ast = die.GetDWARFParser();
@@ -1427,7 +1432,7 @@ SymbolFileDWARF::ResolveTypeUID (lldb::u
         DWARFDebugInfo* debug_info = DebugInfo();
         if (debug_info)
         {
-            DWARFDIE type_die = debug_info->GetDIE (type_uid);
+            DWARFDIE type_die = debug_info->GetDIE (DIERef(type_uid));
             if (type_die)
             {
                 const bool assert_not_being_parsed = true;
@@ -1493,7 +1498,7 @@ bool
 SymbolFileDWARF::HasForwardDeclForClangType (const CompilerType &clang_type)
 {
     CompilerType clang_type_no_qualifiers = ClangASTContext::RemoveFastQualifiers(clang_type);
-    return m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType()) != nullptr;
+    return GetForwardDeclClangTypeToDie().count (clang_type_no_qualifiers.GetOpaqueQualType());
 }
 
 
@@ -1502,8 +1507,8 @@ SymbolFileDWARF::CompleteType (CompilerT
 {
     // We have a struct/union/class/enum that needs to be fully resolved.
     CompilerType clang_type_no_qualifiers = ClangASTContext::RemoveFastQualifiers(clang_type);
-    const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType());
-    if (die == NULL)
+    auto die_it = GetForwardDeclClangTypeToDie().find (clang_type_no_qualifiers.GetOpaqueQualType());
+    if (die_it == GetForwardDeclClangTypeToDie().end())
     {
         // We have already resolved this type...
         return true;
@@ -1512,11 +1517,12 @@ SymbolFileDWARF::CompleteType (CompilerT
     // 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.
-    m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers.GetOpaqueQualType());
+    GetForwardDeclClangTypeToDie().erase (clang_type_no_qualifiers.GetOpaqueQualType());
 
     DWARFDebugInfo* debug_info = DebugInfo();
-    DWARFDIE dwarf_die (debug_info->GetCompileUnitContainingDIE (die->GetOffset()), die);
-    Type *type = m_die_to_type.lookup (die);
+    
+    DWARFDIE dwarf_die = debug_info->GetDIE(die_it->getSecond());
+    Type *type = GetDIEToType().lookup (dwarf_die.GetDIE());
 
     Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
     if (log)
@@ -1537,7 +1543,7 @@ SymbolFileDWARF::ResolveType (const DWAR
 {
     if (die)
     {
-        Type *type = m_die_to_type.lookup (die.GetDIE());
+        Type *type = GetDIEToType().lookup (die.GetDIE());
 
         if (type == NULL)
             type = GetTypeForDIE (die).get();
@@ -1623,8 +1629,7 @@ SymbolFileDWARF::UpdateExternalModuleLis
     m_fetched_external_modules = true;
     
     DWARFDebugInfo * debug_info = DebugInfo();
-    debug_info->GetNumCompileUnits();
-    
+
     const uint32_t num_compile_units = GetNumCompileUnits();
     for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
     {
@@ -2000,8 +2005,7 @@ SymbolFileDWARF::Index ()
 
             bool clear_dies = dwarf_cu->ExtractDIEsIfNeeded (false) > 1;
 
-            dwarf_cu->Index (cu_idx,
-                             m_function_basename_index,
+            dwarf_cu->Index (m_function_basename_index,
                              m_function_fullname_index,
                              m_function_method_index,
                              m_function_selector_index,
@@ -2127,8 +2131,8 @@ SymbolFileDWARF::FindGlobalVariables (co
         bool done = false;
         for (size_t i=0; i<num_die_matches && !done; ++i)
         {
-            const dw_offset_t die_offset = die_offsets[i];
-            DWARFDIE die = debug_info->GetDIE (die_offset);
+            const DIERef& die_ref = die_offsets[i];
+            DWARFDIE die = debug_info->GetDIE (die_ref);
 
             if (die)
             {
@@ -2169,7 +2173,7 @@ SymbolFileDWARF::FindGlobalVariables (co
                 if (m_using_apple_tables)
                 {
                     GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')\n",
-                                                                               die_offset, name.GetCString());
+                                                                               die_ref.die_offset, name.GetCString());
                 }
             }
         }
@@ -2215,7 +2219,7 @@ SymbolFileDWARF::FindGlobalVariables(con
     const uint32_t original_size = variables.GetSize();
 
     DIEArray die_offsets;
-    
+
     if (m_using_apple_tables)
     {
         if (m_apple_names_ap.get())
@@ -2244,8 +2248,8 @@ SymbolFileDWARF::FindGlobalVariables(con
         DWARFDebugInfo* debug_info = DebugInfo();
         for (size_t i=0; i<num_matches; ++i)
         {
-            const dw_offset_t die_offset = die_offsets[i];
-            DWARFDIE die = debug_info->GetDIE (die_offset);
+            const DIERef& die_ref = die_offsets[i];
+            DWARFDIE die = debug_info->GetDIE (die_ref);
             
             if (die)
             {
@@ -2261,7 +2265,7 @@ SymbolFileDWARF::FindGlobalVariables(con
                 if (m_using_apple_tables)
                 {
                     GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for regex '%s')\n",
-                                                                               die_offset, regex.GetText());
+                                                                               die_ref.die_offset, regex.GetText());
                 }
             }            
         }
@@ -2273,11 +2277,11 @@ SymbolFileDWARF::FindGlobalVariables(con
 
 
 bool
-SymbolFileDWARF::ResolveFunction (dw_offset_t die_offset,
+SymbolFileDWARF::ResolveFunction (const DIERef& die_ref,
                                   bool include_inlines,
                                   SymbolContextList& sc_list)
 {
-    DWARFDIE die = DebugInfo()->GetDIE (die_offset);
+    DWARFDIE die = DebugInfo()->GetDIE (die_ref);
     return ResolveFunction (die, include_inlines, sc_list);
 }
     
@@ -2397,10 +2401,7 @@ SymbolFileDWARF::ParseFunctions (const D
     if (num_matches)
     {
         for (size_t i=0; i<num_matches; ++i)
-        {
-            const dw_offset_t die_offset = die_offsets[i];
-            ResolveFunction (die_offset, include_inlines, sc_list);
-        }
+            ResolveFunction (die_offsets[i], include_inlines, sc_list);
     }
 }
 
@@ -2493,8 +2494,8 @@ SymbolFileDWARF::FindFunctions (const Co
                 num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);
                 for (uint32_t i = 0; i < num_matches; i++)
                 {
-                    const dw_offset_t die_offset = die_offsets[i];
-                    DWARFDIE die = info->GetDIE (die_offset);
+                    const DIERef& die_ref = die_offsets[i];
+                    DWARFDIE die = info->GetDIE (die_ref);
                     if (die)
                     {
                         if (!DIEInDeclContext(parent_decl_ctx, die))
@@ -2509,7 +2510,7 @@ SymbolFileDWARF::FindFunctions (const Co
                     else
                     {
                         GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')", 
-                                                                                   die_offset, name_cstr);
+                                                                                   die_ref.die_offset, name_cstr);
                     }                                    
                 }
             }
@@ -2525,8 +2526,8 @@ SymbolFileDWARF::FindFunctions (const Co
                 
                 for (uint32_t i = 0; i < num_matches; i++)
                 {
-                    const dw_offset_t die_offset = die_offsets[i];
-                    DWARFDIE die = info->GetDIE (die_offset);
+                    const DIERef& die_ref = die_offsets[i];
+                    DWARFDIE die = info->GetDIE (die_ref);
                     if (die)
                     {
                         const char *die_name = die.GetName();
@@ -2542,7 +2543,7 @@ SymbolFileDWARF::FindFunctions (const Co
                     else
                     {
                         GetObjectFile()->GetModule()->ReportError ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
-                                                                   die_offset, name_cstr);
+                                                                   die_ref.die_offset, name_cstr);
                     }                                    
                 }
                 die_offsets.clear();
@@ -2559,8 +2560,8 @@ SymbolFileDWARF::FindFunctions (const Co
                 
                 for (uint32_t i = 0; i < num_matches; i++)
                 {
-                    const dw_offset_t die_offset = die_offsets[i];
-                    DWARFDIE die = info->GetDIE (die_offset);
+                    const DIERef& die_ref = die_offsets[i];
+                    DWARFDIE die = info->GetDIE (die_ref);
                     if (die)
                     {
                         if (!DIEInDeclContext(parent_decl_ctx, die))
@@ -2609,7 +2610,7 @@ SymbolFileDWARF::FindFunctions (const Co
                                         else
                                         {
                                             GetObjectFile()->GetModule()->ReportWarning ("function at die offset 0x%8.8x had no function type",
-                                                                                         die_offset);
+                                                                                         die_ref.die_offset);
                                         }
                                     }
                                 }
@@ -2621,7 +2622,7 @@ SymbolFileDWARF::FindFunctions (const Co
                     else
                     {
                         GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
-                                                                                   die_offset, name_cstr);
+                                                                                   die_ref.die_offset, name_cstr);
                     }                                    
                 }
                 die_offsets.clear();
@@ -2856,8 +2857,8 @@ SymbolFileDWARF::FindTypes (const Symbol
         DWARFDebugInfo* debug_info = DebugInfo();
         for (size_t i=0; i<num_die_matches; ++i)
         {
-            const dw_offset_t die_offset = die_offsets[i];
-            DWARFDIE die = debug_info->GetDIE (die_offset);
+            const DIERef& die_ref = die_offsets[i];
+            DWARFDIE die = debug_info->GetDIE (die_ref);
 
             if (die)
             {
@@ -2878,7 +2879,7 @@ SymbolFileDWARF::FindTypes (const Symbol
                 if (m_using_apple_tables)
                 {
                     GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
-                                                                               die_offset, name.GetCString());
+                                                                               die_ref.die_offset, name.GetCString());
                 }
             }            
 
@@ -2960,8 +2961,8 @@ SymbolFileDWARF::FindNamespace (const Sy
             DWARFDebugInfo* debug_info = DebugInfo();
             for (size_t i=0; i<num_matches; ++i)
             {
-                const dw_offset_t die_offset = die_offsets[i];
-                DWARFDIE die = debug_info->GetDIE (die_offset);
+                const DIERef& die_ref = die_offsets[i];
+                DWARFDIE die = debug_info->GetDIE (die_ref);
 
                 if (die)
                 {
@@ -2981,7 +2982,7 @@ SymbolFileDWARF::FindNamespace (const Sy
                     if (m_using_apple_tables)
                     {
                         GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_namespaces accelerator table had bad die 0x%8.8x for '%s')\n",
-                                                                   die_offset, name.GetCString());
+                                                                   die_ref.die_offset, name.GetCString());
                     }
                 }            
 
@@ -3001,42 +3002,13 @@ SymbolFileDWARF::FindNamespace (const Sy
     return namespace_decl_ctx;
 }
 
-uint32_t
-SymbolFileDWARF::FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, TypeList& types)
-{
-    // Remember how many sc_list are in the list before we search in case
-    // we are appending the results to a variable list.
-    uint32_t original_size = types.GetSize();
-
-    const uint32_t num_die_offsets = die_offsets.size();
-    // Parse all of the types we found from the pubtypes matches
-    uint32_t i;
-    uint32_t num_matches = 0;
-    for (i = 0; i < num_die_offsets; ++i)
-    {
-        Type *matching_type = ResolveTypeUID (die_offsets[i]);
-        if (matching_type)
-        {
-            // We found a type pointer, now find the shared pointer form our type list
-            types.InsertUnique (matching_type->shared_from_this());
-            ++num_matches;
-            if (num_matches >= max_matches)
-                break;
-        }
-    }
-
-    // Return the number of variable that were appended to the list
-    return types.GetSize() - original_size;
-}
-
-
 TypeSP
 SymbolFileDWARF::GetTypeForDIE (const DWARFDIE &die)
 {
     TypeSP type_sp;
     if (die)
     {
-        Type *type_ptr = m_die_to_type.lookup (die.GetDIE());
+        Type *type_ptr = GetDIEToType().lookup (die.GetDIE());
         if (type_ptr == NULL)
         {
             CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(die.GetCU());
@@ -3195,8 +3167,8 @@ SymbolFileDWARF::FindCompleteObjCDefinit
         DWARFDebugInfo* debug_info = DebugInfo();
         for (size_t i=0; i<num_matches; ++i)
         {
-            const dw_offset_t die_offset = die_offsets[i];
-            DWARFDIE type_die = debug_info->GetDIE (die_offset);
+            const DIERef& die_ref = die_offsets[i];
+            DWARFDIE type_die = debug_info->GetDIE (die_ref);
             
             if (type_die)
             {
@@ -3233,7 +3205,7 @@ SymbolFileDWARF::FindCompleteObjCDefinit
                                           type_cu->GetID());
                             
                             if (die)
-                                m_die_to_type[die.GetDIE()] = resolved_type;
+                                GetDIEToType()[die.GetDIE()] = resolved_type;
                             type_sp = resolved_type->shared_from_this();
                             break;
                         }
@@ -3245,7 +3217,7 @@ SymbolFileDWARF::FindCompleteObjCDefinit
                 if (m_using_apple_tables)
                 {
                     GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
-                                                               die_offset, type_name.GetCString());
+                                                               die_ref.die_offset, type_name.GetCString());
                 }
             }            
             
@@ -3419,8 +3391,8 @@ SymbolFileDWARF::FindDefinitionTypeForDW
                 DWARFDebugInfo* debug_info = DebugInfo();
                 for (size_t i=0; i<num_matches; ++i)
                 {
-                    const dw_offset_t die_offset = die_offsets[i];
-                    DWARFDIE type_die = debug_info->GetDIE (die_offset);
+                    const DIERef& die_ref = die_offsets[i];
+                    DWARFDIE type_die = debug_info->GetDIE (die_ref);
                     
                     if (type_die)
                     {
@@ -3503,7 +3475,7 @@ SymbolFileDWARF::FindDefinitionTypeForDW
                         if (m_using_apple_tables)
                         {
                             GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
-                                                                                       die_offset, type_name.GetCString());
+                                                                                       die_ref.die_offset, type_name.GetCString());
                         }
                     }            
                     
@@ -3646,9 +3618,9 @@ SymbolFileDWARF::ParseVariablesForContex
         
         if (sc.function)
         {
-            DWARFDIE function_die = info->GetDIE(sc.function->GetID());
+            DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID()));
             
-            const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsUnsigned (DW_AT_low_pc, LLDB_INVALID_ADDRESS);
+            const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress (DW_AT_low_pc, LLDB_INVALID_ADDRESS);
             if (func_lo_pc != LLDB_INVALID_ADDRESS)
             {
                 const size_t num_variables = ParseVariables(sc, function_die.GetFirstChild(), func_lo_pc, true, true);
@@ -3695,7 +3667,6 @@ SymbolFileDWARF::ParseVariablesForContex
                         Index ();
 
                     m_global_index.FindAllEntriesForCompileUnit (dwarf_cu->GetOffset(), 
-                                                                 dwarf_cu->GetNextCompileUnitOffset(), 
                                                                  die_offsets);
                 }
 
@@ -3705,8 +3676,8 @@ SymbolFileDWARF::ParseVariablesForContex
                     DWARFDebugInfo* debug_info = DebugInfo();
                     for (size_t i=0; i<num_matches; ++i)
                     {
-                        const dw_offset_t die_offset = die_offsets[i];
-                        DWARFDIE die = debug_info->GetDIE (die_offset);
+                        const DIERef& die_ref = die_offsets[i];
+                        DWARFDIE die = debug_info->GetDIE (die_ref);
                         if (die)
                         {
                             VariableSP var_sp (ParseVariableDIE(sc, die, LLDB_INVALID_ADDRESS));
@@ -3720,7 +3691,7 @@ SymbolFileDWARF::ParseVariablesForContex
                         {
                             if (m_using_apple_tables)
                             {
-                                GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x)\n", die_offset);
+                                GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x)\n", die_ref.die_offset);
                             }
                         }            
 
@@ -3741,11 +3712,14 @@ SymbolFileDWARF::ParseVariableDIE
     const lldb::addr_t func_low_pc
 )
 {
+    if (die.GetDWARF() != this)
+        return die.GetDWARF()->ParseVariableDIE(sc, die, func_low_pc);
+
     VariableSP var_sp;
     if (!die)
         return var_sp;
 
-    var_sp = m_die_to_variable_sp[die.GetDIE()];
+    var_sp = GetDIEToVariable()[die.GetDIE()];
     if (var_sp)
         return var_sp;  // Already been parsed!
     
@@ -3764,7 +3738,7 @@ SymbolFileDWARF::ParseVariableDIE
             const char *mangled = NULL;
             Declaration decl;
             uint32_t i;
-            lldb::user_id_t type_uid = LLDB_INVALID_UID;
+            DWARFFormValue type_die_form;
             DWARFExpression location(die.GetCU());
             bool is_external = false;
             bool is_artificial = false;
@@ -3788,7 +3762,7 @@ SymbolFileDWARF::ParseVariableDIE
                     case DW_AT_name:        name = form_value.AsCString(); break;
                     case DW_AT_linkage_name:
                     case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(); break;
-                    case DW_AT_type:        type_uid = form_value.Reference(); break;
+                    case DW_AT_type:        type_die_form = form_value; break;
                     case DW_AT_external:    is_external = form_value.Boolean(); break;
                     case DW_AT_const_value:
                         // If we have already found a DW_AT_location attribute, ignore this attribute.
@@ -4063,7 +4037,7 @@ SymbolFileDWARF::ParseVariableDIE
 
             if (symbol_context_scope)
             {
-                SymbolFileTypeSP type_sp(new SymbolFileType(*this, type_uid));
+                SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID()));
                 
                 if (const_value.Form() && type_sp && type_sp->GetType())
                     location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), die.GetCU()->GetAddressByteSize());
@@ -4094,20 +4068,20 @@ SymbolFileDWARF::ParseVariableDIE
         // was missing vital information to be able to be displayed in the debugger
         // (missing location due to optimization, etc)) so we don't re-parse
         // this DIE over and over later...
-        m_die_to_variable_sp[die.GetDIE()] = var_sp;
+        GetDIEToVariable()[die.GetDIE()] = var_sp;
     }
     return var_sp;
 }
 
 
 DWARFDIE
-SymbolFileDWARF::FindBlockContainingSpecification (dw_offset_t func_die_offset, 
+SymbolFileDWARF::FindBlockContainingSpecification (const DIERef& func_die_ref,
                                                    dw_offset_t spec_block_die_offset)
 {
     // Give the concrete function die specified by "func_die_offset", find the 
     // concrete block whose DW_AT_specification or DW_AT_abstract_origin points
     // to "spec_block_die_offset"
-    return FindBlockContainingSpecification (DebugInfo()->GetDIE (func_die_offset), spec_block_die_offset);
+    return FindBlockContainingSpecification (DebugInfo()->GetDIE (func_die_ref), spec_block_die_offset);
 }
 
 
@@ -4166,7 +4140,7 @@ SymbolFileDWARF::ParseVariables (const S
         dw_tag_t tag = die.Tag();
 
         // Check to see if we have already parsed this variable or constant?
-        VariableSP var_sp = m_die_to_variable_sp[die.GetDIE()];
+        VariableSP var_sp = GetDIEToVariable()[die.GetDIE()];
         if (var_sp)
         {
             if (cc_variable_list)
@@ -4219,7 +4193,7 @@ SymbolFileDWARF::ParseVariables (const S
                                     // 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 (sc.function->GetID(),
+                                    const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID()),
                                                                                                           sc_parent_die.GetOffset());
                                     if (concrete_block_die)
                                         block = sc.function->GetBlock(true).FindBlockByID(concrete_block_die.GetID());
@@ -4324,5 +4298,3 @@ SymbolFileDWARF::GetDebugMapSymfile ()
     }
     return m_debug_map_symfile;
 }
-
-

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=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Wed Sep  9 05:20:48 2015
@@ -65,6 +65,7 @@ class SymbolFileDWARF : public lldb_priv
 {
 public:
     friend class SymbolFileDWARFDebugMap;
+    friend class SymbolFileDWARFDwo;
     friend class DebugMapModule;
     friend class DWARFCompileUnit;
     friend class DWARFASTParserClang;
@@ -265,7 +266,7 @@ public:
     const DWARFDebugRanges*
     DebugRanges() const;
 
-    const lldb_private::DWARFDataExtractor&
+    virtual const lldb_private::DWARFDataExtractor&
     GetCachedSectionData (uint32_t got_flag, 
                           lldb::SectionType sect_type, 
                           lldb_private::DWARFDataExtractor &data);
@@ -311,7 +312,14 @@ public:
     static DWARFDIE
     GetParentSymbolContextDIE(const DWARFDIE &die);
 
+    virtual lldb::CompUnitSP
+    ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx);
+
 protected:
+    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr;
+    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP;
+    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::clang_type_t> DIEToClangType;
+    typedef llvm::DenseMap<lldb::clang_type_t, DIERef> ClangTypeToDIE;
 
     enum
     {
@@ -343,11 +351,7 @@ protected:
 
     DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
 
-    lldb::CompUnitSP
-    ParseCompileUnit (DWARFCompileUnit* dwarf_cu,
-                      uint32_t cu_idx);
-
-    DWARFCompileUnit*
+    virtual DWARFCompileUnit*
     GetDWARFCompileUnit (lldb_private::CompileUnit *comp_unit);
 
     DWARFCompileUnit*
@@ -401,7 +405,7 @@ protected:
 
     // Given a die_offset, figure out the symbol context representing that die.
     bool
-    ResolveFunction (dw_offset_t offset,
+    ResolveFunction (const DIERef& die_ref,
                      bool include_inlines,
                      lldb_private::SymbolContextList& sc_list);
 
@@ -451,11 +455,6 @@ protected:
     lldb::TypeSP
     GetTypeForDIE (const DWARFDIE &die);
 
-    uint32_t
-    FindTypes (std::vector<dw_offset_t> die_offsets,
-               uint32_t max_matches,
-               lldb_private::TypeList& types);
-
     void
     Index();
     
@@ -472,12 +471,10 @@ protected:
     GetDebugMapSymfile ();
 
     DWARFDIE
-    FindBlockContainingSpecification (dw_offset_t func_die_offset,
-                                      dw_offset_t spec_block_die_offset);
+    FindBlockContainingSpecification (const DIERef& func_die_ref, dw_offset_t spec_block_die_offset);
 
     DWARFDIE
-    FindBlockContainingSpecification (const DWARFDIE &die,
-                                      dw_offset_t spec_block_die_offset);
+    FindBlockContainingSpecification (const DWARFDIE &die, dw_offset_t spec_block_die_offset);
     
     UniqueDWARFASTTypeMap &
     GetUniqueDWARFASTTypeMap ();
@@ -486,7 +483,7 @@ protected:
     UserIDMatches (lldb::user_id_t uid) const
     {
         const lldb::user_id_t high_uid = uid & 0xffffffff00000000ull;
-        if (high_uid)
+        if (high_uid != 0 && GetID() != 0)
             return high_uid == GetID();
         return true;
     }
@@ -526,6 +523,18 @@ protected:
     void
     UpdateExternalModuleListIfNeeded();
 
+    virtual DIEToTypePtr&
+    GetDIEToType() { return m_die_to_type; }
+
+    virtual DIEToVariableSP&
+    GetDIEToVariable() { return m_die_to_variable_sp; }
+    
+    virtual DIEToClangType&
+    GetForwardDeclDieToClangType() { return m_forward_decl_die_to_clang_type; }
+
+    virtual ClangTypeToDIE&
+    GetForwardDeclClangTypeToDie() { return m_forward_decl_clang_type_to_die; }
+
     lldb::ModuleWP                        m_debug_map_module_wp;
     SymbolFileDWARFDebugMap *             m_debug_map_symfile;
     lldb_private::Flags                   m_flags;
@@ -571,10 +580,6 @@ protected:
 
     std::unique_ptr<DWARFDebugRanges>     m_ranges;
     UniqueDWARFASTTypeMap m_unique_ast_type_map;
-    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr;
-    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP;
-    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::clang_type_t> DIEToClangType;
-    typedef llvm::DenseMap<lldb::clang_type_t, const DWARFDebugInfoEntry *> ClangTypeToDIE;
     DIEToTypePtr m_die_to_type;
     DIEToVariableSP m_die_to_variable_sp;
     DIEToClangType m_forward_decl_die_to_clang_type;

Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp?rev=247132&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp (added)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp Wed Sep  9 05:20:48 2015
@@ -0,0 +1,104 @@
+//===-- SymbolFileDWARFDwo.cpp ----------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SymbolFileDWARFDwo.h"
+
+#include "lldb/Core/Section.h"
+#include "lldb/Symbol/ObjectFile.h"
+
+#include "DWARFCompileUnit.h"
+#include "DWARFDebugInfo.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+SymbolFileDWARFDwo::SymbolFileDWARFDwo(ObjectFileSP objfile, DWARFCompileUnit* dwarf_cu) :
+    SymbolFileDWARF(objfile.get()),
+    m_obj_file_sp(objfile),
+    m_base_dwarf_cu(dwarf_cu)
+{
+}
+
+const lldb_private::DWARFDataExtractor&
+SymbolFileDWARFDwo::GetCachedSectionData(uint32_t got_flag,
+                                         lldb::SectionType sect_type,
+                                         lldb_private::DWARFDataExtractor &data)
+{
+    if (!m_flags.IsClear (got_flag))
+        return data;
+
+    const SectionList* section_list = m_obj_file->GetSectionList(false /* update_module_section_list */);
+    if (section_list)
+    {
+        SectionSP section_sp (section_list->FindSectionByType(sect_type, true));
+        if (section_sp)
+        {
+            // See if we memory mapped the DWARF segment?
+            if (m_dwarf_data.GetByteSize())
+            {
+                data.SetData(m_dwarf_data, section_sp->GetOffset(), section_sp->GetFileSize());
+                m_flags.Set (got_flag);
+                return data;
+            }
+
+            if (m_obj_file->ReadSectionData(section_sp.get(), data) != 0)
+            {
+                m_flags.Set (got_flag);
+                return data;
+            }
+
+            data.Clear();
+        }
+    }
+    return SymbolFileDWARF::GetCachedSectionData(got_flag, sect_type, data);
+}
+
+lldb::CompUnitSP
+SymbolFileDWARFDwo::ParseCompileUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
+{
+    assert(GetCompileUnit() == dwarf_cu && "SymbolFileDWARFDwo::ParseCompileUnit called with incompatible compile unit");
+    return m_base_dwarf_cu->GetSymbolFileDWARF()->ParseCompileUnit(m_base_dwarf_cu, UINT32_MAX);
+}
+
+DWARFCompileUnit*
+SymbolFileDWARFDwo::GetCompileUnit()
+{
+    assert(GetNumCompileUnits() == 1 && "Only dwo files with 1 compile unit is supported");
+    return DebugInfo()->GetCompileUnitAtIndex(0);
+}
+
+DWARFCompileUnit*
+SymbolFileDWARFDwo::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit)
+{
+    return GetCompileUnit();
+}
+
+SymbolFileDWARF::DIEToTypePtr&
+SymbolFileDWARFDwo::GetDIEToType()
+{
+    return m_base_dwarf_cu->GetSymbolFileDWARF()->GetDIEToType();
+}
+
+SymbolFileDWARF::DIEToVariableSP&
+SymbolFileDWARFDwo::GetDIEToVariable()
+{
+    return m_base_dwarf_cu->GetSymbolFileDWARF()->GetDIEToVariable();
+}
+
+SymbolFileDWARF::DIEToClangType&
+SymbolFileDWARFDwo::GetForwardDeclDieToClangType()
+{
+    return m_base_dwarf_cu->GetSymbolFileDWARF()->GetForwardDeclDieToClangType();
+}
+
+SymbolFileDWARF::ClangTypeToDIE&
+SymbolFileDWARFDwo::GetForwardDeclClangTypeToDie()
+{
+    return m_base_dwarf_cu->GetSymbolFileDWARF()->GetForwardDeclClangTypeToDie();
+}

Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h?rev=247132&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h (added)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h Wed Sep  9 05:20:48 2015
@@ -0,0 +1,58 @@
+//===-- SymbolFileDWARFDwo.h ------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SymbolFileDWARFDwo_SymbolFileDWARFDwo_h_
+#define SymbolFileDWARFDwo_SymbolFileDWARFDwo_h_
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "SymbolFileDWARF.h"
+
+class SymbolFileDWARFDwo : public SymbolFileDWARF
+{
+public:
+    SymbolFileDWARFDwo(lldb::ObjectFileSP objfile, DWARFCompileUnit* dwarf_cu);
+
+    virtual
+    ~SymbolFileDWARFDwo() = default;
+    
+    const lldb_private::DWARFDataExtractor&
+    GetCachedSectionData(uint32_t got_flag,
+                         lldb::SectionType sect_type,
+                         lldb_private::DWARFDataExtractor &data) override;
+    
+    lldb::CompUnitSP
+    ParseCompileUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) override;
+
+    DWARFCompileUnit*
+    GetCompileUnit();
+
+    DWARFCompileUnit*
+    GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) override;
+
+protected:
+    DIEToTypePtr&
+    GetDIEToType() override;
+
+    DIEToVariableSP&
+    GetDIEToVariable() override;
+    
+    DIEToClangType&
+    GetForwardDeclDieToClangType() override;
+
+    ClangTypeToDIE&
+    GetForwardDeclClangTypeToDie() override;
+
+    lldb::ObjectFileSP m_obj_file_sp;
+    DWARFCompileUnit* m_base_dwarf_cu;
+};
+
+#endif  // SymbolFileDWARFDwo_SymbolFileDWARFDwo_h_

Modified: lldb/trunk/source/Symbol/ObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ObjectFile.cpp?rev=247132&r1=247131&r2=247132&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ObjectFile.cpp (original)
+++ lldb/trunk/source/Symbol/ObjectFile.cpp Wed Sep  9 05:20:48 2015
@@ -602,15 +602,23 @@ ObjectFile::ClearSymtab ()
 }
 
 SectionList *
-ObjectFile::GetSectionList()
+ObjectFile::GetSectionList(bool update_module_section_list)
 {
     if (m_sections_ap.get() == nullptr)
     {
-        ModuleSP module_sp(GetModule());
-        if (module_sp)
+        if (update_module_section_list)
         {
-            lldb_private::Mutex::Locker locker(module_sp->GetMutex());
-            CreateSections(*module_sp->GetUnifiedSectionList());
+            ModuleSP module_sp(GetModule());
+            if (module_sp)
+            {
+                lldb_private::Mutex::Locker locker(module_sp->GetMutex());
+                CreateSections(*module_sp->GetUnifiedSectionList());
+            }
+        }
+        else
+        {
+            SectionList unified_section_list;
+            CreateSections(unified_section_list);
         }
     }
     return m_sections_ap.get();




More information about the lldb-commits mailing list