[Lldb-commits] [lldb] r246100 - Major DWARF cleanup.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Wed Aug 26 15:57:52 PDT 2015
Author: gclayton
Date: Wed Aug 26 17:57:51 2015
New Revision: 246100
URL: http://llvm.org/viewvc/llvm-project?rev=246100&view=rev
Log:
Major DWARF cleanup.
Added a new class called DWARFDIE that contains a DWARFCompileUnit and DWARFDebugInfoEntry so that these items always stay together.
There were many places where we just handed out DWARFDebugInfoEntry pointers and then use them with a compile unit that may or may not be the correct one. Clients outside of DWARFCompileUnit and DWARFDebugInfoEntry should all be dealing with DWARFDIE instances instead of playing with DWARFCompileUnit/DWARFDebugInfoEntry pairs manually.
This paves to the way for some modifications that are coming for DWO.
Added:
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
Modified:
lldb/trunk/include/lldb/Core/dwarf.h
lldb/trunk/include/lldb/Symbol/ClangASTContext.h
lldb/trunk/include/lldb/Symbol/TypeSystem.h
lldb/trunk/lldb.xcodeproj/project.pbxproj
lldb/trunk/source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.h
lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.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/DWARFDebugPubnames.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h
lldb/trunk/source/Symbol/ClangASTContext.cpp
lldb/trunk/source/Symbol/TypeSystem.cpp
lldb/trunk/source/Target/Target.cpp
Modified: lldb/trunk/include/lldb/Core/dwarf.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/dwarf.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/dwarf.h (original)
+++ lldb/trunk/include/lldb/Core/dwarf.h Wed Aug 26 17:57:51 2015
@@ -14,6 +14,9 @@
// Get the DWARF constant definitions from llvm
#include "llvm/Support/Dwarf.h"
+
+#include "lldb/Core/RangeMap.h"
+
// and stuff them in our default namespace
using namespace llvm::dwarf;
@@ -59,5 +62,6 @@ typedef uint32_t dw_offset_t; // D
//#define DW_OP_APPLE_clear 0xFE // clears the entire expression stack, ok if the stack is empty
//#define DW_OP_APPLE_error 0xFF // Stops expression evaluation and returns an error (no args)
+typedef lldb_private::RangeArray<dw_addr_t, dw_addr_t, 2> DWARFRangeList;
#endif // DebugBase_dwarf_h_
Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)
+++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Wed Aug 26 17:57:51 2015
@@ -35,10 +35,8 @@
// Forward definitions for DWARF plug-in for type parsing
-class DWARFCompileUnit;
-class DWARFDebugInfoEntry;
+class DWARFDIE;
class DWARFDIECollection;
-class SymbolFileDWARF;
namespace lldb_private {
@@ -502,35 +500,25 @@ public:
lldb::TypeSP
ParseTypeFromDWARF (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
Log *log,
bool *type_is_new_ptr) override;
Function *
ParseFunctionFromDWARF (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die) override;
+ const DWARFDIE &die) override;
bool
- CompleteTypeFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry* die,
+ CompleteTypeFromDWARF (const DWARFDIE &die,
lldb_private::Type *type,
CompilerType &clang_type) override;
CompilerDeclContext
- GetDeclContextForUIDFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry* die) override;
+ GetDeclContextForUIDFromDWARF (const DWARFDIE &die) override;
CompilerDeclContext
- GetDeclContextContainingUIDFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry* die) override;
+ GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die) override;
//------------------------------------------------------------------
// ClangASTContext callbacks for external source lookups.
@@ -551,9 +539,7 @@ public:
llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets);
clang::NamespaceDecl *
- ResolveNamespaceDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry *die);
+ ResolveNamespaceDIE (const DWARFDIE &die);
//----------------------------------------------------------------------
// CompilerDeclContext override functions
@@ -1141,19 +1127,14 @@ protected:
// DWARF parsing functions
bool
- ParseTemplateDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ ParseTemplateDIE (const DWARFDIE &die,
ClangASTContext::TemplateParameterInfos &template_param_infos);
bool
- ParseTemplateParameterInfos (SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die,
+ ParseTemplateParameterInfos (const DWARFDIE &parent_die,
ClangASTContext::TemplateParameterInfos &template_param_infos);
clang::ClassTemplateDecl *
- ParseClassTemplateDecl (SymbolFileDWARF *dwarf,
- clang::DeclContext *decl_ctx,
+ ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
lldb::AccessType access_type,
const char *parent_name,
int tag_decl_kind,
@@ -1164,9 +1145,7 @@ protected:
size_t
ParseChildMembers (const lldb_private::SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
lldb_private::CompilerType &class_clang_type,
const lldb::LanguageType class_language,
std::vector<clang::CXXBaseSpecifier *>& base_classes,
@@ -1180,9 +1159,7 @@ protected:
size_t
ParseChildParameters (const lldb_private::SymbolContext& sc,
clang::DeclContext *containing_decl_ctx,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die,
+ const DWARFDIE &parent_die,
bool skip_artificial,
bool &is_static,
bool &is_variadic,
@@ -1193,9 +1170,7 @@ protected:
void
ParseChildArrayInfo (const lldb_private::SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die,
+ const DWARFDIE &parent_die,
int64_t& first_index,
std::vector<uint64_t>& element_orders,
uint32_t& byte_stride,
@@ -1207,29 +1182,19 @@ protected:
lldb_private::CompilerType &clang_type,
bool is_signed,
uint32_t enumerator_byte_size,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die);
+ const DWARFDIE &parent_die);
clang::DeclContext *
- GetClangDeclContextForDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die);
+ GetClangDeclContextForDIE (const DWARFDIE &die);
clang::DeclContext *
- GetClangDeclContextContainingDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die,
- const DWARFDebugInfoEntry **decl_ctx_die);
+ GetClangDeclContextContainingDIE (const DWARFDIE &die,
+ DWARFDIE *decl_ctx_die);
bool
- CopyUniqueClassMethodTypes (SymbolFileDWARF *dwarf,
- SymbolFileDWARF *src_symfile,
+ CopyUniqueClassMethodTypes (const DWARFDIE &src_class_die,
+ const DWARFDIE &dst_class_die,
Type *class_type,
- DWARFCompileUnit* src_cu,
- const DWARFDebugInfoEntry *src_class_die,
- DWARFCompileUnit* dst_cu,
- const DWARFDebugInfoEntry *dst_class_die,
DWARFDIECollection &failures);
clang::DeclContext *
@@ -1244,12 +1209,7 @@ protected:
void
LinkDeclContextToDIE (clang::DeclContext *decl_ctx,
- const DWARFDebugInfoEntry *die)
- {
- m_die_to_decl_ctx[die] = decl_ctx;
- // There can be many DIEs for a single decl context
- m_decl_ctx_to_die[decl_ctx].insert(die);
- }
+ const DWARFDIE &die);
typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet;
typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap;
Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original)
+++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Wed Aug 26 17:57:51 2015
@@ -18,8 +18,7 @@
#include "clang/AST/CharUnits.h"
#include "clang/AST/Type.h"
-class SymbolFileDWARF;
-class DWARFCompileUnit;
+class DWARFDIE;
class DWARFDebugInfoEntry;
namespace lldb_private {
@@ -45,22 +44,16 @@ public:
//----------------------------------------------------------------------
virtual lldb::TypeSP
ParseTypeFromDWARF (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
Log *log,
bool *type_is_new_ptr) = 0;
virtual Function *
ParseFunctionFromDWARF (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die) = 0;
+ const DWARFDIE &die) = 0;
virtual bool
- CompleteTypeFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry* die,
+ CompleteTypeFromDWARF (const DWARFDIE &die,
lldb_private::Type *type,
CompilerType &clang_type)
{
@@ -68,17 +61,13 @@ public:
}
virtual CompilerDeclContext
- GetDeclContextForUIDFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry* die)
+ GetDeclContextForUIDFromDWARF (const DWARFDIE &die)
{
return CompilerDeclContext();
}
virtual CompilerDeclContext
- GetDeclContextContainingUIDFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry* die)
+ GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die)
{
return CompilerDeclContext();
}
Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Wed Aug 26 17:57:51 2015
@@ -290,6 +290,8 @@
2669424C1A6DC2AC0063BE93 /* Platform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266941FC1A6DC2AC0063BE93 /* Platform.cpp */; };
2669424D1A6DC32B0063BE93 /* LLDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26680207115FD0ED008E1FE4 /* LLDB.framework */; };
266DFE9713FD656E00D0C574 /* OperatingSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266DFE9613FD656E00D0C574 /* OperatingSystem.cpp */; };
+ 266E82971B8CE3AC008FCA06 /* DWARFDIE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266E82961B8CE3AC008FCA06 /* DWARFDIE.cpp */; settings = {ASSET_TAGS = (); }; };
+ 266E829D1B8E542C008FCA06 /* DWARFAttribute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266E829C1B8E542C008FCA06 /* DWARFAttribute.cpp */; settings = {ASSET_TAGS = (); }; };
2670F8121862B44A006B332C /* libncurses.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2670F8111862B44A006B332C /* libncurses.dylib */; };
2671A0D013482601003A87BB /* ConnectionMachPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2671A0CF13482601003A87BB /* ConnectionMachPort.cpp */; };
26744EF11338317700EF765A /* GDBRemoteCommunicationClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26744EED1338317700EF765A /* GDBRemoteCommunicationClient.cpp */; };
@@ -1631,6 +1633,9 @@
266960631199F4230075C61A /* sed-sources */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "sed-sources"; sourceTree = "<group>"; };
266DFE9613FD656E00D0C574 /* OperatingSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OperatingSystem.cpp; path = source/Target/OperatingSystem.cpp; sourceTree = "<group>"; };
266DFE9813FD658300D0C574 /* OperatingSystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OperatingSystem.h; path = include/lldb/Target/OperatingSystem.h; sourceTree = "<group>"; };
+ 266E82951B8CE346008FCA06 /* DWARFDIE.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWARFDIE.h; sourceTree = "<group>"; };
+ 266E82961B8CE3AC008FCA06 /* DWARFDIE.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DWARFDIE.cpp; sourceTree = "<group>"; };
+ 266E829C1B8E542C008FCA06 /* DWARFAttribute.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DWARFAttribute.cpp; sourceTree = "<group>"; };
266F5CBB12FC846200DFCE33 /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Config.h; path = include/lldb/Host/Config.h; sourceTree = "<group>"; };
26709E311964A34000B94724 /* LaunchServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LaunchServices.framework; path = /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework; sourceTree = "<absolute>"; };
2670F8111862B44A006B332C /* libncurses.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libncurses.dylib; path = /usr/lib/libncurses.dylib; sourceTree = "<absolute>"; };
@@ -3079,6 +3084,7 @@
260C89B310F57C5600BB2B04 /* DWARFAbbreviationDeclaration.cpp */,
260C89B410F57C5600BB2B04 /* DWARFAbbreviationDeclaration.h */,
260C89B610F57C5600BB2B04 /* DWARFAttribute.h */,
+ 266E829C1B8E542C008FCA06 /* DWARFAttribute.cpp */,
260C89B710F57C5600BB2B04 /* DWARFCompileUnit.cpp */,
260C89B810F57C5600BB2B04 /* DWARFCompileUnit.h */,
26AB92101819D74600E63F3E /* DWARFDataExtractor.cpp */,
@@ -3109,6 +3115,8 @@
26B1EFAD154638AF00E2DAC7 /* DWARFDeclContext.h */,
260C89CF10F57C5600BB2B04 /* DWARFDefines.cpp */,
260C89D010F57C5600BB2B04 /* DWARFDefines.h */,
+ 266E82951B8CE346008FCA06 /* DWARFDIE.h */,
+ 266E82961B8CE3AC008FCA06 /* DWARFDIE.cpp */,
260C89D110F57C5600BB2B04 /* DWARFDIECollection.cpp */,
260C89D210F57C5600BB2B04 /* DWARFDIECollection.h */,
260C89D310F57C5600BB2B04 /* DWARFFormValue.cpp */,
@@ -6096,6 +6104,7 @@
2689004413353E0400698AC0 /* Module.cpp in Sources */,
2689004513353E0400698AC0 /* ModuleChild.cpp in Sources */,
23EDE33319269E7C00F6A132 /* NativeRegisterContext.cpp in Sources */,
+ 266E829D1B8E542C008FCA06 /* DWARFAttribute.cpp in Sources */,
2689004613353E0400698AC0 /* ModuleList.cpp in Sources */,
2689004713353E0400698AC0 /* PluginManager.cpp in Sources */,
AF0C112818580CD800C4C45B /* QueueItem.cpp in Sources */,
@@ -6258,6 +6267,7 @@
268900CD13353E5F00698AC0 /* UniqueDWARFASTType.cpp in Sources */,
944372DC171F6B4300E57C32 /* RegisterContextDummy.cpp in Sources */,
268900CE13353E5F00698AC0 /* SymbolFileSymtab.cpp in Sources */,
+ 266E82971B8CE3AC008FCA06 /* DWARFDIE.cpp in Sources */,
268900CF13353E5F00698AC0 /* SymbolVendorMacOSX.cpp in Sources */,
268900D013353E6F00698AC0 /* Block.cpp in Sources */,
268900D113353E6F00698AC0 /* ClangASTContext.cpp in Sources */,
Modified: lldb/trunk/source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.h (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.h Wed Aug 26 17:57:51 2015
@@ -52,7 +52,7 @@ public:
virtual void
DidLaunch() override;
- virtual lldb::ThreadPlanSP
+ lldb::ThreadPlanSP
GetStepThroughTrampolinePlan(lldb_private::Thread &thread,
bool stop_others) override;
Modified: lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h Wed Aug 26 17:57:51 2015
@@ -54,7 +54,7 @@ public:
virtual void
DidLaunch() override;
- virtual lldb::ThreadPlanSP
+ lldb::ThreadPlanSP
GetStepThroughTrampolinePlan(lldb_private::Thread &thread,
bool stop_others) override;
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt Wed Aug 26 17:57:51 2015
@@ -2,6 +2,7 @@ set(LLVM_NO_RTTI 1)
add_lldb_library(lldbPluginSymbolFileDWARF
DWARFAbbreviationDeclaration.cpp
+ DWARFAttribute.cpp
DWARFCompileUnit.cpp
DWARFDataExtractor.cpp
DWARFDebugAbbrev.cpp
@@ -17,6 +18,7 @@ add_lldb_library(lldbPluginSymbolFileDWA
DWARFDebugRanges.cpp
DWARFDeclContext.cpp
DWARFDefines.cpp
+ DWARFDIE.cpp
DWARFDIECollection.cpp
DWARFFormValue.cpp
DWARFLocationDescription.cpp
Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp?rev=246100&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp (added)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp Wed Aug 26 17:57:51 2015
@@ -0,0 +1,90 @@
+//===-- DWARFAttribute.cpp --------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DWARFAttribute.h"
+#include "DWARFDebugInfo.h"
+#include "DWARFCompileUnit.h"
+
+DWARFAttributes::DWARFAttributes() :
+ m_infos()
+{
+}
+
+DWARFAttributes::~DWARFAttributes()
+{
+}
+
+
+uint32_t
+DWARFAttributes::FindAttributeIndex(dw_attr_t attr) const
+{
+ collection::const_iterator end = m_infos.end();
+ collection::const_iterator beg = m_infos.begin();
+ collection::const_iterator pos;
+ for (pos = beg; pos != end; ++pos)
+ {
+ if (pos->attr.get_attr() == attr)
+ return std::distance(beg, pos);
+ }
+ return UINT32_MAX;
+}
+
+void
+DWARFAttributes::Append(const DWARFCompileUnit *cu, dw_offset_t attr_die_offset, dw_attr_t attr, dw_form_t form)
+{
+ AttributeValue attr_value = { cu, attr_die_offset, { attr, form } };
+ m_infos.push_back(attr_value);
+}
+
+bool
+DWARFAttributes::ContainsAttribute(dw_attr_t attr) const
+{
+ return FindAttributeIndex(attr) != UINT32_MAX;
+}
+
+bool
+DWARFAttributes::RemoveAttribute(dw_attr_t attr)
+{
+ uint32_t attr_index = FindAttributeIndex(attr);
+ if (attr_index != UINT32_MAX)
+ {
+ m_infos.erase(m_infos.begin() + attr_index);
+ return true;
+ }
+ return false;
+}
+
+bool
+DWARFAttributes::ExtractFormValueAtIndex (uint32_t i, DWARFFormValue &form_value) const
+{
+ const DWARFCompileUnit *cu = CompileUnitAtIndex(i);
+ form_value.SetCompileUnit(cu);
+ form_value.SetForm(FormAtIndex(i));
+ lldb::offset_t offset = DIEOffsetAtIndex(i);
+ return form_value.ExtractValue(cu->GetSymbolFileDWARF()->get_debug_info_data(), &offset);
+}
+
+uint64_t
+DWARFAttributes::FormValueAsUnsigned (dw_attr_t attr, uint64_t fail_value) const
+{
+ const uint32_t attr_idx = FindAttributeIndex (attr);
+ if (attr_idx != UINT32_MAX)
+ return FormValueAsUnsignedAtIndex (attr_idx, fail_value);
+ return fail_value;
+}
+
+uint64_t
+DWARFAttributes::FormValueAsUnsignedAtIndex(uint32_t i, uint64_t fail_value) const
+{
+ DWARFFormValue form_value;
+ if (ExtractFormValueAtIndex(i, form_value))
+ return form_value.Reference();
+ return fail_value;
+}
+
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h Wed Aug 26 17:57:51 2015
@@ -10,36 +10,72 @@
#ifndef SymbolFileDWARF_DWARFAttribute_h_
#define SymbolFileDWARF_DWARFAttribute_h_
+#include "llvm/ADT/SmallVector.h"
#include "DWARFDefines.h"
#include <vector>
+class DWARFCompileUnit;
+class DWARFFormValue;
+
class DWARFAttribute
{
public:
DWARFAttribute(dw_attr_t attr, dw_form_t form) :
- m_attr_form ( attr << 16 | form )
+ m_attr (attr),
+ m_form (form)
{
}
- void set(dw_attr_t attr, dw_form_t form) { m_attr_form = (attr << 16) | form; }
- void set_attr(dw_attr_t attr) { m_attr_form = (m_attr_form & 0x0000ffffu) | (attr << 16); }
- void set_form(dw_form_t form) { m_attr_form = (m_attr_form & 0xffff0000u) | form; }
- dw_attr_t get_attr() const { return m_attr_form >> 16; }
- dw_form_t get_form() const { return (dw_form_t)m_attr_form; }
- void get(dw_attr_t& attr, dw_form_t& form) const
+ void set (dw_attr_t attr, dw_form_t form) { m_attr = attr; m_form = form; }
+ void set_attr (dw_attr_t attr) { m_attr = attr; }
+ void set_form (dw_form_t form) { m_form = form; }
+ dw_attr_t get_attr () const { return m_attr; }
+ dw_form_t get_form () const { return m_form; }
+ void get (dw_attr_t& attr, dw_form_t& form) const
{
- uint32_t attr_form = m_attr_form;
- attr = attr_form >> 16;
- form = (dw_form_t)attr_form;
+ attr = m_attr;
+ form = m_form;
}
- bool operator == (const DWARFAttribute& rhs) const { return m_attr_form == rhs.m_attr_form; }
+ bool operator == (const DWARFAttribute& rhs) const { return m_attr == rhs.m_attr && m_form == rhs.m_form; }
typedef std::vector<DWARFAttribute> collection;
typedef collection::iterator iterator;
typedef collection::const_iterator const_iterator;
protected:
- uint32_t m_attr_form; // Upper 16 bits is attribute, lower 16 bits is form
+ dw_attr_t m_attr;
+ dw_form_t m_form;
};
+class DWARFAttributes
+{
+public:
+ DWARFAttributes();
+ ~DWARFAttributes();
+
+ void Append(const DWARFCompileUnit *cu, dw_offset_t attr_die_offset, dw_attr_t attr, dw_form_t form);
+ const DWARFCompileUnit * CompileUnitAtIndex(uint32_t i) const { return m_infos[i].cu; }
+ dw_offset_t DIEOffsetAtIndex(uint32_t i) const { return m_infos[i].die_offset; }
+ dw_attr_t AttributeAtIndex(uint32_t i) const { return m_infos[i].attr.get_attr(); }
+ dw_attr_t FormAtIndex(uint32_t i) const { return m_infos[i].attr.get_form(); }
+ bool ExtractFormValueAtIndex (uint32_t i, DWARFFormValue &form_value) const;
+ uint64_t FormValueAsUnsignedAtIndex (uint32_t i, uint64_t fail_value) const;
+ uint64_t FormValueAsUnsigned (dw_attr_t attr, uint64_t fail_value) const;
+ uint32_t FindAttributeIndex(dw_attr_t attr) const;
+ bool ContainsAttribute(dw_attr_t attr) const;
+ bool RemoveAttribute(dw_attr_t attr);
+ void Clear() { m_infos.clear(); }
+ size_t Size() const { return m_infos.size(); }
+
+protected:
+ struct AttributeValue
+ {
+ const DWARFCompileUnit *cu; // Keep the compile unit with each attribute in case we have DW_FORM_ref_addr values
+ dw_offset_t die_offset;
+ DWARFAttribute attr;
+ };
+ typedef llvm::SmallVector<AttributeValue, 8> collection;
+ collection m_infos;
+};
+
#endif // SymbolFileDWARF_DWARFAttribute_h_
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp Wed Aug 26 17:57:51 2015
@@ -376,6 +376,15 @@ DWARFCompileUnit::SetDefaultAddressSize(
g_default_addr_size = addr_size;
}
+lldb::user_id_t
+DWARFCompileUnit::GetID () const
+{
+ if (m_dwarf2Data)
+ return m_dwarf2Data->MakeUserID(GetOffset());
+ else
+ return GetOffset();
+}
+
void
DWARFCompileUnit::BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
DWARFDebugAranges* debug_aranges)
@@ -392,7 +401,7 @@ DWARFCompileUnit::BuildAddressRangeTable
const dw_offset_t cu_offset = GetOffset();
if (die)
{
- DWARFDebugRanges::RangeList ranges;
+ DWARFRangeList ranges;
const size_t num_ranges = die->GetAttributeAddressRanges(dwarf2Data, this, ranges, false);
if (num_ranges > 0)
{
@@ -402,7 +411,7 @@ DWARFCompileUnit::BuildAddressRangeTable
// this with recent GCC builds.
for (size_t i=0; i<num_ranges; ++i)
{
- const DWARFDebugRanges::RangeList::Entry &range = ranges.GetEntryRef(i);
+ const DWARFRangeList::Entry &range = ranges.GetEntryRef(i);
debug_aranges->AppendRange(cu_offset, range.GetRangeBase(), range.GetRangeEnd());
}
@@ -416,7 +425,7 @@ DWARFCompileUnit::BuildAddressRangeTable
// and then throwing them all away to keep memory usage down.
const bool clear_dies = ExtractDIEsIfNeeded (false) > 1;
- die = DIE();
+ die = DIEPtr();
if (die)
die->BuildAddressRangeTable(dwarf2Data, this, debug_aranges);
@@ -496,7 +505,7 @@ DWARFCompileUnit::GetFunctionAranges ()
"DWARFCompileUnit::GetFunctionAranges() for compile unit at .debug_info[0x%8.8x]",
GetOffset());
}
- const DWARFDebugInfoEntry* die = DIE();
+ const DWARFDebugInfoEntry* die = DIEPtr();
if (die)
die->BuildFunctionAddressRangeTable (m_dwarf2Data, this, m_func_aranges_ap.get());
const bool minimize = false;
@@ -505,74 +514,58 @@ DWARFCompileUnit::GetFunctionAranges ()
return *m_func_aranges_ap.get();
}
-bool
-DWARFCompileUnit::LookupAddress
-(
- const dw_addr_t address,
- DWARFDebugInfoEntry** function_die_handle,
- DWARFDebugInfoEntry** block_die_handle
-)
+DWARFDIE
+DWARFCompileUnit::LookupAddress (const dw_addr_t address)
{
- bool success = false;
-
- if (function_die_handle != NULL && DIE())
+ if (DIE())
{
-
const DWARFDebugAranges &func_aranges = GetFunctionAranges ();
// Re-check the aranges auto pointer contents in case it was created above
if (!func_aranges.IsEmpty())
- {
- *function_die_handle = GetDIEPtr(func_aranges.FindAddress(address));
- if (*function_die_handle != NULL)
- {
- success = true;
- if (block_die_handle != NULL)
- {
- DWARFDebugInfoEntry* child = (*function_die_handle)->GetFirstChild();
- while (child)
- {
- if (child->LookupAddress(address, m_dwarf2Data, this, NULL, block_die_handle))
- break;
- child = child->GetSibling();
- }
- }
- }
- }
+ return GetDIE(func_aranges.FindAddress(address));
}
- return success;
+ return DWARFDIE();
}
//----------------------------------------------------------------------
// Compare function DWARFDebugAranges::Range structures
//----------------------------------------------------------------------
-static bool CompareDIEOffset (const DWARFDebugInfoEntry& die1, const DWARFDebugInfoEntry& die2)
+static bool CompareDIEOffset (const DWARFDebugInfoEntry& die, const dw_offset_t die_offset)
{
- return die1.GetOffset() < die2.GetOffset();
+ return die.GetOffset() < die_offset;
}
//----------------------------------------------------------------------
-// GetDIEPtr()
+// GetDIE()
//
-// Get the DIE (Debug Information Entry) with the specified offset.
+// Get the DIE (Debug Information Entry) with the specified offset by
+// first checking if the DIE is contained within this compile unit and
+// grabbing the DIE from this compile unit. Otherwise we grab the DIE
+// from the DWARF file.
//----------------------------------------------------------------------
-DWARFDebugInfoEntry*
-DWARFCompileUnit::GetDIEPtr(dw_offset_t die_offset)
+DWARFDIE
+DWARFCompileUnit::GetDIE (dw_offset_t die_offset)
{
if (die_offset != DW_INVALID_OFFSET)
{
- ExtractDIEsIfNeeded (false);
- DWARFDebugInfoEntry compare_die;
- compare_die.SetOffset(die_offset);
- DWARFDebugInfoEntry::iterator end = m_die_array.end();
- DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, compare_die, CompareDIEOffset);
- if (pos != end)
+ if (ContainsDIEOffset(die_offset))
{
- if (die_offset == (*pos).GetOffset())
- return &(*pos);
+ ExtractDIEsIfNeeded (false);
+ DWARFDebugInfoEntry::iterator end = m_die_array.end();
+ DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, die_offset, CompareDIEOffset);
+ if (pos != end)
+ {
+ if (die_offset == (*pos).GetOffset())
+ return DWARFDIE(this, &(*pos));
+ }
+ }
+ else
+ {
+ return m_dwarf2Data->DebugInfo()->GetDIE (die_offset);
}
}
- return NULL; // Not found in any compile units
+ return DWARFDIE(); // Not found
}
//----------------------------------------------------------------------
@@ -581,30 +574,36 @@ DWARFCompileUnit::GetDIEPtr(dw_offset_t
// Get the DIE (Debug Information Entry) that contains the specified
// .debug_info offset.
//----------------------------------------------------------------------
-const DWARFDebugInfoEntry*
-DWARFCompileUnit::GetDIEPtrContainingOffset(dw_offset_t die_offset)
+DWARFDIE
+DWARFCompileUnit::GetDIEContainingOffset(dw_offset_t die_offset)
{
if (die_offset != DW_INVALID_OFFSET)
{
- ExtractDIEsIfNeeded (false);
- DWARFDebugInfoEntry compare_die;
- compare_die.SetOffset(die_offset);
- DWARFDebugInfoEntry::iterator end = m_die_array.end();
- DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, compare_die, CompareDIEOffset);
- if (pos != end)
+ if (ContainsDIEOffset(die_offset))
{
- if (die_offset >= (*pos).GetOffset())
+
+ ExtractDIEsIfNeeded (false);
+ DWARFDebugInfoEntry::iterator end = m_die_array.end();
+ DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, die_offset, CompareDIEOffset);
+ if (pos != end)
{
- DWARFDebugInfoEntry::iterator next = pos + 1;
- if (next != end)
+ if (die_offset >= (*pos).GetOffset())
{
- if (die_offset < (*next).GetOffset())
- return &(*pos);
+ DWARFDebugInfoEntry::iterator next = pos + 1;
+ if (next != end)
+ {
+ if (die_offset < (*next).GetOffset())
+ return DWARFDIE(this, &(*pos));
+ }
}
}
}
+ else
+ {
+ return m_dwarf2Data->DebugInfo()->GetDIEContainingOffset (die_offset);
+ }
}
- return NULL; // Not found in any compile units
+ return DWARFDIE(); // Not found
}
@@ -618,7 +617,7 @@ DWARFCompileUnit::AppendDIEsWithTag (con
for (pos = m_die_array.begin(); pos != end; ++pos)
{
if (pos->Tag() == tag)
- dies.Append (&(*pos));
+ dies.Append (DWARFDIE(this, &(*pos)));
}
// Return the number of DIEs added to the collection
@@ -703,7 +702,7 @@ DWARFCompileUnit::Index (const uint32_t
continue;
}
- DWARFDebugInfoEntry::Attributes attributes;
+ DWARFAttributes attributes;
const char *name = NULL;
const char *mangled_cstr = NULL;
bool is_declaration = false;
@@ -713,7 +712,7 @@ DWARFCompileUnit::Index (const uint32_t
bool is_global_or_static_variable = false;
dw_offset_t specification_die_offset = DW_INVALID_OFFSET;
- const size_t num_attributes = die.GetAttributes(m_dwarf2Data, this, fixed_form_sizes, attributes);
+ const size_t num_attributes = die.GetAttributes(this, fixed_form_sizes, attributes);
if (num_attributes > 0)
{
for (uint32_t i=0; i<num_attributes; ++i)
@@ -723,24 +722,24 @@ DWARFCompileUnit::Index (const uint32_t
switch (attr)
{
case DW_AT_name:
- if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
- name = form_value.AsCString(m_dwarf2Data);
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ name = form_value.AsCString();
break;
case DW_AT_declaration:
- if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
is_declaration = form_value.Unsigned() != 0;
break;
// case DW_AT_artificial:
-// if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
+// if (attributes.ExtractFormValueAtIndex(i, form_value))
// is_artificial = form_value.Unsigned() != 0;
// break;
case DW_AT_MIPS_linkage_name:
case DW_AT_linkage_name:
- if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
- mangled_cstr = form_value.AsCString(m_dwarf2Data);
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ mangled_cstr = form_value.AsCString();
break;
case DW_AT_low_pc:
@@ -802,7 +801,7 @@ DWARFCompileUnit::Index (const uint32_t
break;
case DW_AT_specification:
- if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
specification_die_offset = form_value.Reference();
break;
}
@@ -850,18 +849,9 @@ DWARFCompileUnit::Index (const uint32_t
{
if (specification_die_offset != DW_INVALID_OFFSET)
{
- const DWARFDebugInfoEntry *specification_die = m_dwarf2Data->DebugInfo()->GetDIEPtr (specification_die_offset, NULL);
- if (specification_die)
- {
- parent = specification_die->GetParent();
- if (parent)
- {
- parent_tag = parent->Tag();
-
- if (parent_tag == DW_TAG_class_type || parent_tag == DW_TAG_structure_type)
- is_method = true;
- }
- }
+ DWARFDIE specification_die = m_dwarf2Data->DebugInfo()->GetDIE (specification_die_offset);
+ if (specification_die.GetParent().IsStructOrClass())
+ is_method = true;
}
}
}
@@ -1133,3 +1123,18 @@ DWARFCompileUnit::GetIsOptimized ()
return false;
}
}
+
+DWARFFormValue::FixedFormSizes
+DWARFCompileUnit::GetFixedFormSizes ()
+{
+ return DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize(), IsDWARF64());
+}
+
+TypeSystem *
+DWARFCompileUnit::GetTypeSystem ()
+{
+ if (m_dwarf2Data)
+ return m_dwarf2Data->GetTypeSystemForLanguage(GetLanguageType());
+ else
+ return nullptr;
+}
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h Wed Aug 26 17:57:51 2015
@@ -12,6 +12,7 @@
#include "lldb/lldb-enumerations.h"
#include "DWARFDebugInfoEntry.h"
+#include "DWARFDIE.h"
#include "SymbolFileDWARF.h"
class NameToDIE;
@@ -32,16 +33,13 @@ public:
bool Extract(const lldb_private::DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr);
size_t ExtractDIEsIfNeeded (bool cu_die_only);
- bool LookupAddress(
- const dw_addr_t address,
- DWARFDebugInfoEntry** function_die,
- DWARFDebugInfoEntry** block_die);
-
+ DWARFDIE LookupAddress(const dw_addr_t address);
size_t AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const;
void Clear();
bool Verify(lldb_private::Stream *s) const;
void Dump(lldb_private::Stream *s) const;
dw_offset_t GetOffset() const { return m_offset; }
+ lldb::user_id_t GetID () const;
uint32_t Size() const { return m_is_dwarf64 ? 23 : 11; /* Size in bytes of the compile unit header */ }
bool ContainsDIEOffset(dw_offset_t die_offset) const { return die_offset >= GetFirstDIEOffset() && die_offset < GetNextCompileUnitOffset(); }
dw_offset_t GetFirstDIEOffset() const { return m_offset + Size(); }
@@ -58,6 +56,12 @@ public:
void BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
DWARFDebugAranges* debug_aranges);
+ lldb_private::TypeSystem *
+ GetTypeSystem();
+
+ DWARFFormValue::FixedFormSizes
+ GetFixedFormSizes ();
+
void
SetBaseAddress(dw_addr_t base_addr)
{
@@ -73,8 +77,14 @@ public:
return &m_die_array[0];
}
+ DWARFDIE
+ DIE ()
+ {
+ return DWARFDIE(this, DIEPtr());
+ }
+
const DWARFDebugInfoEntry*
- DIE()
+ DIEPtr()
{
ExtractDIEsIfNeeded (false);
if (m_die_array.empty())
@@ -111,11 +121,11 @@ public:
return &m_die_array[idx];
}
- DWARFDebugInfoEntry*
- GetDIEPtr (dw_offset_t die_offset);
+ DWARFDIE
+ GetDIE (dw_offset_t die_offset);
- const DWARFDebugInfoEntry*
- GetDIEPtrContainingOffset (dw_offset_t die_offset);
+ DWARFDIE
+ GetDIEContainingOffset (dw_offset_t die_offset);
static uint8_t
GetAddressByteSize(const DWARFCompileUnit* cu);
Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp?rev=246100&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp (added)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp Wed Aug 26 17:57:51 2015
@@ -0,0 +1,416 @@
+//===-- DWARFDIE.cpp --------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DWARFDIE.h"
+
+#include "DWARFCompileUnit.h"
+#include "DWARFDebugAbbrev.h"
+#include "DWARFDebugAranges.h"
+#include "DWARFDebugInfo.h"
+#include "DWARFDebugInfoEntry.h"
+#include "DWARFDebugRanges.h"
+#include "DWARFDeclContext.h"
+#include "DWARFDIECollection.h"
+#include "DWARFFormValue.h"
+#include "DWARFLocationDescription.h"
+#include "DWARFLocationList.h"
+#include "SymbolFileDWARF.h"
+
+#include "lldb/Core/Module.h"
+#include "lldb/Symbol/ObjectFile.h"
+
+dw_tag_t
+DWARFDIE::Tag() const
+{
+ if (m_die)
+ return m_die->Tag();
+ else
+ return 0;
+}
+
+const char *
+DWARFDIE::GetTagAsCString () const
+{
+ return lldb_private::DW_TAG_value_to_name (Tag());
+}
+
+DWARFDIE
+DWARFDIE::GetParent () const
+{
+ if (IsValid())
+ return DWARFDIE(m_cu, m_die->GetParent());
+ else
+ return DWARFDIE();
+}
+
+DWARFDIE
+DWARFDIE::GetFirstChild () const
+{
+ if (IsValid())
+ return DWARFDIE(m_cu, m_die->GetFirstChild());
+ else
+ return DWARFDIE();
+}
+
+DWARFDIE
+DWARFDIE::GetSibling () const
+{
+ if (IsValid())
+ return DWARFDIE(m_cu, m_die->GetSibling());
+ else
+ return DWARFDIE();
+}
+
+DWARFDIE
+DWARFDIE::GetReferencedDIE (const dw_attr_t attr) const
+{
+ const dw_offset_t die_offset = GetAttributeValueAsReference (attr, DW_INVALID_OFFSET);
+ if (die_offset != DW_INVALID_OFFSET)
+ return GetDIE(die_offset);
+ else
+ return DWARFDIE();
+}
+
+DWARFDIE
+DWARFDIE::GetDIE (dw_offset_t die_offset) const
+{
+ if (IsValid())
+ return m_cu->GetDIE(die_offset);
+ else
+ return DWARFDIE();
+}
+
+const char *
+DWARFDIE::GetAttributeValueAsString (const dw_attr_t attr, const char *fail_value) const
+{
+ if (IsValid())
+ return m_die->GetAttributeValueAsString(GetDWARF(), GetCU(), attr, fail_value);
+ else
+ return fail_value;
+}
+
+uint64_t
+DWARFDIE::GetAttributeValueAsUnsigned (const dw_attr_t attr, uint64_t fail_value) const
+{
+ if (IsValid())
+ return m_die->GetAttributeValueAsUnsigned(GetDWARF(), GetCU(), attr, fail_value);
+ else
+ return fail_value;
+}
+
+int64_t
+DWARFDIE::GetAttributeValueAsSigned (const dw_attr_t attr, int64_t fail_value) const
+{
+ if (IsValid())
+ return m_die->GetAttributeValueAsSigned(GetDWARF(), GetCU(), attr, fail_value);
+ else
+ return fail_value;
+}
+
+uint64_t
+DWARFDIE::GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const
+{
+ if (IsValid())
+ return m_die->GetAttributeValueAsReference(GetDWARF(), GetCU(), attr, fail_value);
+ else
+ return fail_value;
+}
+
+
+DWARFDIE
+DWARFDIE::LookupDeepestBlock (lldb::addr_t file_addr) const
+{
+ if (IsValid())
+ {
+ SymbolFileDWARF *dwarf= GetDWARF();
+ DWARFCompileUnit *cu = GetCU();
+ DWARFDebugInfoEntry* function_die = nullptr;
+ DWARFDebugInfoEntry* block_die = nullptr;
+ if (m_die->LookupAddress (file_addr,
+ dwarf,
+ cu,
+ &function_die,
+ &block_die))
+ {
+ if (block_die && block_die != function_die)
+ {
+ if (cu->ContainsDIEOffset(block_die->GetOffset()))
+ return DWARFDIE(cu, block_die);
+ else
+ return DWARFDIE(dwarf->DebugInfo()->GetCompileUnitContainingDIE(block_die->GetOffset()), block_die);
+ }
+ }
+ }
+ return DWARFDIE();
+}
+
+lldb::user_id_t
+DWARFDIE::GetID () const
+{
+ const dw_offset_t die_offset = GetOffset();
+ if (die_offset != DW_INVALID_OFFSET)
+ {
+ SymbolFileDWARF *dwarf = GetDWARF();
+ if (dwarf)
+ return dwarf->MakeUserID(die_offset);
+ else
+ return die_offset;
+ }
+ return LLDB_INVALID_UID;
+}
+
+const char *
+DWARFDIE::GetName () const
+{
+ if (IsValid())
+ return m_die->GetName (GetDWARF(), m_cu);
+ else
+ return nullptr;
+}
+
+const char *
+DWARFDIE::GetMangledName () const
+{
+ if (IsValid())
+ return m_die->GetMangledName (GetDWARF(), m_cu);
+ else
+ return nullptr;
+}
+
+const char *
+DWARFDIE::GetPubname () const
+{
+ if (IsValid())
+ return m_die->GetPubname (GetDWARF(), m_cu);
+ else
+ return nullptr;
+}
+
+const char *
+DWARFDIE::GetQualifiedName (std::string &storage) const
+{
+ if (IsValid())
+ return m_die->GetQualifiedName (GetDWARF(), m_cu, storage);
+ else
+ return nullptr;
+}
+
+lldb::LanguageType
+DWARFDIE::GetLanguage () const
+{
+ if (IsValid())
+ return m_cu->GetLanguageType();
+ else
+ return lldb::eLanguageTypeUnknown;
+}
+
+
+lldb::ModuleSP
+DWARFDIE::GetModule () const
+{
+ SymbolFileDWARF *dwarf = GetDWARF();
+ if (dwarf)
+ return dwarf->GetObjectFile()->GetModule();
+ else
+ return lldb::ModuleSP();
+}
+
+lldb_private::CompileUnit *
+DWARFDIE::GetLLDBCompileUnit () const
+{
+ if (IsValid())
+ return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU());
+ else
+ return nullptr;
+}
+
+lldb_private::Type *
+DWARFDIE::ResolveType () const
+{
+ if (IsValid())
+ return GetDWARF()->ResolveType(*this, true);
+ else
+ return nullptr;
+}
+
+lldb_private::Type *
+DWARFDIE::ResolveTypeUID (lldb::user_id_t uid) const
+{
+ SymbolFileDWARF *dwarf = GetDWARF();
+ if (dwarf)
+ return dwarf->ResolveTypeUID(uid);
+ else
+ return nullptr;
+}
+
+void
+DWARFDIE::GetDeclContextDIEs (DWARFDIECollection &decl_context_dies) const
+{
+ if (IsValid())
+ {
+ DWARFDIE parent_decl_ctx_die = m_die->GetParentDeclContextDIE (GetDWARF(), GetCU());
+ if (parent_decl_ctx_die && parent_decl_ctx_die.GetDIE() != GetDIE())
+ {
+ decl_context_dies.Append(parent_decl_ctx_die);
+ parent_decl_ctx_die.GetDeclContextDIEs (decl_context_dies);
+ }
+ }
+}
+
+void
+DWARFDIE::GetDWARFDeclContext (DWARFDeclContext &dwarf_decl_ctx) const
+{
+ if (IsValid())
+ {
+ m_die->GetDWARFDeclContext (GetDWARF(), GetCU(), dwarf_decl_ctx);
+ }
+ else
+ {
+ dwarf_decl_ctx.Clear();
+ }
+}
+
+
+DWARFDIE
+DWARFDIE::GetParentDeclContextDIE () const
+{
+ if (IsValid())
+ return m_die->GetParentDeclContextDIE(GetDWARF(), m_cu);
+ else
+ return DWARFDIE();
+}
+
+
+dw_offset_t
+DWARFDIE::GetOffset () const
+{
+ if (IsValid())
+ return m_die->GetOffset();
+ else
+ return DW_INVALID_OFFSET;
+}
+
+dw_offset_t
+DWARFDIE::GetCompileUnitRelativeOffset () const
+{
+ if (IsValid())
+ return m_die->GetOffset() - m_cu->GetOffset();
+ else
+ return DW_INVALID_OFFSET;
+}
+
+SymbolFileDWARF *
+DWARFDIE::GetDWARF () const
+{
+ if (m_cu)
+ return m_cu->GetSymbolFileDWARF();
+ else
+ return nullptr;
+}
+
+lldb_private::TypeSystem *
+DWARFDIE::GetTypeSystem () const
+{
+ if (m_cu)
+ return m_cu->GetTypeSystem();
+ else
+ return nullptr;
+}
+
+bool
+DWARFDIE::IsStructOrClass () const
+{
+ const dw_tag_t tag = Tag();
+ return tag == DW_TAG_class_type || tag == DW_TAG_structure_type;
+}
+
+bool
+DWARFDIE::HasChildren () const
+{
+ if (m_die)
+ return m_die->HasChildren();
+ else
+ return false;
+}
+
+bool
+DWARFDIE::Supports_DW_AT_APPLE_objc_complete_type () const
+{
+ if (IsValid())
+ return GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu);
+ else
+ return false;
+}
+
+size_t
+DWARFDIE::GetAttributes (DWARFAttributes &attributes, uint32_t depth) const
+{
+ if (IsValid())
+ {
+ return m_die->GetAttributes (m_cu,
+ m_cu->GetFixedFormSizes(),
+ attributes,
+ depth);
+ }
+ if (depth == 0)
+ attributes.Clear();
+ return 0;
+}
+
+
+bool
+DWARFDIE::GetDIENamesAndRanges (const char * &name,
+ const char * &mangled,
+ DWARFRangeList& ranges,
+ int& decl_file,
+ int& decl_line,
+ int& decl_column,
+ int& call_file,
+ int& call_line,
+ int& call_column,
+ lldb_private::DWARFExpression *frame_base) const
+{
+ if (IsValid())
+ {
+ return m_die->GetDIENamesAndRanges (GetDWARF(),
+ GetCU(),
+ name,
+ mangled,
+ ranges,
+ decl_file,
+ decl_line,
+ decl_column,
+ call_file,
+ call_line,
+ call_column,
+ frame_base);
+ }
+ else
+ return false;
+}
+
+void
+DWARFDIE::Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const
+{
+ if (s && IsValid())
+ m_die->Dump (GetDWARF(), GetCU(), *s, recurse_depth);
+}
+
+
+bool operator == (const DWARFDIE &lhs, const DWARFDIE &rhs)
+{
+ return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU();
+}
+
+bool operator != (const DWARFDIE &lhs, const DWARFDIE &rhs)
+{
+ return lhs.GetDIE() != rhs.GetDIE() || lhs.GetCU() != rhs.GetCU();
+}
+
+
Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h?rev=246100&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h (added)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h Wed Aug 26 17:57:51 2015
@@ -0,0 +1,261 @@
+//===-- DWARFDIE.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_DWARFDIE_h_
+#define SymbolFileDWARF_DWARFDIE_h_
+
+#include "lldb/lldb-types.h"
+#include "lldb/Core/dwarf.h"
+
+class DWARFAttributes;
+class DWARFCompileUnit;
+class DWARFDebugInfoEntry;
+class DWARFDeclContext;
+class DWARFDIECollection;
+class SymbolFileDWARF;
+
+class DWARFDIE
+{
+public:
+ DWARFDIE () :
+ m_cu (nullptr),
+ m_die (nullptr)
+ {
+ }
+
+ DWARFDIE (DWARFCompileUnit *cu, DWARFDebugInfoEntry *die) :
+ m_cu (cu),
+ m_die (die)
+ {
+ }
+
+ DWARFDIE (const DWARFCompileUnit *cu, DWARFDebugInfoEntry *die) :
+ m_cu (const_cast<DWARFCompileUnit *>(cu)),
+ m_die (die)
+ {
+ }
+
+ DWARFDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) :
+ m_cu (cu),
+ m_die (const_cast<DWARFDebugInfoEntry *>(die))
+ {
+ }
+
+ DWARFDIE (const DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) :
+ m_cu (const_cast<DWARFCompileUnit *>(cu)),
+ m_die (const_cast<DWARFDebugInfoEntry *>(die))
+ {
+ }
+
+ //----------------------------------------------------------------------
+ // Tests
+ //----------------------------------------------------------------------
+ operator bool () const
+ {
+ return IsValid();
+ }
+
+ bool
+ IsValid() const
+ {
+ return m_cu && m_die;
+ }
+
+ bool
+ IsStructOrClass () const;
+
+ bool
+ HasChildren () const;
+
+ bool
+ Supports_DW_AT_APPLE_objc_complete_type () const;
+
+ //----------------------------------------------------------------------
+ // Accessors
+ //----------------------------------------------------------------------
+ SymbolFileDWARF *
+ GetDWARF () const;
+
+ DWARFCompileUnit *
+ GetCU() const
+ {
+ return m_cu;
+ }
+
+ DWARFDebugInfoEntry *
+ GetDIE() const
+ {
+ return m_die;
+ }
+
+ lldb_private::TypeSystem *
+ GetTypeSystem () const;
+
+ void
+ Set (DWARFCompileUnit *cu, DWARFDebugInfoEntry *die)
+ {
+ if (cu && die)
+ {
+ m_cu = cu;
+ m_die = die;
+ }
+ else
+ {
+ Clear();
+ }
+ }
+
+ void
+ Clear ()
+ {
+ m_cu = nullptr;
+ m_die = nullptr;
+ }
+
+ //----------------------------------------------------------------------
+ // Accessing information about a DIE
+ //----------------------------------------------------------------------
+ dw_tag_t
+ Tag() const;
+
+ const char *
+ GetTagAsCString () const;
+
+ dw_offset_t
+ GetOffset () const;
+
+ dw_offset_t
+ GetCompileUnitRelativeOffset () const;
+
+ //----------------------------------------------------------------------
+ // Get the LLDB user ID for this DIE. This is often just the DIE offset,
+ // but it might have a SymbolFileDWARF::GetID() in the high 32 bits if
+ // we are doing Darwin DWARF in .o file, or DWARF stand alone debug
+ // info.
+ //----------------------------------------------------------------------
+ lldb::user_id_t
+ GetID() const;
+
+ const char *
+ GetName () const;
+
+ const char *
+ GetMangledName () const;
+
+ const char *
+ GetPubname () const;
+
+ const char *
+ GetQualifiedName (std::string &storage) const;
+
+ lldb::LanguageType
+ GetLanguage () const;
+
+ lldb::ModuleSP
+ GetModule () const;
+
+ lldb_private::CompileUnit *
+ GetLLDBCompileUnit () const;
+
+ lldb_private::Type *
+ ResolveType () const;
+
+ // Resolve a type by UID using this DIE's DWARF file
+ lldb_private::Type *
+ ResolveTypeUID (lldb::user_id_t uid) const;
+
+ //----------------------------------------------------------------------
+ // Functions for obtaining DIE relations and references
+ //----------------------------------------------------------------------
+
+ DWARFDIE
+ GetParent () const;
+
+ DWARFDIE
+ GetFirstChild () const;
+
+ DWARFDIE
+ GetSibling () const;
+
+ DWARFDIE
+ GetReferencedDIE (const dw_attr_t attr) const;
+
+ //----------------------------------------------------------------------
+ // Get a another DIE from the same DWARF file as this DIE. This will
+ // check the current DIE's compile unit first to see if "die_offset" is
+ // in the same compile unit, and fall back to checking the DWARF file.
+ //----------------------------------------------------------------------
+ DWARFDIE
+ GetDIE (dw_offset_t die_offset) const;
+
+ DWARFDIE
+ LookupDeepestBlock (lldb::addr_t file_addr) const;
+
+ DWARFDIE
+ GetParentDeclContextDIE () const;
+
+ //----------------------------------------------------------------------
+ // DeclContext related functions
+ //----------------------------------------------------------------------
+ void
+ GetDeclContextDIEs (DWARFDIECollection &decl_context_dies) const;
+
+ void
+ GetDWARFDeclContext (DWARFDeclContext &dwarf_decl_ctx) const;
+
+ //----------------------------------------------------------------------
+ // Getting attribute values from the DIE.
+ //
+ // GetAttributeValueAsXXX() functions should only be used if you are
+ // looking for one or two attributes on a DIE. If you are trying to
+ // parse all attributes, use GetAttributes (...) instead
+ //----------------------------------------------------------------------
+ const char *
+ GetAttributeValueAsString (const dw_attr_t attr, const char *fail_value) const;
+
+ uint64_t
+ GetAttributeValueAsUnsigned (const dw_attr_t attr, uint64_t fail_value) const;
+
+ int64_t
+ GetAttributeValueAsSigned (const dw_attr_t attr, int64_t fail_value) const;
+
+ uint64_t
+ GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const;
+
+ size_t
+ GetAttributes (DWARFAttributes &attributes, uint32_t depth = 0) const;
+
+ bool
+ GetDIENamesAndRanges (const char * &name,
+ const char * &mangled,
+ DWARFRangeList& ranges,
+ int& decl_file,
+ int& decl_line,
+ int& decl_column,
+ int& call_file,
+ int& call_line,
+ int& call_column,
+ lldb_private::DWARFExpression *frame_base) const;
+
+ //----------------------------------------------------------------------
+ // Pretty printing
+ //----------------------------------------------------------------------
+
+ void
+ Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const;
+
+protected:
+ DWARFCompileUnit *m_cu;
+ DWARFDebugInfoEntry *m_die;
+};
+
+bool operator == (const DWARFDIE &lhs, const DWARFDIE &rhs);
+bool operator != (const DWARFDIE &lhs, const DWARFDIE &rhs);
+
+#endif // SymbolFileDWARF_DWARFDIE_h_
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp Wed Aug 26 17:57:51 2015
@@ -19,7 +19,7 @@ using namespace lldb_private;
using namespace std;
bool
-DWARFDIECollection::Insert(const DWARFDebugInfoEntry *die)
+DWARFDIECollection::Insert(const DWARFDIE &die)
{
iterator end_pos = m_dies.end();
iterator insert_pos = upper_bound(m_dies.begin(), end_pos, die);
@@ -30,17 +30,17 @@ DWARFDIECollection::Insert(const DWARFDe
}
void
-DWARFDIECollection::Append (const DWARFDebugInfoEntry *die)
+DWARFDIECollection::Append (const DWARFDIE &die)
{
m_dies.push_back (die);
}
-const DWARFDebugInfoEntry *
-DWARFDIECollection::GetDIEPtrAtIndex(uint32_t idx) const
+DWARFDIE
+DWARFDIECollection::GetDIEAtIndex(uint32_t idx) const
{
if (idx < m_dies.size())
return m_dies[idx];
- return NULL;
+ return DWARFDIE();
}
@@ -55,8 +55,6 @@ DWARFDIECollection::Dump(Stream *s, cons
{
if (title && title[0] != '\0')
s->Printf( "%s\n", title);
- const_iterator end_pos = m_dies.end();
- const_iterator pos;
- for (pos = m_dies.begin(); pos != end_pos; ++pos)
- s->Printf( "0x%8.8x\n", (*pos)->GetOffset());
+ for (const auto &die : m_dies)
+ s->Printf( "0x%8.8x\n", die.GetDIE()->GetOffset());
}
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h Wed Aug 26 17:57:51 2015
@@ -10,7 +10,7 @@
#ifndef SymbolFileDWARF_DWARFDIECollection_h_
#define SymbolFileDWARF_DWARFDIECollection_h_
-#include "SymbolFileDWARF.h"
+#include "DWARFDIE.h"
#include <vector>
class DWARFDIECollection
@@ -25,22 +25,22 @@ public:
}
void
- Append (const DWARFDebugInfoEntry *die);
+ Append (const DWARFDIE &die);
void
Dump(lldb_private::Stream *s, const char* title) const;
- const DWARFDebugInfoEntry*
- GetDIEPtrAtIndex(uint32_t idx) const;
+ DWARFDIE
+ GetDIEAtIndex (uint32_t idx) const;
bool
- Insert(const DWARFDebugInfoEntry *die);
+ Insert(const DWARFDIE &die);
size_t
Size() const;
protected:
- typedef std::vector<const DWARFDebugInfoEntry *> collection;
+ typedef std::vector<DWARFDIE> collection;
typedef collection::iterator iterator;
typedef collection::const_iterator const_iterator;
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp Wed Aug 26 17:57:51 2015
@@ -107,50 +107,41 @@ DWARFDebugInfo::GetCompileUnitAranges ()
//----------------------------------------------------------------------
// LookupAddress
//----------------------------------------------------------------------
-bool
-DWARFDebugInfo::LookupAddress
-(
- const dw_addr_t address,
- const dw_offset_t hint_die_offset,
- DWARFCompileUnitSP& cu_sp,
- DWARFDebugInfoEntry** function_die,
- DWARFDebugInfoEntry** block_die
-)
+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_sp = GetCompileUnit(hint_die_offset);
+ {
+ cu = GetCompileUnit(hint_die_offset);
+ }
else
{
DWARFDebugAranges &cu_aranges = GetCompileUnitAranges ();
const dw_offset_t cu_offset = cu_aranges.FindAddress (address);
- cu_sp = GetCompileUnit(cu_offset);
+ cu = GetCompileUnit(cu_offset);
}
- if (cu_sp.get())
+ if (cu)
{
- if (cu_sp->LookupAddress(address, function_die, block_die))
- return true;
- cu_sp.reset();
+ die = cu->LookupAddress(address);
}
else
{
// The hint_die_offset may have been a pointer to the actual item that
// we are looking for
- DWARFDebugInfoEntry* die_ptr = GetDIEPtr(hint_die_offset, &cu_sp);
- if (die_ptr)
+ die = GetDIE(hint_die_offset);
+ if (die)
{
- if (cu_sp.get())
- {
- if (function_die || block_die)
- return die_ptr->LookupAddress(address, m_dwarf2Data, cu_sp.get(), function_die, block_die);
+ DWARFDebugInfoEntry* function_die = nullptr;
- // We only wanted the compile unit that contained this address
- return true;
- }
+ if (die.GetDIE()->LookupAddress (address, die.GetDWARF(), die.GetCU(), &function_die, nullptr))
+ die.Set (die.GetCU(), function_die);
}
}
- return false;
+ return die;
}
@@ -219,7 +210,7 @@ OffsetLessThanCompileUnitOffset (dw_offs
return offset < cu_sp->GetOffset();
}
-DWARFCompileUnitSP
+DWARFCompileUnit *
DWARFDebugInfo::GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr)
{
DWARFCompileUnitSP cu_sp;
@@ -256,11 +247,11 @@ DWARFDebugInfo::GetCompileUnit(dw_offset
}
if (idx_ptr)
*idx_ptr = cu_idx;
- return cu_sp;
+ return cu_sp.get();
}
-DWARFCompileUnitSP
-DWARFDebugInfo::GetCompileUnitContainingDIE(dw_offset_t die_offset)
+DWARFCompileUnit *
+DWARFDebugInfo::GetCompileUnitContainingDIE (dw_offset_t die_offset)
{
DWARFCompileUnitSP cu_sp;
if (die_offset != DW_INVALID_OFFSET)
@@ -287,7 +278,7 @@ DWARFDebugInfo::GetCompileUnitContaining
}
}
}
- return cu_sp;
+ return cu_sp.get();
}
//----------------------------------------------------------------------
@@ -295,50 +286,23 @@ DWARFDebugInfo::GetCompileUnitContaining
//
// Get the DIE (Debug Information Entry) with the specified offset.
//----------------------------------------------------------------------
-DWARFDebugInfoEntry*
-DWARFDebugInfo::GetDIEPtr(dw_offset_t die_offset, DWARFCompileUnitSP* cu_sp_ptr)
+DWARFDIE
+DWARFDebugInfo::GetDIE(dw_offset_t die_offset)
{
- DWARFCompileUnitSP cu_sp(GetCompileUnitContainingDIE(die_offset));
- if (cu_sp_ptr)
- *cu_sp_ptr = cu_sp;
- if (cu_sp.get())
- return cu_sp->GetDIEPtr(die_offset);
- return NULL; // Not found in any compile units
+ DWARFCompileUnit *cu = GetCompileUnitContainingDIE(die_offset);
+ if (cu)
+ return cu->GetDIE (die_offset);
+ return DWARFDIE(); // Not found
}
-DWARFDebugInfoEntry*
-DWARFDebugInfo::GetDIEPtrWithCompileUnitHint (dw_offset_t die_offset, DWARFCompileUnit**cu_handle)
+DWARFDIE
+DWARFDebugInfo::GetDIEContainingOffset (dw_offset_t die_offset)
{
- assert (cu_handle);
- DWARFDebugInfoEntry* die = NULL;
- if (*cu_handle)
- die = (*cu_handle)->GetDIEPtr(die_offset);
+ DWARFCompileUnit *cu = GetCompileUnitContainingDIE(die_offset);
+ if (cu)
+ return cu->GetDIEContainingOffset (die_offset);
- if (die == NULL)
- {
- DWARFCompileUnitSP cu_sp (GetCompileUnitContainingDIE(die_offset));
- if (cu_sp.get())
- {
- *cu_handle = cu_sp.get();
- die = cu_sp->GetDIEPtr(die_offset);
- }
- }
- if (die == NULL)
- *cu_handle = NULL;
- return die;
-}
-
-
-const DWARFDebugInfoEntry*
-DWARFDebugInfo::GetDIEPtrContainingOffset(dw_offset_t die_offset, DWARFCompileUnitSP* cu_sp_ptr)
-{
- DWARFCompileUnitSP cu_sp(GetCompileUnitContainingDIE(die_offset));
- if (cu_sp_ptr)
- *cu_sp_ptr = cu_sp;
- if (cu_sp.get())
- return cu_sp->GetDIEPtrContainingOffset(die_offset);
-
- return NULL; // Not found in any compile units
+ return DWARFDIE(); // Not found
}
@@ -391,7 +355,7 @@ DWARFDebugInfo::Parse(SymbolFileDWARF* d
depth = 0;
// Call the callback function with no DIE pointer for the compile unit
// and get the offset that we are to continue to parse from
- offset = callback(dwarf2Data, cu, NULL, offset, depth, userData);
+ offset = callback(dwarf2Data, cu.get(), NULL, offset, depth, userData);
// Make sure we are within our compile unit
if (offset < next_cu_offset)
@@ -402,7 +366,7 @@ DWARFDebugInfo::Parse(SymbolFileDWARF* d
while (!done && die.Extract(dwarf2Data, cu.get(), &offset))
{
// Call the callback function with DIE pointer that falls within the compile unit
- offset = callback(dwarf2Data, cu, &die, offset, depth, userData);
+ offset = callback(dwarf2Data, cu.get(), &die, offset, depth, userData);
if (die.IsNULL())
{
@@ -469,7 +433,7 @@ typedef struct DumpInfo
static dw_offset_t DumpCallback
(
SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnitSP& cu_sp,
+ DWARFCompileUnit* cu,
DWARFDebugInfoEntry* die,
const dw_offset_t next_offset,
const uint32_t curr_depth,
@@ -477,9 +441,6 @@ static dw_offset_t DumpCallback
)
{
DumpInfo* dumpInfo = (DumpInfo*)userData;
-
- const DWARFCompileUnit* cu = cu_sp.get();
-
Stream *s = dumpInfo->strm;
bool show_parents = s->GetFlags().Test(DWARFDebugInfo::eDumpFlag_ShowAncestors);
@@ -696,11 +657,11 @@ DWARFDebugInfo::Dump (Stream *s, const u
for (pos = m_compile_units.begin(); pos != m_compile_units.end(); ++pos)
{
const DWARFCompileUnitSP& cu_sp = *pos;
- DumpCallback(m_dwarf2Data, (DWARFCompileUnitSP&)cu_sp, NULL, 0, curr_depth, &dumpInfo);
+ DumpCallback(m_dwarf2Data, cu_sp.get(), NULL, 0, curr_depth, &dumpInfo);
- const DWARFDebugInfoEntry* die = cu_sp->DIE();
+ const DWARFDIE die = cu_sp->DIE();
if (die)
- die->Dump(m_dwarf2Data, cu_sp.get(), *s, recurse_depth);
+ die.Dump(s, recurse_depth);
}
}
@@ -726,7 +687,7 @@ typedef struct FindCallbackStringInfoTag
static dw_offset_t FindCallbackString
(
SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnitSP& cu_sp,
+ DWARFCompileUnit* cu,
DWARFDebugInfoEntry* die,
const dw_offset_t next_offset,
const uint32_t curr_depth,
@@ -734,7 +695,6 @@ static dw_offset_t FindCallbackString
)
{
FindCallbackStringInfo* info = (FindCallbackStringInfo*)userData;
- const DWARFCompileUnit* cu = cu_sp.get();
if (die)
{
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h Wed Aug 26 17:57:51 2015
@@ -16,6 +16,7 @@
#include "lldb/lldb-private.h"
#include "lldb/lldb-private.h"
#include "SymbolFileDWARF.h"
+#include "DWARFDIE.h"
typedef std::multimap<const char*, dw_offset_t, CStringCompareFunctionObject> CStringToDIEMap;
typedef CStringToDIEMap::iterator CStringToDIEMapIter;
@@ -28,7 +29,7 @@ class DWARFDebugInfo
public:
typedef dw_offset_t (*Callback)(
SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnitSP& cu_shared_ptr,
+ DWARFCompileUnit* cu_shared_ptr,
DWARFDebugInfoEntry* die,
const dw_offset_t next_offset,
const uint32_t depth,
@@ -37,24 +38,19 @@ public:
DWARFDebugInfo();
void SetDwarfData(SymbolFileDWARF* dwarf2Data);
- bool 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
- DWARFCompileUnitSP& cu_shared_ptr,
- DWARFDebugInfoEntry** function_die,
- DWARFDebugInfoEntry** block_die);
+ 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
void AddCompileUnit(DWARFCompileUnitSP& cu);
size_t GetNumCompileUnits();
bool ContainsCompileUnit (const DWARFCompileUnit *cu) const;
- DWARFCompileUnit* GetCompileUnitAtIndex(uint32_t idx);
- DWARFCompileUnitSP GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr = NULL);
- DWARFCompileUnitSP GetCompileUnitContainingDIE(dw_offset_t die_offset);
+ DWARFCompileUnit* GetCompileUnitAtIndex (uint32_t idx);
+ DWARFCompileUnit* GetCompileUnit (dw_offset_t cu_offset, uint32_t* idx_ptr = NULL);
+ DWARFCompileUnit* GetCompileUnitContainingDIE (dw_offset_t die_offset);
- DWARFDebugInfoEntry* GetDIEPtr(dw_offset_t die_offset, DWARFCompileUnitSP* cu_sp_ptr);
- DWARFDebugInfoEntry* GetDIEPtrWithCompileUnitHint (dw_offset_t die_offset, DWARFCompileUnit**cu_handle);
-
- const DWARFDebugInfoEntry* GetDIEPtrContainingOffset(dw_offset_t die_offset, DWARFCompileUnitSP* cu_sp_ptr);
+ DWARFDIE GetDIE (dw_offset_t die_offset);
+ DWARFDIE GetDIEContainingOffset (dw_offset_t die_offset);
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp Wed Aug 26 17:57:51 2015
@@ -34,86 +34,6 @@ using namespace lldb_private;
using namespace std;
extern int g_verbose;
-
-
-DWARFDebugInfoEntry::Attributes::Attributes() :
- m_infos()
-{
-}
-
-DWARFDebugInfoEntry::Attributes::~Attributes()
-{
-}
-
-
-uint32_t
-DWARFDebugInfoEntry::Attributes::FindAttributeIndex(dw_attr_t attr) const
-{
- collection::const_iterator end = m_infos.end();
- collection::const_iterator beg = m_infos.begin();
- collection::const_iterator pos;
- for (pos = beg; pos != end; ++pos)
- {
- if (pos->attr == attr)
- return std::distance(beg, pos);
- }
- return UINT32_MAX;
-}
-
-void
-DWARFDebugInfoEntry::Attributes::Append(const DWARFCompileUnit *cu, dw_offset_t attr_die_offset, dw_attr_t attr, dw_form_t form)
-{
- Info info = { cu, attr_die_offset, attr, form };
- m_infos.push_back(info);
-}
-
-bool
-DWARFDebugInfoEntry::Attributes::ContainsAttribute(dw_attr_t attr) const
-{
- return FindAttributeIndex(attr) != UINT32_MAX;
-}
-
-bool
-DWARFDebugInfoEntry::Attributes::RemoveAttribute(dw_attr_t attr)
-{
- uint32_t attr_index = FindAttributeIndex(attr);
- if (attr_index != UINT32_MAX)
- {
- m_infos.erase(m_infos.begin() + attr_index);
- return true;
- }
- return false;
-}
-
-bool
-DWARFDebugInfoEntry::Attributes::ExtractFormValueAtIndex (SymbolFileDWARF* dwarf2Data, uint32_t i, DWARFFormValue &form_value) const
-{
- form_value.SetCompileUnit(CompileUnitAtIndex(i));
- form_value.SetForm(FormAtIndex(i));
- lldb::offset_t offset = DIEOffsetAtIndex(i);
- return form_value.ExtractValue(dwarf2Data->get_debug_info_data(), &offset);
-}
-
-uint64_t
-DWARFDebugInfoEntry::Attributes::FormValueAsUnsigned (SymbolFileDWARF* dwarf2Data, dw_attr_t attr, uint64_t fail_value) const
-{
- const uint32_t attr_idx = FindAttributeIndex (attr);
- if (attr_idx != UINT32_MAX)
- return FormValueAsUnsignedAtIndex (dwarf2Data, attr_idx, fail_value);
- return fail_value;
-}
-
-uint64_t
-DWARFDebugInfoEntry::Attributes::FormValueAsUnsignedAtIndex(SymbolFileDWARF* dwarf2Data, uint32_t i, uint64_t fail_value) const
-{
- DWARFFormValue form_value;
- if (ExtractFormValueAtIndex(dwarf2Data, i, form_value))
- return form_value.Reference();
- return fail_value;
-}
-
-
-
bool
DWARFDebugInfoEntry::FastExtract
(
@@ -530,8 +450,8 @@ DWARFDebugInfoEntry::DumpAncestry
// else if (a_tag > b_tag)
// return 1;
//
-// DWARFDebugInfoEntry::Attributes a_attrs;
-// DWARFDebugInfoEntry::Attributes b_attrs;
+// DWARFAttributes a_attrs;
+// DWARFAttributes b_attrs;
// size_t a_attr_count = a_die->GetAttributes(dwarf2Data, a_cu, a_attrs);
// size_t b_attr_count = b_die->GetAttributes(dwarf2Data, b_cu, b_attrs);
// if (a_attr_count != b_attr_count)
@@ -743,7 +663,7 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
const DWARFCompileUnit* cu,
const char * &name,
const char * &mangled,
- DWARFDebugRanges::RangeList& ranges,
+ DWARFRangeList& ranges,
int& decl_file,
int& decl_line,
int& decl_column,
@@ -823,13 +743,13 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
case DW_AT_name:
if (name == NULL)
- name = form_value.AsCString(dwarf2Data);
+ name = form_value.AsCString();
break;
case DW_AT_MIPS_linkage_name:
case DW_AT_linkage_name:
if (mangled == NULL)
- mangled = form_value.AsCString(dwarf2Data);
+ mangled = form_value.AsCString();
break;
case DW_AT_abstract_origin:
@@ -914,9 +834,9 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
if (lo_pc != LLDB_INVALID_ADDRESS)
{
if (hi_pc != LLDB_INVALID_ADDRESS && hi_pc > lo_pc)
- ranges.Append(DWARFDebugRanges::Range (lo_pc, hi_pc - lo_pc));
+ ranges.Append(DWARFRangeList::Entry (lo_pc, hi_pc - lo_pc));
else
- ranges.Append(DWARFDebugRanges::Range (lo_pc, 0));
+ ranges.Append(DWARFRangeList::Entry (lo_pc, 0));
}
}
@@ -933,14 +853,12 @@ DWARFDebugInfoEntry::GetDIENamesAndRange
std::vector<dw_offset_t>::const_iterator end = die_offsets.end();
for (pos = die_offsets.begin(); pos != end; ++pos)
{
- DWARFCompileUnitSP cu_sp_ptr;
- const DWARFDebugInfoEntry* die = NULL;
dw_offset_t die_offset = *pos;
if (die_offset != DW_INVALID_OFFSET)
{
- die = dwarf2Data->DebugInfo()->GetDIEPtr(die_offset, &cu_sp_ptr);
+ DWARFDIE die = dwarf2Data->DebugInfo()->GetDIE(die_offset);
if (die)
- die->GetDIENamesAndRanges(dwarf2Data, cu_sp_ptr.get(), name, mangled, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column);
+ die.GetDIE()->GetDIENamesAndRanges(die.GetDWARF(), die.GetCU(), name, mangled, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column);
}
}
}
@@ -1097,7 +1015,7 @@ DWARFDebugInfoEntry::DumpAttribute
// Always dump form value if verbose is enabled
if (verbose)
{
- form_value.Dump(s, dwarf2Data);
+ form_value.Dump(s);
}
@@ -1130,7 +1048,7 @@ DWARFDebugInfoEntry::DumpAttribute
if (blockData)
{
if (!verbose)
- form_value.Dump(s, dwarf2Data);
+ form_value.Dump(s);
// Location description is inlined in data in the form value
DWARFDataExtractor locationData(debug_info_data, (*offset_ptr) - form_value.Unsigned(), form_value.Unsigned());
@@ -1147,13 +1065,13 @@ DWARFDebugInfoEntry::DumpAttribute
if (dwarf2Data)
{
if ( !verbose )
- form_value.Dump(s, dwarf2Data);
+ form_value.Dump(s);
DWARFLocationList::Dump(s, cu, dwarf2Data->get_debug_loc_data(), debug_loc_offset);
}
else
{
if ( !verbose )
- form_value.Dump(s, NULL);
+ form_value.Dump(s);
}
}
}
@@ -1163,7 +1081,7 @@ DWARFDebugInfoEntry::DumpAttribute
case DW_AT_specification:
{
uint64_t abstract_die_offset = form_value.Reference();
- form_value.Dump(s, dwarf2Data);
+ form_value.Dump(s);
// *ostrm_ptr << HEX32 << abstract_die_offset << " ( ";
if ( verbose ) s.PutCString(" ( ");
GetName(dwarf2Data, cu, abstract_die_offset, s);
@@ -1175,7 +1093,7 @@ DWARFDebugInfoEntry::DumpAttribute
{
uint64_t type_die_offset = form_value.Reference();
if (!verbose)
- form_value.Dump(s, dwarf2Data);
+ form_value.Dump(s);
s.PutCString(" ( ");
AppendTypeName(dwarf2Data, cu, type_die_offset, s);
s.PutCString(" )");
@@ -1185,7 +1103,7 @@ DWARFDebugInfoEntry::DumpAttribute
case DW_AT_ranges:
{
if ( !verbose )
- form_value.Dump(s, dwarf2Data);
+ form_value.Dump(s);
lldb::offset_t ranges_offset = form_value.Unsigned();
dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0;
if (dwarf2Data)
@@ -1195,7 +1113,7 @@ DWARFDebugInfoEntry::DumpAttribute
default:
if ( !verbose )
- form_value.Dump(s, dwarf2Data);
+ form_value.Dump(s);
break;
}
@@ -1209,17 +1127,19 @@ DWARFDebugInfoEntry::DumpAttribute
// take precedence (this can happen for declaration attributes).
//----------------------------------------------------------------------
size_t
-DWARFDebugInfoEntry::GetAttributes
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFFormValue::FixedFormSizes fixed_form_sizes,
- DWARFDebugInfoEntry::Attributes& attributes,
- uint32_t curr_depth
-) const
-{
- lldb::offset_t offset;
- const DWARFAbbreviationDeclaration* abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
+DWARFDebugInfoEntry::GetAttributes (const DWARFCompileUnit* cu,
+ DWARFFormValue::FixedFormSizes fixed_form_sizes,
+ DWARFAttributes& attributes,
+ uint32_t curr_depth) const
+{
+ SymbolFileDWARF* dwarf2Data = nullptr;
+ const DWARFAbbreviationDeclaration* abbrevDecl = nullptr;
+ lldb::offset_t offset = 0;
+ if (cu)
+ {
+ dwarf2Data = cu->GetSymbolFileDWARF();
+ abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
+ }
if (abbrevDecl)
{
@@ -1262,21 +1182,10 @@ DWARFDebugInfoEntry::GetAttributes
DWARFFormValue form_value (cu, form);
if (form_value.ExtractValue(debug_info_data, &offset))
{
- const DWARFDebugInfoEntry* die = NULL;
dw_offset_t die_offset = form_value.Reference();
- if (cu->ContainsDIEOffset(die_offset))
- {
- die = const_cast<DWARFCompileUnit*>(cu)->GetDIEPtr(die_offset);
- if (die)
- die->GetAttributes(dwarf2Data, cu, fixed_form_sizes, attributes, curr_depth + 1);
- }
- else
- {
- DWARFCompileUnitSP cu_sp_ptr;
- die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(die_offset, &cu_sp_ptr);
- if (die)
- die->GetAttributes(dwarf2Data, cu_sp_ptr.get(), fixed_form_sizes, attributes, curr_depth + 1);
- }
+ DWARFDIE spec_die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(die_offset);
+ if (spec_die)
+ spec_die.GetAttributes(attributes, curr_depth + 1);
}
}
else
@@ -1363,7 +1272,7 @@ DWARFDebugInfoEntry::GetAttributeValueAs
{
DWARFFormValue form_value;
if (GetAttributeValue(dwarf2Data, cu, attr, form_value))
- return form_value.AsCString(dwarf2Data);
+ return form_value.AsCString();
return fail_value;
}
@@ -1450,7 +1359,7 @@ DWARFDebugInfoEntry::GetAttributeHighPC
{
dw_form_t form = form_value.Form();
if (form == DW_FORM_addr || form == DW_FORM_GNU_addr_index)
- return form_value.Address(dwarf2Data);
+ return form_value.Address();
// DWARF4 can specify the hi_pc as an <offset-from-lowpc>
return lo_pc + form_value.Unsigned();
@@ -1491,7 +1400,7 @@ DWARFDebugInfoEntry::GetAttributeAddress
size_t
DWARFDebugInfoEntry::GetAttributeAddressRanges(SymbolFileDWARF* dwarf2Data,
const DWARFCompileUnit* cu,
- DWARFDebugRanges::RangeList &ranges,
+ DWARFRangeList &ranges,
bool check_hi_lo_pc) const
{
ranges.Clear();
@@ -1515,7 +1424,7 @@ DWARFDebugInfoEntry::GetAttributeAddress
if (GetAttributeAddressRange (dwarf2Data, cu, lo_pc, hi_pc, LLDB_INVALID_ADDRESS))
{
if (lo_pc < hi_pc)
- ranges.Append(DWARFDebugRanges::RangeList::Entry(lo_pc, hi_pc - lo_pc));
+ ranges.Append(DWARFRangeList::Entry(lo_pc, hi_pc - lo_pc));
}
}
return ranges.GetSize();
@@ -1586,20 +1495,18 @@ DWARFDebugInfoEntry::GetName
{
DWARFFormValue form_value;
if (GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
- return form_value.AsCString(dwarf2Data);
+ return form_value.AsCString();
else if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value))
{
- DWARFCompileUnitSP cu_sp_ptr;
- const DWARFDebugInfoEntry* die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(form_value.Reference(), &cu_sp_ptr);
+ DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
if (die)
- return die->GetName(dwarf2Data, cu_sp_ptr.get());
+ return die.GetName();
}
else if (GetAttributeValue(dwarf2Data, cu, DW_AT_abstract_origin, form_value))
{
- DWARFCompileUnitSP cu_sp_ptr;
- const DWARFDebugInfoEntry* die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(form_value.Reference(), &cu_sp_ptr);
+ DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
if (die)
- return die->GetName(dwarf2Data, cu_sp_ptr.get());
+ return die.GetName();
}
return nullptr;
}
@@ -1623,15 +1530,15 @@ DWARFDebugInfoEntry::GetMangledName
DWARFFormValue form_value;
if (GetAttributeValue(dwarf2Data, cu, DW_AT_MIPS_linkage_name, form_value))
- name = form_value.AsCString(dwarf2Data);
+ name = form_value.AsCString();
if (GetAttributeValue(dwarf2Data, cu, DW_AT_linkage_name, form_value))
- name = form_value.AsCString(dwarf2Data);
+ name = form_value.AsCString();
if (substitute_name_allowed && name == nullptr)
{
if (GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
- name = form_value.AsCString(dwarf2Data);
+ name = form_value.AsCString();
}
return name;
}
@@ -1657,19 +1564,16 @@ DWARFDebugInfoEntry::GetPubname
DWARFFormValue form_value;
if (GetAttributeValue(dwarf2Data, cu, DW_AT_MIPS_linkage_name, form_value))
- name = form_value.AsCString(dwarf2Data);
+ name = form_value.AsCString();
else if (GetAttributeValue(dwarf2Data, cu, DW_AT_linkage_name, form_value))
- name = form_value.AsCString(dwarf2Data);
+ name = form_value.AsCString();
else if (GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
- name = form_value.AsCString(dwarf2Data);
+ name = form_value.AsCString();
else if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value))
{
- // The specification DIE may be in another compile unit so we need
- // to get a die and its compile unit.
- DWARFCompileUnitSP cu_sp_ptr;
- const DWARFDebugInfoEntry* die = const_cast<SymbolFileDWARF*>(dwarf2Data)->DebugInfo()->GetDIEPtr(form_value.Reference(), &cu_sp_ptr);
+ DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
if (die)
- return die->GetPubname(dwarf2Data, cu_sp_ptr.get());
+ name = die.GetPubname();
}
return name;
}
@@ -1713,7 +1617,7 @@ DWARFDebugInfoEntry::GetName
DWARFFormValue form_value;
if (die.GetAttributeValue(dwarf2Data, cu, DW_AT_name, form_value))
{
- const char* name = form_value.AsCString(dwarf2Data);
+ const char* name = form_value.AsCString();
if (name)
{
s.PutCString(name);
@@ -1914,16 +1818,12 @@ DWARFDebugInfoEntry::BuildFunctionAddres
}
void
-DWARFDebugInfoEntry::GetDeclContextDIEs (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
+DWARFDebugInfoEntry::GetDeclContextDIEs (DWARFCompileUnit* cu,
DWARFDIECollection &decl_context_dies) const
{
- const DWARFDebugInfoEntry *parent_decl_ctx_die = GetParentDeclContextDIE (dwarf2Data, cu);
- if (parent_decl_ctx_die && parent_decl_ctx_die != this)
- {
- decl_context_dies.Append(parent_decl_ctx_die);
- parent_decl_ctx_die->GetDeclContextDIEs (dwarf2Data, cu, decl_context_dies);
- }
+
+ DWARFDIE die (cu, const_cast<DWARFDebugInfoEntry *>(this));
+ die.GetDeclContextDIEs(decl_context_dies);
}
void
@@ -1935,11 +1835,11 @@ DWARFDebugInfoEntry::GetDWARFDeclContext
if (tag != DW_TAG_compile_unit)
{
dwarf_decl_ctx.AppendDeclContext(tag, GetName(dwarf2Data, cu));
- const DWARFDebugInfoEntry *parent_decl_ctx_die = GetParentDeclContextDIE (dwarf2Data, cu);
- if (parent_decl_ctx_die && parent_decl_ctx_die != this)
+ DWARFDIE parent_decl_ctx_die = GetParentDeclContextDIE (dwarf2Data, cu);
+ if (parent_decl_ctx_die && parent_decl_ctx_die.GetDIE() != this)
{
- if (parent_decl_ctx_die->Tag() != DW_TAG_compile_unit)
- parent_decl_ctx_die->GetDWARFDeclContext (dwarf2Data, cu, dwarf_decl_ctx);
+ if (parent_decl_ctx_die.Tag() != DW_TAG_compile_unit)
+ parent_decl_ctx_die.GetDIE()->GetDWARFDeclContext (parent_decl_ctx_die.GetDWARF(), parent_decl_ctx_die.GetCU(), dwarf_decl_ctx);
}
}
}
@@ -1956,30 +1856,30 @@ DWARFDebugInfoEntry::MatchesDWARFDeclCon
return this_dwarf_decl_ctx == dwarf_decl_ctx;
}
-const DWARFDebugInfoEntry *
+DWARFDIE
DWARFDebugInfoEntry::GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
DWARFCompileUnit* cu) const
{
- DWARFDebugInfoEntry::Attributes attributes;
- GetAttributes(dwarf2Data, cu, DWARFFormValue::FixedFormSizes(), attributes);
+ DWARFAttributes attributes;
+ GetAttributes(cu, DWARFFormValue::FixedFormSizes(), attributes);
return GetParentDeclContextDIE (dwarf2Data, cu, attributes);
}
-const DWARFDebugInfoEntry *
+DWARFDIE
DWARFDebugInfoEntry::GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
DWARFCompileUnit* cu,
- const DWARFDebugInfoEntry::Attributes& attributes) const
+ const DWARFAttributes& attributes) const
{
- const DWARFDebugInfoEntry * die = this;
-
- while (die != NULL)
+ DWARFDIE die (cu, const_cast<DWARFDebugInfoEntry *>(this));
+
+ while (die)
{
// If this is the original DIE that we are searching for a declaration
// for, then don't look in the cache as we don't want our own decl
// context to be our decl context...
- if (die != this)
+ if (die.GetDIE() != this)
{
- switch (die->Tag())
+ switch (die.Tag())
{
case DW_TAG_compile_unit:
case DW_TAG_namespace:
@@ -1995,33 +1895,33 @@ DWARFDebugInfoEntry::GetParentDeclContex
dw_offset_t die_offset;
- die_offset = attributes.FormValueAsUnsigned(dwarf2Data, DW_AT_specification, DW_INVALID_OFFSET);
+ die_offset = attributes.FormValueAsUnsigned(DW_AT_specification, DW_INVALID_OFFSET);
if (die_offset != DW_INVALID_OFFSET)
{
- const DWARFDebugInfoEntry *spec_die = cu->GetDIEPtr (die_offset);
+ DWARFDIE spec_die = cu->GetDIE (die_offset);
if (spec_die)
- {
- const DWARFDebugInfoEntry *spec_die_decl_ctx_die = spec_die->GetParentDeclContextDIE (dwarf2Data, cu);
- if (spec_die_decl_ctx_die)
- return spec_die_decl_ctx_die;
- }
+ {
+ DWARFDIE decl_ctx_die = spec_die.GetParentDeclContextDIE();
+ if (decl_ctx_die)
+ return decl_ctx_die;
+ }
}
- die_offset = attributes.FormValueAsUnsigned(dwarf2Data, DW_AT_abstract_origin, DW_INVALID_OFFSET);
+ die_offset = attributes.FormValueAsUnsigned(DW_AT_abstract_origin, DW_INVALID_OFFSET);
if (die_offset != DW_INVALID_OFFSET)
{
- const DWARFDebugInfoEntry *abs_die = cu->GetDIEPtr (die_offset);
+ DWARFDIE abs_die = cu->GetDIE (die_offset);
if (abs_die)
{
- const DWARFDebugInfoEntry *abs_die_decl_ctx_die = abs_die->GetParentDeclContextDIE (dwarf2Data, cu);
- if (abs_die_decl_ctx_die)
- return abs_die_decl_ctx_die;
+ DWARFDIE decl_ctx_die = abs_die.GetParentDeclContextDIE();
+ if (decl_ctx_die)
+ return decl_ctx_die;
}
}
- die = die->GetParent();
+ die = die.GetParent();
}
- return NULL;
+ return DWARFDIE();
}
@@ -2030,15 +1930,15 @@ DWARFDebugInfoEntry::GetQualifiedName (S
DWARFCompileUnit* cu,
std::string &storage) const
{
- DWARFDebugInfoEntry::Attributes attributes;
- GetAttributes(dwarf2Data, cu, DWARFFormValue::FixedFormSizes(), attributes);
+ DWARFAttributes attributes;
+ GetAttributes(cu, DWARFFormValue::FixedFormSizes(), attributes);
return GetQualifiedName (dwarf2Data, cu, attributes, storage);
}
const char*
DWARFDebugInfoEntry::GetQualifiedName (SymbolFileDWARF* dwarf2Data,
DWARFCompileUnit* cu,
- const DWARFDebugInfoEntry::Attributes& attributes,
+ const DWARFAttributes& attributes,
std::string &storage) const
{
@@ -2046,47 +1946,47 @@ DWARFDebugInfoEntry::GetQualifiedName (S
if (name)
{
- const DWARFDebugInfoEntry *parent_decl_ctx_die = GetParentDeclContextDIE (dwarf2Data, cu);
+ DWARFDIE parent_decl_ctx_die = GetParentDeclContextDIE (dwarf2Data, cu);
storage.clear();
// TODO: change this to get the correct decl context parent....
while (parent_decl_ctx_die)
{
- const dw_tag_t parent_tag = parent_decl_ctx_die->Tag();
+ const dw_tag_t parent_tag = parent_decl_ctx_die.Tag();
switch (parent_tag)
{
case DW_TAG_namespace:
- {
- const char *namespace_name = parent_decl_ctx_die->GetName (dwarf2Data, cu);
- if (namespace_name)
- {
- storage.insert (0, "::");
- storage.insert (0, namespace_name);
- }
- else
- {
- storage.insert (0, "(anonymous namespace)::");
- }
- parent_decl_ctx_die = parent_decl_ctx_die->GetParentDeclContextDIE(dwarf2Data, cu);
- }
+ {
+ const char *namespace_name = parent_decl_ctx_die.GetName ();
+ if (namespace_name)
+ {
+ storage.insert (0, "::");
+ storage.insert (0, namespace_name);
+ }
+ else
+ {
+ storage.insert (0, "(anonymous namespace)::");
+ }
+ parent_decl_ctx_die = parent_decl_ctx_die.GetParentDeclContextDIE();
+ }
break;
case DW_TAG_class_type:
case DW_TAG_structure_type:
case DW_TAG_union_type:
- {
- const char *class_union_struct_name = parent_decl_ctx_die->GetName (dwarf2Data, cu);
-
- if (class_union_struct_name)
- {
- storage.insert (0, "::");
- storage.insert (0, class_union_struct_name);
- }
- parent_decl_ctx_die = parent_decl_ctx_die->GetParentDeclContextDIE(dwarf2Data, cu);
- }
+ {
+ const char *class_union_struct_name = parent_decl_ctx_die.GetName ();
+
+ if (class_union_struct_name)
+ {
+ storage.insert (0, "::");
+ storage.insert (0, class_union_struct_name);
+ }
+ parent_decl_ctx_die = parent_decl_ctx_die.GetParentDeclContextDIE();
+ }
break;
default:
- parent_decl_ctx_die = NULL;
+ parent_decl_ctx_die.Clear();
break;
}
}
@@ -2234,7 +2134,7 @@ DWARFDebugInfoEntry::LookupAddress
dw_offset_t debug_ranges_offset = GetAttributeValueAsUnsigned(dwarf2Data, cu, DW_AT_ranges, DW_INVALID_OFFSET);
if (debug_ranges_offset != DW_INVALID_OFFSET)
{
- DWARFDebugRanges::RangeList ranges;
+ DWARFRangeList ranges;
DWARFDebugRanges* debug_ranges = dwarf2Data->DebugRanges();
debug_ranges->FindRanges(debug_ranges_offset, ranges);
// All DW_AT_ranges are relative to the base address of the
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h Wed Aug 26 17:57:51 2015
@@ -57,38 +57,6 @@ public:
typedef offset_collection::iterator offset_collection_iterator;
typedef offset_collection::const_iterator offset_collection_const_iterator;
- class Attributes
- {
- public:
- Attributes();
- ~Attributes();
-
- void Append(const DWARFCompileUnit *cu, dw_offset_t attr_die_offset, dw_attr_t attr, dw_form_t form);
- const DWARFCompileUnit * CompileUnitAtIndex(uint32_t i) const { return m_infos[i].cu; }
- dw_offset_t DIEOffsetAtIndex(uint32_t i) const { return m_infos[i].die_offset; }
- dw_attr_t AttributeAtIndex(uint32_t i) const { return m_infos[i].attr; }
- dw_attr_t FormAtIndex(uint32_t i) const { return m_infos[i].form; }
- bool ExtractFormValueAtIndex (SymbolFileDWARF* dwarf2Data, uint32_t i, DWARFFormValue &form_value) const;
- uint64_t FormValueAsUnsignedAtIndex (SymbolFileDWARF* dwarf2Data, uint32_t i, uint64_t fail_value) const;
- uint64_t FormValueAsUnsigned (SymbolFileDWARF* dwarf2Data, dw_attr_t attr, uint64_t fail_value) const;
- uint32_t FindAttributeIndex(dw_attr_t attr) const;
- bool ContainsAttribute(dw_attr_t attr) const;
- bool RemoveAttribute(dw_attr_t attr);
- void Clear() { m_infos.clear(); }
- size_t Size() const { return m_infos.size(); }
-
- protected:
- struct Info
- {
- const DWARFCompileUnit *cu; // Keep the compile unit with each attribute in case we have DW_FORM_ref_addr values
- dw_offset_t die_offset;
- dw_attr_t attr;
- dw_form_t form;
- };
- typedef llvm::SmallVector<Info, 8> collection;
- collection m_infos;
- };
-
struct CompareState
{
CompareState() :
@@ -159,10 +127,9 @@ public:
DWARFDebugInfoEntry** block_die);
size_t GetAttributes(
- SymbolFileDWARF* dwarf2Data,
const DWARFCompileUnit* cu,
DWARFFormValue::FixedFormSizes fixed_form_sizes,
- DWARFDebugInfoEntry::Attributes& attrs,
+ DWARFAttributes& attrs,
uint32_t curr_depth = 0) const; // "curr_depth" for internal use only, don't set this yourself!!!
dw_offset_t GetAttributeValue(
@@ -212,7 +179,7 @@ public:
size_t GetAttributeAddressRanges (
SymbolFileDWARF* dwarf2Data,
const DWARFCompileUnit* cu,
- DWARFDebugRanges::RangeList &ranges,
+ DWARFRangeList &ranges,
bool check_hi_lo_pc) const;
dw_offset_t GetAttributeValueAsLocation(
@@ -255,7 +222,7 @@ public:
const char * GetQualifiedName (
SymbolFileDWARF* dwarf2Data,
DWARFCompileUnit* cu,
- const DWARFDebugInfoEntry::Attributes& attributes,
+ const DWARFAttributes& attributes,
std::string &storage) const;
// static int Compare(
@@ -310,7 +277,7 @@ public:
const DWARFCompileUnit* cu,
const char * &name,
const char * &mangled,
- DWARFDebugRanges::RangeList& rangeList,
+ DWARFRangeList& rangeList,
int& decl_file,
int& decl_line,
int& decl_column,
@@ -375,8 +342,7 @@ public:
const DWARFDebugInfoEntry* GetFirstChild() const { return (HasChildren() && !m_empty_children) ? this + 1 : NULL; }
- void GetDeclContextDIEs (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
+ void GetDeclContextDIEs (DWARFCompileUnit* cu,
DWARFDIECollection &decl_context_dies) const;
void GetDWARFDeclContext (SymbolFileDWARF* dwarf2Data,
@@ -388,11 +354,11 @@ public:
DWARFCompileUnit* cu,
const DWARFDeclContext &dwarf_decl_ctx) const;
- const DWARFDebugInfoEntry* GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
+ DWARFDIE GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
DWARFCompileUnit* cu) const;
- const DWARFDebugInfoEntry* GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
+ DWARFDIE GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
DWARFCompileUnit* cu,
- const DWARFDebugInfoEntry::Attributes& attributes) const;
+ const DWARFAttributes& attributes) const;
void
SetParent (DWARFDebugInfoEntry* parent)
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp Wed Aug 26 17:57:51 2015
@@ -100,17 +100,17 @@ DWARFDebugPubnames::GeneratePubnames(Sym
size_t die_idx;
for (die_idx = 0; die_idx < die_count; ++die_idx)
{
- const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx);
- DWARFDebugInfoEntry::Attributes attributes;
+ DWARFDIE die = dies.GetDIEAtIndex(die_idx);
+ DWARFAttributes attributes;
const char *name = NULL;
const char *mangled = NULL;
bool add_die = false;
- const size_t num_attributes = die->GetAttributes(dwarf2Data, cu, fixed_form_sizes, attributes);
+ const size_t num_attributes = die.GetDIE()->GetAttributes(die.GetCU(), fixed_form_sizes, attributes);
if (num_attributes > 0)
{
uint32_t i;
- dw_tag_t tag = die->Tag();
+ dw_tag_t tag = die.Tag();
for (i=0; i<num_attributes; ++i)
{
@@ -119,14 +119,14 @@ DWARFDebugPubnames::GeneratePubnames(Sym
switch (attr)
{
case DW_AT_name:
- if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
- name = form_value.AsCString(dwarf2Data);
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ name = form_value.AsCString();
break;
case DW_AT_MIPS_linkage_name:
case DW_AT_linkage_name:
- if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
- mangled = form_value.AsCString(dwarf2Data);
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ mangled = form_value.AsCString();
break;
case DW_AT_low_pc:
@@ -139,10 +139,10 @@ DWARFDebugPubnames::GeneratePubnames(Sym
case DW_AT_location:
if (tag == DW_TAG_variable)
{
- const DWARFDebugInfoEntry* parent_die = die->GetParent();
- while ( parent_die != NULL )
+ DWARFDIE parent_die = die.GetParent();
+ while ( parent_die )
{
- switch (parent_die->Tag())
+ switch (parent_die.Tag())
{
case DW_TAG_subprogram:
case DW_TAG_lexical_block:
@@ -152,31 +152,16 @@ DWARFDebugPubnames::GeneratePubnames(Sym
// if the location describes a hard coded address, but we don't want the performance
// penalty of that right now.
add_die = false;
-// if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
-// {
-// // If we have valid block data, then we have location expression bytes
-// // that are fixed (not a location list).
-// const uint8_t *block_data = form_value.BlockData();
-// if (block_data)
-// {
-// uint32_t block_length = form_value.Unsigned();
-// if (block_length == 1 + attributes.CompileUnitAtIndex(i)->GetAddressByteSize())
-// {
-// if (block_data[0] == DW_OP_addr)
-// add_die = true;
-// }
-// }
-// }
- parent_die = NULL; // Terminate the while loop.
+ parent_die.Clear(); // Terminate the while loop.
break;
case DW_TAG_compile_unit:
add_die = true;
- parent_die = NULL; // Terminate the while loop.
+ parent_die.Clear(); // Terminate the while loop.
break;
default:
- parent_die = parent_die->GetParent(); // Keep going in the while loop.
+ parent_die = parent_die.GetParent(); // Keep going in the while loop.
break;
}
}
@@ -188,7 +173,7 @@ DWARFDebugPubnames::GeneratePubnames(Sym
if (add_die && (name || mangled))
{
- pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, mangled ? mangled : name);
+ pubnames_set.AddDescriptor(die.GetCompileUnitRelativeOffset(), mangled ? mangled : name);
}
}
@@ -230,13 +215,11 @@ DWARFDebugPubnames::GeneratePubBaseTypes
size_t die_idx;
for (die_idx = 0; die_idx < die_count; ++die_idx)
{
- const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx);
- const char *name = die->GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, NULL);
+ DWARFDIE die = dies.GetDIEAtIndex (die_idx);
+ const char *name = die.GetName();
if (name)
- {
- pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, name);
- }
+ pubnames_set.AddDescriptor(die.GetCompileUnitRelativeOffset(), name);
}
if (pubnames_set.NumDescriptors() > 0)
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp Wed Aug 26 17:57:51 2015
@@ -27,7 +27,7 @@ DWARFDebugRanges::~DWARFDebugRanges()
void
DWARFDebugRanges::Extract(SymbolFileDWARF* dwarf2Data)
{
- RangeList range_list;
+ DWARFRangeList range_list;
lldb::offset_t offset = 0;
dw_offset_t debug_ranges_offset = offset;
while (Extract(dwarf2Data, &offset, range_list))
@@ -38,52 +38,8 @@ DWARFDebugRanges::Extract(SymbolFileDWAR
}
}
-//void
-//DWARFDebugRanges::RangeList::AddOffset(dw_addr_t offset)
-//{
-// if (!ranges.empty())
-// {
-// Range::iterator pos = ranges.begin();
-// Range::iterator end_pos = ranges.end();
-// for (pos = ranges.begin(); pos != end_pos; ++pos)
-// {
-// // assert for unsigned overflows
-// assert (~pos->begin_offset >= offset);
-// assert (~pos->end_offset >= offset);
-// pos->begin_offset += offset;
-// pos->end_offset += offset;
-// }
-// }
-//}
-//
-//void
-//DWARFDebugRanges::RangeList::SubtractOffset(dw_addr_t offset)
-//{
-// if (!ranges.empty())
-// {
-// Range::iterator pos = ranges.begin();
-// Range::iterator end_pos = ranges.end();
-// for (pos = ranges.begin(); pos != end_pos; ++pos)
-// {
-// assert (pos->begin_offset >= offset);
-// assert (pos->end_offset >= offset);
-// pos->begin_offset -= offset;
-// pos->end_offset -= offset;
-// }
-// }
-//}
-//
-//
-//const DWARFDebugRanges::Range*
-//DWARFDebugRanges::RangeList::RangeAtIndex(size_t i) const
-//{
-// if (i < ranges.size())
-// return &ranges[i];
-// return NULL;
-//}
-
bool
-DWARFDebugRanges::Extract(SymbolFileDWARF* dwarf2Data, lldb::offset_t *offset_ptr, RangeList &range_list)
+DWARFDebugRanges::Extract(SymbolFileDWARF* dwarf2Data, lldb::offset_t *offset_ptr, DWARFRangeList &range_list)
{
range_list.Clear();
@@ -118,13 +74,13 @@ DWARFDebugRanges::Extract(SymbolFileDWAR
break;
default:
- assert(!"DWARFDebugRanges::RangeList::Extract() unsupported address size.");
+ assert(!"DWARFRangeList::Extract() unsupported address size.");
break;
}
// Filter out empty ranges
if (begin < end)
- range_list.Append(Range(begin, end - begin));
+ range_list.Append(DWARFRangeList::Entry(begin, end - begin));
}
// Make sure we consumed at least something
@@ -178,7 +134,7 @@ DWARFDebugRanges::Dump(Stream &s, const
}
bool
-DWARFDebugRanges::FindRanges(dw_offset_t debug_ranges_offset, RangeList& range_list) const
+DWARFDebugRanges::FindRanges(dw_offset_t debug_ranges_offset, DWARFRangeList& range_list) const
{
range_map_const_iterator pos = m_range_map.find(debug_ranges_offset);
if (pos != m_range_map.end())
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h Wed Aug 26 17:57:51 2015
@@ -11,34 +11,30 @@
#define SymbolFileDWARF_DWARFDebugRanges_h_
#include "SymbolFileDWARF.h"
+#include "DWARFDIE.h"
#include <map>
-#include <vector>
-
-#include "lldb/Core/RangeMap.h"
class DWARFDebugRanges
{
public:
- typedef lldb_private::RangeArray<dw_addr_t, dw_addr_t, 2> RangeList;
- typedef RangeList::Entry Range;
DWARFDebugRanges();
~DWARFDebugRanges();
void Extract(SymbolFileDWARF* dwarf2Data);
static void Dump(lldb_private::Stream &s, const lldb_private::DWARFDataExtractor& debug_ranges_data, lldb::offset_t *offset_ptr, dw_addr_t cu_base_addr);
- bool FindRanges(dw_offset_t debug_ranges_offset, DWARFDebugRanges::RangeList& range_list) const;
+ bool FindRanges(dw_offset_t debug_ranges_offset, DWARFRangeList& range_list) const;
protected:
bool
Extract (SymbolFileDWARF* dwarf2Data,
lldb::offset_t *offset_ptr,
- RangeList &range_list);
+ DWARFRangeList &range_list);
- typedef std::map<dw_offset_t, RangeList> range_map;
- typedef range_map::iterator range_map_iterator;
- typedef range_map::const_iterator range_map_const_iterator;
+ typedef std::map<dw_offset_t, DWARFRangeList> range_map;
+ typedef range_map::iterator range_map_iterator;
+ typedef range_map::const_iterator range_map_const_iterator;
range_map m_range_map;
};
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h Wed Aug 26 17:57:51 2015
@@ -108,6 +108,13 @@ public:
return lldb_private::ConstString (GetQualifiedName ());
}
+ void
+ Clear()
+ {
+ m_entries.clear();
+ m_qualified_name.clear();
+ }
+
protected:
typedef std::vector<Entry> collection;
collection m_entries;
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp Wed Aug 26 17:57:51 2015
@@ -342,7 +342,7 @@ DWARFFormValue::SkipValue(dw_form_t form
void
-DWARFFormValue::Dump(Stream &s, SymbolFileDWARF* symbol_file) const
+DWARFFormValue::Dump(Stream &s) const
{
uint64_t uvalue = Unsigned();
bool cu_relative_offset = false;
@@ -359,7 +359,7 @@ DWARFFormValue::Dump(Stream &s, SymbolFi
case DW_FORM_data4: s.PutHex32(uvalue); break;
case DW_FORM_ref_sig8:
case DW_FORM_data8: s.PutHex64(uvalue); break;
- case DW_FORM_string: s.QuotedCString(AsCString(symbol_file)); break;
+ case DW_FORM_string: s.QuotedCString(AsCString()); break;
case DW_FORM_exprloc:
case DW_FORM_block:
case DW_FORM_block1:
@@ -395,18 +395,18 @@ DWARFFormValue::Dump(Stream &s, SymbolFi
case DW_FORM_sdata: s.PutSLEB128(uvalue); break;
case DW_FORM_udata: s.PutULEB128(uvalue); break;
case DW_FORM_strp:
- if (symbol_file)
{
- if (verbose)
- s.Printf(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
-
- const char* dbg_str = AsCString(symbol_file);
+ const char* dbg_str = AsCString();
if (dbg_str)
+ {
+ if (verbose)
+ s.Printf(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
s.QuotedCString(dbg_str);
- }
- else
- {
- s.PutHex32(uvalue);
+ }
+ else
+ {
+ s.PutHex32(uvalue);
+ }
}
break;
@@ -444,8 +444,10 @@ DWARFFormValue::Dump(Stream &s, SymbolFi
}
const char*
-DWARFFormValue::AsCString(SymbolFileDWARF* symbol_file) const
+DWARFFormValue::AsCString() const
{
+ SymbolFileDWARF* symbol_file = m_cu->GetSymbolFileDWARF();
+
if (m_form == DW_FORM_string)
{
return m_value.value.cstr;
@@ -471,8 +473,10 @@ DWARFFormValue::AsCString(SymbolFileDWAR
}
dw_addr_t
-DWARFFormValue::Address(SymbolFileDWARF* symbol_file) const
+DWARFFormValue::Address() const
{
+ SymbolFileDWARF* symbol_file = m_cu->GetSymbolFileDWARF();
+
if (m_form == DW_FORM_addr)
return Unsigned();
@@ -571,8 +575,7 @@ DWARFFormValue::IsDataForm(const dw_form
int
DWARFFormValue::Compare (const DWARFFormValue& a_value,
- const DWARFFormValue& b_value,
- SymbolFileDWARF* symbol_file)
+ const DWARFFormValue& b_value)
{
dw_form_t a_form = a_value.Form();
dw_form_t b_form = b_value.Form();
@@ -619,8 +622,8 @@ DWARFFormValue::Compare (const DWARFForm
case DW_FORM_strp:
case DW_FORM_GNU_str_index:
{
- const char *a_string = a_value.AsCString(symbol_file);
- const char *b_string = b_value.AsCString(symbol_file);
+ const char *a_string = a_value.AsCString();
+ const char *b_string = b_value.AsCString();
if (a_string == b_string)
return 0;
else if (a_string && b_string)
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h Wed Aug 26 17:57:51 2015
@@ -14,7 +14,6 @@
#include "DWARFDataExtractor.h"
class DWARFCompileUnit;
-class SymbolFileDWARF;
class DWARFFormValue
{
@@ -81,7 +80,7 @@ public:
dw_form_t Form() const { return m_form; }
void SetForm(dw_form_t form) { m_form = form; }
const ValueType& Value() const { return m_value; }
- void Dump(lldb_private::Stream &s, SymbolFileDWARF* symbol_file) const;
+ void Dump(lldb_private::Stream &s) const;
bool ExtractValue(const lldb_private::DWARFDataExtractor& data,
lldb::offset_t* offset_ptr);
const uint8_t* BlockData() const;
@@ -92,16 +91,15 @@ public:
void SetUnsigned(uint64_t uval) { m_value.value.uval = uval; }
int64_t Signed() const { return m_value.value.sval; }
void SetSigned(int64_t sval) { m_value.value.sval = sval; }
- const char* AsCString(SymbolFileDWARF* symbol_file) const;
- dw_addr_t Address(SymbolFileDWARF* symbol_file) const;
+ const char* AsCString() const;
+ dw_addr_t Address() const;
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);
static bool IsDataForm(const dw_form_t form);
static FixedFormSizes GetFixedFormSizesForAddressSize (uint8_t addr_size, bool is_dwarf64);
static int Compare (const DWARFFormValue& a,
- const DWARFFormValue& b,
- SymbolFileDWARF* symbol_file);
+ const DWARFFormValue& b);
protected:
const DWARFCompileUnit* m_cu; // Compile unit for this form
dw_form_t m_form; // Form for this value
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Wed Aug 26 17:57:51 2015
@@ -286,65 +286,61 @@ SymbolFileDWARF::GetTypeList ()
}
void
-SymbolFileDWARF::GetTypes (DWARFCompileUnit* cu,
- const DWARFDebugInfoEntry *die,
+SymbolFileDWARF::GetTypes (const DWARFDIE &die,
dw_offset_t min_die_offset,
dw_offset_t max_die_offset,
uint32_t type_mask,
TypeSet &type_set)
{
- if (cu)
+ if (die)
{
- if (die)
+ const dw_offset_t die_offset = die.GetOffset();
+
+ if (die_offset >= max_die_offset)
+ return;
+
+ if (die_offset >= min_die_offset)
{
- const dw_offset_t die_offset = die->GetOffset();
+ const dw_tag_t tag = die.Tag();
- if (die_offset >= max_die_offset)
- return;
-
- if (die_offset >= min_die_offset)
- {
- const dw_tag_t tag = die->Tag();
-
- bool add_type = false;
+ bool add_type = false;
- switch (tag)
+ switch (tag)
+ {
+ case DW_TAG_array_type: add_type = (type_mask & eTypeClassArray ) != 0; break;
+ case DW_TAG_unspecified_type:
+ case DW_TAG_base_type: add_type = (type_mask & eTypeClassBuiltin ) != 0; break;
+ case DW_TAG_class_type: add_type = (type_mask & eTypeClassClass ) != 0; break;
+ case DW_TAG_structure_type: add_type = (type_mask & eTypeClassStruct ) != 0; break;
+ case DW_TAG_union_type: add_type = (type_mask & eTypeClassUnion ) != 0; break;
+ case DW_TAG_enumeration_type: add_type = (type_mask & eTypeClassEnumeration ) != 0; break;
+ case DW_TAG_subroutine_type:
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine: add_type = (type_mask & eTypeClassFunction ) != 0; break;
+ case DW_TAG_pointer_type: add_type = (type_mask & eTypeClassPointer ) != 0; break;
+ case DW_TAG_rvalue_reference_type:
+ case DW_TAG_reference_type: add_type = (type_mask & eTypeClassReference ) != 0; break;
+ case DW_TAG_typedef: add_type = (type_mask & eTypeClassTypedef ) != 0; break;
+ case DW_TAG_ptr_to_member_type: add_type = (type_mask & eTypeClassMemberPointer ) != 0; break;
+ }
+
+ if (add_type)
+ {
+ const bool assert_not_being_parsed = true;
+ Type *type = ResolveTypeUID (die, assert_not_being_parsed);
+ if (type)
{
- case DW_TAG_array_type: add_type = (type_mask & eTypeClassArray ) != 0; break;
- case DW_TAG_unspecified_type:
- case DW_TAG_base_type: add_type = (type_mask & eTypeClassBuiltin ) != 0; break;
- case DW_TAG_class_type: add_type = (type_mask & eTypeClassClass ) != 0; break;
- case DW_TAG_structure_type: add_type = (type_mask & eTypeClassStruct ) != 0; break;
- case DW_TAG_union_type: add_type = (type_mask & eTypeClassUnion ) != 0; break;
- case DW_TAG_enumeration_type: add_type = (type_mask & eTypeClassEnumeration ) != 0; break;
- case DW_TAG_subroutine_type:
- case DW_TAG_subprogram:
- case DW_TAG_inlined_subroutine: add_type = (type_mask & eTypeClassFunction ) != 0; break;
- case DW_TAG_pointer_type: add_type = (type_mask & eTypeClassPointer ) != 0; break;
- case DW_TAG_rvalue_reference_type:
- case DW_TAG_reference_type: add_type = (type_mask & eTypeClassReference ) != 0; break;
- case DW_TAG_typedef: add_type = (type_mask & eTypeClassTypedef ) != 0; break;
- case DW_TAG_ptr_to_member_type: add_type = (type_mask & eTypeClassMemberPointer ) != 0; break;
- }
-
- if (add_type)
- {
- const bool assert_not_being_parsed = true;
- Type *type = ResolveTypeUID (cu, die, assert_not_being_parsed);
- if (type)
- {
- if (type_set.find(type) == type_set.end())
- type_set.insert(type);
- }
+ if (type_set.find(type) == type_set.end())
+ type_set.insert(type);
}
}
-
- for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild();
- child_die != NULL;
- child_die = child_die->GetSibling())
- {
- GetTypes (cu, child_die, min_die_offset, max_die_offset, type_mask, type_set);
- }
+ }
+
+ for (DWARFDIE child_die = die.GetFirstChild();
+ child_die.IsValid();
+ child_die = child_die.GetSibling())
+ {
+ GetTypes (child_die, min_die_offset, max_die_offset, type_mask, type_set);
}
}
}
@@ -367,8 +363,7 @@ SymbolFileDWARF::GetTypes (SymbolContext
dwarf_cu = GetDWARFCompileUnit(comp_unit);
if (dwarf_cu == 0)
return 0;
- GetTypes (dwarf_cu,
- dwarf_cu->DIE(),
+ GetTypes (dwarf_cu->DIE(),
dwarf_cu->GetOffset(),
dwarf_cu->GetNextCompileUnitOffset(),
type_mask,
@@ -385,8 +380,7 @@ SymbolFileDWARF::GetTypes (SymbolContext
dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
if (dwarf_cu)
{
- GetTypes (dwarf_cu,
- dwarf_cu->DIE(),
+ GetTypes (dwarf_cu->DIE(),
0,
UINT32_MAX,
type_mask,
@@ -395,68 +389,7 @@ SymbolFileDWARF::GetTypes (SymbolContext
}
}
}
-// if (m_using_apple_tables)
-// {
-// DWARFMappedHash::MemoryTable *apple_types = m_apple_types_ap.get();
-// if (apple_types)
-// {
-// apple_types->ForEach([this, &type_set, apple_types, type_mask](const DWARFMappedHash::DIEInfoArray &die_info_array) -> bool {
-//
-// for (auto die_info: die_info_array)
-// {
-// bool add_type = TagMatchesTypeMask (type_mask, 0);
-// if (!add_type)
-// {
-// dw_tag_t tag = die_info.tag;
-// if (tag == 0)
-// {
-// const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_info.offset, NULL);
-// tag = die->Tag();
-// }
-// add_type = TagMatchesTypeMask (type_mask, tag);
-// }
-// if (add_type)
-// {
-// Type *type = ResolveTypeUID(die_info.offset);
-//
-// if (type_set.find(type) == type_set.end())
-// type_set.insert(type);
-// }
-// }
-// return true; // Keep iterating
-// });
-// }
-// }
-// else
-// {
-// if (!m_indexed)
-// Index ();
-//
-// m_type_index.ForEach([this, &type_set, type_mask](const char *name, uint32_t die_offset) -> bool {
-//
-// bool add_type = TagMatchesTypeMask (type_mask, 0);
-//
-// if (!add_type)
-// {
-// const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_offset, NULL);
-// if (die)
-// {
-// const dw_tag_t tag = die->Tag();
-// add_type = TagMatchesTypeMask (type_mask, tag);
-// }
-// }
-//
-// if (add_type)
-// {
-// Type *type = ResolveTypeUID(die_offset);
-//
-// if (type_set.find(type) == type_set.end())
-// type_set.insert(type);
-// }
-// return true; // Keep iterating
-// });
-// }
-
+
std::set<CompilerType> clang_type_set;
size_t num_types_added = 0;
for (Type *type : type_set)
@@ -477,13 +410,13 @@ SymbolFileDWARF::GetTypes (SymbolContext
// Gets the first parent that is a lexical block, function or inlined
// subroutine, or compile unit.
//----------------------------------------------------------------------
-const DWARFDebugInfoEntry *
-SymbolFileDWARF::GetParentSymbolContextDIE(const DWARFDebugInfoEntry *child_die)
+DWARFDIE
+SymbolFileDWARF::GetParentSymbolContextDIE(const DWARFDIE &child_die)
{
- const DWARFDebugInfoEntry *die;
- for (die = child_die->GetParent(); die != NULL; die = die->GetParent())
+ DWARFDIE die;
+ for (die = child_die.GetParent(); die; die = die.GetParent())
{
- dw_tag_t tag = die->Tag();
+ dw_tag_t tag = die.Tag();
switch (tag)
{
@@ -494,7 +427,7 @@ SymbolFileDWARF::GetParentSymbolContextD
return die;
}
}
- return NULL;
+ return DWARFDIE();
}
@@ -921,7 +854,7 @@ SymbolFileDWARF::GetDWARFCompileUnit(lld
// TODO: modify to support LTO .o files where each .o file might
// have multiple DW_TAG_compile_unit tags.
- DWARFCompileUnit *dwarf_cu = info->GetCompileUnit(0).get();
+ DWARFCompileUnit *dwarf_cu = info->GetCompileUnit(0);
if (dwarf_cu && dwarf_cu->GetUserData() == NULL)
dwarf_cu->SetUserData(comp_unit);
return dwarf_cu;
@@ -931,7 +864,7 @@ SymbolFileDWARF::GetDWARFCompileUnit(lld
// Just a normal DWARF file whose user ID for the compile unit is
// the DWARF offset itself
- DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID()).get();
+ DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID());
if (dwarf_cu && dwarf_cu->GetUserData() == NULL)
dwarf_cu->SetUserData(comp_unit);
return dwarf_cu;
@@ -1015,7 +948,7 @@ SymbolFileDWARF::ParseCompileUnit (DWARF
cu_sp.reset(new CompileUnit (module_sp,
dwarf_cu,
cu_file_spec,
- MakeUserID(dwarf_cu->GetOffset()),
+ dwarf_cu->GetID(),
cu_language,
is_optimized));
if (cu_sp)
@@ -1074,14 +1007,18 @@ SymbolFileDWARF::ParseCompileUnitAtIndex
}
Function *
-SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die)
+SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, const DWARFDIE &die)
{
- TypeSystem *type_system = GetTypeSystemForLanguage(dwarf_cu->GetLanguageType());
+ if (die.IsValid())
+ {
+ TypeSystem *type_system = GetTypeSystemForLanguage(die.GetCU()->GetLanguageType());
- if (type_system)
- return type_system->ParseFunctionFromDWARF(sc, this, dwarf_cu, die);
- else
- return nullptr;
+ if (type_system)
+ {
+ return type_system->ParseFunctionFromDWARF(sc, die);
+ }
+ }
+ return nullptr;
}
bool
@@ -1122,10 +1059,10 @@ SymbolFileDWARF::ParseCompileUnitFunctio
size_t func_idx;
for (func_idx = 0; func_idx < num_functions; ++func_idx)
{
- const DWARFDebugInfoEntry *die = function_dies.GetDIEPtrAtIndex(func_idx);
- if (sc.comp_unit->FindFunctionByUID (MakeUserID(die->GetOffset())).get() == NULL)
+ DWARFDIE die = function_dies.GetDIEAtIndex(func_idx);
+ if (sc.comp_unit->FindFunctionByUID (die.GetID()).get() == NULL)
{
- if (ParseCompileUnitFunction(sc, dwarf_cu, die))
+ if (ParseCompileUnitFunction(sc, die))
++functions_added;
}
}
@@ -1274,20 +1211,17 @@ SymbolFileDWARF::ParseCompileUnitLineTab
}
size_t
-SymbolFileDWARF::ParseFunctionBlocks
-(
- const SymbolContext& sc,
- Block *parent_block,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
- addr_t subprogram_low_pc,
- uint32_t depth
-)
+SymbolFileDWARF::ParseFunctionBlocks (const SymbolContext& sc,
+ Block *parent_block,
+ const DWARFDIE &orig_die,
+ addr_t subprogram_low_pc,
+ uint32_t depth)
{
size_t blocks_added = 0;
- while (die != NULL)
+ DWARFDIE die = orig_die;
+ while (die)
{
- dw_tag_t tag = die->Tag();
+ dw_tag_t tag = die.Tag();
switch (tag)
{
@@ -1309,11 +1243,11 @@ SymbolFileDWARF::ParseFunctionBlocks
}
else
{
- BlockSP block_sp(new Block (MakeUserID(die->GetOffset())));
+ BlockSP block_sp(new Block (die.GetID()));
parent_block->AddChild(block_sp);
block = block_sp.get();
}
- DWARFDebugRanges::RangeList ranges;
+ DWARFRangeList ranges;
const char *name = NULL;
const char *mangled_name = NULL;
@@ -1323,13 +1257,11 @@ SymbolFileDWARF::ParseFunctionBlocks
int call_file = 0;
int call_line = 0;
int call_column = 0;
- if (die->GetDIENamesAndRanges (this,
- dwarf_cu,
- name,
- mangled_name,
- ranges,
- decl_file, decl_line, decl_column,
- call_file, call_line, call_column))
+ if (die.GetDIENamesAndRanges (name,
+ mangled_name,
+ ranges,
+ decl_file, decl_line, decl_column,
+ call_file, call_line, call_column, nullptr))
{
if (tag == DW_TAG_subprogram)
{
@@ -1355,7 +1287,7 @@ SymbolFileDWARF::ParseFunctionBlocks
const size_t num_ranges = ranges.GetSize();
for (size_t i = 0; i<num_ranges; ++i)
{
- const DWARFDebugRanges::Range &range = ranges.GetEntryRef (i);
+ const DWARFRangeList::Entry &range = ranges.GetEntryRef (i);
const addr_t range_base = range.GetRangeBase();
if (range_base >= subprogram_low_pc)
block->AddRange(Block::Range (range_base - subprogram_low_pc, range.GetByteSize()));
@@ -1387,12 +1319,11 @@ SymbolFileDWARF::ParseFunctionBlocks
++blocks_added;
- if (die->HasChildren())
+ if (die.HasChildren())
{
blocks_added += ParseFunctionBlocks (sc,
block,
- dwarf_cu,
- die->GetFirstChild(),
+ die.GetFirstChild(),
subprogram_low_pc,
depth + 1);
}
@@ -1408,22 +1339,21 @@ SymbolFileDWARF::ParseFunctionBlocks
// DW_TAG_subprogram DIE
if (depth == 0)
- die = NULL;
+ die.Clear();
else
- die = die->GetSibling();
+ die = die.GetSibling();
}
return blocks_added;
}
bool
-SymbolFileDWARF::ClassOrStructIsVirtual (DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die)
+SymbolFileDWARF::ClassOrStructIsVirtual (const DWARFDIE &parent_die)
{
if (parent_die)
{
- for (const DWARFDebugInfoEntry *die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
+ for (DWARFDIE die = parent_die.GetFirstChild(); die; die = die.GetSibling())
{
- dw_tag_t tag = die->Tag();
+ dw_tag_t tag = die.Tag();
bool check_virtuality = false;
switch (tag)
{
@@ -1436,7 +1366,7 @@ SymbolFileDWARF::ClassOrStructIsVirtual
}
if (check_virtuality)
{
- if (die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_virtuality, 0) != 0)
+ if (die.GetAttributeValueAsUnsigned(DW_AT_virtuality, 0) != 0)
return true;
}
}
@@ -1452,13 +1382,12 @@ SymbolFileDWARF::GetDeclContextForUID (l
DWARFDebugInfo* debug_info = DebugInfo();
if (debug_info)
{
- DWARFCompileUnitSP cu_sp;
- const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(type_uid, &cu_sp);
+ DWARFDIE die = debug_info->GetDIE(type_uid);
if (die)
{
- TypeSystem *type_system = GetTypeSystemForLanguage(cu_sp->GetLanguageType());
+ TypeSystem *type_system = die.GetTypeSystem();
if (type_system)
- return type_system->GetDeclContextForUIDFromDWARF(this, cu_sp.get(), die);
+ return type_system->GetDeclContextForUIDFromDWARF(die);
}
}
}
@@ -1473,13 +1402,12 @@ SymbolFileDWARF::GetDeclContextContainin
DWARFDebugInfo* debug_info = DebugInfo();
if (debug_info)
{
- DWARFCompileUnitSP cu_sp;
- const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(type_uid, &cu_sp);
+ DWARFDIE die = debug_info->GetDIE(type_uid);
if (die)
{
- TypeSystem *type_system = GetTypeSystemForLanguage(cu_sp->GetLanguageType());
+ TypeSystem *type_system = die.GetTypeSystem();
if (type_system)
- return type_system->GetDeclContextContainingUIDFromDWARF(this, cu_sp.get(), die);
+ return type_system->GetDeclContextContainingUIDFromDWARF(die);
}
}
}
@@ -1495,70 +1423,61 @@ SymbolFileDWARF::ResolveTypeUID (lldb::u
DWARFDebugInfo* debug_info = DebugInfo();
if (debug_info)
{
- DWARFCompileUnitSP cu_sp;
- const DWARFDebugInfoEntry* type_die = debug_info->GetDIEPtr(type_uid, &cu_sp);
- const bool assert_not_being_parsed = true;
- return ResolveTypeUID (cu_sp.get(), type_die, assert_not_being_parsed);
+ DWARFDIE type_die = debug_info->GetDIE (type_uid);
+ if (type_die)
+ {
+ const bool assert_not_being_parsed = true;
+ return ResolveTypeUID (type_die, assert_not_being_parsed);
+ }
}
}
return NULL;
}
Type*
-SymbolFileDWARF::ResolveTypeUID (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* die, bool assert_not_being_parsed)
+SymbolFileDWARF::ResolveTypeUID (const DWARFDIE &die, bool assert_not_being_parsed)
{
- if (die != NULL)
+ if (die)
{
Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
if (log)
GetObjectFile()->GetModule()->LogMessage (log,
"SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s'",
- die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
- die->GetName(this, cu));
+ die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName());
// We might be coming in in the middle of a type tree (a class
// withing a class, an enum within a class), so parse any needed
// parent DIEs before we get to this one...
- const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (cu, die);
- switch (decl_ctx_die->Tag())
+ DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE (die);
+ if (decl_ctx_die)
{
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_class_type:
- {
- // Get the type, which could be a forward declaration
- if (log)
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s' resolve parent forward type for 0x%8.8x",
- die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
- die->GetName(this, cu),
- decl_ctx_die->GetOffset());
-//
-// Type *parent_type = ResolveTypeUID (cu, decl_ctx_die, assert_not_being_parsed);
-// if (child_requires_parent_class_union_or_struct_to_be_completed(die->Tag()))
-// {
-// if (log)
-// GetObjectFile()->GetModule()->LogMessage (log,
-// "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s' resolve parent full type for 0x%8.8x since die is a function",
-// die->GetOffset(),
-// DW_TAG_value_to_name(die->Tag()),
-// die->GetName(this, cu),
-// decl_ctx_die->GetOffset());
-// // Ask the type to complete itself if it already hasn't since if we
-// // want a function (method or static) from a class, the class must
-// // create itself and add it's own methods and class functions.
-// if (parent_type)
-// parent_type->GetFullCompilerType ();
-// }
- }
- break;
+ if (log)
+ {
+ switch (decl_ctx_die.Tag())
+ {
+ case DW_TAG_structure_type:
+ case DW_TAG_union_type:
+ case DW_TAG_class_type:
+ {
+ // Get the type, which could be a forward declaration
+ if (log)
+ GetObjectFile()->GetModule()->LogMessage (log,
+ "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s' resolve parent forward type for 0x%8.8x",
+ die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName(),
+ decl_ctx_die.GetOffset());
+ }
+ break;
- default:
- break;
+ default:
+ break;
+ }
+ }
}
- return ResolveType (cu, die);
+ return ResolveType (die);
}
return NULL;
}
@@ -1593,58 +1512,37 @@ SymbolFileDWARF::CompleteType (CompilerT
m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers.GetOpaqueQualType());
DWARFDebugInfo* debug_info = DebugInfo();
- DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get();
+ DWARFDIE dwarf_die (debug_info->GetCompileUnitContainingDIE (die->GetOffset()), die);
Type *type = m_die_to_type.lookup (die);
Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
if (log)
GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
"0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...",
- MakeUserID(die->GetOffset()),
- DW_TAG_value_to_name(die->Tag()),
+ dwarf_die.GetID(),
+ dwarf_die.GetTagAsCString(),
type->GetName().AsCString());
assert (clang_type);
- DWARFDebugInfoEntry::Attributes attributes;
+ DWARFAttributes attributes;
- TypeSystem *type_system = GetTypeSystemForLanguage(dwarf_cu->GetLanguageType());
+ TypeSystem *type_system = dwarf_die.GetTypeSystem();
if (type_system)
- return type_system->CompleteTypeFromDWARF (this, dwarf_cu, die, type, clang_type);
+ return type_system->CompleteTypeFromDWARF (dwarf_die, type, clang_type);
return false;
}
-void
-SymbolFileDWARF::ClearDIEBeingParsed (const DWARFDebugInfoEntry* type_die)
-{
- if (type_die)
- {
- if (m_die_to_type.lookup (type_die) == DIE_IS_BEING_PARSED)
- m_die_to_type[type_die] = nullptr;
- }
-}
Type*
-SymbolFileDWARF::GetCachedTypeForDIE (const DWARFDebugInfoEntry* type_die) const
+SymbolFileDWARF::ResolveType (const DWARFDIE &die, bool assert_not_being_parsed)
{
- if (type_die)
- {
- Type *type = m_die_to_type.lookup (type_die);
- if (type != DIE_IS_BEING_PARSED)
- return type;
- }
- return nullptr;
-}
-
-Type*
-SymbolFileDWARF::ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed)
-{
- if (type_die != NULL)
+ if (die)
{
- Type *type = m_die_to_type.lookup (type_die);
+ Type *type = m_die_to_type.lookup (die.GetDIE());
if (type == NULL)
- type = GetTypeForDIE (dwarf_cu, type_die).get();
+ type = GetTypeForDIE (die).get();
if (assert_not_being_parsed)
{
@@ -1652,15 +1550,15 @@ SymbolFileDWARF::ResolveType (DWARFCompi
return type;
GetObjectFile()->GetModule()->ReportError ("Parsing a die that is being parsed die: 0x%8.8x: %s %s",
- type_die->GetOffset(),
- DW_TAG_value_to_name(type_die->Tag()),
- type_die->GetName(this, dwarf_cu));
+ die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName());
}
else
return type;
}
- return NULL;
+ return nullptr;
}
CompileUnit*
@@ -1696,20 +1594,24 @@ SymbolFileDWARF::GetObjCMethodDIEOffsets
}
bool
-SymbolFileDWARF::GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, SymbolContext& sc)
+SymbolFileDWARF::GetFunction (const DWARFDIE &die, SymbolContext& sc)
{
sc.Clear(false);
- // Check if the symbol vendor already knows about this compile unit?
- sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
- sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(func_die->GetOffset())).get();
- if (sc.function == NULL)
- sc.function = ParseCompileUnitFunction(sc, dwarf_cu, func_die);
-
- if (sc.function)
- {
- sc.module_sp = sc.function->CalculateSymbolContextModule();
- return true;
+ if (die)
+ {
+ // Check if the symbol vendor already knows about this compile unit?
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
+
+ sc.function = sc.comp_unit->FindFunctionByUID (die.GetID()).get();
+ if (sc.function == NULL)
+ sc.function = ParseCompileUnitFunction(sc, die);
+
+ if (sc.function)
+ {
+ sc.module_sp = sc.function->CalculateSymbolContextModule();
+ return true;
+ }
}
return false;
@@ -1867,7 +1769,7 @@ SymbolFileDWARF::ResolveSymbolContext (c
else
{
uint32_t cu_idx = DW_INVALID_INDEX;
- DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx).get();
+ DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx);
if (dwarf_cu)
{
sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
@@ -1878,22 +1780,16 @@ SymbolFileDWARF::ResolveSymbolContext (c
bool force_check_line_table = false;
if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock))
{
- DWARFDebugInfoEntry *function_die = NULL;
- DWARFDebugInfoEntry *block_die = NULL;
- if (resolve_scope & eSymbolContextBlock)
- {
- dwarf_cu->LookupAddress(file_vm_addr, &function_die, &block_die);
- }
- else
- {
- dwarf_cu->LookupAddress(file_vm_addr, &function_die, NULL);
- }
-
- if (function_die != NULL)
+ DWARFDIE function_die = dwarf_cu->LookupAddress(file_vm_addr);
+ DWARFDIE block_die;
+ if (function_die)
{
- sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get();
+ sc.function = sc.comp_unit->FindFunctionByUID (function_die.GetID()).get();
if (sc.function == NULL)
- sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die);
+ sc.function = ParseCompileUnitFunction(sc, function_die);
+
+ if (sc.function && (resolve_scope & eSymbolContextBlock))
+ block_die = function_die.LookupDeepestBlock(file_vm_addr);
}
else
{
@@ -1914,10 +1810,10 @@ SymbolFileDWARF::ResolveSymbolContext (c
{
Block& block = sc.function->GetBlock (true);
- if (block_die != NULL)
- sc.block = block.FindBlockByID (MakeUserID(block_die->GetOffset()));
+ if (block_die)
+ sc.block = block.FindBlockByID (block_die.GetID());
else
- sc.block = block.FindBlockByID (MakeUserID(function_die->GetOffset()));
+ sc.block = block.FindBlockByID (function_die.GetID());
if (sc.block)
resolved |= eSymbolContextBlock;
}
@@ -2032,25 +1928,26 @@ SymbolFileDWARF::ResolveSymbolContext(co
const lldb::addr_t file_vm_addr = sc.line_entry.range.GetBaseAddress().GetFileAddress();
if (file_vm_addr != LLDB_INVALID_ADDRESS)
{
- DWARFDebugInfoEntry *function_die = NULL;
- DWARFDebugInfoEntry *block_die = NULL;
- dwarf_cu->LookupAddress(file_vm_addr, &function_die, resolve_scope & eSymbolContextBlock ? &block_die : NULL);
-
- if (function_die != NULL)
+ DWARFDIE function_die = dwarf_cu->LookupAddress(file_vm_addr);
+ DWARFDIE block_die;
+ if (function_die)
{
- sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get();
+ sc.function = sc.comp_unit->FindFunctionByUID (function_die.GetID()).get();
if (sc.function == NULL)
- sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die);
+ sc.function = ParseCompileUnitFunction(sc, function_die);
+
+ if (sc.function && (resolve_scope & eSymbolContextBlock))
+ block_die = function_die.LookupDeepestBlock(file_vm_addr);
}
if (sc.function != NULL)
{
Block& block = sc.function->GetBlock (true);
- if (block_die != NULL)
- sc.block = block.FindBlockByID (MakeUserID(block_die->GetOffset()));
- else if (function_die != NULL)
- sc.block = block.FindBlockByID (MakeUserID(function_die->GetOffset()));
+ if (block_die)
+ sc.block = block.FindBlockByID (block_die.GetID());
+ else if (function_die)
+ sc.block = block.FindBlockByID (function_die.GetID());
}
}
}
@@ -2229,17 +2126,15 @@ SymbolFileDWARF::FindGlobalVariables (co
assert (sc.module_sp);
DWARFDebugInfo* debug_info = DebugInfo();
- DWARFCompileUnit* dwarf_cu = NULL;
- const DWARFDebugInfoEntry* die = NULL;
bool done = false;
for (size_t i=0; i<num_die_matches && !done; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
+ DWARFDIE die = debug_info->GetDIE (die_offset);
if (die)
{
- switch (die->Tag())
+ switch (die.Tag())
{
default:
case DW_TAG_subprogram:
@@ -2250,21 +2145,21 @@ SymbolFileDWARF::FindGlobalVariables (co
case DW_TAG_variable:
{
- sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
if (parent_decl_ctx)
{
- TypeSystem *type_system = GetTypeSystemForLanguage(dwarf_cu->GetLanguageType());
+ TypeSystem *type_system = die.GetTypeSystem();
if (type_system)
{
- CompilerDeclContext actual_parent_decl_ctx = type_system->GetDeclContextContainingUIDFromDWARF (this, dwarf_cu, die);
+ CompilerDeclContext actual_parent_decl_ctx = type_system->GetDeclContextContainingUIDFromDWARF (die);
if (!actual_parent_decl_ctx || actual_parent_decl_ctx != *parent_decl_ctx)
continue;
}
}
- ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables);
+ ParseVariables(sc, die, LLDB_INVALID_ADDRESS, false, false, &variables);
if (variables.GetSize() - original_size >= max_matches)
done = true;
@@ -2346,8 +2241,6 @@ SymbolFileDWARF::FindGlobalVariables(con
sc.module_sp = m_obj_file->GetModule();
assert (sc.module_sp);
- DWARFCompileUnit* dwarf_cu = NULL;
- const DWARFDebugInfoEntry* die = NULL;
const size_t num_matches = die_offsets.size();
if (num_matches)
{
@@ -2355,13 +2248,13 @@ SymbolFileDWARF::FindGlobalVariables(con
for (size_t i=0; i<num_matches; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
+ DWARFDIE die = debug_info->GetDIE (die_offset);
if (die)
{
- sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
- ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables);
+ ParseVariables(sc, die, LLDB_INVALID_ADDRESS, false, false, &variables);
if (variables.GetSize() - original_size >= max_matches)
break;
@@ -2384,52 +2277,58 @@ SymbolFileDWARF::FindGlobalVariables(con
bool
SymbolFileDWARF::ResolveFunction (dw_offset_t die_offset,
- DWARFCompileUnit *&dwarf_cu,
bool include_inlines,
SymbolContextList& sc_list)
{
- const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
- return ResolveFunction (dwarf_cu, die, include_inlines, sc_list);
+ DWARFDIE die = DebugInfo()->GetDIE (die_offset);
+ return ResolveFunction (die, include_inlines, sc_list);
}
bool
-SymbolFileDWARF::ResolveFunction (DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die,
+SymbolFileDWARF::ResolveFunction (const DWARFDIE &orig_die,
bool include_inlines,
SymbolContextList& sc_list)
{
SymbolContext sc;
- if (die == NULL)
+ if (!orig_die)
return false;
// If we were passed a die that is not a function, just return false...
- if (! (die->Tag() == DW_TAG_subprogram || (include_inlines && die->Tag() == DW_TAG_inlined_subroutine)))
+ if (!(orig_die.Tag() == DW_TAG_subprogram || (include_inlines && orig_die.Tag() == DW_TAG_inlined_subroutine)))
return false;
-
- const DWARFDebugInfoEntry* inlined_die = NULL;
- if (die->Tag() == DW_TAG_inlined_subroutine)
+
+ DWARFDIE die = orig_die;
+ DWARFDIE inlined_die;
+ if (die.Tag() == DW_TAG_inlined_subroutine)
{
inlined_die = die;
- while ((die = die->GetParent()) != NULL)
+ while (1)
{
- if (die->Tag() == DW_TAG_subprogram)
+ die = die.GetParent();
+
+ if (die)
+ {
+ if (die.Tag() == DW_TAG_subprogram)
+ break;
+ }
+ else
break;
}
}
- assert (die && die->Tag() == DW_TAG_subprogram);
- if (GetFunction (cu, die, sc))
+ assert (die && die.Tag() == DW_TAG_subprogram);
+ if (GetFunction (die, sc))
{
Address addr;
// Parse all blocks if needed
if (inlined_die)
{
Block &function_block = sc.function->GetBlock (true);
- sc.block = function_block.FindBlockByID (MakeUserID(inlined_die->GetOffset()));
+ sc.block = function_block.FindBlockByID (inlined_die.GetID());
if (sc.block == NULL)
- sc.block = function_block.FindBlockByID (inlined_die->GetOffset());
+ sc.block = function_block.FindBlockByID (inlined_die.GetOffset());
if (sc.block == NULL || sc.block->GetStartAddress (addr) == false)
addr.Clear();
}
@@ -2500,135 +2399,17 @@ SymbolFileDWARF::ParseFunctions (const D
const size_t num_matches = die_offsets.size();
if (num_matches)
{
- DWARFCompileUnit* dwarf_cu = NULL;
for (size_t i=0; i<num_matches; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- ResolveFunction (die_offset, dwarf_cu, include_inlines, sc_list);
+ ResolveFunction (die_offset, include_inlines, sc_list);
}
}
}
bool
-SymbolFileDWARF::FunctionDieMatchesPartialName (const DWARFDebugInfoEntry* die,
- const DWARFCompileUnit *dwarf_cu,
- uint32_t name_type_mask,
- const char *partial_name,
- const char *base_name_start,
- const char *base_name_end)
-{
- // If we are looking only for methods, throw away all the ones that are or aren't in C++ classes:
- if (name_type_mask == eFunctionNameTypeMethod || name_type_mask == eFunctionNameTypeBase)
- {
- const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (dwarf_cu, die);
-
- if (decl_ctx_die == nullptr)
- return false;
-
- const dw_tag_t decl_ctx_tag = decl_ctx_die->Tag();
-
- bool is_cxx_method = (decl_ctx_tag == DW_TAG_structure_type) || (decl_ctx_tag == DW_TAG_class_type);
-
- if (name_type_mask == eFunctionNameTypeMethod)
- {
- if (is_cxx_method == false)
- return false;
- }
-
- if (name_type_mask == eFunctionNameTypeBase)
- {
- if (is_cxx_method == true)
- return false;
- }
- }
-
- // Now we need to check whether the name we got back for this type matches the extra specifications
- // that were in the name we're looking up:
- if (base_name_start != partial_name || *base_name_end != '\0')
- {
- // First see if the stuff to the left matches the full name. To do that let's see if
- // we can pull out the mips linkage name attribute:
-
- Mangled best_name;
- DWARFDebugInfoEntry::Attributes attributes;
- DWARFFormValue form_value;
- die->GetAttributes(this, dwarf_cu, DWARFFormValue::FixedFormSizes(), attributes);
- uint32_t idx = attributes.FindAttributeIndex(DW_AT_MIPS_linkage_name);
- if (idx == UINT32_MAX)
- idx = attributes.FindAttributeIndex(DW_AT_linkage_name);
- if (idx != UINT32_MAX)
- {
- if (attributes.ExtractFormValueAtIndex(this, idx, form_value))
- {
- const char *mangled_name = form_value.AsCString(this);
- if (mangled_name)
- best_name.SetValue (ConstString(mangled_name), true);
- }
- }
-
- if (!best_name)
- {
- idx = attributes.FindAttributeIndex(DW_AT_name);
- if (idx != UINT32_MAX && attributes.ExtractFormValueAtIndex(this, idx, form_value))
- {
- const char *name = form_value.AsCString(this);
- best_name.SetValue (ConstString(name), false);
- }
- }
-
- const LanguageType cu_language = const_cast<DWARFCompileUnit *>(dwarf_cu)->GetLanguageType();
- if (best_name.GetDemangledName(cu_language))
- {
- const char *demangled = best_name.GetDemangledName(cu_language).GetCString();
- if (demangled)
- {
- std::string name_no_parens(partial_name, base_name_end - partial_name);
- const char *partial_in_demangled = strstr (demangled, name_no_parens.c_str());
- if (partial_in_demangled == NULL)
- return false;
- else
- {
- // Sort out the case where our name is something like "Process::Destroy" and the match is
- // "SBProcess::Destroy" - that shouldn't be a match. We should really always match on
- // namespace boundaries...
-
- if (partial_name[0] == ':' && partial_name[1] == ':')
- {
- // The partial name was already on a namespace boundary so all matches are good.
- return true;
- }
- else if (partial_in_demangled == demangled)
- {
- // They both start the same, so this is an good match.
- return true;
- }
- else
- {
- if (partial_in_demangled - demangled == 1)
- {
- // Only one character difference, can't be a namespace boundary...
- return false;
- }
- else if (*(partial_in_demangled - 1) == ':' && *(partial_in_demangled - 2) == ':')
- {
- // We are on a namespace boundary, so this is also good.
- return true;
- }
- else
- return false;
- }
- }
- }
- }
- }
-
- return true;
-}
-
-bool
SymbolFileDWARF::DIEInDeclContext (const CompilerDeclContext *decl_ctx,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die)
+ const DWARFDIE &die)
{
// If we have no parent decl context to match this DIE matches, and if the parent
// decl context isn't valid, we aren't trying to look for any particular decl
@@ -2636,13 +2417,13 @@ SymbolFileDWARF::DIEInDeclContext (const
if (decl_ctx == nullptr || !decl_ctx->IsValid())
return true;
- if (cu && die)
+ if (die)
{
- TypeSystem *type_system = GetTypeSystemForLanguage(cu->GetLanguageType());
+ TypeSystem *type_system = die.GetTypeSystem();
if (type_system)
{
- CompilerDeclContext actual_decl_ctx = type_system->GetDeclContextContainingUIDFromDWARF (this, cu, die);
+ CompilerDeclContext actual_decl_ctx = type_system->GetDeclContextContainingUIDFromDWARF (die);
if (actual_decl_ctx)
return actual_decl_ctx == *decl_ctx;
}
@@ -2698,7 +2479,6 @@ SymbolFileDWARF::FindFunctions (const Co
if (info == NULL)
return 0;
- DWARFCompileUnit *dwarf_cu = NULL;
std::set<const DWARFDebugInfoEntry *> resolved_dies;
if (m_using_apple_tables)
{
@@ -2718,16 +2498,16 @@ SymbolFileDWARF::FindFunctions (const Co
for (uint32_t i = 0; i < num_matches; i++)
{
const dw_offset_t die_offset = die_offsets[i];
- const DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
+ DWARFDIE die = info->GetDIE (die_offset);
if (die)
{
- if (!DIEInDeclContext(parent_decl_ctx, dwarf_cu, die))
+ if (!DIEInDeclContext(parent_decl_ctx, die))
continue; // The containing decl contexts don't match
- if (resolved_dies.find(die) == resolved_dies.end())
+ if (resolved_dies.find(die.GetDIE()) == resolved_dies.end())
{
- if (ResolveFunction (dwarf_cu, die, include_inlines, sc_list))
- resolved_dies.insert(die);
+ if (ResolveFunction (die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
}
}
else
@@ -2750,16 +2530,16 @@ SymbolFileDWARF::FindFunctions (const Co
for (uint32_t i = 0; i < num_matches; i++)
{
const dw_offset_t die_offset = die_offsets[i];
- const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
+ DWARFDIE die = info->GetDIE (die_offset);
if (die)
{
- const char *die_name = die->GetName(this, dwarf_cu);
+ const char *die_name = die.GetName();
if (ObjCLanguageRuntime::IsPossibleObjCMethodName(die_name))
{
- if (resolved_dies.find(die) == resolved_dies.end())
+ if (resolved_dies.find(die.GetDIE()) == resolved_dies.end())
{
- if (ResolveFunction (dwarf_cu, die, include_inlines, sc_list))
- resolved_dies.insert(die);
+ if (ResolveFunction (die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
}
}
}
@@ -2784,16 +2564,15 @@ SymbolFileDWARF::FindFunctions (const Co
for (uint32_t i = 0; i < num_matches; i++)
{
const dw_offset_t die_offset = die_offsets[i];
- const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
+ DWARFDIE die = info->GetDIE (die_offset);
if (die)
{
- if (!DIEInDeclContext(parent_decl_ctx, dwarf_cu, die))
+ if (!DIEInDeclContext(parent_decl_ctx, die))
continue; // The containing decl contexts don't match
// If we get to here, the die is good, and we should add it:
- if (resolved_dies.find(die) == resolved_dies.end())
- if (ResolveFunction (dwarf_cu, die, include_inlines, sc_list))
+ if (resolved_dies.find(die.GetDIE()) == resolved_dies.end() && ResolveFunction (die, include_inlines, sc_list))
{
bool keep_die = true;
if ((name_type_mask & (eFunctionNameTypeBase|eFunctionNameTypeMethod)) != (eFunctionNameTypeBase|eFunctionNameTypeMethod))
@@ -2840,7 +2619,7 @@ SymbolFileDWARF::FindFunctions (const Co
}
}
if (keep_die)
- resolved_dies.insert(die);
+ resolved_dies.insert(die.GetDIE());
}
}
else
@@ -2903,24 +2682,22 @@ SymbolFileDWARF::FindFunctions (const Co
}
}
DIEArray die_offsets;
- DWARFCompileUnit *dwarf_cu = NULL;
-
if (name_type_mask & eFunctionNameTypeBase)
{
uint32_t num_base = m_function_basename_index.Find(name, die_offsets);
for (uint32_t i = 0; i < num_base; i++)
{
- const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu);
+ DWARFDIE die = info->GetDIE (die_offsets[i]);
if (die)
{
- if (!DIEInDeclContext(parent_decl_ctx, dwarf_cu, die))
+ if (!DIEInDeclContext(parent_decl_ctx, die))
continue; // The containing decl contexts don't match
// If we get to here, the die is good, and we should add it:
- if (resolved_dies.find(die) == resolved_dies.end())
+ if (resolved_dies.find(die.GetDIE()) == resolved_dies.end())
{
- if (ResolveFunction (dwarf_cu, die, include_inlines, sc_list))
- resolved_dies.insert(die);
+ if (ResolveFunction (die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
}
}
}
@@ -2936,14 +2713,14 @@ SymbolFileDWARF::FindFunctions (const Co
{
for (uint32_t i = 0; i < num_base; i++)
{
- const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu);
+ DWARFDIE die = info->GetDIE (die_offsets[i]);
if (die)
{
// If we get to here, the die is good, and we should add it:
- if (resolved_dies.find(die) == resolved_dies.end())
+ if (resolved_dies.find(die.GetDIE()) == resolved_dies.end())
{
- if (ResolveFunction (dwarf_cu, die, include_inlines, sc_list))
- resolved_dies.insert(die);
+ if (ResolveFunction (die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
}
}
}
@@ -3080,20 +2857,18 @@ SymbolFileDWARF::FindTypes (const Symbol
if (num_die_matches)
{
const uint32_t initial_types_size = types.GetSize();
- DWARFCompileUnit* dwarf_cu = NULL;
- const DWARFDebugInfoEntry* die = NULL;
DWARFDebugInfo* debug_info = DebugInfo();
for (size_t i=0; i<num_die_matches; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
+ DWARFDIE die = debug_info->GetDIE (die_offset);
if (die)
{
- if (!DIEInDeclContext(parent_decl_ctx, dwarf_cu, die))
+ if (!DIEInDeclContext(parent_decl_ctx, die))
continue; // The containing decl contexts don't match
- Type *matching_type = ResolveType (dwarf_cu, die);
+ Type *matching_type = ResolveType (die);
if (matching_type)
{
// We found a type pointer, now find the shared pointer form our type list
@@ -3183,8 +2958,6 @@ SymbolFileDWARF::FindNamespace (const Sy
m_namespace_index.Find (name, die_offsets);
}
- DWARFCompileUnit* dwarf_cu = NULL;
- const DWARFDebugInfoEntry* die = NULL;
const size_t num_matches = die_offsets.size();
if (num_matches)
{
@@ -3192,18 +2965,18 @@ SymbolFileDWARF::FindNamespace (const Sy
for (size_t i=0; i<num_matches; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
-
+ DWARFDIE die = debug_info->GetDIE (die_offset);
+
if (die)
{
- if (!DIEInDeclContext(parent_decl_ctx, dwarf_cu, die))
+ if (!DIEInDeclContext (parent_decl_ctx, die))
continue; // The containing decl contexts don't match
- TypeSystem *type_system = GetTypeSystemForLanguage(dwarf_cu->GetLanguageType());
+ TypeSystem *type_system = die.GetTypeSystem();
if (type_system)
{
- namespace_decl_ctx = type_system->GetDeclContextForUIDFromDWARF(this, dwarf_cu, die);
+ namespace_decl_ctx = type_system->GetDeclContextForUIDFromDWARF (die);
if (namespace_decl_ctx)
break;
}
@@ -3263,19 +3036,18 @@ SymbolFileDWARF::FindTypes(std::vector<d
TypeSP
-SymbolFileDWARF::GetTypeForDIE (DWARFCompileUnit *dwarf_cu, const DWARFDebugInfoEntry* die)
+SymbolFileDWARF::GetTypeForDIE (const DWARFDIE &die)
{
TypeSP type_sp;
- if (die != NULL)
+ if (die)
{
- assert(dwarf_cu != NULL);
- Type *type_ptr = m_die_to_type.lookup (die);
+ Type *type_ptr = m_die_to_type.lookup (die.GetDIE());
if (type_ptr == NULL)
{
- CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(dwarf_cu);
+ CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(die.GetCU());
assert (lldb_cu);
SymbolContext sc(lldb_cu);
- type_sp = ParseType(sc, dwarf_cu, die, NULL);
+ type_sp = ParseType(sc, die, NULL);
}
else if (type_ptr != DIE_IS_BEING_PARSED)
{
@@ -3288,21 +3060,21 @@ SymbolFileDWARF::GetTypeForDIE (DWARFCom
}
-const DWARFDebugInfoEntry *
-SymbolFileDWARF::GetDeclContextDIEContainingDIE (const DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
+DWARFDIE
+SymbolFileDWARF::GetDeclContextDIEContainingDIE (const DWARFDIE &orig_die)
{
- if (cu && die)
+ if (orig_die)
{
- const DWARFDebugInfoEntry * const decl_die = die;
+ DWARFDIE die = orig_die;
- while (die != NULL)
+ while (die)
{
// If this is the original DIE that we are searching for a declaration
// for, then don't look in the cache as we don't want our own decl
// context to be our decl context...
- if (decl_die != die)
+ if (orig_die != die)
{
- switch (die->Tag())
+ switch (die.Tag())
{
case DW_TAG_compile_unit:
case DW_TAG_namespace:
@@ -3315,31 +3087,27 @@ SymbolFileDWARF::GetDeclContextDIEContai
break;
}
}
-
- dw_offset_t die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_specification, DW_INVALID_OFFSET);
- if (die_offset != DW_INVALID_OFFSET)
+
+ DWARFDIE spec_die = die.GetReferencedDIE(DW_AT_specification);
+ if (spec_die)
{
- DWARFCompileUnit *spec_cu = const_cast<DWARFCompileUnit *>(cu);
- const DWARFDebugInfoEntry *spec_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &spec_cu);
- const DWARFDebugInfoEntry *spec_die_decl_ctx_die = GetDeclContextDIEContainingDIE (spec_cu, spec_die);
- if (spec_die_decl_ctx_die)
- return spec_die_decl_ctx_die;
+ DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE(spec_die);
+ if (decl_ctx_die)
+ return decl_ctx_die;
}
-
- die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_abstract_origin, DW_INVALID_OFFSET);
- if (die_offset != DW_INVALID_OFFSET)
+
+ DWARFDIE abs_die = die.GetReferencedDIE(DW_AT_abstract_origin);
+ if (abs_die)
{
- DWARFCompileUnit *abs_cu = const_cast<DWARFCompileUnit *>(cu);
- const DWARFDebugInfoEntry *abs_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &abs_cu);
- const DWARFDebugInfoEntry *abs_die_decl_ctx_die = GetDeclContextDIEContainingDIE (abs_cu, abs_die);
- if (abs_die_decl_ctx_die)
- return abs_die_decl_ctx_die;
+ DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE(abs_die);
+ if (decl_ctx_die)
+ return decl_ctx_die;
}
-
- die = die->GetParent();
+
+ die = die.GetParent();
}
}
- return NULL;
+ return DWARFDIE();
}
@@ -3397,7 +3165,7 @@ SymbolFileDWARF::Supports_DW_AT_APPLE_ob
// This function can be used when a DIE is found that is a forward declaration
// DIE and we want to try and find a type that has the complete definition.
TypeSP
-SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
+SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
const ConstString &type_name,
bool must_be_implementation)
{
@@ -3427,15 +3195,13 @@ SymbolFileDWARF::FindCompleteObjCDefinit
const size_t num_matches = die_offsets.size();
- DWARFCompileUnit* type_cu = NULL;
- const DWARFDebugInfoEntry* type_die = NULL;
if (num_matches)
{
DWARFDebugInfo* debug_info = DebugInfo();
for (size_t i=0; i<num_matches; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu);
+ DWARFDIE type_die = debug_info->GetDIE (die_offset);
if (type_die)
{
@@ -3444,7 +3210,7 @@ SymbolFileDWARF::FindCompleteObjCDefinit
// Don't try and resolve the DIE we are looking for with the DIE itself!
if (type_die != die)
{
- switch (type_die->Tag())
+ switch (type_die.Tag())
{
case DW_TAG_class_type:
case DW_TAG_structure_type:
@@ -3457,22 +3223,22 @@ SymbolFileDWARF::FindCompleteObjCDefinit
if (try_resolving_type)
{
- if (must_be_implementation && type_cu->Supports_DW_AT_APPLE_objc_complete_type())
- try_resolving_type = type_die->GetAttributeValueAsUnsigned (this, type_cu, DW_AT_APPLE_objc_complete_type, 0);
+ if (must_be_implementation && type_die.Supports_DW_AT_APPLE_objc_complete_type())
+ try_resolving_type = type_die.GetAttributeValueAsUnsigned (DW_AT_APPLE_objc_complete_type, 0);
if (try_resolving_type)
{
- Type *resolved_type = ResolveType (type_cu, type_die, false);
+ Type *resolved_type = ResolveType (type_die, false);
if (resolved_type && resolved_type != DIE_IS_BEING_PARSED)
{
DEBUG_PRINTF ("resolved 0x%8.8" PRIx64 " from %s to 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ")\n",
- MakeUserID(die->GetOffset()),
+ die.GetID(),
m_obj_file->GetFileSpec().GetFilename().AsCString("<Unknown>"),
- MakeUserID(type_die->GetOffset()),
- MakeUserID(type_cu->GetOffset()));
+ type_die.GetID(),
+ type_cu->GetID());
if (die)
- m_die_to_type[die] = resolved_type;
+ m_die_to_type[die.GetDIE()] = resolved_type;
type_sp = resolved_type->shared_from_this();
break;
}
@@ -3507,19 +3273,12 @@ SymbolFileDWARF::FindCompleteObjCDefinit
// when they don't.
//----------------------------------------------------------------------
bool
-SymbolFileDWARF::DIEDeclContextsMatch (DWARFCompileUnit* cu1, const DWARFDebugInfoEntry *die1,
- DWARFCompileUnit* cu2, const DWARFDebugInfoEntry *die2)
+SymbolFileDWARF::DIEDeclContextsMatch (const DWARFDIE &die1,
+ const DWARFDIE &die2)
{
if (die1 == die2)
return true;
-#if defined (LLDB_CONFIGURATION_DEBUG)
- // You can't and shouldn't call this function with a compile unit from
- // two different SymbolFileDWARF instances.
- assert (DebugInfo()->ContainsCompileUnit (cu1));
- assert (DebugInfo()->ContainsCompileUnit (cu2));
-#endif
-
DWARFDIECollection decl_ctx_1;
DWARFDIECollection decl_ctx_2;
//The declaration DIE stack is a stack of the declaration context
@@ -3537,8 +3296,8 @@ SymbolFileDWARF::DIEDeclContextsMatch (D
// all the way back to the compiler unit.
// First lets grab the decl contexts for both DIEs
- die1->GetDeclContextDIEs (this, cu1, decl_ctx_1);
- die2->GetDeclContextDIEs (this, cu2, decl_ctx_2);
+ die1.GetDeclContextDIEs (decl_ctx_1);
+ die2.GetDeclContextDIEs (decl_ctx_2);
// Make sure the context arrays have the same size, otherwise
// we are done
const size_t count1 = decl_ctx_1.Size();
@@ -3548,14 +3307,14 @@ SymbolFileDWARF::DIEDeclContextsMatch (D
// Make sure the DW_TAG values match all the way back up the
// compile unit. If they don't, then we are done.
- const DWARFDebugInfoEntry *decl_ctx_die1;
- const DWARFDebugInfoEntry *decl_ctx_die2;
+ DWARFDIE decl_ctx_die1;
+ DWARFDIE decl_ctx_die2;
size_t i;
for (i=0; i<count1; i++)
{
- decl_ctx_die1 = decl_ctx_1.GetDIEPtrAtIndex (i);
- decl_ctx_die2 = decl_ctx_2.GetDIEPtrAtIndex (i);
- if (decl_ctx_die1->Tag() != decl_ctx_die2->Tag())
+ decl_ctx_die1 = decl_ctx_1.GetDIEAtIndex (i);
+ decl_ctx_die2 = decl_ctx_2.GetDIEAtIndex (i);
+ if (decl_ctx_die1.Tag() != decl_ctx_die2.Tag())
return false;
}
#if defined LLDB_CONFIGURATION_DEBUG
@@ -3563,17 +3322,17 @@ SymbolFileDWARF::DIEDeclContextsMatch (D
// Make sure the top item in the decl context die array is always
// DW_TAG_compile_unit. If it isn't then something went wrong in
// the DWARFDebugInfoEntry::GetDeclContextDIEs() function...
- assert (decl_ctx_1.GetDIEPtrAtIndex (count1 - 1)->Tag() == DW_TAG_compile_unit);
+ assert (decl_ctx_1.GetDIEAtIndex (count1 - 1).Tag() == DW_TAG_compile_unit);
#endif
// Always skip the compile unit when comparing by only iterating up to
// "count - 1". Here we compare the names as we go.
for (i=0; i<count1 - 1; i++)
{
- decl_ctx_die1 = decl_ctx_1.GetDIEPtrAtIndex (i);
- decl_ctx_die2 = decl_ctx_2.GetDIEPtrAtIndex (i);
- const char *name1 = decl_ctx_die1->GetName(this, cu1);
- const char *name2 = decl_ctx_die2->GetName(this, cu2);
+ decl_ctx_die1 = decl_ctx_1.GetDIEAtIndex (i);
+ decl_ctx_die2 = decl_ctx_2.GetDIEAtIndex (i);
+ const char *name1 = decl_ctx_die1.GetName();
+ const char *name2 = decl_ctx_die2.GetName();
// If the string was from a DW_FORM_strp, then the pointer will often
// be the same!
if (name1 == name2)
@@ -3660,22 +3419,20 @@ SymbolFileDWARF::FindDefinitionTypeForDW
const size_t num_matches = die_offsets.size();
- DWARFCompileUnit* type_cu = NULL;
- const DWARFDebugInfoEntry* type_die = NULL;
if (num_matches)
{
DWARFDebugInfo* debug_info = DebugInfo();
for (size_t i=0; i<num_matches; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu);
+ DWARFDIE type_die = debug_info->GetDIE (die_offset);
if (type_die)
{
bool try_resolving_type = false;
// Don't try and resolve the DIE we are looking for with the DIE itself!
- const dw_tag_t type_tag = type_die->Tag();
+ const dw_tag_t type_tag = type_die.Tag();
// Make sure the tags match
if (type_tag == tag)
{
@@ -3708,7 +3465,7 @@ SymbolFileDWARF::FindDefinitionTypeForDW
if (try_resolving_type)
{
DWARFDeclContext type_dwarf_decl_ctx;
- type_die->GetDWARFDeclContext (this, type_cu, type_dwarf_decl_ctx);
+ type_die.GetDWARFDeclContext (type_dwarf_decl_ctx);
if (log)
{
@@ -3716,14 +3473,14 @@ SymbolFileDWARF::FindDefinitionTypeForDW
"SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s') trying die=0x%8.8x (%s)",
DW_TAG_value_to_name(dwarf_decl_ctx[0].tag),
dwarf_decl_ctx.GetQualifiedName(),
- type_die->GetOffset(),
+ type_die.GetOffset(),
type_dwarf_decl_ctx.GetQualifiedName());
}
// Make sure the decl contexts match all the way up
if (dwarf_decl_ctx == type_dwarf_decl_ctx)
{
- Type *resolved_type = ResolveType (type_cu, type_die, false);
+ Type *resolved_type = ResolveType (type_die, false);
if (resolved_type && resolved_type != DIE_IS_BEING_PARSED)
{
type_sp = resolved_type->shared_from_this();
@@ -3736,12 +3493,12 @@ SymbolFileDWARF::FindDefinitionTypeForDW
if (log)
{
std::string qualified_name;
- type_die->GetQualifiedName(this, type_cu, qualified_name);
+ type_die.GetQualifiedName(qualified_name);
GetObjectFile()->GetModule()->LogMessage (log,
"SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s') ignoring die=0x%8.8x (%s)",
DW_TAG_value_to_name(dwarf_decl_ctx[0].tag),
dwarf_decl_ctx.GetQualifiedName(),
- type_die->GetOffset(),
+ type_die.GetOffset(),
qualified_name.c_str());
}
}
@@ -3763,21 +3520,24 @@ SymbolFileDWARF::FindDefinitionTypeForDW
}
TypeSP
-SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool *type_is_new_ptr)
+SymbolFileDWARF::ParseType (const SymbolContext& sc, const DWARFDIE &die, bool *type_is_new_ptr)
{
TypeSP type_sp;
-
- TypeSystem *type_system = GetTypeSystemForLanguage(dwarf_cu->GetLanguageType());
- if (type_system)
+ if (die)
{
- Log *log = LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO);
- type_sp = type_system->ParseTypeFromDWARF (sc, this, dwarf_cu, die, log, type_is_new_ptr);
- if (type_sp)
- {
- TypeList* type_list = GetTypeList();
- if (type_list)
- type_list->Insert(type_sp);
+ TypeSystem *type_system = GetTypeSystemForLanguage(die.GetCU()->GetLanguageType());
+
+ if (type_system)
+ {
+ Log *log = LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO);
+ type_sp = type_system->ParseTypeFromDWARF (sc, die, log, type_is_new_ptr);
+ if (type_sp)
+ {
+ TypeList* type_list = GetTypeList();
+ if (type_list)
+ type_list->Insert(type_sp);
+ }
}
}
@@ -3788,38 +3548,38 @@ size_t
SymbolFileDWARF::ParseTypes
(
const SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &orig_die,
bool parse_siblings,
bool parse_children
)
{
size_t types_added = 0;
- while (die != NULL)
+ DWARFDIE die = orig_die;
+ while (die)
{
bool type_is_new = false;
- if (ParseType(sc, dwarf_cu, die, &type_is_new).get())
+ if (ParseType(sc, die, &type_is_new).get())
{
if (type_is_new)
++types_added;
}
- if (parse_children && die->HasChildren())
+ if (parse_children && die.HasChildren())
{
- if (die->Tag() == DW_TAG_subprogram)
+ if (die.Tag() == DW_TAG_subprogram)
{
SymbolContext child_sc(sc);
- child_sc.function = sc.comp_unit->FindFunctionByUID(MakeUserID(die->GetOffset())).get();
- types_added += ParseTypes(child_sc, dwarf_cu, die->GetFirstChild(), true, true);
+ child_sc.function = sc.comp_unit->FindFunctionByUID(die.GetID()).get();
+ types_added += ParseTypes(child_sc, die.GetFirstChild(), true, true);
}
else
- types_added += ParseTypes(sc, dwarf_cu, die->GetFirstChild(), true, true);
+ types_added += ParseTypes(sc, die.GetFirstChild(), true, true);
}
if (parse_siblings)
- die = die->GetSibling();
+ die = die.GetSibling();
else
- die = NULL;
+ die.Clear();
}
return types_added;
}
@@ -3833,11 +3593,11 @@ SymbolFileDWARF::ParseFunctionBlocks (co
DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
if (dwarf_cu)
{
- dw_offset_t function_die_offset = sc.function->GetID();
- const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(function_die_offset);
+ const dw_offset_t function_die_offset = sc.function->GetID();
+ DWARFDIE function_die = dwarf_cu->GetDIE (function_die_offset);
if (function_die)
{
- ParseFunctionBlocks(sc, &sc.function->GetBlock (false), dwarf_cu, function_die, LLDB_INVALID_ADDRESS, 0);
+ ParseFunctionBlocks(sc, &sc.function->GetBlock (false), function_die, LLDB_INVALID_ADDRESS, 0);
}
}
@@ -3857,18 +3617,18 @@ SymbolFileDWARF::ParseTypes (const Symbo
if (sc.function)
{
dw_offset_t function_die_offset = sc.function->GetID();
- const DWARFDebugInfoEntry *func_die = dwarf_cu->GetDIEPtr(function_die_offset);
- if (func_die && func_die->HasChildren())
+ DWARFDIE func_die = dwarf_cu->GetDIE(function_die_offset);
+ if (func_die && func_die.HasChildren())
{
- types_added = ParseTypes(sc, dwarf_cu, func_die->GetFirstChild(), true, true);
+ types_added = ParseTypes(sc, func_die.GetFirstChild(), true, true);
}
}
else
{
- const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->DIE();
- if (dwarf_cu_die && dwarf_cu_die->HasChildren())
+ DWARFDIE dwarf_cu_die = dwarf_cu->DIE();
+ if (dwarf_cu_die && dwarf_cu_die.HasChildren())
{
- types_added = ParseTypes(sc, dwarf_cu, dwarf_cu_die->GetFirstChild(), true, true);
+ types_added = ParseTypes(sc, dwarf_cu_die.GetFirstChild(), true, true);
}
}
}
@@ -3887,17 +3647,12 @@ SymbolFileDWARF::ParseVariablesForContex
if (sc.function)
{
- DWARFCompileUnit* dwarf_cu = info->GetCompileUnitContainingDIE(sc.function->GetID()).get();
-
- if (dwarf_cu == NULL)
- return 0;
-
- const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(sc.function->GetID());
+ DWARFDIE function_die = info->GetDIE(sc.function->GetID());
- dw_addr_t func_lo_pc = function_die->GetAttributeValueAsUnsigned (this, dwarf_cu, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
+ const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsUnsigned (DW_AT_low_pc, LLDB_INVALID_ADDRESS);
if (func_lo_pc != LLDB_INVALID_ADDRESS)
{
- const size_t num_variables = ParseVariables(sc, dwarf_cu, func_lo_pc, function_die->GetFirstChild(), true, true);
+ const size_t num_variables = ParseVariables(sc, function_die.GetFirstChild(), func_lo_pc, true, true);
// Let all blocks know they have parse all their variables
sc.function->GetBlock (false).SetDidParseVariables (true, true);
@@ -3906,7 +3661,7 @@ SymbolFileDWARF::ParseVariablesForContex
}
else if (sc.comp_unit)
{
- DWARFCompileUnit* dwarf_cu = info->GetCompileUnit(sc.comp_unit->GetID()).get();
+ DWARFCompileUnit* dwarf_cu = info->GetCompileUnit(sc.comp_unit->GetID());
if (dwarf_cu == NULL)
return 0;
@@ -3919,8 +3674,6 @@ SymbolFileDWARF::ParseVariablesForContex
variables.reset(new VariableList());
sc.comp_unit->SetVariableList(variables);
- DWARFCompileUnit* match_dwarf_cu = NULL;
- const DWARFDebugInfoEntry* die = NULL;
DIEArray die_offsets;
if (m_using_apple_tables)
{
@@ -3954,10 +3707,10 @@ SymbolFileDWARF::ParseVariablesForContex
for (size_t i=0; i<num_matches; ++i)
{
const dw_offset_t die_offset = die_offsets[i];
- die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &match_dwarf_cu);
+ DWARFDIE die = debug_info->GetDIE (die_offset);
if (die)
{
- VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, LLDB_INVALID_ADDRESS));
+ VariableSP var_sp (ParseVariableDIE(sc, die, LLDB_INVALID_ADDRESS));
if (var_sp)
{
variables->AddVariableIfUnique (var_sp);
@@ -3985,27 +3738,27 @@ VariableSP
SymbolFileDWARF::ParseVariableDIE
(
const SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
const lldb::addr_t func_low_pc
)
{
- VariableSP var_sp (m_die_to_variable_sp[die]);
+ VariableSP var_sp;
+ if (!die)
+ return var_sp;
+
+ var_sp = m_die_to_variable_sp[die.GetDIE()];
if (var_sp)
return var_sp; // Already been parsed!
- const dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
ModuleSP module = GetObjectFile()->GetModule();
if ((tag == DW_TAG_variable) ||
(tag == DW_TAG_constant) ||
(tag == DW_TAG_formal_parameter && sc.function))
{
- DWARFDebugInfoEntry::Attributes attributes;
- const size_t num_attributes = die->GetAttributes(this,
- dwarf_cu,
- DWARFFormValue::FixedFormSizes(),
- attributes);
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
if (num_attributes > 0)
{
const char *name = NULL;
@@ -4013,7 +3766,7 @@ SymbolFileDWARF::ParseVariableDIE
Declaration decl;
uint32_t i;
lldb::user_id_t type_uid = LLDB_INVALID_UID;
- DWARFExpression location(dwarf_cu);
+ DWARFExpression location(die.GetCU());
bool is_external = false;
bool is_artificial = false;
bool location_is_const_value_data = false;
@@ -4026,16 +3779,16 @@ SymbolFileDWARF::ParseVariableDIE
dw_attr_t attr = attributes.AttributeAtIndex(i);
DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(this, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
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_name: name = form_value.AsCString(this); break;
+ case DW_AT_name: name = form_value.AsCString(); break;
case DW_AT_linkage_name:
- case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(this); break;
+ case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(); break;
case DW_AT_type: type_uid = form_value.Reference(); break;
case DW_AT_external: is_external = form_value.Boolean(); break;
case DW_AT_const_value:
@@ -4092,7 +3845,7 @@ SymbolFileDWARF::ParseVariableDIE
}
else
{
- const char *str = form_value.AsCString(this);
+ const char *str = form_value.AsCString();
uint32_t string_offset = str - (const char *)debug_info_data.GetDataStart();
uint32_t string_length = strlen(str) + 1;
location.CopyOpcodeData(module, debug_info_data, string_offset, string_length);
@@ -4145,13 +3898,13 @@ SymbolFileDWARF::ParseVariableDIE
}
}
- const DWARFDebugInfoEntry *parent_context_die = GetDeclContextDIEContainingDIE(dwarf_cu, die);
- bool is_static_member = die->GetParent()->Tag() == DW_TAG_compile_unit && (parent_context_die->Tag() == DW_TAG_class_type || parent_context_die->Tag() == DW_TAG_structure_type);
+ const DWARFDIE parent_context_die = GetDeclContextDIEContainingDIE(die);
+ const dw_tag_t parent_tag = die.GetParent().Tag();
+ bool is_static_member = parent_tag == DW_TAG_compile_unit && (parent_context_die.Tag() == DW_TAG_class_type || parent_context_die.Tag() == DW_TAG_structure_type);
ValueType scope = eValueTypeInvalid;
- const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die);
- dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0;
+ const DWARFDIE sc_parent_die = GetParentSymbolContextDIE(die);
SymbolContextScope * symbol_context_scope = NULL;
if (!mangled)
@@ -4162,12 +3915,12 @@ SymbolFileDWARF::ParseVariableDIE
// B which in turn is contained in a namespace A, the command "frame var j" returns
// "(int) A::B::j = 4". If the compiler does not emit a linkage name, we should be able
// to generate a fully qualified name from the declaration context.
- if (die->GetParent()->Tag() == DW_TAG_compile_unit &&
- LanguageRuntime::LanguageIsCPlusPlus(dwarf_cu->GetLanguageType()))
+ if (parent_tag == DW_TAG_compile_unit &&
+ LanguageRuntime::LanguageIsCPlusPlus(die.GetLanguage()))
{
DWARFDeclContext decl_ctx;
- die->GetDWARFDeclContext(this, dwarf_cu, decl_ctx);
+ die.GetDWARFDeclContext(decl_ctx);
mangled = decl_ctx.GetQualifiedNameAsConstString().GetCString();
}
}
@@ -4196,7 +3949,7 @@ SymbolFileDWARF::ParseVariableDIE
{
StreamString strm;
location.DumpLocationForAddress (&strm, eDescriptionLevelFull, 0, 0, NULL);
- GetObjectFile()->GetModule()->ReportError ("0x%8.8x: %s has an invalid location: %s", die->GetOffset(), DW_TAG_value_to_name(die->Tag()), strm.GetString().c_str());
+ GetObjectFile()->GetModule()->ReportError ("0x%8.8x: %s has an invalid location: %s", die.GetOffset(), die.GetTagAsCString(), strm.GetString().c_str());
}
}
@@ -4297,7 +4050,7 @@ SymbolFileDWARF::ParseVariableDIE
case DW_TAG_lexical_block:
if (sc.function)
{
- symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset()));
+ symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
if (symbol_context_scope == NULL)
symbol_context_scope = sc.function;
}
@@ -4314,9 +4067,9 @@ SymbolFileDWARF::ParseVariableDIE
SymbolFileTypeSP type_sp(new SymbolFileType(*this, type_uid));
if (const_value.Form() && type_sp && type_sp->GetType())
- location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), dwarf_cu->GetAddressByteSize());
+ location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), die.GetCU()->GetAddressByteSize());
- var_sp.reset (new Variable (MakeUserID(die->GetOffset()),
+ var_sp.reset (new Variable (die.GetID(),
name,
mangled,
type_sp,
@@ -4342,57 +4095,40 @@ 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] = var_sp;
+ m_die_to_variable_sp[die.GetDIE()] = var_sp;
}
return var_sp;
}
-const DWARFDebugInfoEntry *
+DWARFDIE
SymbolFileDWARF::FindBlockContainingSpecification (dw_offset_t func_die_offset,
- dw_offset_t spec_block_die_offset,
- DWARFCompileUnit **result_die_cu_handle)
+ 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"
- DWARFDebugInfo* info = DebugInfo();
-
- const DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint(func_die_offset, result_die_cu_handle);
- if (die)
- {
- assert (*result_die_cu_handle);
- return FindBlockContainingSpecification (*result_die_cu_handle, die, spec_block_die_offset, result_die_cu_handle);
- }
- return NULL;
+ return FindBlockContainingSpecification (DebugInfo()->GetDIE (func_die_offset), spec_block_die_offset);
}
-const DWARFDebugInfoEntry *
-SymbolFileDWARF::FindBlockContainingSpecification(DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
- dw_offset_t spec_block_die_offset,
- DWARFCompileUnit **result_die_cu_handle)
+DWARFDIE
+SymbolFileDWARF::FindBlockContainingSpecification(const DWARFDIE &die,
+ dw_offset_t spec_block_die_offset)
{
if (die)
{
- switch (die->Tag())
+ switch (die.Tag())
{
case DW_TAG_subprogram:
case DW_TAG_inlined_subroutine:
case DW_TAG_lexical_block:
{
- if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_specification, DW_INVALID_OFFSET) == spec_block_die_offset)
- {
- *result_die_cu_handle = dwarf_cu;
+ if (die.GetAttributeValueAsReference (DW_AT_specification, DW_INVALID_OFFSET) == spec_block_die_offset)
return die;
- }
- if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_abstract_origin, DW_INVALID_OFFSET) == spec_block_die_offset)
- {
- *result_die_cu_handle = dwarf_cu;
+ if (die.GetAttributeValueAsReference (DW_AT_abstract_origin, DW_INVALID_OFFSET) == spec_block_die_offset)
return die;
- }
}
break;
}
@@ -4400,49 +4136,42 @@ SymbolFileDWARF::FindBlockContainingSpec
// 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"
- for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild(); child_die != NULL; child_die = child_die->GetSibling())
+ for (DWARFDIE child_die = die.GetFirstChild(); child_die; child_die = child_die.GetSibling())
{
- const DWARFDebugInfoEntry *result_die = FindBlockContainingSpecification (dwarf_cu,
- child_die,
- spec_block_die_offset,
- result_die_cu_handle);
+ DWARFDIE result_die = FindBlockContainingSpecification (child_die, spec_block_die_offset);
if (result_die)
return result_die;
}
}
- *result_die_cu_handle = NULL;
- return NULL;
+ return DWARFDIE();
}
size_t
-SymbolFileDWARF::ParseVariables
-(
- const SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const lldb::addr_t func_low_pc,
- const DWARFDebugInfoEntry *orig_die,
- bool parse_siblings,
- bool parse_children,
- VariableList* cc_variable_list
-)
+SymbolFileDWARF::ParseVariables (const SymbolContext& sc,
+ const DWARFDIE &orig_die,
+ const lldb::addr_t func_low_pc,
+ bool parse_siblings,
+ bool parse_children,
+ VariableList* cc_variable_list)
{
- if (orig_die == NULL)
+ if (!orig_die)
return 0;
VariableListSP variable_list_sp;
size_t vars_added = 0;
- const DWARFDebugInfoEntry *die = orig_die;
- while (die != NULL)
+ DWARFDIE die = orig_die;
+ while (die)
{
- dw_tag_t tag = die->Tag();
+ dw_tag_t tag = die.Tag();
// Check to see if we have already parsed this variable or constant?
- if (m_die_to_variable_sp[die])
+ VariableSP var_sp = m_die_to_variable_sp[die.GetDIE()];
+ if (var_sp)
{
if (cc_variable_list)
- cc_variable_list->AddVariableIfUnique (m_die_to_variable_sp[die]);
+ cc_variable_list->AddVariableIfUnique (var_sp);
}
else
{
@@ -4453,8 +4182,8 @@ SymbolFileDWARF::ParseVariables
{
if (variable_list_sp.get() == NULL)
{
- const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(orig_die);
- dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0;
+ DWARFDIE sc_parent_die = GetParentSymbolContextDIE(orig_die);
+ dw_tag_t parent_tag = sc_parent_die.Tag();
switch (parent_tag)
{
case DW_TAG_compile_unit:
@@ -4470,10 +4199,10 @@ SymbolFileDWARF::ParseVariables
else
{
GetObjectFile()->GetModule()->ReportError ("parent 0x%8.8" PRIx64 " %s with no valid compile unit in symbol context for 0x%8.8" PRIx64 " %s.\n",
- MakeUserID(sc_parent_die->GetOffset()),
- DW_TAG_value_to_name (parent_tag),
- MakeUserID(orig_die->GetOffset()),
- DW_TAG_value_to_name (orig_die->Tag()));
+ sc_parent_die.GetID(),
+ sc_parent_die.GetTagAsCString(),
+ orig_die.GetID(),
+ orig_die.GetTagAsCString());
}
break;
@@ -4484,19 +4213,17 @@ SymbolFileDWARF::ParseVariables
{
// Check to see if we already have parsed the variables for the given scope
- Block *block = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset()));
+ Block *block = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
if (block == NULL)
{
// This must be a specification or abstract origin with
// a concrete block counterpart in the current function. We need
// to find the concrete block so we can correctly add the
// variable to it
- DWARFCompileUnit *concrete_block_die_cu = dwarf_cu;
- const DWARFDebugInfoEntry *concrete_block_die = FindBlockContainingSpecification (sc.function->GetID(),
- sc_parent_die->GetOffset(),
- &concrete_block_die_cu);
+ const DWARFDIE concrete_block_die = FindBlockContainingSpecification (sc.function->GetID(),
+ sc_parent_die.GetOffset());
if (concrete_block_die)
- block = sc.function->GetBlock(true).FindBlockByID(MakeUserID(concrete_block_die->GetOffset()));
+ block = sc.function->GetBlock(true).FindBlockByID(concrete_block_die.GetID());
}
if (block != NULL)
@@ -4514,15 +4241,15 @@ SymbolFileDWARF::ParseVariables
default:
GetObjectFile()->GetModule()->ReportError ("didn't find appropriate parent DIE for variable list for 0x%8.8" PRIx64 " %s.\n",
- MakeUserID(orig_die->GetOffset()),
- DW_TAG_value_to_name (orig_die->Tag()));
+ orig_die.GetID(),
+ orig_die.GetTagAsCString());
break;
}
}
if (variable_list_sp)
{
- VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, func_low_pc));
+ VariableSP var_sp (ParseVariableDIE(sc, die, func_low_pc));
if (var_sp)
{
variable_list_sp->AddVariableIfUnique (var_sp);
@@ -4536,15 +4263,15 @@ SymbolFileDWARF::ParseVariables
bool skip_children = (sc.function == NULL && tag == DW_TAG_subprogram);
- if (!skip_children && parse_children && die->HasChildren())
+ if (!skip_children && parse_children && die.HasChildren())
{
- vars_added += ParseVariables(sc, dwarf_cu, func_low_pc, die->GetFirstChild(), true, true, cc_variable_list);
+ vars_added += ParseVariables(sc, die.GetFirstChild(), func_low_pc, true, true, cc_variable_list);
}
if (parse_siblings)
- die = die->GetSibling();
+ die = die.GetSibling();
else
- die = NULL;
+ die.Clear();
}
return vars_added;
}
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=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Wed Aug 26 17:57:51 2015
@@ -148,16 +148,9 @@ public:
CompleteType (lldb_private::CompilerType& clang_type) override;
lldb_private::Type *
- ResolveType (DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry* type_die,
+ ResolveType (const DWARFDIE &die,
bool assert_not_being_parsed = true);
- lldb_private::Type *
- GetCachedTypeForDIE (const DWARFDebugInfoEntry* type_die) const;
-
- void
- ClearDIEBeingParsed (const DWARFDebugInfoEntry* type_die);
-
lldb_private::CompilerDeclContext
GetDeclContextForUID (lldb::user_id_t uid) override;
@@ -281,9 +274,8 @@ public:
static bool
SupportedVersion(uint16_t version);
- const DWARFDebugInfoEntry *
- GetDeclContextDIEContainingDIE (const DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die);
+ DWARFDIE
+ GetDeclContextDIEContainingDIE (const DWARFDIE &die);
lldb_private::Flags&
GetFlags ()
@@ -317,8 +309,8 @@ public:
bool
Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu);
- static const DWARFDebugInfoEntry *
- GetParentSymbolContextDIE(const DWARFDebugInfoEntry *child_die);
+ static DWARFDIE
+ GetParentSymbolContextDIE(const DWARFDIE &die);
protected:
@@ -348,8 +340,7 @@ protected:
bool
DIEInDeclContext (const lldb_private::CompilerDeclContext *parent_decl_ctx,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die);
+ const DWARFDIE &die);
DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
@@ -364,81 +355,62 @@ protected:
GetNextUnparsedDWARFCompileUnit (DWARFCompileUnit* prev_cu);
bool
- GetFunction (DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry* func_die,
+ GetFunction (const DWARFDIE &die,
lldb_private::SymbolContext& sc);
lldb_private::Function *
ParseCompileUnitFunction (const lldb_private::SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die);
+ const DWARFDIE &die);
size_t
ParseFunctionBlocks (const lldb_private::SymbolContext& sc,
lldb_private::Block *parent_block,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
lldb::addr_t subprogram_low_pc,
uint32_t depth);
size_t
ParseTypes (const lldb_private::SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
bool parse_siblings,
bool parse_children);
lldb::TypeSP
ParseType (const lldb_private::SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
bool *type_is_new);
lldb_private::Type *
- ResolveTypeUID (DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry* die,
+ ResolveTypeUID (const DWARFDIE &die,
bool assert_not_being_parsed);
lldb::VariableSP
ParseVariableDIE(const lldb_private::SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
const lldb::addr_t func_low_pc);
size_t
- ParseVariables(const lldb_private::SymbolContext& sc,
- DWARFCompileUnit* dwarf_cu,
- const lldb::addr_t func_low_pc,
- const DWARFDebugInfoEntry *die,
- bool parse_siblings,
- bool parse_children,
- lldb_private::VariableList* cc_variable_list = NULL);
+ ParseVariables (const lldb_private::SymbolContext& sc,
+ const DWARFDIE &orig_die,
+ const lldb::addr_t func_low_pc,
+ bool parse_siblings,
+ bool parse_children,
+ lldb_private::VariableList* cc_variable_list = NULL);
bool
- ClassOrStructIsVirtual (DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die);
+ ClassOrStructIsVirtual (const DWARFDIE &die);
// Given a die_offset, figure out the symbol context representing that die.
bool
ResolveFunction (dw_offset_t offset,
- DWARFCompileUnit *&dwarf_cu,
bool include_inlines,
lldb_private::SymbolContextList& sc_list);
bool
- ResolveFunction (DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die,
+ ResolveFunction (const DWARFDIE &die,
bool include_inlines,
lldb_private::SymbolContextList& sc_list);
- bool
- FunctionDieMatchesPartialName (const DWARFDebugInfoEntry* die,
- const DWARFCompileUnit *dwarf_cu,
- uint32_t name_type_mask,
- const char *partial_name,
- const char *base_name_start,
- const char *base_name_end);
-
void
FindFunctions(const lldb_private::ConstString &name,
const NameToDIE &name_to_die,
@@ -461,7 +433,7 @@ protected:
FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx);
lldb::TypeSP
- FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
+ FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
const lldb_private::ConstString &type_name,
bool must_be_implementation);
@@ -478,8 +450,7 @@ protected:
lldb_private::SymbolContextList& sc_list);
lldb::TypeSP
- GetTypeForDIE (DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry* die);
+ GetTypeForDIE (const DWARFDIE &die);
uint32_t
FindTypes (std::vector<dw_offset_t> die_offsets,
@@ -501,16 +472,13 @@ protected:
SymbolFileDWARFDebugMap *
GetDebugMapSymfile ();
- const DWARFDebugInfoEntry *
+ DWARFDIE
FindBlockContainingSpecification (dw_offset_t func_die_offset,
- dw_offset_t spec_block_die_offset,
- DWARFCompileUnit **dwarf_cu_handle);
+ dw_offset_t spec_block_die_offset);
- const DWARFDebugInfoEntry *
- FindBlockContainingSpecification (DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
- dw_offset_t spec_block_die_offset,
- DWARFCompileUnit **dwarf_cu_handle);
+ DWARFDIE
+ FindBlockContainingSpecification (const DWARFDIE &die,
+ dw_offset_t spec_block_die_offset);
UniqueDWARFASTTypeMap &
GetUniqueDWARFASTTypeMap ();
@@ -525,12 +493,11 @@ protected:
}
bool
- DIEDeclContextsMatch (DWARFCompileUnit* cu1, const DWARFDebugInfoEntry *die1,
- DWARFCompileUnit* cu2, const DWARFDebugInfoEntry *die2);
+ DIEDeclContextsMatch (const DWARFDIE &die1,
+ const DWARFDIE &die2);
bool
- ClassContainsSelector (DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry *class_die,
+ ClassContainsSelector (const DWARFDIE &class_die,
const lldb_private::ConstString &selector);
bool
@@ -546,8 +513,7 @@ protected:
typedef std::map<uint64_t, ClangModuleInfo> ExternalTypeModuleMap;
void
- GetTypes (DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ GetTypes (const DWARFDIE &die,
dw_offset_t min_die_offset,
dw_offset_t max_die_offset,
uint32_t type_mask,
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp Wed Aug 26 17:57:51 2015
@@ -1225,7 +1225,7 @@ SymbolFileDWARFDebugMap::Supports_DW_AT_
}
TypeSP
-SymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
+SymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
const ConstString &type_name,
bool must_be_implementation)
{
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h Wed Aug 26 17:57:51 2015
@@ -266,7 +266,7 @@ protected:
Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso);
lldb::TypeSP
- FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
+ FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
const lldb_private::ConstString &type_name,
bool must_be_implementation);
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp Wed Aug 26 17:57:51 2015
@@ -18,55 +18,50 @@
#include "DWARFDebugInfoEntry.h"
bool
-UniqueDWARFASTTypeList::Find
-(
- SymbolFileDWARF *symfile,
- const DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die,
- const lldb_private::Declaration &decl,
- const int32_t byte_size,
- UniqueDWARFASTType &entry
-) const
+UniqueDWARFASTTypeList::Find (const DWARFDIE &die,
+ const lldb_private::Declaration &decl,
+ const int32_t byte_size,
+ UniqueDWARFASTType &entry) const
{
- collection::const_iterator pos, end = m_collection.end();
- for (pos = m_collection.begin(); pos != end; ++pos)
+ for (const UniqueDWARFASTType &udt : m_collection)
{
// Make sure the tags match
- if (pos->m_die->Tag() == die->Tag())
+ if (udt.m_die.Tag() == die.Tag())
{
// Validate byte sizes of both types only if both are valid.
- if (pos->m_byte_size < 0 || byte_size < 0 || pos->m_byte_size == byte_size)
+ if (udt.m_byte_size < 0 || byte_size < 0 || udt.m_byte_size == byte_size)
{
// Make sure the file and line match
- if (pos->m_declaration == decl)
+ if (udt.m_declaration == decl)
{
// The type has the same name, and was defined on the same
// file and line. Now verify all of the parent DIEs match.
- const DWARFDebugInfoEntry *parent_arg_die = die->GetParent();
- const DWARFDebugInfoEntry *parend_pos_die = pos->m_die->GetParent();
+ DWARFDIE parent_arg_die = die.GetParent();
+ DWARFDIE parent_pos_die = udt.m_die.GetParent();
bool match = true;
bool done = false;
- while (!done && match && parent_arg_die && parend_pos_die)
+ while (!done && match && parent_arg_die && parent_pos_die)
{
- if (parent_arg_die->Tag() == parend_pos_die->Tag())
+ const dw_tag_t parent_arg_tag = parent_arg_die.Tag();
+ const dw_tag_t parent_pos_tag = parent_pos_die.Tag();
+ if (parent_arg_tag == parent_pos_tag)
{
- const dw_tag_t tag = parent_arg_die->Tag();
- switch (tag)
+ switch (parent_arg_tag)
{
case DW_TAG_class_type:
case DW_TAG_structure_type:
case DW_TAG_union_type:
case DW_TAG_namespace:
{
- const char *parent_arg_die_name = parent_arg_die->GetName(symfile, cu);
+ const char *parent_arg_die_name = parent_arg_die.GetName();
if (parent_arg_die_name == NULL) // Anonymous (i.e. no-name) struct
{
match = false;
}
else
{
- const char *parent_pos_die_name = parend_pos_die->GetName(pos->m_symfile, pos->m_cu);
- if (parent_pos_die_name == NULL || strcmp (parent_arg_die_name, parent_pos_die_name))
+ const char *parent_pos_die_name = parent_pos_die.GetName();
+ if (parent_pos_die_name == NULL || ((parent_arg_die_name != parent_pos_die_name) && strcmp (parent_arg_die_name, parent_pos_die_name)))
match = false;
}
}
@@ -77,13 +72,13 @@ UniqueDWARFASTTypeList::Find
break;
}
}
- parent_arg_die = parent_arg_die->GetParent();
- parend_pos_die = parend_pos_die->GetParent();
+ parent_arg_die = parent_arg_die.GetParent();
+ parent_pos_die = parent_pos_die.GetParent();
}
if (match)
{
- entry = *pos;
+ entry = udt;
return true;
}
}
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h Wed Aug 26 17:57:51 2015
@@ -19,6 +19,7 @@
// Project includes
#include "lldb/Symbol/Declaration.h"
+#include "DWARFDIE.h"
class DWARFCompileUnit;
class DWARFDebugInfoEntry;
@@ -32,23 +33,17 @@ public:
//------------------------------------------------------------------
UniqueDWARFASTType () :
m_type_sp (),
- m_symfile (NULL),
- m_cu (NULL),
- m_die (NULL),
+ m_die (),
m_declaration (),
m_byte_size (-1) // Set to negative value to make sure we have a valid value
{
}
UniqueDWARFASTType (lldb::TypeSP &type_sp,
- SymbolFileDWARF *symfile,
- DWARFCompileUnit *cu,
- DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
const lldb_private::Declaration &decl,
int32_t byte_size) :
m_type_sp (type_sp),
- m_symfile (symfile),
- m_cu (cu),
m_die (die),
m_declaration (decl),
m_byte_size (byte_size)
@@ -57,8 +52,6 @@ public:
UniqueDWARFASTType (const UniqueDWARFASTType &rhs) :
m_type_sp (rhs.m_type_sp),
- m_symfile (rhs.m_symfile),
- m_cu (rhs.m_cu),
m_die (rhs.m_die),
m_declaration (rhs.m_declaration),
m_byte_size (rhs.m_byte_size)
@@ -75,8 +68,6 @@ public:
if (this != &rhs)
{
m_type_sp = rhs.m_type_sp;
- m_symfile = rhs.m_symfile;
- m_cu = rhs.m_cu;
m_die = rhs.m_die;
m_declaration = rhs.m_declaration;
m_byte_size = rhs.m_byte_size;
@@ -85,9 +76,7 @@ public:
}
lldb::TypeSP m_type_sp;
- SymbolFileDWARF *m_symfile;
- const DWARFCompileUnit *m_cu;
- const DWARFDebugInfoEntry *m_die;
+ DWARFDIE m_die;
lldb_private::Declaration m_declaration;
int32_t m_byte_size;
};
@@ -117,9 +106,7 @@ public:
}
bool
- Find (SymbolFileDWARF *symfile,
- const DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die,
+ Find (const DWARFDIE &die,
const lldb_private::Declaration &decl,
const int32_t byte_size,
UniqueDWARFASTType &entry) const;
@@ -149,10 +136,8 @@ public:
}
bool
- Find (const lldb_private::ConstString &name,
- SymbolFileDWARF *symfile,
- const DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die,
+ Find (const lldb_private::ConstString &name,
+ const DWARFDIE &die,
const lldb_private::Declaration &decl,
const int32_t byte_size,
UniqueDWARFASTType &entry) const
@@ -161,7 +146,7 @@ public:
collection::const_iterator pos = m_collection.find (unique_name_cstr);
if (pos != m_collection.end())
{
- return pos->second.Find (symfile, cu, die, decl, byte_size, entry);
+ return pos->second.Find (die, decl, byte_size, entry);
}
return false;
}
Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Wed Aug 26 17:57:51 2015
@@ -8764,6 +8764,7 @@ ClangASTContext::DumpTypeDescription (vo
#include "Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h"
#include "Plugins/SymbolFile/DWARF/DWARFDeclContext.h"
#include "Plugins/SymbolFile/DWARF/DWARFDefines.h"
+#include "Plugins/SymbolFile/DWARF/DWARFDIE.h"
#include "Plugins/SymbolFile/DWARF/DWARFDIECollection.h"
#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
#include "Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h"
@@ -8846,27 +8847,18 @@ private:
};
bool
-ClangASTContext::ParseTemplateDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ClangASTContext::ParseTemplateDIE (const DWARFDIE &die,
ClangASTContext::TemplateParameterInfos &template_param_infos)
{
- const dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
switch (tag)
{
case DW_TAG_template_type_parameter:
case DW_TAG_template_value_parameter:
{
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize(),
- dwarf_cu->IsDWARF64());
-
- DWARFDebugInfoEntry::Attributes attributes;
- const size_t num_attributes = die->GetAttributes (dwarf,
- dwarf_cu,
- fixed_form_sizes,
- attributes);
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes (attributes);
const char *name = NULL;
Type *lldb_type = NULL;
CompilerType clang_type;
@@ -8882,22 +8874,22 @@ ClangASTContext::ParseTemplateDIE (Symbo
switch (attr)
{
case DW_AT_name:
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
- name = form_value.AsCString(dwarf);
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ name = form_value.AsCString();
break;
case DW_AT_type:
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
const dw_offset_t type_die_offset = form_value.Reference();
- lldb_type = dwarf->ResolveTypeUID(type_die_offset);
+ lldb_type = die.ResolveTypeUID(type_die_offset);
if (lldb_type)
clang_type = lldb_type->GetForwardCompilerType ();
}
break;
case DW_AT_const_value:
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
uval64_valid = true;
uval64 = form_value.Unsigned();
@@ -8951,27 +8943,25 @@ ClangASTContext::ParseTemplateDIE (Symbo
}
bool
-ClangASTContext::ParseTemplateParameterInfos (SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die,
+ClangASTContext::ParseTemplateParameterInfos (const DWARFDIE &parent_die,
ClangASTContext::TemplateParameterInfos &template_param_infos)
{
- if (parent_die == NULL)
+ if (!parent_die)
return false;
Args template_parameter_names;
- for (const DWARFDebugInfoEntry *die = parent_die->GetFirstChild();
- die != NULL;
- die = die->GetSibling())
+ for (DWARFDIE die = parent_die.GetFirstChild();
+ die.IsValid();
+ die = die.GetSibling())
{
- const dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
switch (tag)
{
case DW_TAG_template_type_parameter:
case DW_TAG_template_value_parameter:
- ParseTemplateDIE (dwarf, dwarf_cu, die, template_param_infos);
+ ParseTemplateDIE (die, template_param_infos);
break;
default:
@@ -8984,8 +8974,7 @@ ClangASTContext::ParseTemplateParameterI
}
clang::ClassTemplateDecl *
-ClangASTContext::ParseClassTemplateDecl (SymbolFileDWARF *dwarf,
- clang::DeclContext *decl_ctx,
+ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
lldb::AccessType access_type,
const char *parent_name,
int tag_decl_kind,
@@ -9006,9 +8995,7 @@ ClangASTContext::ParseClassTemplateDecl
}
bool
-ClangASTContext::CompleteTypeFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry* die,
+ClangASTContext::CompleteTypeFromDWARF (const DWARFDIE &die,
lldb_private::Type *type,
CompilerType &clang_type)
{
@@ -9016,20 +9003,22 @@ ClangASTContext::CompleteTypeFromDWARF (
// clang::ExternalASTSource queries for this type.
SetHasExternalStorage (clang_type.GetOpaqueQualType(), false);
- if (dwarf == nullptr || dwarf_cu == nullptr || die == nullptr)
+ if (!die)
return false;
- const dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
+
+ SymbolFileDWARF *dwarf = die.GetDWARF();
Log *log = nullptr; // (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
if (log)
dwarf->GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
"0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...",
- dwarf->MakeUserID(die->GetOffset()),
- DW_TAG_value_to_name(tag),
+ die.GetID(),
+ die.GetTagAsCString(),
type->GetName().AsCString());
assert (clang_type);
- DWARFDebugInfoEntry::Attributes attributes;
+ DWARFAttributes attributes;
switch (tag)
{
@@ -9040,7 +9029,7 @@ ClangASTContext::CompleteTypeFromDWARF (
LayoutInfo layout_info;
{
- if (die->HasChildren())
+ if (die.HasChildren())
{
LanguageType class_language = eLanguageTypeUnknown;
if (ClangASTContext::IsObjCObjectOrInterfaceType(clang_type))
@@ -9069,7 +9058,7 @@ ClangASTContext::CompleteTypeFromDWARF (
default_accessibility = eAccessPrivate;
}
- SymbolContext sc(dwarf->GetCompUnitForDWARFCompUnit(dwarf_cu));
+ SymbolContext sc(die.GetLLDBCompileUnit());
std::vector<clang::CXXBaseSpecifier *> base_classes;
std::vector<int> member_accessibilities;
bool is_a_class = false;
@@ -9078,8 +9067,6 @@ ClangASTContext::CompleteTypeFromDWARF (
DelayedPropertyList delayed_properties;
ParseChildMembers (sc,
- dwarf,
- dwarf_cu,
die,
clang_type,
class_language,
@@ -9097,7 +9084,7 @@ ClangASTContext::CompleteTypeFromDWARF (
{
for (size_t i=0; i<num_functions; ++i)
{
- dwarf->ResolveType(dwarf_cu, member_function_dies.GetDIEPtrAtIndex(i));
+ dwarf->ResolveType(member_function_dies.GetDIEAtIndex(i));
}
}
@@ -9113,15 +9100,14 @@ ClangASTContext::CompleteTypeFromDWARF (
{
DWARFDebugInfo* debug_info = dwarf->DebugInfo();
- DWARFCompileUnit* method_cu = NULL;
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];
- DWARFDebugInfoEntry *method_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &method_cu);
+ DWARFDIE method_die = debug_info->GetDIE (die_offset);
if (method_die)
- dwarf->ResolveType (method_cu, method_die);
+ method_die.ResolveType ();
}
}
@@ -9177,8 +9163,8 @@ ClangASTContext::CompleteTypeFromDWARF (
if (!base_class_error)
{
dwarf->GetObjectFile()->GetModule()->ReportError ("DWARF DIE at 0x%8.8x for class '%s' has a base class '%s' that is a forward declaration, not a complete definition.\nPlease file a bug against the compiler and include the preprocessed output for %s",
- die->GetOffset(),
- die->GetName(dwarf, dwarf_cu),
+ die.GetOffset(),
+ die.GetName(),
base_class_type.GetTypeName().GetCString(),
sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file");
}
@@ -9216,7 +9202,7 @@ ClangASTContext::CompleteTypeFromDWARF (
if (type)
layout_info.bit_size = type->GetByteSize() * 8;
if (layout_info.bit_size == 0)
- layout_info.bit_size = die->GetAttributeValueAsUnsigned(dwarf, dwarf_cu, DW_AT_byte_size, 0) * 8;
+ layout_info.bit_size = die.GetAttributeValueAsUnsigned(DW_AT_byte_size, 0) * 8;
clang::CXXRecordDecl *record_decl = GetAsCXXRecordDecl(clang_type.GetOpaqueQualType());
if (record_decl)
@@ -9287,12 +9273,12 @@ ClangASTContext::CompleteTypeFromDWARF (
case DW_TAG_enumeration_type:
ClangASTContext::StartTagDeclarationDefinition (clang_type);
- if (die->HasChildren())
+ if (die.HasChildren())
{
- SymbolContext sc(dwarf->GetCompUnitForDWARFCompUnit(dwarf_cu));
+ SymbolContext sc(die.GetLLDBCompileUnit());
bool is_signed = false;
clang_type.IsIntegerType(is_signed);
- ParseChildEnumerators(sc, clang_type, is_signed, type->GetByteSize(), dwarf, dwarf_cu, die);
+ ParseChildEnumerators(sc, clang_type, is_signed, type->GetByteSize(), die);
}
ClangASTContext::CompleteTagDeclarationDefinition (clang_type);
return (bool)clang_type;
@@ -9306,22 +9292,18 @@ ClangASTContext::CompleteTypeFromDWARF (
}
CompilerDeclContext
-ClangASTContext::GetDeclContextForUIDFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry* die)
+ClangASTContext::GetDeclContextForUIDFromDWARF (const DWARFDIE &die)
{
- clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE (dwarf, cu, die);
+ clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE (die);
if (clang_decl_ctx)
return CompilerDeclContext(this, clang_decl_ctx);
return CompilerDeclContext();
}
CompilerDeclContext
-ClangASTContext::GetDeclContextContainingUIDFromDWARF (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry* die)
+ClangASTContext::GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die)
{
- clang::DeclContext *clang_decl_ctx = GetClangDeclContextContainingDIE (dwarf, cu, die, nullptr);
+ clang::DeclContext *clang_decl_ctx = GetClangDeclContextContainingDIE (die, nullptr);
if (clang_decl_ctx)
return CompilerDeclContext(this, clang_decl_ctx);
return CompilerDeclContext();
@@ -9392,26 +9374,20 @@ ClangASTContext::ParseChildEnumerators (
lldb_private::CompilerType &clang_type,
bool is_signed,
uint32_t enumerator_byte_size,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die)
+ const DWARFDIE &parent_die)
{
- if (parent_die == NULL)
+ if (!parent_die)
return 0;
size_t enumerators_added = 0;
- const DWARFDebugInfoEntry *die;
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize(),
- dwarf_cu->IsDWARF64());
- for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
{
- const dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
if (tag == DW_TAG_enumerator)
{
- DWARFDebugInfoEntry::Attributes attributes;
- const size_t num_child_attributes = die->GetAttributes(dwarf, dwarf_cu, fixed_form_sizes, attributes);
+ DWARFAttributes attributes;
+ const size_t num_child_attributes = die.GetAttributes(attributes);
if (num_child_attributes > 0)
{
const char *name = NULL;
@@ -9424,7 +9400,7 @@ ClangASTContext::ParseChildEnumerators (
{
const dw_attr_t attr = attributes.AttributeAtIndex(i);
DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -9437,7 +9413,7 @@ ClangASTContext::ParseChildEnumerators (
break;
case DW_AT_name:
- name = form_value.AsCString(dwarf);
+ name = form_value.AsCString();
break;
case DW_AT_description:
@@ -9473,27 +9449,26 @@ class DIEStack
{
public:
- void Push (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
+ void Push (const DWARFDIE &die)
{
- m_dies.push_back (DIEInfo(cu, die));
+ m_dies.push_back (die);
}
- void LogDIEs (Log *log, SymbolFileDWARF *dwarf)
+ void LogDIEs (Log *log)
{
StreamString log_strm;
const size_t n = m_dies.size();
log_strm.Printf("DIEStack[%" PRIu64 "]:\n", (uint64_t)n);
for (size_t i=0; i<n; i++)
{
- DWARFCompileUnit *cu = m_dies[i].cu;
- const DWARFDebugInfoEntry *die = m_dies[i].die;
std::string qualified_name;
- die->GetQualifiedName(dwarf, cu, qualified_name);
+ const DWARFDIE &die = m_dies[i];
+ die.GetQualifiedName(qualified_name);
log_strm.Printf ("[%" PRIu64 "] 0x%8.8x: %s name='%s'\n",
(uint64_t)i,
- die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
+ die.GetOffset(),
+ die.GetTagAsCString(),
qualified_name.c_str());
}
log->PutCString(log_strm.GetData());
@@ -9507,16 +9482,16 @@ public:
{
public:
ScopedPopper (DIEStack &die_stack) :
- m_die_stack (die_stack),
- m_valid (false)
+ m_die_stack (die_stack),
+ m_valid (false)
{
}
void
- Push (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
+ Push (const DWARFDIE &die)
{
m_valid = true;
- m_die_stack.Push (cu, die);
+ m_die_stack.Push (die);
}
~ScopedPopper ()
@@ -9533,16 +9508,7 @@ public:
};
protected:
- struct DIEInfo {
- DIEInfo (DWARFCompileUnit *c, const DWARFDebugInfoEntry *d) :
- cu(c),
- die(d)
- {
- }
- DWARFCompileUnit *cu;
- const DWARFDebugInfoEntry *die;
- };
- typedef std::vector<DIEInfo> Stack;
+ typedef std::vector<DWARFDIE> Stack;
Stack m_dies;
};
#endif
@@ -9603,11 +9569,9 @@ struct BitfieldInfo
Function *
ClangASTContext::ParseFunctionFromDWARF (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die)
+ const DWARFDIE &die)
{
- DWARFDebugRanges::RangeList func_ranges;
+ DWARFRangeList func_ranges;
const char *name = NULL;
const char *mangled = NULL;
int decl_file = 0;
@@ -9616,33 +9580,32 @@ ClangASTContext::ParseFunctionFromDWARF
int call_file = 0;
int call_line = 0;
int call_column = 0;
- DWARFExpression frame_base(dwarf_cu);
+ DWARFExpression frame_base(die.GetCU());
- assert (die->Tag() == DW_TAG_subprogram);
+ const dw_tag_t tag = die.Tag();
- if (die->Tag() != DW_TAG_subprogram)
+ if (tag != DW_TAG_subprogram)
return NULL;
- if (die->GetDIENamesAndRanges (dwarf,
- dwarf_cu,
- name,
- mangled,
- func_ranges,
- decl_file,
- decl_line,
- decl_column,
- call_file,
- call_line,
- call_column,
- &frame_base))
+ if (die.GetDIENamesAndRanges (name,
+ mangled,
+ func_ranges,
+ decl_file,
+ decl_line,
+ decl_column,
+ call_file,
+ call_line,
+ call_column,
+ &frame_base))
{
+
// Union of all ranges in the function DIE (if the function is discontiguous)
AddressRange func_range;
lldb::addr_t lowest_func_addr = func_ranges.GetMinRangeBase (0);
lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd (0);
if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr)
{
- ModuleSP module_sp (dwarf->GetObjectFile()->GetModule());
+ ModuleSP module_sp (die.GetModule());
func_range.GetBaseAddress().ResolveAddressUsingFileSections (lowest_func_addr, module_sp->GetSectionList());
if (func_range.GetBaseAddress().IsValid())
func_range.SetByteSize(highest_func_addr - lowest_func_addr);
@@ -9653,8 +9616,8 @@ ClangASTContext::ParseFunctionFromDWARF
Mangled func_name;
if (mangled)
func_name.SetValue(ConstString(mangled), true);
- else if (die->GetParent()->Tag() == DW_TAG_compile_unit &&
- LanguageRuntime::LanguageIsCPlusPlus(dwarf_cu->GetLanguageType()) &&
+ else if (die.GetParent().Tag() == DW_TAG_compile_unit &&
+ LanguageRuntime::LanguageIsCPlusPlus(die.GetLanguage()) &&
name && strcmp(name, "main") != 0)
{
// If the mangled name is not present in the DWARF, generate the demangled name
@@ -9665,21 +9628,15 @@ ClangASTContext::ParseFunctionFromDWARF
unsigned type_quals = 0;
std::vector<CompilerType> param_types;
std::vector<clang::ParmVarDecl*> param_decls;
- const DWARFDebugInfoEntry *decl_ctx_die = NULL;
DWARFDeclContext decl_ctx;
StreamString sstr;
- die->GetDWARFDeclContext(dwarf, dwarf_cu, decl_ctx);
+ die.GetDWARFDeclContext(decl_ctx);
sstr << decl_ctx.GetQualifiedName();
- clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE(dwarf,
- dwarf_cu,
- die,
- &decl_ctx_die);
+ clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE(die, nullptr);
ParseChildParameters(sc,
containing_decl_ctx,
- dwarf,
- dwarf_cu,
die,
true,
is_static,
@@ -9712,17 +9669,18 @@ ClangASTContext::ParseFunctionFromDWARF
decl_line,
decl_column));
+ SymbolFileDWARF *dwarf = die.GetDWARF();
// Supply the type _only_ if it has already been parsed
- Type *func_type = dwarf->m_die_to_type.lookup (die);
+ Type *func_type = dwarf->m_die_to_type.lookup (die.GetDIE());
assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
if (dwarf->FixupAddress (func_range.GetBaseAddress()))
{
- const user_id_t func_user_id = dwarf->MakeUserID(die->GetOffset());
+ const user_id_t func_user_id = die.GetID();
func_sp.reset(new Function (sc.comp_unit,
- dwarf->MakeUserID(func_user_id), // UserID is the DIE offset
- dwarf->MakeUserID(func_user_id),
+ func_user_id, // UserID is the DIE offset
+ func_user_id,
func_name,
func_type,
func_range)); // first address range
@@ -9743,9 +9701,7 @@ ClangASTContext::ParseFunctionFromDWARF
size_t
ClangASTContext::ParseChildMembers (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die,
+ const DWARFDIE &parent_die,
CompilerType &class_clang_type,
const LanguageType class_language,
std::vector<clang::CXXBaseSpecifier *>& base_classes,
@@ -9756,35 +9712,29 @@ ClangASTContext::ParseChildMembers (cons
bool &is_a_class,
LayoutInfo &layout_info)
{
- if (parent_die == NULL)
+ if (!parent_die)
return 0;
size_t count = 0;
- const DWARFDebugInfoEntry *die;
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize(),
- dwarf_cu->IsDWARF64());
uint32_t member_idx = 0;
BitfieldInfo last_field_info;
- ModuleSP module_sp = dwarf->GetObjectFile()->GetModule();
+
+ ModuleSP module_sp = parent_die.GetDWARF()->GetObjectFile()->GetModule();
ClangASTContext* ast = class_clang_type.GetTypeSystem()->AsClangASTContext();
if (ast == nullptr)
return 0;
- for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
{
- dw_tag_t tag = die->Tag();
+ dw_tag_t tag = die.Tag();
switch (tag)
{
case DW_TAG_member:
case DW_TAG_APPLE_property:
{
- DWARFDebugInfoEntry::Attributes attributes;
- const size_t num_attributes = die->GetAttributes (dwarf,
- dwarf_cu,
- fixed_form_sizes,
- attributes);
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes (attributes);
if (num_attributes > 0)
{
Declaration decl;
@@ -9809,14 +9759,14 @@ ClangASTContext::ParseChildMembers (cons
{
const dw_attr_t attr = attributes.AttributeAtIndex(i);
DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
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_name: name = form_value.AsCString(dwarf); break;
+ case DW_AT_name: name = form_value.AsCString(); break;
case DW_AT_type: encoding_uid = form_value.Reference(); break;
case DW_AT_bit_offset: bit_offset = form_value.Unsigned(); break;
case DW_AT_bit_size: bit_size = form_value.Unsigned(); break;
@@ -9826,7 +9776,7 @@ ClangASTContext::ParseChildMembers (cons
{
Value initialValue(0);
Value memberOffset(0);
- const DWARFDataExtractor& debug_info_data = dwarf->get_debug_info_data();
+ const DWARFDataExtractor& debug_info_data = die.GetDWARF()->get_debug_info_data();
uint32_t block_length = form_value.Unsigned();
uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
if (DWARFExpression::Evaluate(NULL, // ExecutionContext *
@@ -9835,7 +9785,7 @@ ClangASTContext::ParseChildMembers (cons
NULL, // RegisterContext *
module_sp,
debug_info_data,
- dwarf_cu,
+ die.GetCU(),
block_offset,
block_length,
eRegisterKindDWARF,
@@ -9857,11 +9807,11 @@ ClangASTContext::ParseChildMembers (cons
case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType (form_value.Unsigned()); break;
case DW_AT_artificial: is_artificial = form_value.Boolean(); break;
- case DW_AT_APPLE_property_name: prop_name = form_value.AsCString(dwarf);
+ case DW_AT_APPLE_property_name: prop_name = form_value.AsCString();
break;
- case DW_AT_APPLE_property_getter: prop_getter_name = form_value.AsCString(dwarf);
+ case DW_AT_APPLE_property_getter: prop_getter_name = form_value.AsCString();
break;
- case DW_AT_APPLE_property_setter: prop_setter_name = form_value.AsCString(dwarf);
+ case DW_AT_APPLE_property_setter: prop_setter_name = form_value.AsCString();
break;
case DW_AT_APPLE_property_attribute: prop_attributes = form_value.Unsigned(); break;
case DW_AT_external: is_external = form_value.Boolean(); break;
@@ -9956,7 +9906,7 @@ ClangASTContext::ParseChildMembers (cons
// Handle static members
if (is_external && member_byte_offset == UINT32_MAX)
{
- Type *var_type = dwarf->ResolveTypeUID(encoding_uid);
+ Type *var_type = die.ResolveTypeUID(encoding_uid);
if (var_type)
{
@@ -9972,7 +9922,7 @@ ClangASTContext::ParseChildMembers (cons
if (is_artificial == false)
{
- Type *member_type = dwarf->ResolveTypeUID(encoding_uid);
+ Type *member_type = die.ResolveTypeUID(encoding_uid);
clang::FieldDecl *field_decl = NULL;
if (tag == DW_TAG_member)
@@ -10010,7 +9960,7 @@ ClangASTContext::ParseChildMembers (cons
if (byte_size == 0)
byte_size = member_type->GetByteSize();
- if (dwarf->GetObjectFile()->GetByteOrder() == eByteOrderLittle)
+ if (die.GetDWARF()->GetObjectFile()->GetByteOrder() == eByteOrderLittle)
{
this_field_info.bit_offset += byte_size * 8;
this_field_info.bit_offset -= (bit_offset + bit_size);
@@ -10049,7 +9999,7 @@ ClangASTContext::ParseChildMembers (cons
bool detect_unnamed_bitfields = true;
if (class_language == eLanguageTypeObjC || class_language == eLanguageTypeObjC_plus_plus)
- detect_unnamed_bitfields = dwarf_cu->Supports_unnamed_objc_bitfields ();
+ detect_unnamed_bitfields = die.GetCU()->Supports_unnamed_objc_bitfields ();
if (detect_unnamed_bitfields)
{
@@ -10114,17 +10064,17 @@ ClangASTContext::ParseChildMembers (cons
&member_array_is_incomplete) &&
!member_array_is_incomplete)
{
- uint64_t parent_byte_size = parent_die->GetAttributeValueAsUnsigned(dwarf, dwarf_cu, DW_AT_byte_size, UINT64_MAX);
+ uint64_t parent_byte_size = parent_die.GetAttributeValueAsUnsigned(DW_AT_byte_size, UINT64_MAX);
if (member_byte_offset >= parent_byte_size)
{
if (member_array_size != 1)
{
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,
- dwarf->MakeUserID(die->GetOffset()),
- name,
- encoding_uid,
- dwarf->MakeUserID(parent_die->GetOffset()));
+ die.GetID(),
+ name,
+ encoding_uid,
+ parent_die.GetID());
}
member_clang_type = CreateArrayType(member_array_element_type, 0, false);
@@ -10138,7 +10088,7 @@ ClangASTContext::ParseChildMembers (cons
accessibility,
bit_size);
- SetMetadataAsUserID (field_decl, dwarf->MakeUserID(die->GetOffset()));
+ SetMetadataAsUserID (field_decl, die.GetID());
layout_info.field_offsets.insert(std::make_pair(field_decl, field_bit_offset));
}
@@ -10146,12 +10096,12 @@ ClangASTContext::ParseChildMembers (cons
{
if (name)
module_sp->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which was unable to be parsed",
- dwarf->MakeUserID(die->GetOffset()),
+ die.GetID(),
name,
encoding_uid);
else
module_sp->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member refers to type 0x%8.8" PRIx64 " which was unable to be parsed",
- dwarf->MakeUserID(die->GetOffset()),
+ die.GetID(),
encoding_uid);
}
}
@@ -10167,7 +10117,7 @@ ClangASTContext::ParseChildMembers (cons
}
ClangASTMetadata metadata;
- metadata.SetUserID (dwarf->MakeUserID(die->GetOffset()));
+ metadata.SetUserID (die.GetID());
delayed_properties.push_back(DelayedAddObjCClassProperty(class_clang_type,
prop_name,
member_type->GetLayoutCompilerType (),
@@ -10178,7 +10128,7 @@ ClangASTContext::ParseChildMembers (cons
&metadata));
if (ivar_decl)
- SetMetadataAsUserID (ivar_decl, dwarf->MakeUserID(die->GetOffset()));
+ SetMetadataAsUserID (ivar_decl, die.GetID());
}
}
}
@@ -10197,15 +10147,12 @@ ClangASTContext::ParseChildMembers (cons
if (default_accessibility == eAccessNone)
default_accessibility = eAccessPrivate;
// TODO: implement DW_TAG_inheritance type parsing
- DWARFDebugInfoEntry::Attributes attributes;
- const size_t num_attributes = die->GetAttributes (dwarf,
- dwarf_cu,
- fixed_form_sizes,
- attributes);
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes (attributes);
if (num_attributes > 0)
{
Declaration decl;
- DWARFExpression location(dwarf_cu);
+ DWARFExpression location(die.GetCU());
lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
AccessType accessibility = default_accessibility;
bool is_virtual = false;
@@ -10216,7 +10163,7 @@ ClangASTContext::ParseChildMembers (cons
{
const dw_attr_t attr = attributes.AttributeAtIndex(i);
DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -10229,7 +10176,7 @@ ClangASTContext::ParseChildMembers (cons
{
Value initialValue(0);
Value memberOffset(0);
- const DWARFDataExtractor& debug_info_data = dwarf->get_debug_info_data();
+ const DWARFDataExtractor& debug_info_data = die.GetDWARF()->get_debug_info_data();
uint32_t block_length = form_value.Unsigned();
uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
if (DWARFExpression::Evaluate (NULL,
@@ -10238,7 +10185,7 @@ ClangASTContext::ParseChildMembers (cons
NULL,
module_sp,
debug_info_data,
- dwarf_cu,
+ die.GetCU(),
block_offset,
block_length,
eRegisterKindDWARF,
@@ -10275,13 +10222,13 @@ ClangASTContext::ParseChildMembers (cons
}
}
- Type *base_class_type = dwarf->ResolveTypeUID(encoding_uid);
+ Type *base_class_type = die.ResolveTypeUID(encoding_uid);
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,
- parent_die->GetOffset());
+ die.GetOffset(),
+ encoding_uid,
+ parent_die.GetOffset());
break;
}
@@ -10331,9 +10278,7 @@ ClangASTContext::ParseChildMembers (cons
size_t
ClangASTContext::ParseChildParameters (const SymbolContext& sc,
clang::DeclContext *containing_decl_ctx,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die,
+ const DWARFDIE &parent_die,
bool skip_artificial,
bool &is_static,
bool &is_variadic,
@@ -10341,24 +10286,19 @@ ClangASTContext::ParseChildParameters (c
std::vector<clang::ParmVarDecl*>& function_param_decls,
unsigned &type_quals)
{
- if (parent_die == NULL)
+ if (!parent_die)
return 0;
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize(),
- dwarf_cu->IsDWARF64());
-
size_t arg_idx = 0;
- const DWARFDebugInfoEntry *die;
- for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
{
- dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
switch (tag)
{
case DW_TAG_formal_parameter:
{
- DWARFDebugInfoEntry::Attributes attributes;
- const size_t num_attributes = die->GetAttributes(dwarf, dwarf_cu, fixed_form_sizes, attributes);
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
if (num_attributes > 0)
{
const char *name = NULL;
@@ -10373,14 +10313,14 @@ ClangASTContext::ParseChildParameters (c
{
const dw_attr_t attr = attributes.AttributeAtIndex(i);
DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
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_name: name = form_value.AsCString(dwarf);
+ case DW_AT_name: name = form_value.AsCString();
break;
case DW_AT_type: param_type_die_offset = form_value.Reference(); break;
case DW_AT_artificial: is_artificial = form_value.Boolean(); break;
@@ -10427,7 +10367,7 @@ ClangASTContext::ParseChildParameters (c
// being in the formal parameter DIE...
if (name == NULL || ::strcmp(name, "this")==0)
{
- Type *this_type = dwarf->ResolveTypeUID (param_type_die_offset);
+ Type *this_type = die.ResolveTypeUID (param_type_die_offset);
if (this_type)
{
uint32_t encoding_mask = this_type->GetEncodingMask();
@@ -10451,7 +10391,7 @@ ClangASTContext::ParseChildParameters (c
// HACK: Objective C formal parameters "self" and "_cmd"
// are not marked as artificial in the DWARF...
- CompileUnit *comp_unit = dwarf->GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
+ CompileUnit *comp_unit = die.GetLLDBCompileUnit();
if (comp_unit)
{
switch (comp_unit->GetLanguage())
@@ -10470,7 +10410,7 @@ ClangASTContext::ParseChildParameters (c
if (!skip)
{
- Type *type = dwarf->ResolveTypeUID(param_type_die_offset);
+ Type *type = die.ResolveTypeUID(param_type_die_offset);
if (type)
{
function_param_types.push_back (type->GetForwardCompilerType ());
@@ -10481,7 +10421,7 @@ ClangASTContext::ParseChildParameters (c
assert(param_var_decl);
function_param_decls.push_back(param_var_decl);
- SetMetadataAsUserID (param_var_decl, dwarf->MakeUserID(die->GetOffset()));
+ SetMetadataAsUserID (param_var_decl, die.GetID());
}
}
}
@@ -10511,30 +10451,24 @@ ClangASTContext::ParseChildParameters (c
void
ClangASTContext::ParseChildArrayInfo (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *parent_die,
+ const DWARFDIE &parent_die,
int64_t& first_index,
std::vector<uint64_t>& element_orders,
uint32_t& byte_stride,
uint32_t& bit_stride)
{
- if (parent_die == NULL)
+ if (!parent_die)
return;
- const DWARFDebugInfoEntry *die;
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize(),
- dwarf_cu->IsDWARF64());
- for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
{
- const dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
switch (tag)
{
case DW_TAG_subrange_type:
{
- DWARFDebugInfoEntry::Attributes attributes;
- const size_t num_child_attributes = die->GetAttributes(dwarf, dwarf_cu, fixed_form_sizes, attributes);
+ DWARFAttributes attributes;
+ const size_t num_child_attributes = die.GetAttributes(attributes);
if (num_child_attributes > 0)
{
uint64_t num_elements = 0;
@@ -10546,7 +10480,7 @@ ClangASTContext::ParseChildArrayInfo (co
{
const dw_attr_t attr = attributes.AttributeAtIndex(i);
DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -10756,18 +10690,16 @@ ClangASTContext::DeclContextGetClangASTC
clang::DeclContext *
-ClangASTContext::GetClangDeclContextForDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die)
+ClangASTContext::GetClangDeclContextForDIE (const DWARFDIE &die)
{
if (die)
{
- clang::DeclContext *decl_ctx = GetCachedClangDeclContextForDIE (die);
+ clang::DeclContext *decl_ctx = GetCachedClangDeclContextForDIE (die.GetDIE());
if (decl_ctx)
return decl_ctx;
bool try_parsing_type = true;
- switch (die->Tag())
+ switch (die.Tag())
{
case DW_TAG_compile_unit:
decl_ctx = m_clang_tu_decl;
@@ -10775,7 +10707,7 @@ ClangASTContext::GetClangDeclContextForD
break;
case DW_TAG_namespace:
- decl_ctx = ResolveNamespaceDIE (dwarf, cu, die);
+ decl_ctx = ResolveNamespaceDIE (die);
try_parsing_type = false;
break;
@@ -10785,9 +10717,9 @@ ClangASTContext::GetClangDeclContextForD
if (decl_ctx == nullptr && try_parsing_type)
{
- Type* type = dwarf->ResolveType (cu, die);
+ Type* type = die.GetDWARF()->ResolveType (die);
if (type)
- decl_ctx = GetCachedClangDeclContextForDIE (die);
+ decl_ctx = GetCachedClangDeclContextForDIE (die.GetDIE());
}
if (decl_ctx)
@@ -10800,31 +10732,30 @@ ClangASTContext::GetClangDeclContextForD
}
clang::NamespaceDecl *
-ClangASTContext::ResolveNamespaceDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *dwarf_cu,
- const DWARFDebugInfoEntry *die)
+ClangASTContext::ResolveNamespaceDIE (const DWARFDIE &die)
{
- if (die && die->Tag() == DW_TAG_namespace)
+ if (die && die.Tag() == DW_TAG_namespace)
{
// See if we already parsed this namespace DIE and associated it with a
// uniqued namespace declaration
- clang::NamespaceDecl *namespace_decl = static_cast<clang::NamespaceDecl *>(m_die_to_decl_ctx[die]);
+ clang::NamespaceDecl *namespace_decl = static_cast<clang::NamespaceDecl *>(m_die_to_decl_ctx[die.GetDIE()]);
if (namespace_decl)
return namespace_decl;
else
{
- const char *namespace_name = die->GetAttributeValueAsString(dwarf, dwarf_cu, DW_AT_name, NULL);
- clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf, dwarf_cu, die, NULL);
+ const char *namespace_name = die.GetName();
+ clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (die, nullptr);
namespace_decl = GetUniqueNamespaceDeclaration (namespace_name, containing_decl_ctx);
Log *log = nullptr;// (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
if (log)
{
+ SymbolFileDWARF *dwarf = die.GetDWARF();
if (namespace_name)
{
dwarf->GetObjectFile()->GetModule()->LogMessage (log,
"ASTContext => %p: 0x%8.8" PRIx64 ": DW_TAG_namespace with DW_AT_name(\"%s\") => clang::NamespaceDecl *%p (original = %p)",
static_cast<void*>(getASTContext()),
- dwarf->MakeUserID(die->GetOffset()),
+ die.GetID(),
namespace_name,
static_cast<void*>(namespace_decl),
static_cast<void*>(namespace_decl->getOriginalNamespace()));
@@ -10834,7 +10765,7 @@ ClangASTContext::ResolveNamespaceDIE (Sy
dwarf->GetObjectFile()->GetModule()->LogMessage (log,
"ASTContext => %p: 0x%8.8" PRIx64 ": DW_TAG_namespace (anonymous) => clang::NamespaceDecl *%p (original = %p)",
static_cast<void*>(getASTContext()),
- dwarf->MakeUserID(die->GetOffset()),
+ die.GetID(),
static_cast<void*>(namespace_decl),
static_cast<void*>(namespace_decl->getOriginalNamespace()));
}
@@ -10849,22 +10780,22 @@ ClangASTContext::ResolveNamespaceDIE (Sy
}
clang::DeclContext *
-ClangASTContext::GetClangDeclContextContainingDIE (SymbolFileDWARF *dwarf,
- DWARFCompileUnit *cu,
- const DWARFDebugInfoEntry *die,
- const DWARFDebugInfoEntry **decl_ctx_die_copy)
+ClangASTContext::GetClangDeclContextContainingDIE (const DWARFDIE &die,
+ DWARFDIE *decl_ctx_die_copy)
{
if (m_clang_tu_decl == NULL)
m_clang_tu_decl = getASTContext()->getTranslationUnitDecl();
- const DWARFDebugInfoEntry *decl_ctx_die = dwarf->GetDeclContextDIEContainingDIE (cu, die);
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+
+ DWARFDIE decl_ctx_die = dwarf->GetDeclContextDIEContainingDIE (die);
if (decl_ctx_die_copy)
*decl_ctx_die_copy = decl_ctx_die;
if (decl_ctx_die)
{
- clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE (dwarf, cu, decl_ctx_die);
+ clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE (decl_ctx_die);
if (clang_decl_ctx)
return clang_decl_ctx;
}
@@ -10875,9 +10806,7 @@ ClangASTContext::GetClangDeclContextCont
TypeSP
ClangASTContext::ParseTypeFromDWARF (const SymbolContext& sc,
- SymbolFileDWARF *dwarf,
- DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die,
+ const DWARFDIE &die,
Log *log,
bool *type_is_new_ptr)
{
@@ -10892,23 +10821,24 @@ ClangASTContext::ParseTypeFromDWARF (con
#endif
AccessType accessibility = eAccessNone;
- if (die != NULL)
+ if (die)
{
+ SymbolFileDWARF *dwarf = die.GetDWARF();
if (log)
{
- const DWARFDebugInfoEntry *context_die;
- clang::DeclContext *context = GetClangDeclContextContainingDIE (dwarf, dwarf_cu, die, &context_die);
+ DWARFDIE context_die;
+ clang::DeclContext *context = GetClangDeclContextContainingDIE (die, &context_die);
dwarf->GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x, decl_ctx = %p (die 0x%8.8x)) %s name = '%s')",
- die->GetOffset(),
+ die.GetOffset(),
static_cast<void*>(context),
- context_die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
- die->GetName(dwarf, dwarf_cu));
+ context_die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName());
#if defined(LLDB_CONFIGURATION_DEBUG) || defined(LLDB_CONFIGURATION_RELEASE)
- scoped_die_logger.Push (dwarf_cu, die);
- g_die_stack.LogDIEs(log, dwarf);
+ scoped_die_logger.Push (die);
+ g_die_stack.LogDIEs(log);
#endif
}
//
@@ -10921,17 +10851,17 @@ ClangASTContext::ParseTypeFromDWARF (con
//
// }
- Type *type_ptr = dwarf->m_die_to_type.lookup (die);
+ Type *type_ptr = dwarf->m_die_to_type.lookup (die.GetDIE());
TypeList* type_list = dwarf->GetTypeList();
if (type_ptr == NULL)
{
if (type_is_new_ptr)
*type_is_new_ptr = true;
- const dw_tag_t tag = die->Tag();
+ const dw_tag_t tag = die.Tag();
bool is_forward_declaration = false;
- DWARFDebugInfoEntry::Attributes attributes;
+ DWARFAttributes attributes;
const char *type_name_cstr = NULL;
ConstString type_name_const_str;
Type::ResolveState resolve_state = Type::eResolveStateUnresolved;
@@ -10957,12 +10887,9 @@ ClangASTContext::ParseTypeFromDWARF (con
case DW_TAG_unspecified_type:
{
// Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die] = DIE_IS_BEING_PARSED;
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
- const size_t num_attributes = die->GetAttributes(dwarf,
- dwarf_cu,
- DWARFFormValue::FixedFormSizes(),
- attributes);
+ const size_t num_attributes = die.GetAttributes (attributes);
uint32_t encoding = 0;
lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
@@ -10972,7 +10899,7 @@ ClangASTContext::ParseTypeFromDWARF (con
for (i=0; i<num_attributes; ++i)
{
attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -10981,7 +10908,7 @@ ClangASTContext::ParseTypeFromDWARF (con
case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
case DW_AT_name:
- type_name_cstr = form_value.AsCString(dwarf);
+ type_name_cstr = form_value.AsCString();
// Work around a bug in llvm-gcc where they give a name to a reference type which doesn't
// include the "&"...
if (tag == DW_TAG_reference_type)
@@ -11003,7 +10930,7 @@ ClangASTContext::ParseTypeFromDWARF (con
}
}
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", dwarf->MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid);
+ DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid);
switch (tag)
{
@@ -11051,10 +10978,11 @@ ClangASTContext::ParseTypeFromDWARF (con
if (type_name_const_str == g_objc_type_name_id)
{
if (log)
- dwarf->GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'id' built-in type.",
- die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
- die->GetName(dwarf, dwarf_cu));
+ dwarf->GetObjectFile()->GetModule()->LogMessage (log,
+ "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'id' built-in type.",
+ die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName());
clang_type = GetBasicType(eBasicTypeObjCID);
encoding_data_type = Type::eEncodingIsUID;
encoding_uid = LLDB_INVALID_UID;
@@ -11064,10 +10992,11 @@ ClangASTContext::ParseTypeFromDWARF (con
else if (type_name_const_str == g_objc_type_name_Class)
{
if (log)
- dwarf->GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'Class' built-in type.",
- die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
- die->GetName(dwarf, dwarf_cu));
+ dwarf->GetObjectFile()->GetModule()->LogMessage (log,
+ "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'Class' built-in type.",
+ die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName());
clang_type = GetBasicType(eBasicTypeObjCClass);
encoding_data_type = Type::eEncodingIsUID;
encoding_uid = LLDB_INVALID_UID;
@@ -11076,10 +11005,11 @@ ClangASTContext::ParseTypeFromDWARF (con
else if (type_name_const_str == g_objc_type_name_selector)
{
if (log)
- dwarf->GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'selector' built-in type.",
- die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
- die->GetName(dwarf, dwarf_cu));
+ dwarf->GetObjectFile()->GetModule()->LogMessage (log,
+ "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'selector' built-in type.",
+ die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName());
clang_type = GetBasicType(eBasicTypeObjCSel);
encoding_data_type = Type::eEncodingIsUID;
encoding_uid = LLDB_INVALID_UID;
@@ -11090,19 +11020,20 @@ ClangASTContext::ParseTypeFromDWARF (con
{
// Clang sometimes erroneously emits id as objc_object*. In that case we fix up the type to "id".
- DWARFDebugInfoEntry* encoding_die = dwarf_cu->GetDIEPtr(encoding_uid);
+ const DWARFDIE encoding_die = die.GetDIE(encoding_uid);
- if (encoding_die && encoding_die->Tag() == DW_TAG_structure_type)
+ if (encoding_die && encoding_die.Tag() == DW_TAG_structure_type)
{
- if (const char *struct_name = encoding_die->GetAttributeValueAsString(dwarf, dwarf_cu, DW_AT_name, NULL))
+ if (const char *struct_name = encoding_die.GetName())
{
if (!strcmp(struct_name, "objc_object"))
{
if (log)
- dwarf->GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is 'objc_object*', which we overrode to 'id'.",
- die->GetOffset(),
- DW_TAG_value_to_name(die->Tag()),
- die->GetName(dwarf, dwarf_cu));
+ dwarf->GetObjectFile()->GetModule()->LogMessage (log,
+ "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is 'objc_object*', which we overrode to 'id'.",
+ die.GetOffset(),
+ die.GetTagAsCString(),
+ die.GetName());
clang_type = GetBasicType(eBasicTypeObjCID);
encoding_data_type = Type::eEncodingIsUID;
encoding_uid = LLDB_INVALID_UID;
@@ -11114,7 +11045,7 @@ ClangASTContext::ParseTypeFromDWARF (con
}
}
- type_sp.reset( new Type (dwarf->MakeUserID(die->GetOffset()),
+ type_sp.reset( new Type (die.GetID(),
dwarf,
type_name_const_str,
byte_size,
@@ -11125,7 +11056,7 @@ ClangASTContext::ParseTypeFromDWARF (con
clang_type,
resolve_state));
- dwarf->m_die_to_type[die] = type_sp.get();
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
// Type* encoding_type = GetUniquedTypeForDIEOffset(encoding_uid, type_sp, NULL, 0, 0, false);
// if (encoding_type != NULL)
@@ -11143,28 +11074,25 @@ ClangASTContext::ParseTypeFromDWARF (con
case DW_TAG_class_type:
{
// Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die] = DIE_IS_BEING_PARSED;
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
bool byte_size_valid = false;
LanguageType class_language = eLanguageTypeUnknown;
bool is_complete_objc_class = false;
//bool struct_is_class = false;
- const size_t num_attributes = die->GetAttributes(dwarf,
- dwarf_cu,
- DWARFFormValue::FixedFormSizes(),
- attributes);
+ const size_t num_attributes = die.GetAttributes (attributes);
if (num_attributes > 0)
{
uint32_t i;
for (i=0; i<num_attributes; ++i)
{
attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
case DW_AT_decl_file:
- if (dwarf_cu->DW_AT_decl_file_attributes_are_invalid())
+ if (die.GetCU()->DW_AT_decl_file_attributes_are_invalid())
{
// llvm-gcc outputs invalid DW_AT_decl_file attributes that always
// point to the compile unit file, so we clear this invalid value
@@ -11184,7 +11112,7 @@ ClangASTContext::ParseTypeFromDWARF (con
break;
case DW_AT_name:
- type_name_cstr = form_value.AsCString(dwarf);
+ type_name_cstr = form_value.AsCString();
type_name_const_str.SetCString(type_name_cstr);
break;
@@ -11231,8 +11159,6 @@ ClangASTContext::ParseTypeFromDWARF (con
// Only try and unique the type if it has a name.
if (type_name_const_str &&
dwarf->GetUniqueDWARFASTTypeMap().Find (type_name_const_str,
- dwarf,
- dwarf_cu,
die,
decl,
byte_size_valid ? byte_size : -1,
@@ -11246,12 +11172,12 @@ ClangASTContext::ParseTypeFromDWARF (con
type_sp = unique_ast_entry_ap->m_type_sp;
if (type_sp)
{
- dwarf->m_die_to_type[die] = type_sp.get();
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
return type_sp;
}
}
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
+ DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
int tag_decl_kind = -1;
AccessType default_accessibility = eAccessNone;
@@ -11272,7 +11198,7 @@ ClangASTContext::ParseTypeFromDWARF (con
}
if (byte_size_valid && byte_size == 0 && type_name_cstr &&
- die->HasChildren() == false &&
+ die.HasChildren() == false &&
sc.comp_unit->GetLanguage() == eLanguageTypeObjC)
{
// Work around an issue with clang at the moment where
@@ -11292,7 +11218,7 @@ ClangASTContext::ParseTypeFromDWARF (con
if (class_language == eLanguageTypeObjC ||
class_language == eLanguageTypeObjC_plus_plus)
{
- if (!is_complete_objc_class && dwarf->Supports_DW_AT_APPLE_objc_complete_type(dwarf_cu))
+ if (!is_complete_objc_class && die.Supports_DW_AT_APPLE_objc_complete_type())
{
// We have a valid eSymbolTypeObjCClass class symbol whose
// name matches the current objective C class that we
@@ -11320,7 +11246,7 @@ ClangASTContext::ParseTypeFromDWARF (con
dwarf->GetObjectFile()->GetModule()->LogMessage (log,
"SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is an incomplete objc type, complete type is 0x%8.8" PRIx64,
static_cast<void*>(this),
- die->GetOffset(),
+ die.GetOffset(),
DW_TAG_value_to_name(tag),
type_name_cstr,
type_sp->GetID());
@@ -11329,7 +11255,7 @@ ClangASTContext::ParseTypeFromDWARF (con
// 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] = type_sp.get();
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
return type_sp;
}
}
@@ -11348,13 +11274,13 @@ ClangASTContext::ParseTypeFromDWARF (con
dwarf->GetObjectFile()->GetModule()->LogMessage (log,
"SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward declaration, trying to find complete type",
static_cast<void*>(this),
- die->GetOffset(),
+ die.GetOffset(),
DW_TAG_value_to_name(tag),
type_name_cstr);
}
DWARFDeclContext die_decl_ctx;
- die->GetDWARFDeclContext(dwarf, dwarf_cu, die_decl_ctx);
+ die.GetDWARFDeclContext(die_decl_ctx);
//type_sp = FindDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str);
type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
@@ -11378,7 +11304,7 @@ ClangASTContext::ParseTypeFromDWARF (con
dwarf->GetObjectFile()->GetModule()->LogMessage (log,
"SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward declaration, complete type is 0x%8.8" PRIx64,
static_cast<void*>(this),
- die->GetOffset(),
+ die.GetOffset(),
DW_TAG_value_to_name(tag),
type_name_cstr,
type_sp->GetID());
@@ -11387,18 +11313,16 @@ ClangASTContext::ParseTypeFromDWARF (con
// 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] = type_sp.get();
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
return type_sp;
}
}
assert (tag_decl_kind != -1);
bool clang_type_was_created = false;
- clang_type.SetCompilerType(this, dwarf->m_forward_decl_die_to_clang_type.lookup (die));
+ clang_type.SetCompilerType(this, dwarf->m_forward_decl_die_to_clang_type.lookup (die.GetDIE()));
if (!clang_type)
{
- const DWARFDebugInfoEntry *decl_ctx_die;
-
- clang::DeclContext *decl_ctx = GetClangDeclContextContainingDIE (dwarf, dwarf_cu, die, &decl_ctx_die);
+ clang::DeclContext *decl_ctx = GetClangDeclContextContainingDIE (die, nullptr);
if (accessibility == eAccessNone && decl_ctx)
{
// Check the decl context that contains this class/struct/union.
@@ -11409,16 +11333,15 @@ ClangASTContext::ParseTypeFromDWARF (con
}
ClangASTMetadata metadata;
- metadata.SetUserID(dwarf->MakeUserID(die->GetOffset()));
- metadata.SetIsDynamicCXXType(dwarf->ClassOrStructIsVirtual (dwarf_cu, die));
+ metadata.SetUserID(die.GetID());
+ metadata.SetIsDynamicCXXType(dwarf->ClassOrStructIsVirtual (die));
if (type_name_cstr && strchr (type_name_cstr, '<'))
{
ClangASTContext::TemplateParameterInfos template_param_infos;
- if (ParseTemplateParameterInfos (dwarf, dwarf_cu, die, template_param_infos))
+ if (ParseTemplateParameterInfos (die, template_param_infos))
{
- clang::ClassTemplateDecl *class_template_decl = ParseClassTemplateDecl (dwarf,
- decl_ctx,
+ clang::ClassTemplateDecl *class_template_decl = ParseClassTemplateDecl (decl_ctx,
accessibility,
type_name_cstr,
tag_decl_kind,
@@ -11452,7 +11375,7 @@ ClangASTContext::ParseTypeFromDWARF (con
// parameters in any class methods need it for the clang
// types for function prototypes.
LinkDeclContextToDIE(GetDeclContextForType(clang_type), die);
- type_sp.reset (new Type (dwarf->MakeUserID(die->GetOffset()),
+ type_sp.reset (new Type (die.GetID(),
dwarf,
type_name_const_str,
byte_size,
@@ -11470,23 +11393,21 @@ ClangASTContext::ParseTypeFromDWARF (con
// end up creating many copies of the same type over
// and over in the ASTContext for our module
unique_ast_entry_ap->m_type_sp = type_sp;
- unique_ast_entry_ap->m_symfile = dwarf;
- unique_ast_entry_ap->m_cu = dwarf_cu;
unique_ast_entry_ap->m_die = die;
unique_ast_entry_ap->m_declaration = decl;
unique_ast_entry_ap->m_byte_size = byte_size;
dwarf->GetUniqueDWARFASTTypeMap().Insert (type_name_const_str,
*unique_ast_entry_ap);
- if (is_forward_declaration && die->HasChildren())
+ if (is_forward_declaration && die.HasChildren())
{
// Check to see if the DIE actually has a definition, some version of GCC will
// emit DIEs with DW_AT_declaration set to true, but yet still have subprogram,
// members, or inheritance, so we can't trust it
- const DWARFDebugInfoEntry *child_die = die->GetFirstChild();
+ DWARFDIE child_die = die.GetFirstChild();
while (child_die)
{
- switch (child_die->Tag())
+ switch (child_die.Tag())
{
case DW_TAG_inheritance:
case DW_TAG_subprogram:
@@ -11497,11 +11418,11 @@ ClangASTContext::ParseTypeFromDWARF (con
case DW_TAG_enumeration_type:
case DW_TAG_typedef:
case DW_TAG_union_type:
- child_die = NULL;
+ child_die.Clear();
is_forward_declaration = false;
break;
default:
- child_die = child_die->GetSibling();
+ child_die = child_die.GetSibling();
break;
}
}
@@ -11513,7 +11434,7 @@ ClangASTContext::ParseTypeFromDWARF (con
// if the class has child classes or types that require
// the class to be created for use as their decl contexts
// the class will be ready to accept these child definitions.
- if (die->HasChildren() == false)
+ if (die.HasChildren() == false)
{
// No children for this struct/union/class, lets finish it
ClangASTContext::StartTagDeclarationDefinition (clang_type);
@@ -11546,8 +11467,8 @@ ClangASTContext::ParseTypeFromDWARF (con
// 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] = clang_type.GetOpaqueQualType();
- dwarf->m_forward_decl_clang_type_to_die[ClangASTContext::RemoveFastQualifiers(clang_type).GetOpaqueQualType()] = die;
+ 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();
SetHasExternalStorage (clang_type.GetOpaqueQualType(), true);
}
}
@@ -11558,14 +11479,11 @@ ClangASTContext::ParseTypeFromDWARF (con
case DW_TAG_enumeration_type:
{
// Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die] = DIE_IS_BEING_PARSED;
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
lldb::user_id_t encoding_uid = DW_INVALID_OFFSET;
- const size_t num_attributes = die->GetAttributes(dwarf,
- dwarf_cu,
- DWARFFormValue::FixedFormSizes(),
- attributes);
+ const size_t num_attributes = die.GetAttributes (attributes);
if (num_attributes > 0)
{
uint32_t i;
@@ -11573,7 +11491,7 @@ ClangASTContext::ParseTypeFromDWARF (con
for (i=0; i<num_attributes; ++i)
{
attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -11581,7 +11499,7 @@ ClangASTContext::ParseTypeFromDWARF (con
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:
- type_name_cstr = form_value.AsCString(dwarf);
+ 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;
@@ -11604,10 +11522,10 @@ ClangASTContext::ParseTypeFromDWARF (con
}
}
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
+ 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 (this, dwarf->m_forward_decl_die_to_clang_type.lookup (die));
+ clang_type.SetCompilerType (this, dwarf->m_forward_decl_die_to_clang_type.lookup (die.GetDIE()));
if (!clang_type)
{
if (encoding_uid != DW_INVALID_OFFSET)
@@ -11623,7 +11541,7 @@ ClangASTContext::ParseTypeFromDWARF (con
byte_size * 8);
clang_type = CreateEnumerationType (type_name_cstr,
- GetClangDeclContextContainingDIE (dwarf, dwarf_cu, die, NULL),
+ GetClangDeclContextContainingDIE (die, nullptr),
decl,
enumerator_clang_type);
}
@@ -11634,7 +11552,7 @@ ClangASTContext::ParseTypeFromDWARF (con
LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die);
- type_sp.reset( new Type (dwarf->MakeUserID(die->GetOffset()),
+ type_sp.reset( new Type (die.GetID(),
dwarf,
type_name_const_str,
byte_size,
@@ -11646,12 +11564,12 @@ ClangASTContext::ParseTypeFromDWARF (con
Type::eResolveStateForward));
ClangASTContext::StartTagDeclarationDefinition (clang_type);
- if (die->HasChildren())
+ if (die.HasChildren())
{
- SymbolContext cu_sc(dwarf->GetCompUnitForDWARFCompUnit(dwarf_cu));
+ SymbolContext cu_sc(die.GetLLDBCompileUnit());
bool is_signed = false;
enumerator_clang_type.IsIntegerType(is_signed);
- ParseChildEnumerators(cu_sc, clang_type, is_signed, type_sp->GetByteSize(), dwarf, dwarf_cu, die);
+ ParseChildEnumerators(cu_sc, clang_type, is_signed, type_sp->GetByteSize(), die);
}
ClangASTContext::CompleteTagDeclarationDefinition (clang_type);
}
@@ -11663,7 +11581,7 @@ ClangASTContext::ParseTypeFromDWARF (con
case DW_TAG_subroutine_type:
{
// Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die] = DIE_IS_BEING_PARSED;
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
//const char *mangled = NULL;
dw_offset_t type_die_offset = DW_INVALID_OFFSET;
@@ -11681,17 +11599,14 @@ ClangASTContext::ParseTypeFromDWARF (con
clang::StorageClass storage = clang::SC_None;//, Extern, Static, PrivateExtern
- const size_t num_attributes = die->GetAttributes(dwarf,
- dwarf_cu,
- DWARFFormValue::FixedFormSizes(),
- attributes);
+ const size_t num_attributes = die.GetAttributes (attributes);
if (num_attributes > 0)
{
uint32_t i;
for (i=0; i<num_attributes; ++i)
{
attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -11699,7 +11614,7 @@ ClangASTContext::ParseTypeFromDWARF (con
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:
- type_name_cstr = form_value.AsCString(dwarf);
+ type_name_cstr = form_value.AsCString();
type_name_const_str.SetCString(type_name_cstr);
break;
@@ -11768,15 +11683,16 @@ ClangASTContext::ParseTypeFromDWARF (con
std::string object_pointer_name;
if (object_pointer_die_offset != DW_INVALID_OFFSET)
{
- // Get the name from the object pointer die
- StreamString s;
- if (DWARFDebugInfoEntry::GetName (dwarf, dwarf_cu, object_pointer_die_offset, s))
+ DWARFDIE object_pointer_die = die.GetDIE (object_pointer_die_offset);
+ if (object_pointer_die)
{
- object_pointer_name.assign(s.GetData());
+ const char *object_pointer_name_cstr = object_pointer_die.GetName();
+ if (object_pointer_name_cstr)
+ object_pointer_name = object_pointer_name_cstr;
}
}
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
+ DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
CompilerType return_clang_type;
Type *func_type = NULL;
@@ -11795,8 +11711,8 @@ ClangASTContext::ParseTypeFromDWARF (con
// Parse the function children for the parameters
- const DWARFDebugInfoEntry *decl_ctx_die = NULL;
- clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf, dwarf_cu, die, &decl_ctx_die);
+ DWARFDIE decl_ctx_die;
+ clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (die, &decl_ctx_die);
const clang::Decl::Kind containing_decl_kind = containing_decl_ctx->getDeclKind();
const bool is_cxx_method = DeclKindIsCXXClass (containing_decl_kind);
@@ -11805,13 +11721,11 @@ ClangASTContext::ParseTypeFromDWARF (con
if (is_cxx_method)
is_static = true;
- if (die->HasChildren())
+ if (die.HasChildren())
{
bool skip_artificial = true;
ParseChildParameters (sc,
containing_decl_ctx,
- dwarf,
- dwarf_cu,
die,
skip_artificial,
is_static,
@@ -11843,7 +11757,7 @@ ClangASTContext::ParseTypeFromDWARF (con
ConstString class_name(objc_method.GetClassName());
if (class_name)
{
- TypeSP complete_objc_class_type_sp (dwarf->FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, false));
+ TypeSP complete_objc_class_type_sp (dwarf->FindCompleteObjCDefinitionTypeForDIE (DWARFDIE(), class_name, false));
if (complete_objc_class_type_sp)
{
@@ -11869,12 +11783,12 @@ ClangASTContext::ParseTypeFromDWARF (con
if (type_handled)
{
LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(objc_method_decl), die);
- SetMetadataAsUserID (objc_method_decl, dwarf->MakeUserID(die->GetOffset()));
+ SetMetadataAsUserID (objc_method_decl, die.GetID());
}
else
{
dwarf->GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: invalid Objective-C method 0x%4.4x (%s), please file a bug and attach the file at the start of this error message",
- die->GetOffset(),
+ die.GetOffset(),
tag,
DW_TAG_value_to_name(tag));
}
@@ -11885,40 +11799,35 @@ ClangASTContext::ParseTypeFromDWARF (con
// Look at the parent of this DIE and see if is is
// a class or struct and see if this is actually a
// C++ method
- Type *class_type = dwarf->ResolveType (dwarf_cu, decl_ctx_die);
+ Type *class_type = dwarf->ResolveType (decl_ctx_die);
if (class_type)
{
- if (class_type->GetID() != dwarf->MakeUserID(decl_ctx_die->GetOffset()))
+ if (class_type->GetID() != decl_ctx_die.GetID())
{
// We uniqued the parent class of this function to another class
// so we now need to associate all dies under "decl_ctx_die" to
// DIEs in the DIE for "class_type"...
SymbolFileDWARF *class_symfile = NULL;
- DWARFCompileUnitSP class_type_cu_sp;
- const DWARFDebugInfoEntry *class_type_die = NULL;
+ DWARFDIE class_type_die;
SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile();
if (debug_map_symfile)
{
class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(class_type->GetID()));
- class_type_die = class_symfile->DebugInfo()->GetDIEPtr(class_type->GetID(), &class_type_cu_sp);
+ class_type_die = class_symfile->DebugInfo()->GetDIE (class_type->GetID());
}
else
{
class_symfile = dwarf;
- class_type_die = dwarf->DebugInfo()->GetDIEPtr(class_type->GetID(), &class_type_cu_sp);
+ class_type_die = dwarf->DebugInfo()->GetDIE (class_type->GetID());
}
if (class_type_die)
{
DWARFDIECollection failures;
- CopyUniqueClassMethodTypes (dwarf,
- class_symfile,
- class_type,
- class_type_cu_sp.get(),
+ CopyUniqueClassMethodTypes (decl_ctx_die,
class_type_die,
- dwarf_cu,
- decl_ctx_die,
+ class_type,
failures);
// FIXME do something with these failures that's smarter than
@@ -11926,7 +11835,7 @@ ClangASTContext::ParseTypeFromDWARF (con
// like having stuff added to them after their definitions are
// complete...
- type_ptr = dwarf->m_die_to_type[die];
+ type_ptr = dwarf->m_die_to_type[die.GetDIE()];
if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
{
type_sp = type_ptr->shared_from_this();
@@ -11944,9 +11853,8 @@ ClangASTContext::ParseTypeFromDWARF (con
class_type->GetForwardCompilerType ();
// If we have a specification, then the function type should have been
// made with the specification and not with this die.
- DWARFCompileUnitSP spec_cu_sp;
- const DWARFDebugInfoEntry* spec_die = dwarf->DebugInfo()->GetDIEPtr(specification_die_offset, &spec_cu_sp);
- clang::DeclContext *spec_clang_decl_ctx = GetClangDeclContextForDIE (dwarf, dwarf_cu, spec_die);
+ DWARFDIE spec_die = dwarf->DebugInfo()->GetDIE(specification_die_offset);
+ clang::DeclContext *spec_clang_decl_ctx = GetClangDeclContextForDIE (spec_die);
if (spec_clang_decl_ctx)
{
LinkDeclContextToDIE(spec_clang_decl_ctx, die);
@@ -11954,7 +11862,7 @@ ClangASTContext::ParseTypeFromDWARF (con
else
{
dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_specification(0x%8.8x) has no decl\n",
- dwarf->MakeUserID(die->GetOffset()),
+ die.GetID(),
specification_die_offset);
}
type_handled = true;
@@ -11967,9 +11875,8 @@ ClangASTContext::ParseTypeFromDWARF (con
// clang decl context.
class_type->GetForwardCompilerType ();
- DWARFCompileUnitSP abs_cu_sp;
- const DWARFDebugInfoEntry* abs_die = dwarf->DebugInfo()->GetDIEPtr(abstract_origin_die_offset, &abs_cu_sp);
- clang::DeclContext *abs_clang_decl_ctx = GetClangDeclContextForDIE (dwarf, dwarf_cu, abs_die);
+ DWARFDIE abs_die = dwarf->DebugInfo()->GetDIE (abstract_origin_die_offset);
+ clang::DeclContext *abs_clang_decl_ctx = GetClangDeclContextForDIE (abs_die);
if (abs_clang_decl_ctx)
{
LinkDeclContextToDIE (abs_clang_decl_ctx, die);
@@ -11977,7 +11884,7 @@ ClangASTContext::ParseTypeFromDWARF (con
else
{
dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_abstract_origin(0x%8.8x) has no decl\n",
- dwarf->MakeUserID(die->GetOffset()),
+ die.GetID(),
abstract_origin_die_offset);
}
type_handled = true;
@@ -11994,7 +11901,7 @@ ClangASTContext::ParseTypeFromDWARF (con
if (accessibility == eAccessNone)
accessibility = eAccessPublic;
- if (!is_static && !die->HasChildren())
+ if (!is_static && !die.HasChildren())
{
// We have a C++ member function with no children (this pointer!)
// and clang will get mad if we try and make a function that isn't
@@ -12008,7 +11915,7 @@ ClangASTContext::ParseTypeFromDWARF (con
Host::SetCrashDescriptionWithFormat ("SymbolFileDWARF::ParseType() is adding a method %s to class %s in DIE 0x%8.8" PRIx64 " from %s",
type_name_cstr,
class_type->GetName().GetCString(),
- dwarf->MakeUserID(die->GetOffset()),
+ die.GetID(),
dwarf->GetObjectFile()->GetFileSpec().GetPath().c_str());
const bool is_attr_used = false;
@@ -12034,7 +11941,7 @@ ClangASTContext::ParseTypeFromDWARF (con
ClangASTMetadata metadata;
- metadata.SetUserID(dwarf->MakeUserID(die->GetOffset()));
+ metadata.SetUserID(die.GetID());
if (!object_pointer_name.empty())
{
@@ -12061,7 +11968,7 @@ ClangASTContext::ParseTypeFromDWARF (con
// 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
// trying to parse this DIE anymore...
- dwarf->m_die_to_type[die] = NULL;
+ dwarf->m_die_to_type[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
@@ -12069,7 +11976,7 @@ ClangASTContext::ParseTypeFromDWARF (con
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];
+ type_ptr = dwarf->m_die_to_type[die.GetDIE()];
if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
{
type_sp = type_ptr->shared_from_this();
@@ -12116,7 +12023,7 @@ ClangASTContext::ParseTypeFromDWARF (con
function_param_decls.size());
ClangASTMetadata metadata;
- metadata.SetUserID(dwarf->MakeUserID(die->GetOffset()));
+ metadata.SetUserID(die.GetID());
if (!object_pointer_name.empty())
{
@@ -12129,7 +12036,7 @@ ClangASTContext::ParseTypeFromDWARF (con
SetMetadata (function_decl, metadata);
}
}
- type_sp.reset( new Type (dwarf->MakeUserID(die->GetOffset()),
+ type_sp.reset( new Type (die.GetID(),
dwarf,
type_name_const_str,
0,
@@ -12146,17 +12053,14 @@ ClangASTContext::ParseTypeFromDWARF (con
case DW_TAG_array_type:
{
// Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die] = DIE_IS_BEING_PARSED;
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
lldb::user_id_t type_die_offset = DW_INVALID_OFFSET;
int64_t first_index = 0;
uint32_t byte_stride = 0;
uint32_t bit_stride = 0;
bool is_vector = false;
- const size_t num_attributes = die->GetAttributes(dwarf,
- dwarf_cu,
- DWARFFormValue::FixedFormSizes(),
- attributes);
+ const size_t num_attributes = die.GetAttributes (attributes);
if (num_attributes > 0)
{
@@ -12164,7 +12068,7 @@ ClangASTContext::ParseTypeFromDWARF (con
for (i=0; i<num_attributes; ++i)
{
attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -12172,7 +12076,7 @@ ClangASTContext::ParseTypeFromDWARF (con
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:
- type_name_cstr = form_value.AsCString(dwarf);
+ type_name_cstr = form_value.AsCString();
type_name_const_str.SetCString(type_name_cstr);
break;
@@ -12198,14 +12102,14 @@ ClangASTContext::ParseTypeFromDWARF (con
}
}
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
+ 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);
if (element_type)
{
std::vector<uint64_t> element_orders;
- ParseChildArrayInfo(sc, dwarf, dwarf_cu, die, first_index, element_orders, byte_stride, bit_stride);
+ ParseChildArrayInfo(sc, die, first_index, element_orders, byte_stride, bit_stride);
if (byte_stride == 0 && bit_stride == 0)
byte_stride = element_type->GetByteSize();
CompilerType array_element_type = element_type->GetForwardCompilerType ();
@@ -12232,7 +12136,7 @@ ClangASTContext::ParseTypeFromDWARF (con
clang_type = CreateArrayType (array_element_type, 0, is_vector);
}
ConstString empty_name;
- type_sp.reset( new Type (dwarf->MakeUserID(die->GetOffset()),
+ type_sp.reset( new Type (die.GetID(),
dwarf,
empty_name,
array_element_bit_stride / 8,
@@ -12253,17 +12157,14 @@ ClangASTContext::ParseTypeFromDWARF (con
dw_offset_t type_die_offset = DW_INVALID_OFFSET;
dw_offset_t containing_type_die_offset = DW_INVALID_OFFSET;
- const size_t num_attributes = die->GetAttributes(dwarf,
- dwarf_cu,
- DWARFFormValue::FixedFormSizes(),
- attributes);
+ const size_t num_attributes = die.GetAttributes (attributes);
if (num_attributes > 0) {
uint32_t i;
for (i=0; i<num_attributes; ++i)
{
attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(dwarf, i, form_value))
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
@@ -12285,7 +12186,7 @@ ClangASTContext::ParseTypeFromDWARF (con
byte_size = clang_type.GetByteSize(nullptr);
- type_sp.reset( new Type (dwarf->MakeUserID(die->GetOffset()),
+ type_sp.reset( new Type (die.GetID(),
dwarf,
type_name_const_str,
byte_size,
@@ -12301,7 +12202,7 @@ ClangASTContext::ParseTypeFromDWARF (con
}
default:
dwarf->GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: unhandled type tag 0x%4.4x (%s), please file a bug and attach the file at the start of this error message",
- die->GetOffset(),
+ die.GetOffset(),
tag,
DW_TAG_value_to_name(tag));
break;
@@ -12309,8 +12210,8 @@ ClangASTContext::ParseTypeFromDWARF (con
if (type_sp.get())
{
- const DWARFDebugInfoEntry *sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
- dw_tag_t sc_parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0;
+ DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
+ dw_tag_t sc_parent_tag = sc_parent_die.Tag();
SymbolContextScope * symbol_context_scope = NULL;
if (sc_parent_tag == DW_TAG_compile_unit)
@@ -12319,7 +12220,7 @@ ClangASTContext::ParseTypeFromDWARF (con
}
else if (sc.function != NULL && sc_parent_die)
{
- symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(dwarf->MakeUserID(sc_parent_die->GetOffset()));
+ symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
if (symbol_context_scope == NULL)
symbol_context_scope = sc.function;
}
@@ -12332,7 +12233,7 @@ ClangASTContext::ParseTypeFromDWARF (con
// 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] = type_sp.get();
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
}
}
else if (type_ptr != DIE_IS_BEING_PARSED)
@@ -12344,19 +12245,23 @@ ClangASTContext::ParseTypeFromDWARF (con
}
+void
+ClangASTContext::LinkDeclContextToDIE (clang::DeclContext *decl_ctx, const DWARFDIE &die)
+{
+ m_die_to_decl_ctx[die.GetDIE()] = decl_ctx;
+ // There can be many DIEs for a single decl context
+ m_decl_ctx_to_die[decl_ctx].insert(die.GetDIE());
+}
+
bool
-ClangASTContext::CopyUniqueClassMethodTypes (SymbolFileDWARF *dst_symfile,
- SymbolFileDWARF *src_symfile,
+ClangASTContext::CopyUniqueClassMethodTypes (const DWARFDIE &src_class_die,
+ const DWARFDIE &dst_class_die,
lldb_private::Type *class_type,
- DWARFCompileUnit* src_cu,
- const DWARFDebugInfoEntry *src_class_die,
- DWARFCompileUnit* dst_cu,
- const DWARFDebugInfoEntry *dst_class_die,
DWARFDIECollection &failures)
{
- if (!class_type || !src_cu || !src_class_die || !dst_cu || !dst_class_die)
+ if (!class_type || !src_class_die || !dst_class_die)
return false;
- if (src_class_die->Tag() != dst_class_die->Tag())
+ if (src_class_die.Tag() != dst_class_die.Tag())
return false;
// We need to complete the class type so we can get all of the method types
@@ -12364,27 +12269,27 @@ ClangASTContext::CopyUniqueClassMethodTy
// in "dst_cu" and "dst_class_die"
class_type->GetFullCompilerType ();
- const DWARFDebugInfoEntry *src_die;
- const DWARFDebugInfoEntry *dst_die;
- UniqueCStringMap<const DWARFDebugInfoEntry *> src_name_to_die;
- UniqueCStringMap<const DWARFDebugInfoEntry *> dst_name_to_die;
- UniqueCStringMap<const DWARFDebugInfoEntry *> src_name_to_die_artificial;
- UniqueCStringMap<const DWARFDebugInfoEntry *> dst_name_to_die_artificial;
- for (src_die = src_class_die->GetFirstChild(); src_die != NULL; src_die = src_die->GetSibling())
+ DWARFDIE src_die;
+ DWARFDIE dst_die;
+ UniqueCStringMap<DWARFDIE> src_name_to_die;
+ UniqueCStringMap<DWARFDIE> dst_name_to_die;
+ UniqueCStringMap<DWARFDIE> src_name_to_die_artificial;
+ UniqueCStringMap<DWARFDIE> dst_name_to_die_artificial;
+ for (src_die = src_class_die.GetFirstChild(); src_die.IsValid(); src_die = src_die.GetSibling())
{
- if (src_die->Tag() == DW_TAG_subprogram)
+ if (src_die.Tag() == DW_TAG_subprogram)
{
// Make sure this is a declaration and not a concrete instance by looking
// for DW_AT_declaration set to 1. Sometimes concrete function instances
// are placed inside the class definitions and shouldn't be included in
// the list of things are are tracking here.
- if (src_die->GetAttributeValueAsUnsigned(src_symfile, src_cu, DW_AT_declaration, 0) == 1)
+ if (src_die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0) == 1)
{
- const char *src_name = src_die->GetMangledName (src_symfile, src_cu);
+ const char *src_name = src_die.GetMangledName ();
if (src_name)
{
ConstString src_const_name(src_name);
- if (src_die->GetAttributeValueAsUnsigned(src_symfile, src_cu, DW_AT_artificial, 0))
+ if (src_die.GetAttributeValueAsUnsigned(DW_AT_artificial, 0))
src_name_to_die_artificial.Append(src_const_name.GetCString(), src_die);
else
src_name_to_die.Append(src_const_name.GetCString(), src_die);
@@ -12392,21 +12297,21 @@ ClangASTContext::CopyUniqueClassMethodTy
}
}
}
- for (dst_die = dst_class_die->GetFirstChild(); dst_die != NULL; dst_die = dst_die->GetSibling())
+ for (dst_die = dst_class_die.GetFirstChild(); dst_die.IsValid(); dst_die = dst_die.GetSibling())
{
- if (dst_die->Tag() == DW_TAG_subprogram)
+ if (dst_die.Tag() == DW_TAG_subprogram)
{
// Make sure this is a declaration and not a concrete instance by looking
// for DW_AT_declaration set to 1. Sometimes concrete function instances
// are placed inside the class definitions and shouldn't be included in
// the list of things are are tracking here.
- if (dst_die->GetAttributeValueAsUnsigned(dst_symfile, dst_cu, DW_AT_declaration, 0) == 1)
+ if (dst_die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0) == 1)
{
- const char *dst_name = dst_die->GetMangledName (dst_symfile, dst_cu);
+ const char *dst_name = dst_die.GetMangledName ();
if (dst_name)
{
ConstString dst_const_name(dst_name);
- if (dst_die->GetAttributeValueAsUnsigned(dst_symfile, dst_cu, DW_AT_artificial, 0))
+ if ( dst_die.GetAttributeValueAsUnsigned(DW_AT_artificial, 0))
dst_name_to_die_artificial.Append(dst_const_name.GetCString(), dst_die);
else
dst_name_to_die.Append(dst_const_name.GetCString(), dst_die);
@@ -12427,8 +12332,8 @@ ClangASTContext::CopyUniqueClassMethodTy
{
if (log)
log->Printf("warning: trying to unique class DIE 0x%8.8x to 0x%8.8x, but they didn't have the same size (src=%d, dst=%d)",
- src_class_die->GetOffset(),
- dst_class_die->GetOffset(),
+ src_class_die.GetOffset(),
+ dst_class_die.GetOffset(),
src_size,
dst_size);
}
@@ -12445,21 +12350,21 @@ ClangASTContext::CopyUniqueClassMethodTy
src_die = src_name_to_die.GetValueAtIndexUnchecked (idx);
dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx);
- if (src_die->Tag() != dst_die->Tag())
+ if (src_die.Tag() != dst_die.Tag())
{
if (log)
log->Printf("warning: tried to unique class DIE 0x%8.8x to 0x%8.8x, but 0x%8.8x (%s) tags didn't match 0x%8.8x (%s)",
- src_class_die->GetOffset(),
- dst_class_die->GetOffset(),
- src_die->GetOffset(),
- DW_TAG_value_to_name(src_die->Tag()),
- dst_die->GetOffset(),
- DW_TAG_value_to_name(src_die->Tag()));
+ src_class_die.GetOffset(),
+ dst_class_die.GetOffset(),
+ src_die.GetOffset(),
+ src_die.GetTagAsCString(),
+ dst_die.GetOffset(),
+ dst_die.GetTagAsCString());
fast_path = false;
}
- const char *src_name = src_die->GetMangledName (src_symfile, src_cu);
- const char *dst_name = dst_die->GetMangledName (dst_symfile, dst_cu);
+ const char *src_name = src_die.GetMangledName ();
+ const char *dst_name = dst_die.GetMangledName ();
// Make sure the names match
if (src_name == dst_name || (strcmp (src_name, dst_name) == 0))
@@ -12467,11 +12372,11 @@ ClangASTContext::CopyUniqueClassMethodTy
if (log)
log->Printf("warning: tried to unique class DIE 0x%8.8x to 0x%8.8x, but 0x%8.8x (%s) names didn't match 0x%8.8x (%s)",
- src_class_die->GetOffset(),
- dst_class_die->GetOffset(),
- src_die->GetOffset(),
+ src_class_die.GetOffset(),
+ dst_class_die.GetOffset(),
+ src_die.GetOffset(),
src_name,
- dst_die->GetOffset(),
+ dst_die.GetOffset(),
dst_name);
fast_path = false;
@@ -12488,36 +12393,36 @@ ClangASTContext::CopyUniqueClassMethodTy
src_die = src_name_to_die.GetValueAtIndexUnchecked (idx);
dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx);
- clang::DeclContext *src_decl_ctx = src_symfile->GetClangASTContext().m_die_to_decl_ctx[src_die];
+ clang::DeclContext *src_decl_ctx = src_die.GetDWARF()->GetClangASTContext().m_die_to_decl_ctx[src_die.GetDIE()];
if (src_decl_ctx)
{
if (log)
log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x",
static_cast<void*>(src_decl_ctx),
- src_die->GetOffset(), dst_die->GetOffset());
- dst_symfile->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die);
+ src_die.GetOffset(), dst_die.GetOffset());
+ dst_die.GetDWARF()->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die);
}
else
{
if (log)
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());
+ src_die.GetOffset(), dst_die.GetOffset());
}
- Type *src_child_type = dst_symfile->m_die_to_type[src_die];
+ Type *src_child_type = dst_die.GetDWARF()->m_die_to_type[src_die.GetDIE()];
if (src_child_type)
{
if (log)
log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x",
static_cast<void*>(src_child_type),
src_child_type->GetID(),
- src_die->GetOffset(), dst_die->GetOffset());
- dst_symfile->m_die_to_type[dst_die] = src_child_type;
+ src_die.GetOffset(), dst_die.GetOffset());
+ dst_die.GetDWARF()->m_die_to_type[dst_die.GetDIE()] = src_child_type;
}
else
{
if (log)
- log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
+ log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die.GetOffset(), dst_die.GetOffset());
}
}
}
@@ -12535,47 +12440,47 @@ ClangASTContext::CopyUniqueClassMethodTy
{
const char *dst_name = dst_name_to_die.GetCStringAtIndex(idx);
dst_die = dst_name_to_die.GetValueAtIndexUnchecked(idx);
- src_die = src_name_to_die.Find(dst_name, NULL);
+ src_die = src_name_to_die.Find(dst_name, DWARFDIE());
- if (src_die && (src_die->Tag() == dst_die->Tag()))
+ if (src_die && (src_die.Tag() == dst_die.Tag()))
{
- clang::DeclContext *src_decl_ctx = src_symfile->GetClangASTContext().m_die_to_decl_ctx[src_die];
+ clang::DeclContext *src_decl_ctx = src_die.GetDWARF()->GetClangASTContext().m_die_to_decl_ctx[src_die.GetDIE()];
if (src_decl_ctx)
{
if (log)
log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x",
static_cast<void*>(src_decl_ctx),
- src_die->GetOffset(),
- dst_die->GetOffset());
- dst_symfile->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die);
+ src_die.GetOffset(),
+ dst_die.GetOffset());
+ dst_die.GetDWARF()->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die);
}
else
{
if (log)
- 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());
+ 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_symfile->m_die_to_type[src_die];
+ Type *src_child_type = dst_die.GetDWARF()->m_die_to_type[src_die.GetDIE()];
if (src_child_type)
{
if (log)
log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x",
static_cast<void*>(src_child_type),
src_child_type->GetID(),
- src_die->GetOffset(),
- dst_die->GetOffset());
- dst_symfile->m_die_to_type[dst_die] = src_child_type;
+ src_die.GetOffset(),
+ dst_die.GetOffset());
+ dst_die.GetDWARF()->m_die_to_type[dst_die.GetDIE()] = src_child_type;
}
else
{
if (log)
- log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
+ log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die.GetOffset(), dst_die.GetOffset());
}
}
else
{
if (log)
- log->Printf ("warning: couldn't find a match for 0x%8.8x", dst_die->GetOffset());
+ log->Printf ("warning: couldn't find a match for 0x%8.8x", dst_die.GetOffset());
failures.Append(dst_die);
}
@@ -12596,40 +12501,40 @@ ClangASTContext::CopyUniqueClassMethodTy
{
const char *src_name_artificial = src_name_to_die_artificial.GetCStringAtIndex(idx);
src_die = src_name_to_die_artificial.GetValueAtIndexUnchecked (idx);
- dst_die = dst_name_to_die_artificial.Find(src_name_artificial, NULL);
+ dst_die = dst_name_to_die_artificial.Find(src_name_artificial, DWARFDIE());
if (dst_die)
{
// Both classes have the artificial types, link them
- clang::DeclContext *src_decl_ctx = dst_symfile->GetClangASTContext().m_die_to_decl_ctx[src_die];
+ clang::DeclContext *src_decl_ctx = dst_die.GetDWARF()->GetClangASTContext().m_die_to_decl_ctx[src_die.GetDIE()];
if (src_decl_ctx)
{
if (log)
log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x",
static_cast<void*>(src_decl_ctx),
- src_die->GetOffset(), dst_die->GetOffset());
- dst_symfile->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die);
+ src_die.GetOffset(), dst_die.GetOffset());
+ dst_die.GetDWARF()->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die);
}
else
{
if (log)
- 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());
+ 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_symfile->m_die_to_type[src_die];
+ Type *src_child_type = dst_die.GetDWARF()->m_die_to_type[src_die.GetDIE()];
if (src_child_type)
{
if (log)
log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x",
static_cast<void*>(src_child_type),
src_child_type->GetID(),
- src_die->GetOffset(), dst_die->GetOffset());
- dst_symfile->m_die_to_type[dst_die] = src_child_type;
+ src_die.GetOffset(), dst_die.GetOffset());
+ dst_die.GetDWARF()->m_die_to_type[dst_die.GetDIE()] = src_child_type;
}
else
{
if (log)
- log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
+ log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die.GetOffset(), dst_die.GetOffset());
}
}
}
@@ -12642,7 +12547,7 @@ ClangASTContext::CopyUniqueClassMethodTy
const char *dst_name_artificial = dst_name_to_die_artificial.GetCStringAtIndex(idx);
dst_die = dst_name_to_die_artificial.GetValueAtIndexUnchecked (idx);
if (log)
- log->Printf ("warning: need to create artificial method for 0x%8.8x for method '%s'", dst_die->GetOffset(), dst_name_artificial);
+ log->Printf ("warning: need to create artificial method for 0x%8.8x for method '%s'", dst_die.GetOffset(), dst_name_artificial);
failures.Append(dst_die);
}
Modified: lldb/trunk/source/Symbol/TypeSystem.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeSystem.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/TypeSystem.cpp (original)
+++ lldb/trunk/source/Symbol/TypeSystem.cpp Wed Aug 26 17:57:51 2015
@@ -17,5 +17,4 @@ TypeSystem::TypeSystem() :
TypeSystem::~TypeSystem()
{
-
}
Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=246100&r1=246099&r2=246100&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Wed Aug 26 17:57:51 2015
@@ -2177,7 +2177,7 @@ Target::GetBreakableLoadAddress (lldb::a
{
SymbolContext sc;
uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
- uint32_t resolved_mask = temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr, resolve_scope, sc);
+ temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr, resolve_scope, sc);
if (sc.function)
{
function_start = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(this);
@@ -2225,7 +2225,7 @@ Target::GetBreakableLoadAddress (lldb::a
AddressRange range(resolved_addr, i*2);
uint32_t insn_size = 0;
- uint32_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, range, NULL, prefer_file_cache);
+ disasm_sp->ParseInstructions (&exe_ctx, range, NULL, prefer_file_cache);
uint32_t num_insns = disasm_sp->GetInstructionList().GetSize();
if (num_insns)
More information about the lldb-commits
mailing list