summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/SymbolFile/DWARF
diff options
context:
space:
mode:
authorKate Stone <katherine.stone@apple.com>2016-09-06 20:57:50 +0000
committerKate Stone <katherine.stone@apple.com>2016-09-06 20:57:50 +0000
commitb9c1b51e45b845debb76d8658edabca70ca56079 (patch)
treedfcb5a13ef2b014202340f47036da383eaee74aa /lldb/source/Plugins/SymbolFile/DWARF
parentd5aa73376966339caad04013510626ec2e42c760 (diff)
downloadbcm5719-llvm-b9c1b51e45b845debb76d8658edabca70ca56079.tar.gz
bcm5719-llvm-b9c1b51e45b845debb76d8658edabca70ca56079.zip
*** This commit represents a complete reformatting of the LLDB source code
*** to conform to clang-format’s LLVM style. This kind of mass change has *** two obvious implications: Firstly, merging this particular commit into a downstream fork may be a huge effort. Alternatively, it may be worth merging all changes up to this commit, performing the same reformatting operation locally, and then discarding the merge for this particular commit. The commands used to accomplish this reformatting were as follows (with current working directory as the root of the repository): find . \( -iname "*.c" -or -iname "*.cpp" -or -iname "*.h" -or -iname "*.mm" \) -exec clang-format -i {} + find . -iname "*.py" -exec autopep8 --in-place --aggressive --aggressive {} + ; The version of clang-format used was 3.9.0, and autopep8 was 1.2.4. Secondly, “blame” style tools will generally point to this commit instead of a meaningful prior commit. There are alternatives available that will attempt to look through this change and find the appropriate prior commit. YMMV. llvm-svn: 280751
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/DWARF')
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp113
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DIERef.h60
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h45
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp7612
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h246
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp1391
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.h88
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp932
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.h93
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp355
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h60
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp139
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h101
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp108
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h106
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp1997
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h438
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp784
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h350
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp34
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h36
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp19
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h31
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp209
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.h84
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp472
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.h100
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp204
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h108
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp941
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h116
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp3300
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h629
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp1903
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h398
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.cpp43
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.h17
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.cpp179
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.h47
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.cpp187
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.h60
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp436
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.h32
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.cpp234
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.h123
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp220
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h37
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp152
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h143
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp900
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h126
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp1068
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h154
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp1249
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h350
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp350
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.h89
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp102
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h51
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp7818
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h897
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp2577
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h712
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp149
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h74
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp118
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h182
67 files changed, 20035 insertions, 22443 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp
index 5fe0cc4d416..5ed9c6ab728 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp
@@ -9,83 +9,64 @@
#include "DIERef.h"
#include "DWARFCompileUnit.h"
-#include "DWARFFormValue.h"
#include "DWARFDebugInfo.h"
+#include "DWARFFormValue.h"
#include "SymbolFileDWARF.h"
#include "SymbolFileDWARFDebugMap.h"
-DIERef::DIERef() :
- cu_offset(DW_INVALID_OFFSET),
- die_offset(DW_INVALID_OFFSET)
-{}
+DIERef::DIERef()
+ : cu_offset(DW_INVALID_OFFSET), die_offset(DW_INVALID_OFFSET) {}
-DIERef::DIERef(dw_offset_t c, dw_offset_t d) :
- cu_offset(c),
- die_offset(d)
-{}
+DIERef::DIERef(dw_offset_t c, dw_offset_t d) : cu_offset(c), die_offset(d) {}
-DIERef::DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf) :
- cu_offset(DW_INVALID_OFFSET),
- die_offset(uid&0xffffffff)
-{
- SymbolFileDWARFDebugMap *debug_map = dwarf->GetDebugMapSymfile();
- if (debug_map)
- {
- const uint32_t oso_idx = debug_map->GetOSOIndexFromUserID(uid);
- SymbolFileDWARF *actual_dwarf = debug_map->GetSymbolFileByOSOIndex(oso_idx);
- if (actual_dwarf)
- {
- DWARFDebugInfo *debug_info = actual_dwarf->DebugInfo();
- if (debug_info)
- {
- DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitContainingDIEOffset(die_offset);
- if (dwarf_cu)
- {
- cu_offset = dwarf_cu->GetOffset();
- return;
- }
- }
+DIERef::DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf)
+ : cu_offset(DW_INVALID_OFFSET), die_offset(uid & 0xffffffff) {
+ SymbolFileDWARFDebugMap *debug_map = dwarf->GetDebugMapSymfile();
+ if (debug_map) {
+ const uint32_t oso_idx = debug_map->GetOSOIndexFromUserID(uid);
+ SymbolFileDWARF *actual_dwarf = debug_map->GetSymbolFileByOSOIndex(oso_idx);
+ if (actual_dwarf) {
+ DWARFDebugInfo *debug_info = actual_dwarf->DebugInfo();
+ if (debug_info) {
+ DWARFCompileUnit *dwarf_cu =
+ debug_info->GetCompileUnitContainingDIEOffset(die_offset);
+ if (dwarf_cu) {
+ cu_offset = dwarf_cu->GetOffset();
+ return;
}
- die_offset = DW_INVALID_OFFSET;
- }
- else
- {
- cu_offset = uid>>32;
+ }
}
+ die_offset = DW_INVALID_OFFSET;
+ } else {
+ cu_offset = uid >> 32;
+ }
}
-DIERef::DIERef(const DWARFFormValue& form_value) :
- cu_offset(DW_INVALID_OFFSET),
- die_offset(DW_INVALID_OFFSET)
-{
- if (form_value.IsValid())
- {
- const DWARFCompileUnit* dwarf_cu = form_value.GetCompileUnit();
- if (dwarf_cu)
- {
- if (dwarf_cu->GetBaseObjOffset() != DW_INVALID_OFFSET)
- cu_offset = dwarf_cu->GetBaseObjOffset();
- else
- cu_offset = dwarf_cu->GetOffset();
- }
- die_offset = form_value.Reference();
+DIERef::DIERef(const DWARFFormValue &form_value)
+ : cu_offset(DW_INVALID_OFFSET), die_offset(DW_INVALID_OFFSET) {
+ if (form_value.IsValid()) {
+ const DWARFCompileUnit *dwarf_cu = form_value.GetCompileUnit();
+ if (dwarf_cu) {
+ if (dwarf_cu->GetBaseObjOffset() != DW_INVALID_OFFSET)
+ cu_offset = dwarf_cu->GetBaseObjOffset();
+ else
+ cu_offset = dwarf_cu->GetOffset();
}
+ die_offset = form_value.Reference();
+ }
}
-lldb::user_id_t
-DIERef::GetUID(SymbolFileDWARF *dwarf) const
-{
- //----------------------------------------------------------------------
- // Each SymbolFileDWARF will set its ID to what is expected.
- //
- // SymbolFileDWARF, when used for DWARF with .o files on MacOSX, has the
- // ID set to the compile unit index.
- //
- // SymbolFileDWARFDwo sets the ID to the compile unit offset.
- //----------------------------------------------------------------------
- if (dwarf)
- return dwarf->GetID() | die_offset;
- else
- return LLDB_INVALID_UID;
+lldb::user_id_t DIERef::GetUID(SymbolFileDWARF *dwarf) const {
+ //----------------------------------------------------------------------
+ // Each SymbolFileDWARF will set its ID to what is expected.
+ //
+ // SymbolFileDWARF, when used for DWARF with .o files on MacOSX, has the
+ // ID set to the compile unit index.
+ //
+ // SymbolFileDWARFDwo sets the ID to the compile unit offset.
+ //----------------------------------------------------------------------
+ if (dwarf)
+ return dwarf->GetID() | die_offset;
+ else
+ return LLDB_INVALID_UID;
}
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
index ad4ad45623a..d0048d0f6d6 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h
@@ -16,49 +16,39 @@
class DWARFFormValue;
class SymbolFileDWARF;
-struct DIERef
-{
- DIERef();
+struct DIERef {
+ DIERef();
- DIERef(dw_offset_t c, dw_offset_t d);
+ DIERef(dw_offset_t c, dw_offset_t d);
- //----------------------------------------------------------------------
- // In order to properly decode a lldb::user_id_t back into a DIERef we
- // need the DWARF file since it knows if DWARF in .o files is being used
- // (MacOSX) or if DWO files are being used. The encoding of the user ID
- // differs between the two types of DWARF.
- //----------------------------------------------------------------------
- explicit
- DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf);
+ //----------------------------------------------------------------------
+ // In order to properly decode a lldb::user_id_t back into a DIERef we
+ // need the DWARF file since it knows if DWARF in .o files is being used
+ // (MacOSX) or if DWO files are being used. The encoding of the user ID
+ // differs between the two types of DWARF.
+ //----------------------------------------------------------------------
+ explicit DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf);
- explicit
- DIERef(const DWARFFormValue& form_value);
+ explicit DIERef(const DWARFFormValue &form_value);
- //----------------------------------------------------------------------
- // In order to properly encode a DIERef unto a lldb::user_id_t we need
- // the DWARF file since it knows if DWARF in .o files is being used
- // (MacOSX) or if DWO files are being used. The encoding of the user ID
- // differs between the two types of DWARF.
- //----------------------------------------------------------------------
- lldb::user_id_t
- GetUID(SymbolFileDWARF *dwarf) const;
+ //----------------------------------------------------------------------
+ // In order to properly encode a DIERef unto a lldb::user_id_t we need
+ // the DWARF file since it knows if DWARF in .o files is being used
+ // (MacOSX) or if DWO files are being used. The encoding of the user ID
+ // differs between the two types of DWARF.
+ //----------------------------------------------------------------------
+ lldb::user_id_t GetUID(SymbolFileDWARF *dwarf) const;
- bool
- operator< (const DIERef &ref) const
- {
- return die_offset < ref.die_offset;
- }
+ bool operator<(const DIERef &ref) const {
+ return die_offset < ref.die_offset;
+ }
- bool
- operator< (const DIERef &ref)
- {
- return die_offset < ref.die_offset;
- }
+ bool operator<(const DIERef &ref) { return die_offset < ref.die_offset; }
- dw_offset_t cu_offset;
- dw_offset_t die_offset;
+ dw_offset_t cu_offset;
+ dw_offset_t die_offset;
};
typedef std::vector<DIERef> DIEArray;
-#endif // SymbolFileDWARF_DIERef_h_
+#endif // SymbolFileDWARF_DIERef_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h
index 2fb360440f6..ae7c770d6ef 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h
@@ -17,37 +17,34 @@
class DWARFDIE;
-class DWARFASTParser
-{
+class DWARFASTParser {
public:
- virtual ~DWARFASTParser() {}
+ virtual ~DWARFASTParser() {}
- virtual lldb::TypeSP
- ParseTypeFromDWARF (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die,
- lldb_private::Log *log,
- bool *type_is_new_ptr) = 0;
+ virtual lldb::TypeSP ParseTypeFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die,
+ lldb_private::Log *log,
+ bool *type_is_new_ptr) = 0;
- virtual lldb_private::Function *
- ParseFunctionFromDWARF (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die) = 0;
+ virtual lldb_private::Function *
+ ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die) = 0;
- virtual bool
- CompleteTypeFromDWARF (const DWARFDIE &die,
- lldb_private::Type *type,
- lldb_private::CompilerType &compiler_type) = 0;
+ virtual bool
+ CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
+ lldb_private::CompilerType &compiler_type) = 0;
- virtual lldb_private::CompilerDecl
- GetDeclForUIDFromDWARF (const DWARFDIE &die) = 0;
+ virtual lldb_private::CompilerDecl
+ GetDeclForUIDFromDWARF(const DWARFDIE &die) = 0;
- virtual lldb_private::CompilerDeclContext
- GetDeclContextForUIDFromDWARF (const DWARFDIE &die) = 0;
+ virtual lldb_private::CompilerDeclContext
+ GetDeclContextForUIDFromDWARF(const DWARFDIE &die) = 0;
- virtual lldb_private::CompilerDeclContext
- GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die) = 0;
+ virtual lldb_private::CompilerDeclContext
+ GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) = 0;
- virtual std::vector<DWARFDIE>
- GetDIEForDeclContext (lldb_private::CompilerDeclContext decl_context) = 0;
+ virtual std::vector<DWARFDIE>
+ GetDIEForDeclContext(lldb_private::CompilerDeclContext decl_context) = 0;
};
-#endif // SymbolFileDWARF_DWARFASTParser_h_
+#endif // SymbolFileDWARF_DWARFASTParser_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
index 23381df3297..44843c23d1f 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -11,11 +11,11 @@
#include "DWARFASTParserClang.h"
#include "DWARFCompileUnit.h"
+#include "DWARFDIE.h"
+#include "DWARFDIECollection.h"
#include "DWARFDebugInfo.h"
#include "DWARFDeclContext.h"
#include "DWARFDefines.h"
-#include "DWARFDIE.h"
-#include "DWARFDIECollection.h"
#include "SymbolFileDWARF.h"
#include "SymbolFileDWARFDebugMap.h"
#include "UniqueDWARFASTType.h"
@@ -54,4206 +54,4038 @@
#define DEBUG_PRINTF(fmt, ...)
#endif
-
using namespace lldb;
using namespace lldb_private;
-DWARFASTParserClang::DWARFASTParserClang (ClangASTContext &ast) :
- m_ast (ast),
- m_die_to_decl_ctx (),
- m_decl_ctx_to_die ()
-{
+DWARFASTParserClang::DWARFASTParserClang(ClangASTContext &ast)
+ : m_ast(ast), m_die_to_decl_ctx(), m_decl_ctx_to_die() {}
+
+DWARFASTParserClang::~DWARFASTParserClang() {}
+
+static AccessType DW_ACCESS_to_AccessType(uint32_t dwarf_accessibility) {
+ switch (dwarf_accessibility) {
+ case DW_ACCESS_public:
+ return eAccessPublic;
+ case DW_ACCESS_private:
+ return eAccessPrivate;
+ case DW_ACCESS_protected:
+ return eAccessProtected;
+ default:
+ break;
+ }
+ return eAccessNone;
}
-DWARFASTParserClang::~DWARFASTParserClang ()
-{
+static bool DeclKindIsCXXClass(clang::Decl::Kind decl_kind) {
+ switch (decl_kind) {
+ case clang::Decl::CXXRecord:
+ case clang::Decl::ClassTemplateSpecialization:
+ return true;
+ default:
+ break;
+ }
+ return false;
}
-
-static AccessType
-DW_ACCESS_to_AccessType (uint32_t dwarf_accessibility)
-{
- switch (dwarf_accessibility)
- {
- case DW_ACCESS_public: return eAccessPublic;
- case DW_ACCESS_private: return eAccessPrivate;
- case DW_ACCESS_protected: return eAccessProtected;
- default: break;
+struct BitfieldInfo {
+ uint64_t bit_size;
+ uint64_t bit_offset;
+
+ BitfieldInfo()
+ : bit_size(LLDB_INVALID_ADDRESS), bit_offset(LLDB_INVALID_ADDRESS) {}
+
+ void Clear() {
+ bit_size = LLDB_INVALID_ADDRESS;
+ bit_offset = LLDB_INVALID_ADDRESS;
+ }
+
+ bool IsValid() const {
+ return (bit_size != LLDB_INVALID_ADDRESS) &&
+ (bit_offset != LLDB_INVALID_ADDRESS);
+ }
+
+ bool NextBitfieldOffsetIsValid(const uint64_t next_bit_offset) const {
+ if (IsValid()) {
+ // This bitfield info is valid, so any subsequent bitfields
+ // must not overlap and must be at a higher bit offset than
+ // any previous bitfield + size.
+ return (bit_size + bit_offset) <= next_bit_offset;
+ } else {
+ // If the this BitfieldInfo is not valid, then any offset isOK
+ return true;
}
- return eAccessNone;
+ }
+};
+
+ClangASTImporter &DWARFASTParserClang::GetClangASTImporter() {
+ if (!m_clang_ast_importer_ap) {
+ m_clang_ast_importer_ap.reset(new ClangASTImporter);
+ }
+ return *m_clang_ast_importer_ap;
}
-static bool
-DeclKindIsCXXClass (clang::Decl::Kind decl_kind)
-{
- switch (decl_kind)
- {
- case clang::Decl::CXXRecord:
- case clang::Decl::ClassTemplateSpecialization:
- return true;
- default:
- break;
+TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) {
+ ModuleSP dwo_module_sp = die.GetContainingDWOModule();
+ if (dwo_module_sp) {
+ // This type comes from an external DWO module
+ std::vector<CompilerContext> dwo_context;
+ die.GetDWOContext(dwo_context);
+ TypeMap dwo_types;
+ if (dwo_module_sp->GetSymbolVendor()->FindTypes(dwo_context, true,
+ dwo_types)) {
+ const size_t num_dwo_types = dwo_types.GetSize();
+ if (num_dwo_types == 1) {
+ // 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
+ TypeSP dwo_type_sp = dwo_types.GetTypeAtIndex(0);
+ if (dwo_type_sp) {
+ lldb_private::CompilerType dwo_type =
+ dwo_type_sp->GetForwardCompilerType();
+
+ lldb_private::CompilerType type =
+ GetClangASTImporter().CopyType(m_ast, dwo_type);
+
+ // printf ("copied_qual_type: ast = %p, clang_type = %p, name =
+ // '%s'\n", m_ast, copied_qual_type.getAsOpaquePtr(),
+ // external_type->GetName().GetCString());
+ if (type) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ TypeSP type_sp(new Type(die.GetID(), dwarf, dwo_type_sp->GetName(),
+ dwo_type_sp->GetByteSize(), NULL,
+ LLDB_INVALID_UID, Type::eEncodingInvalid,
+ &dwo_type_sp->GetDeclaration(), type,
+ Type::eResolveStateForward));
+
+ dwarf->GetTypeList()->Insert(type_sp);
+ dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ clang::TagDecl *tag_decl = ClangASTContext::GetAsTagDecl(type);
+ if (tag_decl)
+ LinkDeclContextToDIE(tag_decl, die);
+ else {
+ clang::DeclContext *defn_decl_ctx =
+ GetCachedClangDeclContextForDIE(die);
+ if (defn_decl_ctx)
+ LinkDeclContextToDIE(defn_decl_ctx, die);
+ }
+ return type_sp;
+ }
+ }
+ }
}
- return false;
+ }
+ return TypeSP();
}
-struct BitfieldInfo
-{
- uint64_t bit_size;
- uint64_t bit_offset;
-
- BitfieldInfo() :
- bit_size(LLDB_INVALID_ADDRESS),
- bit_offset(LLDB_INVALID_ADDRESS)
- {
- }
+TypeSP DWARFASTParserClang::ParseTypeFromDWARF(const SymbolContext &sc,
+ const DWARFDIE &die, Log *log,
+ bool *type_is_new_ptr) {
+ TypeSP type_sp;
- void
- Clear()
- {
- bit_size = LLDB_INVALID_ADDRESS;
- bit_offset = LLDB_INVALID_ADDRESS;
- }
+ if (type_is_new_ptr)
+ *type_is_new_ptr = false;
- bool
- IsValid() const
- {
- return (bit_size != LLDB_INVALID_ADDRESS) &&
- (bit_offset != LLDB_INVALID_ADDRESS);
+ AccessType accessibility = eAccessNone;
+ if (die) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ if (log) {
+ 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(), static_cast<void *>(context),
+ context_die.GetOffset(), die.GetTagAsCString(), die.GetName());
}
+ //
+ // Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
+ // if (log && dwarf_cu)
+ // {
+ // StreamString s;
+ // die->DumpLocation (this, dwarf_cu, s);
+ // dwarf->GetObjectFile()->GetModule()->LogMessage (log,
+ // "SymbolFileDwarf::%s %s", __FUNCTION__, s.GetData());
+ //
+ // }
+
+ Type *type_ptr = dwarf->GetDIEToType().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();
+
+ bool is_forward_declaration = false;
+ DWARFAttributes attributes;
+ const char *type_name_cstr = NULL;
+ ConstString type_name_const_str;
+ Type::ResolveState resolve_state = Type::eResolveStateUnresolved;
+ uint64_t byte_size = 0;
+ Declaration decl;
+
+ Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID;
+ CompilerType clang_type;
+ DWARFFormValue form_value;
+
+ dw_attr_t attr;
+
+ switch (tag) {
+ case DW_TAG_typedef:
+ case DW_TAG_base_type:
+ case DW_TAG_pointer_type:
+ case DW_TAG_reference_type:
+ case DW_TAG_rvalue_reference_type:
+ case DW_TAG_const_type:
+ case DW_TAG_restrict_type:
+ case DW_TAG_volatile_type:
+ case DW_TAG_unspecified_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
- bool
- NextBitfieldOffsetIsValid(const uint64_t next_bit_offset) const
- {
- if (IsValid())
- {
- // This bitfield info is valid, so any subsequent bitfields
- // must not overlap and must be at a higher bit offset than
- // any previous bitfield + size.
- return (bit_size + bit_offset) <= next_bit_offset;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ uint32_t encoding = 0;
+ DWARFFormValue encoding_uid;
+
+ if (num_attributes > 0) {
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ attr = attributes.AttributeAtIndex(i);
+ 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:
+
+ 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) {
+ if (strchr(type_name_cstr, '&') == NULL)
+ type_name_cstr = NULL;
+ }
+ if (type_name_cstr)
+ type_name_const_str.SetCString(type_name_cstr);
+ break;
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ break;
+ case DW_AT_encoding:
+ encoding = form_value.Unsigned();
+ break;
+ case DW_AT_type:
+ encoding_uid = form_value;
+ break;
+ default:
+ case DW_AT_sibling:
+ break;
+ }
+ }
+ }
}
- else
- {
- // If the this BitfieldInfo is not valid, then any offset isOK
- return true;
+
+ if (tag == DW_TAG_typedef && encoding_uid.IsValid()) {
+ // Try to parse a typedef from the DWO file first as modules
+ // can contain typedef'ed structures that have no names like:
+ //
+ // typedef struct { int a; } Foo;
+ //
+ // In this case we will have a structure with no name and a
+ // typedef named "Foo" that points to this unnamed structure.
+ // The name in the typedef is the only identifier for the struct,
+ // so always try to get typedefs from DWO files if possible.
+ //
+ // The type_sp returned will be empty if the typedef doesn't exist
+ // in a DWO file, so it is cheap to call this function just to check.
+ //
+ // If we don't do this we end up creating a TypeSP that says this
+ // is a typedef to type 0x123 (the DW_AT_type value would be 0x123
+ // in the DW_TAG_typedef), and this is the unnamed structure type.
+ // We will have a hard time tracking down an unnammed structure
+ // type in the module DWO file, so we make sure we don't get into
+ // this situation by always resolving typedefs from the DWO file.
+ const DWARFDIE encoding_die = dwarf->GetDIE(DIERef(encoding_uid));
+
+ // First make sure that the die that this is typedef'ed to _is_
+ // just a declaration (DW_AT_declaration == 1), not a full definition
+ // since template types can't be represented in modules since only
+ // concrete instances of templates are ever emitted and modules
+ // won't contain those
+ if (encoding_die &&
+ encoding_die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0) ==
+ 1) {
+ type_sp = ParseTypeFromDWO(die, log);
+ if (type_sp)
+ return type_sp;
+ }
}
- }
-};
+ DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n",
+ die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr,
+ encoding_uid.Reference());
-ClangASTImporter &
-DWARFASTParserClang::GetClangASTImporter()
-{
- if (!m_clang_ast_importer_ap)
- {
- m_clang_ast_importer_ap.reset (new ClangASTImporter);
- }
- return *m_clang_ast_importer_ap;
-}
+ switch (tag) {
+ default:
+ break;
+ case DW_TAG_unspecified_type:
+ if (strcmp(type_name_cstr, "nullptr_t") == 0 ||
+ strcmp(type_name_cstr, "decltype(nullptr)") == 0) {
+ resolve_state = Type::eResolveStateFull;
+ clang_type = m_ast.GetBasicType(eBasicTypeNullPtr);
+ break;
+ }
+ // Fall through to base type below in case we can handle the type
+ // there...
+ LLVM_FALLTHROUGH;
+
+ case DW_TAG_base_type:
+ resolve_state = Type::eResolveStateFull;
+ clang_type = m_ast.GetBuiltinTypeForDWARFEncodingAndBitSize(
+ type_name_cstr, encoding, byte_size * 8);
+ break;
+
+ case DW_TAG_pointer_type:
+ encoding_data_type = Type::eEncodingIsPointerUID;
+ break;
+ case DW_TAG_reference_type:
+ encoding_data_type = Type::eEncodingIsLValueReferenceUID;
+ break;
+ case DW_TAG_rvalue_reference_type:
+ encoding_data_type = Type::eEncodingIsRValueReferenceUID;
+ break;
+ case DW_TAG_typedef:
+ encoding_data_type = Type::eEncodingIsTypedefUID;
+ break;
+ case DW_TAG_const_type:
+ encoding_data_type = Type::eEncodingIsConstUID;
+ break;
+ case DW_TAG_restrict_type:
+ encoding_data_type = Type::eEncodingIsRestrictUID;
+ break;
+ case DW_TAG_volatile_type:
+ encoding_data_type = Type::eEncodingIsVolatileUID;
+ break;
+ }
-TypeSP
-DWARFASTParserClang::ParseTypeFromDWO (const DWARFDIE &die, Log *log)
-{
- ModuleSP dwo_module_sp = die.GetContainingDWOModule();
- if (dwo_module_sp)
- {
- // This type comes from an external DWO module
- std::vector<CompilerContext> dwo_context;
- die.GetDWOContext(dwo_context);
- TypeMap dwo_types;
- if (dwo_module_sp->GetSymbolVendor()->FindTypes(dwo_context, true, dwo_types))
- {
- const size_t num_dwo_types = dwo_types.GetSize();
- if (num_dwo_types == 1)
- {
- // 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
- TypeSP dwo_type_sp = dwo_types.GetTypeAtIndex(0);
- if (dwo_type_sp)
- {
- lldb_private::CompilerType dwo_type = dwo_type_sp->GetForwardCompilerType();
-
- lldb_private::CompilerType type = GetClangASTImporter().CopyType (m_ast, dwo_type);
-
- //printf ("copied_qual_type: ast = %p, clang_type = %p, name = '%s'\n", m_ast, copied_qual_type.getAsOpaquePtr(), external_type->GetName().GetCString());
- if (type)
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- TypeSP type_sp (new Type (die.GetID(),
- dwarf,
- dwo_type_sp->GetName(),
- dwo_type_sp->GetByteSize(),
- NULL,
- LLDB_INVALID_UID,
- Type::eEncodingInvalid,
- &dwo_type_sp->GetDeclaration(),
- type,
- Type::eResolveStateForward));
-
- dwarf->GetTypeList()->Insert(type_sp);
- dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
- clang::TagDecl *tag_decl = ClangASTContext::GetAsTagDecl(type);
- if (tag_decl)
- LinkDeclContextToDIE(tag_decl, die);
- else
- {
- clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(die);
- if (defn_decl_ctx)
- LinkDeclContextToDIE(defn_decl_ctx, die);
- }
- return type_sp;
+ if (!clang_type &&
+ (encoding_data_type == Type::eEncodingIsPointerUID ||
+ encoding_data_type == Type::eEncodingIsTypedefUID) &&
+ sc.comp_unit != NULL) {
+ if (tag == DW_TAG_pointer_type) {
+ DWARFDIE target_die = die.GetReferencedDIE(DW_AT_type);
+
+ if (target_die.GetAttributeValueAsUnsigned(DW_AT_APPLE_block, 0)) {
+ // Blocks have a __FuncPtr inside them which is a pointer to a
+ // function of the proper type.
+
+ for (DWARFDIE child_die = target_die.GetFirstChild();
+ child_die.IsValid(); child_die = child_die.GetSibling()) {
+ if (!strcmp(child_die.GetAttributeValueAsString(DW_AT_name, ""),
+ "__FuncPtr")) {
+ DWARFDIE function_pointer_type =
+ child_die.GetReferencedDIE(DW_AT_type);
+
+ if (function_pointer_type) {
+ DWARFDIE function_type =
+ function_pointer_type.GetReferencedDIE(DW_AT_type);
+
+ bool function_type_is_new_pointer;
+ TypeSP lldb_function_type_sp = ParseTypeFromDWARF(
+ sc, function_type, log, &function_type_is_new_pointer);
+
+ if (lldb_function_type_sp) {
+ clang_type = m_ast.CreateBlockPointerType(
+ lldb_function_type_sp->GetForwardCompilerType());
+ encoding_data_type = Type::eEncodingIsUID;
+ encoding_uid.Clear();
+ resolve_state = Type::eResolveStateFull;
}
+ }
+
+ break;
}
+ }
}
- }
- }
- return TypeSP();
-}
-
-TypeSP
-DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc,
- const DWARFDIE &die,
- Log *log,
- bool *type_is_new_ptr)
-{
- TypeSP type_sp;
-
- if (type_is_new_ptr)
- *type_is_new_ptr = false;
+ }
- AccessType accessibility = eAccessNone;
- if (die)
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- if (log)
- {
- DWARFDIE context_die;
- clang::DeclContext *context = GetClangDeclContextContainingDIE (die, &context_die);
+ bool translation_unit_is_objc =
+ (sc.comp_unit->GetLanguage() == eLanguageTypeObjC ||
+ sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus);
- dwarf->GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x, decl_ctx = %p (die 0x%8.8x)) %s name = '%s')",
- die.GetOffset(),
- static_cast<void*>(context),
- context_die.GetOffset(),
- die.GetTagAsCString(),
- die.GetName());
+ if (translation_unit_is_objc) {
+ if (type_name_cstr != NULL) {
+ static ConstString g_objc_type_name_id("id");
+ static ConstString g_objc_type_name_Class("Class");
+ static ConstString g_objc_type_name_selector("SEL");
+ 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(), die.GetTagAsCString(), die.GetName());
+ clang_type = m_ast.GetBasicType(eBasicTypeObjCID);
+ encoding_data_type = Type::eEncodingIsUID;
+ encoding_uid.Clear();
+ resolve_state = Type::eResolveStateFull;
+
+ } 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(), die.GetTagAsCString(), die.GetName());
+ clang_type = m_ast.GetBasicType(eBasicTypeObjCClass);
+ encoding_data_type = Type::eEncodingIsUID;
+ encoding_uid.Clear();
+ resolve_state = Type::eResolveStateFull;
+ } 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(), die.GetTagAsCString(), die.GetName());
+ clang_type = m_ast.GetBasicType(eBasicTypeObjCSel);
+ encoding_data_type = Type::eEncodingIsUID;
+ encoding_uid.Clear();
+ resolve_state = Type::eResolveStateFull;
+ }
+ } else if (encoding_data_type == Type::eEncodingIsPointerUID &&
+ encoding_uid.IsValid()) {
+ // Clang sometimes erroneously emits id as objc_object*. In that
+ // case we fix up the type to "id".
+
+ const DWARFDIE encoding_die = dwarf->GetDIE(DIERef(encoding_uid));
+
+ if (encoding_die && encoding_die.Tag() == DW_TAG_structure_type) {
+ 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(), die.GetTagAsCString(),
+ die.GetName());
+ clang_type = m_ast.GetBasicType(eBasicTypeObjCID);
+ encoding_data_type = Type::eEncodingIsUID;
+ encoding_uid.Clear();
+ resolve_state = Type::eResolveStateFull;
+ }
+ }
+ }
+ }
+ }
}
- //
- // Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
- // if (log && dwarf_cu)
- // {
- // StreamString s;
- // die->DumpLocation (this, dwarf_cu, s);
- // dwarf->GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDwarf::%s %s", __FUNCTION__, s.GetData());
- //
- // }
-
- Type *type_ptr = dwarf->GetDIEToType().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();
-
- bool is_forward_declaration = false;
- DWARFAttributes attributes;
- const char *type_name_cstr = NULL;
- ConstString type_name_const_str;
- Type::ResolveState resolve_state = Type::eResolveStateUnresolved;
- uint64_t byte_size = 0;
- Declaration decl;
+ type_sp.reset(
+ new Type(die.GetID(), dwarf, type_name_const_str, byte_size, NULL,
+ DIERef(encoding_uid).GetUID(dwarf), encoding_data_type,
+ &decl, clang_type, resolve_state));
+
+ dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
+
+ // Type* encoding_type =
+ // GetUniquedTypeForDIEOffset(encoding_uid, type_sp,
+ // NULL, 0, 0, false);
+ // if (encoding_type != NULL)
+ // {
+ // if (encoding_type != DIE_IS_BEING_PARSED)
+ // type_sp->SetEncodingType(encoding_type);
+ // else
+ // m_indirect_fixups.push_back(type_sp.get());
+ // }
+ } break;
+
+ case DW_TAG_structure_type:
+ case DW_TAG_union_type:
+ case DW_TAG_class_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->GetDIEToType()[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(attributes);
+ if (num_attributes > 0) {
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ attr = attributes.AttributeAtIndex(i);
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_decl_file:
+ 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
+ // so that we can still unique types efficiently.
+ decl.SetFile(FileSpec("<invalid>", false));
+ } else
+ decl.SetFile(
+ sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(
+ form_value.Unsigned()));
+ break;
- Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID;
- CompilerType clang_type;
- DWARFFormValue form_value;
+ case DW_AT_decl_line:
+ decl.SetLine(form_value.Unsigned());
+ break;
- dw_attr_t attr;
+ case DW_AT_decl_column:
+ decl.SetColumn(form_value.Unsigned());
+ break;
- switch (tag)
- {
- case DW_TAG_typedef:
- case DW_TAG_base_type:
- case DW_TAG_pointer_type:
- case DW_TAG_reference_type:
- case DW_TAG_rvalue_reference_type:
- case DW_TAG_const_type:
- case DW_TAG_restrict_type:
- case DW_TAG_volatile_type:
- case DW_TAG_unspecified_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- const size_t num_attributes = die.GetAttributes (attributes);
- uint32_t encoding = 0;
- DWARFFormValue encoding_uid;
-
- if (num_attributes > 0)
- {
- uint32_t i;
- for (i=0; i<num_attributes; ++i)
- {
- attr = attributes.AttributeAtIndex(i);
- 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:
-
- 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)
- {
- if (strchr (type_name_cstr, '&') == NULL)
- type_name_cstr = NULL;
- }
- if (type_name_cstr)
- type_name_const_str.SetCString(type_name_cstr);
- break;
- case DW_AT_byte_size: byte_size = form_value.Unsigned(); break;
- case DW_AT_encoding: encoding = form_value.Unsigned(); break;
- case DW_AT_type: encoding_uid = form_value; break;
- default:
- case DW_AT_sibling:
- break;
- }
- }
- }
- }
+ case DW_AT_name:
+ type_name_cstr = form_value.AsCString();
+ type_name_const_str.SetCString(type_name_cstr);
+ break;
- if (tag == DW_TAG_typedef && encoding_uid.IsValid())
- {
- // Try to parse a typedef from the DWO file first as modules
- // can contain typedef'ed structures that have no names like:
- //
- // typedef struct { int a; } Foo;
- //
- // In this case we will have a structure with no name and a
- // typedef named "Foo" that points to this unnamed structure.
- // The name in the typedef is the only identifier for the struct,
- // so always try to get typedefs from DWO files if possible.
- //
- // The type_sp returned will be empty if the typedef doesn't exist
- // in a DWO file, so it is cheap to call this function just to check.
- //
- // If we don't do this we end up creating a TypeSP that says this
- // is a typedef to type 0x123 (the DW_AT_type value would be 0x123
- // in the DW_TAG_typedef), and this is the unnamed structure type.
- // We will have a hard time tracking down an unnammed structure
- // type in the module DWO file, so we make sure we don't get into
- // this situation by always resolving typedefs from the DWO file.
- const DWARFDIE encoding_die = dwarf->GetDIE(DIERef(encoding_uid));
-
- // First make sure that the die that this is typedef'ed to _is_
- // just a declaration (DW_AT_declaration == 1), not a full definition
- // since template types can't be represented in modules since only
- // concrete instances of templates are ever emitted and modules
- // won't contain those
- if (encoding_die && encoding_die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0) == 1)
- {
- type_sp = ParseTypeFromDWO(die, log);
- if (type_sp)
- return type_sp;
- }
- }
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ byte_size_valid = true;
+ break;
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid.Reference());
+ case DW_AT_accessibility:
+ accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned());
+ break;
- switch (tag)
- {
- default:
- break;
+ case DW_AT_declaration:
+ is_forward_declaration = form_value.Boolean();
+ break;
- case DW_TAG_unspecified_type:
- if (strcmp(type_name_cstr, "nullptr_t") == 0 ||
- strcmp(type_name_cstr, "decltype(nullptr)") == 0 )
- {
- resolve_state = Type::eResolveStateFull;
- clang_type = m_ast.GetBasicType(eBasicTypeNullPtr);
- break;
- }
- // Fall through to base type below in case we can handle the type there...
- LLVM_FALLTHROUGH;
-
- case DW_TAG_base_type:
- resolve_state = Type::eResolveStateFull;
- clang_type = m_ast.GetBuiltinTypeForDWARFEncodingAndBitSize (type_name_cstr,
- encoding,
- byte_size * 8);
- break;
-
- case DW_TAG_pointer_type: encoding_data_type = Type::eEncodingIsPointerUID; break;
- case DW_TAG_reference_type: encoding_data_type = Type::eEncodingIsLValueReferenceUID; break;
- case DW_TAG_rvalue_reference_type: encoding_data_type = Type::eEncodingIsRValueReferenceUID; break;
- case DW_TAG_typedef: encoding_data_type = Type::eEncodingIsTypedefUID; break;
- case DW_TAG_const_type: encoding_data_type = Type::eEncodingIsConstUID; break;
- case DW_TAG_restrict_type: encoding_data_type = Type::eEncodingIsRestrictUID; break;
- case DW_TAG_volatile_type: encoding_data_type = Type::eEncodingIsVolatileUID; break;
- }
+ case DW_AT_APPLE_runtime_class:
+ class_language = (LanguageType)form_value.Signed();
+ break;
- if (!clang_type && (encoding_data_type == Type::eEncodingIsPointerUID || encoding_data_type == Type::eEncodingIsTypedefUID) && sc.comp_unit != NULL)
- {
- if (tag == DW_TAG_pointer_type)
- {
- DWARFDIE target_die = die.GetReferencedDIE(DW_AT_type);
-
- if (target_die.GetAttributeValueAsUnsigned(DW_AT_APPLE_block, 0))
- {
- // Blocks have a __FuncPtr inside them which is a pointer to a function of the proper type.
-
- for (DWARFDIE child_die = target_die.GetFirstChild();
- child_die.IsValid();
- child_die = child_die.GetSibling())
- {
- if (!strcmp(child_die.GetAttributeValueAsString(DW_AT_name, ""), "__FuncPtr"))
- {
- DWARFDIE function_pointer_type = child_die.GetReferencedDIE(DW_AT_type);
-
- if (function_pointer_type)
- {
- DWARFDIE function_type = function_pointer_type.GetReferencedDIE(DW_AT_type);
-
- bool function_type_is_new_pointer;
- TypeSP lldb_function_type_sp = ParseTypeFromDWARF(sc, function_type, log, &function_type_is_new_pointer);
-
- if (lldb_function_type_sp)
- {
- clang_type = m_ast.CreateBlockPointerType(lldb_function_type_sp->GetForwardCompilerType());
- encoding_data_type = Type::eEncodingIsUID;
- encoding_uid.Clear();
- resolve_state = Type::eResolveStateFull;
- }
- }
-
- break;
- }
- }
- }
- }
-
- bool translation_unit_is_objc = (sc.comp_unit->GetLanguage() == eLanguageTypeObjC || sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus);
-
- if (translation_unit_is_objc)
- {
- if (type_name_cstr != NULL)
- {
- static ConstString g_objc_type_name_id("id");
- static ConstString g_objc_type_name_Class("Class");
- static ConstString g_objc_type_name_selector("SEL");
-
- 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(),
- die.GetTagAsCString(),
- die.GetName());
- clang_type = m_ast.GetBasicType(eBasicTypeObjCID);
- encoding_data_type = Type::eEncodingIsUID;
- encoding_uid.Clear();
- resolve_state = Type::eResolveStateFull;
+ case DW_AT_APPLE_objc_complete_type:
+ is_complete_objc_class = form_value.Signed();
+ break;
- }
- 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(),
- die.GetTagAsCString(),
- die.GetName());
- clang_type = m_ast.GetBasicType(eBasicTypeObjCClass);
- encoding_data_type = Type::eEncodingIsUID;
- encoding_uid.Clear();
- resolve_state = Type::eResolveStateFull;
- }
- 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(),
- die.GetTagAsCString(),
- die.GetName());
- clang_type = m_ast.GetBasicType(eBasicTypeObjCSel);
- encoding_data_type = Type::eEncodingIsUID;
- encoding_uid.Clear();
- resolve_state = Type::eResolveStateFull;
- }
- }
- else if (encoding_data_type == Type::eEncodingIsPointerUID && encoding_uid.IsValid())
- {
- // Clang sometimes erroneously emits id as objc_object*. In that case we fix up the type to "id".
-
- const DWARFDIE encoding_die = dwarf->GetDIE(DIERef(encoding_uid));
-
- if (encoding_die && encoding_die.Tag() == DW_TAG_structure_type)
- {
- 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(),
- die.GetTagAsCString(),
- die.GetName());
- clang_type = m_ast.GetBasicType(eBasicTypeObjCID);
- encoding_data_type = Type::eEncodingIsUID;
- encoding_uid.Clear();
- resolve_state = Type::eResolveStateFull;
- }
- }
- }
- }
- }
- }
+ case DW_AT_allocated:
+ case DW_AT_associated:
+ case DW_AT_data_location:
+ case DW_AT_description:
+ case DW_AT_start_scope:
+ case DW_AT_visibility:
+ default:
+ case DW_AT_sibling:
+ break;
+ }
+ }
+ }
+ }
- type_sp.reset( new Type (die.GetID(),
- dwarf,
- type_name_const_str,
- byte_size,
- NULL,
- DIERef(encoding_uid).GetUID(dwarf),
- encoding_data_type,
- &decl,
- clang_type,
- resolve_state));
-
- dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
-
- // Type* encoding_type = GetUniquedTypeForDIEOffset(encoding_uid, type_sp, NULL, 0, 0, false);
- // if (encoding_type != NULL)
- // {
- // if (encoding_type != DIE_IS_BEING_PARSED)
- // type_sp->SetEncodingType(encoding_type);
- // else
- // m_indirect_fixups.push_back(type_sp.get());
- // }
- }
- break;
-
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_class_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->GetDIEToType()[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 (attributes);
- if (num_attributes > 0)
- {
- uint32_t i;
- for (i=0; i<num_attributes; ++i)
- {
- attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_decl_file:
- 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
- // so that we can still unique types efficiently.
- decl.SetFile(FileSpec ("<invalid>", false));
- }
- else
- 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:
- type_name_cstr = form_value.AsCString();
- type_name_const_str.SetCString(type_name_cstr);
- break;
-
- case DW_AT_byte_size:
- byte_size = form_value.Unsigned();
- byte_size_valid = true;
- break;
-
- case DW_AT_accessibility:
- accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned());
- break;
-
- case DW_AT_declaration:
- is_forward_declaration = form_value.Boolean();
- break;
-
- case DW_AT_APPLE_runtime_class:
- class_language = (LanguageType)form_value.Signed();
- break;
-
- case DW_AT_APPLE_objc_complete_type:
- is_complete_objc_class = form_value.Signed();
- break;
-
- case DW_AT_allocated:
- case DW_AT_associated:
- case DW_AT_data_location:
- case DW_AT_description:
- case DW_AT_start_scope:
- case DW_AT_visibility:
- default:
- case DW_AT_sibling:
- break;
- }
- }
- }
- }
+ // UniqueDWARFASTType is large, so don't create a local variables on the
+ // stack, put it on the heap. This function is often called recursively
+ // and clang isn't good and sharing the stack space for variables in
+ // different blocks.
+ std::unique_ptr<UniqueDWARFASTType> unique_ast_entry_ap(
+ new UniqueDWARFASTType());
+
+ ConstString unique_typename(type_name_const_str);
+ Declaration unique_decl(decl);
+
+ if (type_name_const_str) {
+ LanguageType die_language = die.GetLanguage();
+ if (Language::LanguageIsCPlusPlus(die_language)) {
+ // For C++, we rely solely upon the one definition rule that says
+ // only
+ // one thing can exist at a given decl context. We ignore the file
+ // and
+ // line that things are declared on.
+ std::string qualified_name;
+ if (die.GetQualifiedName(qualified_name))
+ unique_typename = ConstString(qualified_name);
+ unique_decl.Clear();
+ }
+
+ if (dwarf->GetUniqueDWARFASTTypeMap().Find(
+ unique_typename, die, unique_decl,
+ byte_size_valid ? byte_size : -1, *unique_ast_entry_ap)) {
+ type_sp = unique_ast_entry_ap->m_type_sp;
+ if (type_sp) {
+ dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ return type_sp;
+ }
+ }
+ }
- // UniqueDWARFASTType is large, so don't create a local variables on the
- // stack, put it on the heap. This function is often called recursively
- // and clang isn't good and sharing the stack space for variables in different blocks.
- std::unique_ptr<UniqueDWARFASTType> unique_ast_entry_ap(new UniqueDWARFASTType());
-
- ConstString unique_typename(type_name_const_str);
- Declaration unique_decl(decl);
-
- if (type_name_const_str)
- {
- LanguageType die_language = die.GetLanguage();
- if (Language::LanguageIsCPlusPlus(die_language))
- {
- // For C++, we rely solely upon the one definition rule that says only
- // one thing can exist at a given decl context. We ignore the file and
- // line that things are declared on.
- std::string qualified_name;
- if (die.GetQualifiedName(qualified_name))
- unique_typename = ConstString(qualified_name);
- unique_decl.Clear();
- }
+ 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;
+ if (tag == DW_TAG_structure_type) {
+ tag_decl_kind = clang::TTK_Struct;
+ default_accessibility = eAccessPublic;
+ } else if (tag == DW_TAG_union_type) {
+ tag_decl_kind = clang::TTK_Union;
+ default_accessibility = eAccessPublic;
+ } else if (tag == DW_TAG_class_type) {
+ tag_decl_kind = clang::TTK_Class;
+ default_accessibility = eAccessPrivate;
+ }
- if (dwarf->GetUniqueDWARFASTTypeMap().Find(unique_typename, die, unique_decl,
- byte_size_valid ? byte_size : -1,
- *unique_ast_entry_ap))
- {
- type_sp = unique_ast_entry_ap->m_type_sp;
- if (type_sp)
- {
- dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
- return type_sp;
- }
- }
- }
+ if (byte_size_valid && byte_size == 0 && type_name_cstr &&
+ die.HasChildren() == false &&
+ sc.comp_unit->GetLanguage() == eLanguageTypeObjC) {
+ // Work around an issue with clang at the moment where
+ // forward declarations for objective C classes are emitted
+ // as:
+ // DW_TAG_structure_type [2]
+ // DW_AT_name( "ForwardObjcClass" )
+ // DW_AT_byte_size( 0x00 )
+ // DW_AT_decl_file( "..." )
+ // DW_AT_decl_line( 1 )
+ //
+ // Note that there is no DW_AT_declaration and there are
+ // no children, and the byte size is zero.
+ is_forward_declaration = true;
+ }
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
+ if (class_language == eLanguageTypeObjC ||
+ class_language == eLanguageTypeObjC_plus_plus) {
+ 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
+ // are trying to find and this DIE isn't the complete
+ // definition (we checked is_complete_objc_class above and
+ // know it is false), so the real definition is in here somewhere
+ type_sp = dwarf->FindCompleteObjCDefinitionTypeForDIE(
+ die, type_name_const_str, true);
+
+ if (!type_sp) {
+ SymbolFileDWARFDebugMap *debug_map_symfile =
+ dwarf->GetDebugMapSymfile();
+ if (debug_map_symfile) {
+ // We weren't able to find a full declaration in
+ // this DWARF, see if we have a declaration anywhere
+ // else...
+ type_sp =
+ debug_map_symfile->FindCompleteObjCDefinitionTypeForDIE(
+ die, type_name_const_str, true);
+ }
+ }
- int tag_decl_kind = -1;
- AccessType default_accessibility = eAccessNone;
- if (tag == DW_TAG_structure_type)
- {
- tag_decl_kind = clang::TTK_Struct;
- default_accessibility = eAccessPublic;
- }
- else if (tag == DW_TAG_union_type)
- {
- tag_decl_kind = clang::TTK_Union;
- default_accessibility = eAccessPublic;
- }
- else if (tag == DW_TAG_class_type)
- {
- tag_decl_kind = clang::TTK_Class;
- default_accessibility = eAccessPrivate;
- }
+ if (type_sp) {
+ if (log) {
+ 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(),
+ DW_TAG_value_to_name(tag), type_name_cstr,
+ type_sp->GetID());
+ }
+
+ // 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->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ return type_sp;
+ }
+ }
+ }
- if (byte_size_valid && byte_size == 0 && type_name_cstr &&
- die.HasChildren() == false &&
- sc.comp_unit->GetLanguage() == eLanguageTypeObjC)
- {
- // Work around an issue with clang at the moment where
- // forward declarations for objective C classes are emitted
- // as:
- // DW_TAG_structure_type [2]
- // DW_AT_name( "ForwardObjcClass" )
- // DW_AT_byte_size( 0x00 )
- // DW_AT_decl_file( "..." )
- // DW_AT_decl_line( 1 )
- //
- // Note that there is no DW_AT_declaration and there are
- // no children, and the byte size is zero.
- is_forward_declaration = true;
- }
+ if (is_forward_declaration) {
+ // We have a forward declaration to a type and we need
+ // to try and find a full declaration. We look in the
+ // current type index just in case we have a forward
+ // declaration followed by an actual declarations in the
+ // DWARF. If this fails, we need to look elsewhere...
+ if (log) {
+ 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(),
+ DW_TAG_value_to_name(tag), type_name_cstr);
+ }
+
+ // See if the type comes from a DWO module and if so, track down that
+ // type.
+ type_sp = ParseTypeFromDWO(die, log);
+ if (type_sp)
+ return type_sp;
+
+ DWARFDeclContext 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);
+
+ if (!type_sp) {
+ SymbolFileDWARFDebugMap *debug_map_symfile =
+ dwarf->GetDebugMapSymfile();
+ if (debug_map_symfile) {
+ // We weren't able to find a full declaration in
+ // this DWARF, see if we have a declaration anywhere
+ // else...
+ type_sp =
+ debug_map_symfile->FindDefinitionTypeForDWARFDeclContext(
+ die_decl_ctx);
+ }
+ }
+
+ if (type_sp) {
+ if (log) {
+ 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(),
+ DW_TAG_value_to_name(tag), type_name_cstr, type_sp->GetID());
+ }
- if (class_language == eLanguageTypeObjC ||
- class_language == eLanguageTypeObjC_plus_plus)
- {
- 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
- // are trying to find and this DIE isn't the complete
- // definition (we checked is_complete_objc_class above and
- // know it is false), so the real definition is in here somewhere
- type_sp = dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true);
-
- if (!type_sp)
- {
- SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile();
- if (debug_map_symfile)
- {
- // We weren't able to find a full declaration in
- // this DWARF, see if we have a declaration anywhere
- // else...
- type_sp = debug_map_symfile->FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true);
- }
- }
+ // 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->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(
+ dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf)));
+ if (defn_decl_ctx)
+ LinkDeclContextToDIE(defn_decl_ctx, die);
+ return type_sp;
+ }
+ }
+ assert(tag_decl_kind != -1);
+ bool clang_type_was_created = false;
+ clang_type.SetCompilerType(
+ &m_ast, dwarf->GetForwardDeclDieToClangType().lookup(die.GetDIE()));
+ if (!clang_type) {
+ clang::DeclContext *decl_ctx =
+ GetClangDeclContextContainingDIE(die, nullptr);
+ if (accessibility == eAccessNone && decl_ctx) {
+ // Check the decl context that contains this class/struct/union.
+ // If it is a class we must give it an accessibility.
+ const clang::Decl::Kind containing_decl_kind =
+ decl_ctx->getDeclKind();
+ if (DeclKindIsCXXClass(containing_decl_kind))
+ accessibility = default_accessibility;
+ }
+
+ ClangASTMetadata metadata;
+ metadata.SetUserID(die.GetID());
+ metadata.SetIsDynamicCXXType(dwarf->ClassOrStructIsVirtual(die));
+
+ if (type_name_cstr && strchr(type_name_cstr, '<')) {
+ ClangASTContext::TemplateParameterInfos template_param_infos;
+ if (ParseTemplateParameterInfos(die, template_param_infos)) {
+ clang::ClassTemplateDecl *class_template_decl =
+ m_ast.ParseClassTemplateDecl(decl_ctx, accessibility,
+ type_name_cstr, tag_decl_kind,
+ template_param_infos);
+
+ clang::ClassTemplateSpecializationDecl
+ *class_specialization_decl =
+ m_ast.CreateClassTemplateSpecializationDecl(
+ decl_ctx, class_template_decl, tag_decl_kind,
+ template_param_infos);
+ clang_type = m_ast.CreateClassTemplateSpecializationType(
+ class_specialization_decl);
+ clang_type_was_created = true;
+
+ m_ast.SetMetadata(class_template_decl, metadata);
+ m_ast.SetMetadata(class_specialization_decl, metadata);
+ }
+ }
+
+ if (!clang_type_was_created) {
+ clang_type_was_created = true;
+ clang_type = m_ast.CreateRecordType(decl_ctx, accessibility,
+ type_name_cstr, tag_decl_kind,
+ class_language, &metadata);
+ }
+ }
- if (type_sp)
- {
- if (log)
- {
- 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(),
- DW_TAG_value_to_name(tag),
- type_name_cstr,
- type_sp->GetID());
- }
+ // Store a forward declaration to this class type in case any
+ // parameters in any class methods need it for the clang
+ // types for function prototypes.
+ LinkDeclContextToDIE(m_ast.GetDeclContextForType(clang_type), die);
+ type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str,
+ byte_size, NULL, LLDB_INVALID_UID,
+ Type::eEncodingIsUID, &decl, clang_type,
+ Type::eResolveStateForward));
+
+ type_sp->SetIsCompleteObjCClass(is_complete_objc_class);
+
+ // Add our type to the unique type map so we don't
+ // 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_die = die;
+ unique_ast_entry_ap->m_declaration = unique_decl;
+ unique_ast_entry_ap->m_byte_size = byte_size;
+ dwarf->GetUniqueDWARFASTTypeMap().Insert(unique_typename,
+ *unique_ast_entry_ap);
+
+ 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
+ DWARFDIE child_die = die.GetFirstChild();
+ while (child_die) {
+ switch (child_die.Tag()) {
+ case DW_TAG_inheritance:
+ case DW_TAG_subprogram:
+ case DW_TAG_member:
+ case DW_TAG_APPLE_property:
+ case DW_TAG_class_type:
+ case DW_TAG_structure_type:
+ case DW_TAG_enumeration_type:
+ case DW_TAG_typedef:
+ case DW_TAG_union_type:
+ child_die.Clear();
+ is_forward_declaration = false;
+ break;
+ default:
+ child_die = child_die.GetSibling();
+ break;
+ }
+ }
+ }
- // 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->GetDIEToType()[die.GetDIE()] = type_sp.get();
- return type_sp;
- }
- }
- }
+ if (!is_forward_declaration) {
+ // Always start the definition for a class type so that
+ // 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) {
+ // No children for this struct/union/class, lets finish it
+ if (ClangASTContext::StartTagDeclarationDefinition(clang_type)) {
+ ClangASTContext::CompleteTagDeclarationDefinition(clang_type);
+ } else {
+ dwarf->GetObjectFile()->GetModule()->ReportError(
+ "DWARF DIE at 0x%8.8x named \"%s\" was not able to start its "
+ "definition.\nPlease file a bug and attach the file at the "
+ "start of this error message",
+ die.GetOffset(), type_name_cstr);
+ }
+ if (tag == DW_TAG_structure_type) // this only applies in C
+ {
+ clang::RecordDecl *record_decl =
+ ClangASTContext::GetAsRecordDecl(clang_type);
- if (is_forward_declaration)
- {
- // We have a forward declaration to a type and we need
- // to try and find a full declaration. We look in the
- // current type index just in case we have a forward
- // declaration followed by an actual declarations in the
- // DWARF. If this fails, we need to look elsewhere...
- if (log)
- {
- 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(),
- DW_TAG_value_to_name(tag),
- type_name_cstr);
- }
+ if (record_decl) {
+ GetClangASTImporter().InsertRecordDecl(
+ record_decl, ClangASTImporter::LayoutInfo());
+ }
+ }
+ } else if (clang_type_was_created) {
+ // Start the definition if the class is not objective C since
+ // the underlying decls respond to isCompleteDefinition(). Objective
+ // C decls don't respond to isCompleteDefinition() so we can't
+ // start the declaration definition right away. For C++
+ // class/union/structs
+ // we want to start the definition in case the class is needed as
+ // the
+ // declaration context for a contained class or type without the
+ // need
+ // to complete that type..
+
+ if (class_language != eLanguageTypeObjC &&
+ class_language != eLanguageTypeObjC_plus_plus)
+ ClangASTContext::StartTagDeclarationDefinition(clang_type);
+
+ // Leave this as a forward declaration until we need
+ // to know the details of the type. lldb_private::Type
+ // will automatically call the SymbolFile virtual function
+ // "SymbolFileDWARF::CompleteType(Type *)"
+ // When the definition needs to be defined.
+ assert(!dwarf->GetForwardDeclClangTypeToDie().count(
+ ClangUtil::RemoveFastQualifiers(clang_type)
+ .GetOpaqueQualType()) &&
+ "Type already in the forward declaration map!");
+ // Can't assume m_ast.GetSymbolFile() is actually a SymbolFileDWARF,
+ // it can be a
+ // SymbolFileDWARFDebugMap for Apple binaries.
+ dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] =
+ clang_type.GetOpaqueQualType();
+ dwarf->GetForwardDeclClangTypeToDie()
+ [ClangUtil::RemoveFastQualifiers(clang_type)
+ .GetOpaqueQualType()] = die.GetDIERef();
+ m_ast.SetHasExternalStorage(clang_type.GetOpaqueQualType(), true);
+ }
+ }
+ } break;
- // See if the type comes from a DWO module and if so, track down that type.
- type_sp = ParseTypeFromDWO(die, log);
- if (type_sp)
- return type_sp;
-
- DWARFDeclContext 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);
-
- if (!type_sp)
- {
- SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile();
- if (debug_map_symfile)
- {
- // We weren't able to find a full declaration in
- // this DWARF, see if we have a declaration anywhere
- // else...
- type_sp = debug_map_symfile->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
- }
- }
+ case DW_TAG_enumeration_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
- if (type_sp)
- {
- if (log)
- {
- 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(),
- DW_TAG_value_to_name(tag),
- type_name_cstr,
- type_sp->GetID());
- }
+ DWARFFormValue encoding_form;
- // 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->GetDIEToType()[die.GetDIE()] = type_sp.get();
- clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(
- dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf)));
- if (defn_decl_ctx)
- LinkDeclContextToDIE(defn_decl_ctx, die);
- return type_sp;
- }
- }
- assert (tag_decl_kind != -1);
- bool clang_type_was_created = false;
- clang_type.SetCompilerType(&m_ast, dwarf->GetForwardDeclDieToClangType().lookup (die.GetDIE()));
- if (!clang_type)
- {
- clang::DeclContext *decl_ctx = GetClangDeclContextContainingDIE (die, nullptr);
- if (accessibility == eAccessNone && decl_ctx)
- {
- // Check the decl context that contains this class/struct/union.
- // If it is a class we must give it an accessibility.
- const clang::Decl::Kind containing_decl_kind = decl_ctx->getDeclKind();
- if (DeclKindIsCXXClass (containing_decl_kind))
- accessibility = default_accessibility;
- }
+ 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(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:
+ type_name_cstr = form_value.AsCString();
+ type_name_const_str.SetCString(type_name_cstr);
+ break;
+ case DW_AT_type:
+ encoding_form = form_value;
+ break;
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ break;
+ case DW_AT_accessibility:
+ break; // accessibility =
+ // DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
+ case DW_AT_declaration:
+ is_forward_declaration = form_value.Boolean();
+ break;
+ case DW_AT_allocated:
+ case DW_AT_associated:
+ case DW_AT_bit_stride:
+ case DW_AT_byte_stride:
+ case DW_AT_data_location:
+ case DW_AT_description:
+ case DW_AT_start_scope:
+ case DW_AT_visibility:
+ case DW_AT_specification:
+ case DW_AT_abstract_origin:
+ case DW_AT_sibling:
+ break;
+ }
+ }
+ }
+
+ if (is_forward_declaration) {
+ type_sp = ParseTypeFromDWO(die, log);
+ if (type_sp)
+ return type_sp;
+
+ DWARFDeclContext die_decl_ctx;
+ die.GetDWARFDeclContext(die_decl_ctx);
+
+ type_sp =
+ dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx);
+
+ if (!type_sp) {
+ SymbolFileDWARFDebugMap *debug_map_symfile =
+ dwarf->GetDebugMapSymfile();
+ if (debug_map_symfile) {
+ // We weren't able to find a full declaration in
+ // this DWARF, see if we have a declaration anywhere
+ // else...
+ type_sp =
+ debug_map_symfile->FindDefinitionTypeForDWARFDeclContext(
+ die_decl_ctx);
+ }
+ }
- ClangASTMetadata metadata;
- metadata.SetUserID(die.GetID());
- metadata.SetIsDynamicCXXType(dwarf->ClassOrStructIsVirtual (die));
-
- if (type_name_cstr && strchr (type_name_cstr, '<'))
- {
- ClangASTContext::TemplateParameterInfos template_param_infos;
- if (ParseTemplateParameterInfos (die, template_param_infos))
- {
- clang::ClassTemplateDecl *class_template_decl = m_ast.ParseClassTemplateDecl (decl_ctx,
- accessibility,
- type_name_cstr,
- tag_decl_kind,
- template_param_infos);
-
- clang::ClassTemplateSpecializationDecl *class_specialization_decl = m_ast.CreateClassTemplateSpecializationDecl (decl_ctx,
- class_template_decl,
- tag_decl_kind,
- template_param_infos);
- clang_type = m_ast.CreateClassTemplateSpecializationType (class_specialization_decl);
- clang_type_was_created = true;
-
- m_ast.SetMetadata (class_template_decl, metadata);
- m_ast.SetMetadata (class_specialization_decl, metadata);
- }
- }
+ if (type_sp) {
+ if (log) {
+ 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(),
+ DW_TAG_value_to_name(tag), type_name_cstr,
+ type_sp->GetID());
+ }
+
+ // 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->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ clang::DeclContext *defn_decl_ctx =
+ GetCachedClangDeclContextForDIE(dwarf->DebugInfo()->GetDIE(
+ DIERef(type_sp->GetID(), dwarf)));
+ if (defn_decl_ctx)
+ LinkDeclContextToDIE(defn_decl_ctx, die);
+ return type_sp;
+ }
+ }
+ DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
+ DW_TAG_value_to_name(tag), type_name_cstr);
+
+ CompilerType enumerator_clang_type;
+ clang_type.SetCompilerType(
+ &m_ast,
+ dwarf->GetForwardDeclDieToClangType().lookup(die.GetDIE()));
+ if (!clang_type) {
+ if (encoding_form.IsValid()) {
+ Type *enumerator_type =
+ dwarf->ResolveTypeUID(DIERef(encoding_form));
+ if (enumerator_type)
+ enumerator_clang_type = enumerator_type->GetFullCompilerType();
+ }
- if (!clang_type_was_created)
- {
- clang_type_was_created = true;
- clang_type = m_ast.CreateRecordType (decl_ctx,
- accessibility,
- type_name_cstr,
- tag_decl_kind,
- class_language,
- &metadata);
- }
- }
+ if (!enumerator_clang_type) {
+ if (byte_size > 0) {
+ enumerator_clang_type =
+ m_ast.GetBuiltinTypeForDWARFEncodingAndBitSize(
+ NULL, DW_ATE_signed, byte_size * 8);
+ } else {
+ enumerator_clang_type = m_ast.GetBasicType(eBasicTypeInt);
+ }
+ }
- // Store a forward declaration to this class type in case any
- // parameters in any class methods need it for the clang
- // types for function prototypes.
- LinkDeclContextToDIE(m_ast.GetDeclContextForType(clang_type), die);
- type_sp.reset (new Type (die.GetID(),
- dwarf,
- type_name_const_str,
- byte_size,
- NULL,
- LLDB_INVALID_UID,
- Type::eEncodingIsUID,
- &decl,
- clang_type,
- Type::eResolveStateForward));
-
- type_sp->SetIsCompleteObjCClass(is_complete_objc_class);
-
-
- // Add our type to the unique type map so we don't
- // 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_die = die;
- unique_ast_entry_ap->m_declaration = unique_decl;
- unique_ast_entry_ap->m_byte_size = byte_size;
- dwarf->GetUniqueDWARFASTTypeMap().Insert (unique_typename,
- *unique_ast_entry_ap);
-
- 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
- DWARFDIE child_die = die.GetFirstChild();
- while (child_die)
- {
- switch (child_die.Tag())
- {
- case DW_TAG_inheritance:
- case DW_TAG_subprogram:
- case DW_TAG_member:
- case DW_TAG_APPLE_property:
- case DW_TAG_class_type:
- case DW_TAG_structure_type:
- case DW_TAG_enumeration_type:
- case DW_TAG_typedef:
- case DW_TAG_union_type:
- child_die.Clear();
- is_forward_declaration = false;
- break;
- default:
- child_die = child_die.GetSibling();
- break;
- }
- }
- }
+ clang_type = m_ast.CreateEnumerationType(
+ type_name_cstr, GetClangDeclContextContainingDIE(die, nullptr),
+ decl, enumerator_clang_type);
+ } else {
+ enumerator_clang_type =
+ m_ast.GetEnumerationIntegerType(clang_type.GetOpaqueQualType());
+ }
+
+ LinkDeclContextToDIE(
+ ClangASTContext::GetDeclContextForType(clang_type), die);
+
+ type_sp.reset(new Type(
+ die.GetID(), dwarf, type_name_const_str, byte_size, NULL,
+ DIERef(encoding_form).GetUID(dwarf), Type::eEncodingIsUID, &decl,
+ clang_type, Type::eResolveStateForward));
+
+ if (ClangASTContext::StartTagDeclarationDefinition(clang_type)) {
+ if (die.HasChildren()) {
+ 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(), die);
+ }
+ ClangASTContext::CompleteTagDeclarationDefinition(clang_type);
+ } else {
+ dwarf->GetObjectFile()->GetModule()->ReportError(
+ "DWARF DIE at 0x%8.8x named \"%s\" was not able to start its "
+ "definition.\nPlease file a bug and attach the file at the "
+ "start of this error message",
+ die.GetOffset(), type_name_cstr);
+ }
+ }
+ } break;
+
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_subprogram:
+ case DW_TAG_subroutine_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ DWARFFormValue type_die_form;
+ bool is_variadic = false;
+ bool is_inline = false;
+ bool is_static = false;
+ bool is_virtual = false;
+ bool is_explicit = false;
+ bool is_artificial = false;
+ bool has_template_params = false;
+ DWARFFormValue specification_die_form;
+ DWARFFormValue abstract_origin_die_form;
+ dw_offset_t object_pointer_die_offset = DW_INVALID_OFFSET;
+
+ unsigned type_quals = 0;
+ clang::StorageClass storage =
+ clang::SC_None; //, Extern, Static, PrivateExtern
- if (!is_forward_declaration)
- {
- // Always start the definition for a class type so that
- // 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)
- {
- // No children for this struct/union/class, lets finish it
- if (ClangASTContext::StartTagDeclarationDefinition (clang_type))
- {
- ClangASTContext::CompleteTagDeclarationDefinition (clang_type);
- }
- else
- {
- dwarf->GetObjectFile()->GetModule()->ReportError("DWARF DIE at 0x%8.8x named \"%s\" was not able to start its definition.\nPlease file a bug and attach the file at the start of this error message",
- die.GetOffset(),
- type_name_cstr);
- }
+ 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(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:
+ type_name_cstr = form_value.AsCString();
+ type_name_const_str.SetCString(type_name_cstr);
+ break;
- if (tag == DW_TAG_structure_type) // this only applies in C
- {
- clang::RecordDecl *record_decl = ClangASTContext::GetAsRecordDecl(clang_type);
+ case DW_AT_linkage_name:
+ case DW_AT_MIPS_linkage_name:
+ break; // mangled =
+ // form_value.AsCString(&dwarf->get_debug_str_data());
+ // break;
+ case DW_AT_type:
+ type_die_form = form_value;
+ break;
+ case DW_AT_accessibility:
+ accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned());
+ break;
+ case DW_AT_declaration:
+ break; // is_forward_declaration = form_value.Boolean(); break;
+ case DW_AT_inline:
+ is_inline = form_value.Boolean();
+ break;
+ case DW_AT_virtuality:
+ is_virtual = form_value.Boolean();
+ break;
+ case DW_AT_explicit:
+ is_explicit = form_value.Boolean();
+ break;
+ case DW_AT_artificial:
+ is_artificial = form_value.Boolean();
+ break;
- if (record_decl)
- {
- GetClangASTImporter().InsertRecordDecl(record_decl, ClangASTImporter::LayoutInfo());
- }
- }
- }
- else if (clang_type_was_created)
- {
- // Start the definition if the class is not objective C since
- // the underlying decls respond to isCompleteDefinition(). Objective
- // C decls don't respond to isCompleteDefinition() so we can't
- // start the declaration definition right away. For C++ class/union/structs
- // we want to start the definition in case the class is needed as the
- // declaration context for a contained class or type without the need
- // to complete that type..
-
- if (class_language != eLanguageTypeObjC &&
- class_language != eLanguageTypeObjC_plus_plus)
- ClangASTContext::StartTagDeclarationDefinition (clang_type);
-
- // Leave this as a forward declaration until we need
- // to know the details of the type. lldb_private::Type
- // will automatically call the SymbolFile virtual function
- // "SymbolFileDWARF::CompleteType(Type *)"
- // When the definition needs to be defined.
- assert(!dwarf->GetForwardDeclClangTypeToDie().count(
- ClangUtil::RemoveFastQualifiers(clang_type).GetOpaqueQualType()) &&
- "Type already in the forward declaration map!");
- // Can't assume m_ast.GetSymbolFile() is actually a SymbolFileDWARF, it can be a
- // SymbolFileDWARFDebugMap for Apple binaries.
- dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] = clang_type.GetOpaqueQualType();
- dwarf->GetForwardDeclClangTypeToDie()[ClangUtil::RemoveFastQualifiers(clang_type)
- .GetOpaqueQualType()] = die.GetDIERef();
- m_ast.SetHasExternalStorage (clang_type.GetOpaqueQualType(), true);
- }
- }
+ case DW_AT_external:
+ if (form_value.Unsigned()) {
+ if (storage == clang::SC_None)
+ storage = clang::SC_Extern;
+ else
+ storage = clang::SC_PrivateExtern;
}
- break;
-
- case DW_TAG_enumeration_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- DWARFFormValue encoding_form;
-
- 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(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:
- type_name_cstr = form_value.AsCString();
- type_name_const_str.SetCString(type_name_cstr);
- break;
- case DW_AT_type: encoding_form = form_value; break;
- case DW_AT_byte_size: byte_size = form_value.Unsigned(); break;
- case DW_AT_accessibility: break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
- case DW_AT_declaration: is_forward_declaration = form_value.Boolean(); break;
- case DW_AT_allocated:
- case DW_AT_associated:
- case DW_AT_bit_stride:
- case DW_AT_byte_stride:
- case DW_AT_data_location:
- case DW_AT_description:
- case DW_AT_start_scope:
- case DW_AT_visibility:
- case DW_AT_specification:
- case DW_AT_abstract_origin:
- case DW_AT_sibling:
- break;
- }
- }
- }
-
- if (is_forward_declaration)
- {
- type_sp = ParseTypeFromDWO(die, log);
- if (type_sp)
- return type_sp;
-
- DWARFDeclContext die_decl_ctx;
- die.GetDWARFDeclContext(die_decl_ctx);
-
- type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
-
- if (!type_sp)
- {
- SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile();
- if (debug_map_symfile)
- {
- // We weren't able to find a full declaration in
- // this DWARF, see if we have a declaration anywhere
- // else...
- type_sp = debug_map_symfile->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
- }
- }
-
- if (type_sp)
- {
- if (log)
- {
- 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(),
- DW_TAG_value_to_name(tag),
- type_name_cstr,
- type_sp->GetID());
- }
-
- // 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->GetDIEToType()[die.GetDIE()] = type_sp.get();
- clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf)));
- if (defn_decl_ctx)
- LinkDeclContextToDIE(defn_decl_ctx, die);
- return type_sp;
- }
+ break;
- }
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
-
- CompilerType enumerator_clang_type;
- clang_type.SetCompilerType (&m_ast, dwarf->GetForwardDeclDieToClangType().lookup (die.GetDIE()));
- if (!clang_type)
- {
- if (encoding_form.IsValid())
- {
- Type *enumerator_type = dwarf->ResolveTypeUID(DIERef(encoding_form));
- if (enumerator_type)
- enumerator_clang_type = enumerator_type->GetFullCompilerType ();
- }
+ case DW_AT_specification:
+ specification_die_form = form_value;
+ break;
- if (!enumerator_clang_type)
- {
- if (byte_size > 0)
- {
- enumerator_clang_type = m_ast.GetBuiltinTypeForDWARFEncodingAndBitSize(NULL,
- DW_ATE_signed,
- byte_size * 8);
- }
- else
- {
- enumerator_clang_type = m_ast.GetBasicType(eBasicTypeInt);
- }
- }
+ case DW_AT_abstract_origin:
+ abstract_origin_die_form = form_value;
+ break;
- clang_type = m_ast.CreateEnumerationType (type_name_cstr,
- GetClangDeclContextContainingDIE (die, nullptr),
- decl,
- enumerator_clang_type);
- }
- else
- {
- enumerator_clang_type = m_ast.GetEnumerationIntegerType (clang_type.GetOpaqueQualType());
- }
+ case DW_AT_object_pointer:
+ object_pointer_die_offset = form_value.Reference();
+ break;
- LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die);
-
- type_sp.reset( new Type (die.GetID(),
- dwarf,
- type_name_const_str,
- byte_size,
- NULL,
- DIERef(encoding_form).GetUID(dwarf),
- Type::eEncodingIsUID,
- &decl,
- clang_type,
- Type::eResolveStateForward));
-
- if (ClangASTContext::StartTagDeclarationDefinition (clang_type))
- {
- if (die.HasChildren())
- {
- 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(), die);
- }
- ClangASTContext::CompleteTagDeclarationDefinition (clang_type);
- }
- else
- {
- dwarf->GetObjectFile()->GetModule()->ReportError("DWARF DIE at 0x%8.8x named \"%s\" was not able to start its definition.\nPlease file a bug and attach the file at the start of this error message",
- die.GetOffset(),
- type_name_cstr);
- }
- }
- }
- break;
-
- case DW_TAG_inlined_subroutine:
- case DW_TAG_subprogram:
- case DW_TAG_subroutine_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- DWARFFormValue type_die_form;
- bool is_variadic = false;
- bool is_inline = false;
- bool is_static = false;
- bool is_virtual = false;
- bool is_explicit = false;
- bool is_artificial = false;
- bool has_template_params = false;
- DWARFFormValue specification_die_form;
- DWARFFormValue abstract_origin_die_form;
- dw_offset_t object_pointer_die_offset = DW_INVALID_OFFSET;
-
- unsigned type_quals = 0;
- clang::StorageClass storage = clang::SC_None;//, Extern, Static, PrivateExtern
-
-
- 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(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:
- type_name_cstr = form_value.AsCString();
- type_name_const_str.SetCString(type_name_cstr);
- break;
-
- case DW_AT_linkage_name:
- case DW_AT_MIPS_linkage_name: break; // mangled = form_value.AsCString(&dwarf->get_debug_str_data()); break;
- case DW_AT_type: type_die_form = form_value; break;
- case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
- case DW_AT_declaration: break; // is_forward_declaration = form_value.Boolean(); break;
- case DW_AT_inline: is_inline = form_value.Boolean(); break;
- case DW_AT_virtuality: is_virtual = form_value.Boolean(); break;
- case DW_AT_explicit: is_explicit = form_value.Boolean(); break;
- case DW_AT_artificial: is_artificial = form_value.Boolean(); break;
-
-
- case DW_AT_external:
- if (form_value.Unsigned())
- {
- if (storage == clang::SC_None)
- storage = clang::SC_Extern;
- else
- storage = clang::SC_PrivateExtern;
- }
- break;
-
- case DW_AT_specification:
- specification_die_form = form_value;
- break;
-
- case DW_AT_abstract_origin:
- abstract_origin_die_form = form_value;
- break;
-
- case DW_AT_object_pointer:
- object_pointer_die_offset = form_value.Reference();
- break;
-
- case DW_AT_allocated:
- case DW_AT_associated:
- case DW_AT_address_class:
- case DW_AT_calling_convention:
- case DW_AT_data_location:
- case DW_AT_elemental:
- case DW_AT_entry_pc:
- case DW_AT_frame_base:
- case DW_AT_high_pc:
- case DW_AT_low_pc:
- case DW_AT_prototyped:
- case DW_AT_pure:
- case DW_AT_ranges:
- case DW_AT_recursive:
- case DW_AT_return_addr:
- case DW_AT_segment:
- case DW_AT_start_scope:
- case DW_AT_static_link:
- case DW_AT_trampoline:
- case DW_AT_visibility:
- case DW_AT_vtable_elem_location:
- case DW_AT_description:
- case DW_AT_sibling:
- break;
- }
- }
- }
- }
+ case DW_AT_allocated:
+ case DW_AT_associated:
+ case DW_AT_address_class:
+ case DW_AT_calling_convention:
+ case DW_AT_data_location:
+ case DW_AT_elemental:
+ case DW_AT_entry_pc:
+ case DW_AT_frame_base:
+ case DW_AT_high_pc:
+ case DW_AT_low_pc:
+ case DW_AT_prototyped:
+ case DW_AT_pure:
+ case DW_AT_ranges:
+ case DW_AT_recursive:
+ case DW_AT_return_addr:
+ case DW_AT_segment:
+ case DW_AT_start_scope:
+ case DW_AT_static_link:
+ case DW_AT_trampoline:
+ case DW_AT_visibility:
+ case DW_AT_vtable_elem_location:
+ case DW_AT_description:
+ case DW_AT_sibling:
+ break;
+ }
+ }
+ }
+ }
- std::string object_pointer_name;
- if (object_pointer_die_offset != DW_INVALID_OFFSET)
- {
- DWARFDIE object_pointer_die = die.GetDIE (object_pointer_die_offset);
- if (object_pointer_die)
- {
- const char *object_pointer_name_cstr = object_pointer_die.GetName();
- if (object_pointer_name_cstr)
- object_pointer_name = object_pointer_name_cstr;
- }
- }
+ std::string object_pointer_name;
+ if (object_pointer_die_offset != DW_INVALID_OFFSET) {
+ DWARFDIE object_pointer_die = die.GetDIE(object_pointer_die_offset);
+ if (object_pointer_die) {
+ 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", die.GetID(), 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;
+ CompilerType return_clang_type;
+ Type *func_type = NULL;
- if (type_die_form.IsValid())
- func_type = dwarf->ResolveTypeUID(DIERef(type_die_form));
+ if (type_die_form.IsValid())
+ func_type = dwarf->ResolveTypeUID(DIERef(type_die_form));
- if (func_type)
- return_clang_type = func_type->GetForwardCompilerType ();
- else
- return_clang_type = m_ast.GetBasicType(eBasicTypeVoid);
+ if (func_type)
+ return_clang_type = func_type->GetForwardCompilerType();
+ else
+ return_clang_type = m_ast.GetBasicType(eBasicTypeVoid);
+ std::vector<CompilerType> function_param_types;
+ std::vector<clang::ParmVarDecl *> function_param_decls;
- std::vector<CompilerType> function_param_types;
- std::vector<clang::ParmVarDecl*> function_param_decls;
+ // Parse the function children for the parameters
- // Parse the function children for the parameters
+ 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();
- 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();
+ bool is_cxx_method = DeclKindIsCXXClass(containing_decl_kind);
+ // Start off static. This will be set to false in
+ // ParseChildParameters(...)
+ // if we find a "this" parameters as the first parameter
+ if (is_cxx_method) {
+ is_static = true;
+ }
- bool is_cxx_method = DeclKindIsCXXClass (containing_decl_kind);
- // Start off static. This will be set to false in ParseChildParameters(...)
- // if we find a "this" parameters as the first parameter
- if (is_cxx_method)
- {
- is_static = true;
- }
+ if (die.HasChildren()) {
+ bool skip_artificial = true;
+ ParseChildParameters(sc, containing_decl_ctx, die, skip_artificial,
+ is_static, is_variadic, has_template_params,
+ function_param_types, function_param_decls,
+ type_quals);
+ }
- if (die.HasChildren())
- {
- bool skip_artificial = true;
- ParseChildParameters (sc,
- containing_decl_ctx,
- die,
- skip_artificial,
- is_static,
- is_variadic,
- has_template_params,
- function_param_types,
- function_param_decls,
- type_quals);
- }
+ bool ignore_containing_context = false;
+ // Check for templatized class member functions. If we had any
+ // DW_TAG_template_type_parameter
+ // or DW_TAG_template_value_parameter the DW_TAG_subprogram DIE, then we
+ // can't let this become
+ // a method in a class. Why? Because templatized functions are only
+ // emitted if one of the
+ // templatized methods is used in the current compile unit and we will
+ // end up with classes
+ // that may or may not include these member functions and this means one
+ // class won't match another
+ // class definition and it affects our ability to use a class in the
+ // clang expression parser. So
+ // for the greater good, we currently must not allow any template member
+ // functions in a class definition.
+ if (is_cxx_method && has_template_params) {
+ ignore_containing_context = true;
+ is_cxx_method = false;
+ }
- bool ignore_containing_context = false;
- // Check for templatized class member functions. If we had any DW_TAG_template_type_parameter
- // or DW_TAG_template_value_parameter the DW_TAG_subprogram DIE, then we can't let this become
- // a method in a class. Why? Because templatized functions are only emitted if one of the
- // templatized methods is used in the current compile unit and we will end up with classes
- // that may or may not include these member functions and this means one class won't match another
- // class definition and it affects our ability to use a class in the clang expression parser. So
- // for the greater good, we currently must not allow any template member functions in a class definition.
- if (is_cxx_method && has_template_params)
- {
- ignore_containing_context = true;
- is_cxx_method = false;
+ // clang_type will get the function prototype clang type after this call
+ clang_type = m_ast.CreateFunctionType(
+ return_clang_type, function_param_types.data(),
+ function_param_types.size(), is_variadic, type_quals);
+
+ if (type_name_cstr) {
+ bool type_handled = false;
+ if (tag == DW_TAG_subprogram || tag == DW_TAG_inlined_subroutine) {
+ ObjCLanguage::MethodName objc_method(type_name_cstr, true);
+ if (objc_method.IsValid(true)) {
+ CompilerType class_opaque_type;
+ ConstString class_name(objc_method.GetClassName());
+ if (class_name) {
+ TypeSP complete_objc_class_type_sp(
+ dwarf->FindCompleteObjCDefinitionTypeForDIE(
+ DWARFDIE(), class_name, false));
+
+ if (complete_objc_class_type_sp) {
+ CompilerType type_clang_forward_type =
+ complete_objc_class_type_sp->GetForwardCompilerType();
+ if (ClangASTContext::IsObjCObjectOrInterfaceType(
+ type_clang_forward_type))
+ class_opaque_type = type_clang_forward_type;
+ }
+ }
+
+ if (class_opaque_type) {
+ // If accessibility isn't set to anything valid, assume public
+ // for
+ // now...
+ if (accessibility == eAccessNone)
+ accessibility = eAccessPublic;
+
+ clang::ObjCMethodDecl *objc_method_decl =
+ m_ast.AddMethodToObjCObjectType(
+ class_opaque_type, type_name_cstr, clang_type,
+ accessibility, is_artificial, is_variadic);
+ type_handled = objc_method_decl != NULL;
+ if (type_handled) {
+ LinkDeclContextToDIE(
+ ClangASTContext::GetAsDeclContext(objc_method_decl), die);
+ m_ast.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(), tag, DW_TAG_value_to_name(tag));
+ }
+ }
+ } else if (is_cxx_method) {
+ // 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(decl_ctx_die);
+ if (class_type) {
+ bool alternate_defn = false;
+ if (class_type->GetID() != decl_ctx_die.GetID() ||
+ decl_ctx_die.GetContainingDWOModuleDIE()) {
+ alternate_defn = true;
+
+ // We uniqued the parent class of this function to another
+ // class
+ // so we now need to associate all dies under "decl_ctx_die"
+ // to
+ // DIEs in the DIE for "class_type"...
+ SymbolFileDWARF *class_symfile = NULL;
+ DWARFDIE class_type_die;
+
+ SymbolFileDWARFDebugMap *debug_map_symfile =
+ dwarf->GetDebugMapSymfile();
+ if (debug_map_symfile) {
+ class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(
+ SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(
+ class_type->GetID()));
+ class_type_die = class_symfile->DebugInfo()->GetDIE(
+ DIERef(class_type->GetID(), dwarf));
+ } else {
+ class_symfile = dwarf;
+ class_type_die = dwarf->DebugInfo()->GetDIE(
+ DIERef(class_type->GetID(), dwarf));
+ }
+ if (class_type_die) {
+ DWARFDIECollection failures;
+
+ CopyUniqueClassMethodTypes(decl_ctx_die, class_type_die,
+ class_type, failures);
+
+ // FIXME do something with these failures that's smarter
+ // than
+ // just dropping them on the ground. Unfortunately classes
+ // don't
+ // like having stuff added to them after their definitions
+ // are
+ // complete...
+
+ type_ptr = dwarf->GetDIEToType()[die.GetDIE()];
+ if (type_ptr && type_ptr != DIE_IS_BEING_PARSED) {
+ type_sp = type_ptr->shared_from_this();
+ break;
}
+ }
+ }
- // clang_type will get the function prototype clang type after this call
- clang_type = m_ast.CreateFunctionType (return_clang_type,
- function_param_types.data(),
- function_param_types.size(),
- is_variadic,
- type_quals);
-
-
- if (type_name_cstr)
- {
- bool type_handled = false;
- if (tag == DW_TAG_subprogram ||
- tag == DW_TAG_inlined_subroutine)
- {
- ObjCLanguage::MethodName objc_method (type_name_cstr, true);
- if (objc_method.IsValid(true))
- {
- CompilerType class_opaque_type;
- ConstString class_name(objc_method.GetClassName());
- if (class_name)
- {
- TypeSP complete_objc_class_type_sp (dwarf->FindCompleteObjCDefinitionTypeForDIE (DWARFDIE(), class_name, false));
-
- if (complete_objc_class_type_sp)
- {
- CompilerType type_clang_forward_type = complete_objc_class_type_sp->GetForwardCompilerType ();
- if (ClangASTContext::IsObjCObjectOrInterfaceType(type_clang_forward_type))
- class_opaque_type = type_clang_forward_type;
- }
- }
-
- if (class_opaque_type)
- {
- // If accessibility isn't set to anything valid, assume public for
- // now...
- if (accessibility == eAccessNone)
- accessibility = eAccessPublic;
-
- clang::ObjCMethodDecl *objc_method_decl = m_ast.AddMethodToObjCObjectType (class_opaque_type,
- type_name_cstr,
- clang_type,
- accessibility,
- is_artificial,
- is_variadic);
- type_handled = objc_method_decl != NULL;
- if (type_handled)
- {
- LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(objc_method_decl), die);
- m_ast.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(),
- tag,
- DW_TAG_value_to_name(tag));
- }
- }
- }
- else if (is_cxx_method)
- {
- // 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 (decl_ctx_die);
- if (class_type)
- {
- bool alternate_defn = false;
- if (class_type->GetID() != decl_ctx_die.GetID() || decl_ctx_die.GetContainingDWOModuleDIE())
- {
- alternate_defn = true;
-
- // We uniqued the parent class of this function to another class
- // so we now need to associate all dies under "decl_ctx_die" to
- // DIEs in the DIE for "class_type"...
- SymbolFileDWARF *class_symfile = NULL;
- DWARFDIE class_type_die;
-
- SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile();
- if (debug_map_symfile)
- {
- class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(class_type->GetID()));
- class_type_die = class_symfile->DebugInfo()->GetDIE (DIERef(class_type->GetID(), dwarf));
- }
- else
- {
- class_symfile = dwarf;
- class_type_die = dwarf->DebugInfo()->GetDIE (DIERef(class_type->GetID(), dwarf));
- }
- if (class_type_die)
- {
- DWARFDIECollection failures;
-
- CopyUniqueClassMethodTypes (decl_ctx_die,
- class_type_die,
- class_type,
- failures);
-
- // FIXME do something with these failures that's smarter than
- // just dropping them on the ground. Unfortunately classes don't
- // like having stuff added to them after their definitions are
- // complete...
-
- type_ptr = dwarf->GetDIEToType()[die.GetDIE()];
- if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
- {
- type_sp = type_ptr->shared_from_this();
- break;
- }
- }
- }
-
- if (specification_die_form.IsValid())
- {
- // We have a specification which we are going to base our function
- // prototype off of, so we need this type to be completed so that the
- // m_die_to_decl_ctx for the method in the specification has a valid
- // clang decl context.
- class_type->GetForwardCompilerType ();
- // If we have a specification, then the function type should have been
- // made with the specification and not with this die.
- DWARFDIE spec_die = dwarf->DebugInfo()->GetDIE(DIERef(specification_die_form));
- clang::DeclContext *spec_clang_decl_ctx = GetClangDeclContextForDIE (spec_die);
- if (spec_clang_decl_ctx)
- {
- LinkDeclContextToDIE(spec_clang_decl_ctx, die);
- }
- else
- {
- dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_specification(0x%8.8" PRIx64 ") has no decl\n",
- die.GetID(),
- specification_die_form.Reference());
- }
- type_handled = true;
- }
- else if (abstract_origin_die_form.IsValid())
- {
- // We have a specification which we are going to base our function
- // prototype off of, so we need this type to be completed so that the
- // m_die_to_decl_ctx for the method in the abstract origin has a valid
- // clang decl context.
- class_type->GetForwardCompilerType ();
-
- DWARFDIE abs_die = dwarf->DebugInfo()->GetDIE (DIERef(abstract_origin_die_form));
- clang::DeclContext *abs_clang_decl_ctx = GetClangDeclContextForDIE (abs_die);
- if (abs_clang_decl_ctx)
- {
- LinkDeclContextToDIE (abs_clang_decl_ctx, die);
- }
- else
- {
- dwarf->GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_abstract_origin(0x%8.8" PRIx64 ") has no decl\n",
- die.GetID(),
- abstract_origin_die_form.Reference());
- }
- type_handled = true;
- }
- else
- {
- CompilerType class_opaque_type = class_type->GetForwardCompilerType ();
- if (ClangASTContext::IsCXXClassType(class_opaque_type))
- {
- if (class_opaque_type.IsBeingDefined () || alternate_defn)
- {
- 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
- // well formed in the DWARF, so we will just skip it...
- type_handled = true;
- }
- else
- {
- bool add_method = true;
- if (alternate_defn)
- {
- // If an alternate definition for the class exists, then add the method only if an
- // equivalent is not already present.
- clang::CXXRecordDecl *record_decl = m_ast.GetAsCXXRecordDecl(class_opaque_type.GetOpaqueQualType());
- if (record_decl)
- {
- for (auto method_iter = record_decl->method_begin();
- method_iter != record_decl->method_end();
- method_iter++)
- {
- clang::CXXMethodDecl *method_decl = *method_iter;
- if (method_decl->getNameInfo().getAsString() == std::string(type_name_cstr))
- {
- if (method_decl->getType() ==
- ClangUtil::GetQualType(clang_type))
- {
- add_method = false;
- LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(method_decl), die);
- type_handled = true;
-
- break;
- }
- }
- }
- }
- }
-
- if (add_method)
- {
- // REMOVE THE CRASH DESCRIPTION BELOW
- 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(),
- die.GetID(),
- dwarf->GetObjectFile()->GetFileSpec().GetPath().c_str());
-
- const bool is_attr_used = false;
- // Neither GCC 4.2 nor clang++ currently set a valid accessibility
- // in the DWARF for C++ methods... Default to public for now...
- if (accessibility == eAccessNone)
- accessibility = eAccessPublic;
-
- clang::CXXMethodDecl *cxx_method_decl;
- cxx_method_decl = m_ast.AddMethodToCXXRecordType (class_opaque_type.GetOpaqueQualType(),
- type_name_cstr,
- clang_type,
- accessibility,
- is_virtual,
- is_static,
- is_inline,
- is_explicit,
- is_attr_used,
- is_artificial);
-
- type_handled = cxx_method_decl != NULL;
-
- if (type_handled)
- {
- LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(cxx_method_decl), die);
-
- Host::SetCrashDescription (NULL);
-
- ClangASTMetadata metadata;
- metadata.SetUserID(die.GetID());
-
- if (!object_pointer_name.empty())
- {
- metadata.SetObjectPtrName(object_pointer_name.c_str());
- if (log)
- log->Printf ("Setting object pointer name: %s on method object %p.\n",
- object_pointer_name.c_str(),
- static_cast<void*>(cxx_method_decl));
- }
- m_ast.SetMetadata (cxx_method_decl, metadata);
- }
- else
- {
- ignore_containing_context = true;
- }
- }
- }
- }
- else
- {
- // We were asked to parse the type for a method in a class, yet the
- // class hasn't been asked to complete itself through the
- // clang::ExternalASTSource protocol, so we need to just have the
- // class complete itself and do things the right way, then our
- // DIE should then have an entry in the dwarf->GetDIEToType() map. First
- // we need to modify the dwarf->GetDIEToType() so it doesn't think we are
- // trying to parse this DIE anymore...
- dwarf->GetDIEToType()[die.GetDIE()] = NULL;
-
- // Now we get the full type to force our class type to complete itself
- // using the clang::ExternalASTSource protocol which will parse all
- // base classes and all methods (including the method for this DIE).
- class_type->GetFullCompilerType ();
-
- // The type for this DIE should have been filled in the function call above
- type_ptr = dwarf->GetDIEToType()[die.GetDIE()];
- if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
- {
- type_sp = type_ptr->shared_from_this();
- break;
- }
-
- // FIXME This is fixing some even uglier behavior but we really need to
- // uniq the methods of each class as well as the class itself.
- // <rdar://problem/11240464>
- type_handled = true;
- }
- }
- }
+ if (specification_die_form.IsValid()) {
+ // We have a specification which we are going to base our
+ // function
+ // prototype off of, so we need this type to be completed so
+ // that the
+ // m_die_to_decl_ctx for the method in the specification has a
+ // valid
+ // clang decl context.
+ class_type->GetForwardCompilerType();
+ // If we have a specification, then the function type should
+ // have been
+ // made with the specification and not with this die.
+ DWARFDIE spec_die = dwarf->DebugInfo()->GetDIE(
+ DIERef(specification_die_form));
+ clang::DeclContext *spec_clang_decl_ctx =
+ GetClangDeclContextForDIE(spec_die);
+ if (spec_clang_decl_ctx) {
+ LinkDeclContextToDIE(spec_clang_decl_ctx, die);
+ } else {
+ dwarf->GetObjectFile()->GetModule()->ReportWarning(
+ "0x%8.8" PRIx64 ": DW_AT_specification(0x%8.8" PRIx64
+ ") has no decl\n",
+ die.GetID(), specification_die_form.Reference());
+ }
+ type_handled = true;
+ } else if (abstract_origin_die_form.IsValid()) {
+ // We have a specification which we are going to base our
+ // function
+ // prototype off of, so we need this type to be completed so
+ // that the
+ // m_die_to_decl_ctx for the method in the abstract origin has
+ // a valid
+ // clang decl context.
+ class_type->GetForwardCompilerType();
+
+ DWARFDIE abs_die = dwarf->DebugInfo()->GetDIE(
+ DIERef(abstract_origin_die_form));
+ clang::DeclContext *abs_clang_decl_ctx =
+ GetClangDeclContextForDIE(abs_die);
+ if (abs_clang_decl_ctx) {
+ LinkDeclContextToDIE(abs_clang_decl_ctx, die);
+ } else {
+ dwarf->GetObjectFile()->GetModule()->ReportWarning(
+ "0x%8.8" PRIx64 ": DW_AT_abstract_origin(0x%8.8" PRIx64
+ ") has no decl\n",
+ die.GetID(), abstract_origin_die_form.Reference());
+ }
+ type_handled = true;
+ } else {
+ CompilerType class_opaque_type =
+ class_type->GetForwardCompilerType();
+ if (ClangASTContext::IsCXXClassType(class_opaque_type)) {
+ if (class_opaque_type.IsBeingDefined() || alternate_defn) {
+ 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
+ // well formed in the DWARF, so we will just skip it...
+ type_handled = true;
+ } else {
+ bool add_method = true;
+ if (alternate_defn) {
+ // If an alternate definition for the class exists,
+ // then add the method only if an
+ // equivalent is not already present.
+ clang::CXXRecordDecl *record_decl =
+ m_ast.GetAsCXXRecordDecl(
+ class_opaque_type.GetOpaqueQualType());
+ if (record_decl) {
+ for (auto method_iter = record_decl->method_begin();
+ method_iter != record_decl->method_end();
+ method_iter++) {
+ clang::CXXMethodDecl *method_decl = *method_iter;
+ if (method_decl->getNameInfo().getAsString() ==
+ std::string(type_name_cstr)) {
+ if (method_decl->getType() ==
+ ClangUtil::GetQualType(clang_type)) {
+ add_method = false;
+ LinkDeclContextToDIE(
+ ClangASTContext::GetAsDeclContext(
+ method_decl),
+ die);
+ type_handled = true;
+
+ break;
}
+ }
}
+ }
}
- if (!type_handled)
- {
- clang::FunctionDecl *function_decl = nullptr;
-
- if (abstract_origin_die_form.IsValid())
- {
- DWARFDIE abs_die = dwarf->DebugInfo()->GetDIE (DIERef(abstract_origin_die_form));
-
- SymbolContext sc;
-
- if (dwarf->ResolveType (abs_die))
- {
- function_decl = llvm::dyn_cast_or_null<clang::FunctionDecl>(GetCachedClangDeclContextForDIE(abs_die));
-
- if (function_decl)
- {
- LinkDeclContextToDIE(function_decl, die);
- }
- }
- }
+ if (add_method) {
+ // REMOVE THE CRASH DESCRIPTION BELOW
+ 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(), die.GetID(),
+ dwarf->GetObjectFile()
+ ->GetFileSpec()
+ .GetPath()
+ .c_str());
+
+ const bool is_attr_used = false;
+ // Neither GCC 4.2 nor clang++ currently set a valid
+ // accessibility
+ // in the DWARF for C++ methods... Default to public
+ // for now...
+ if (accessibility == eAccessNone)
+ accessibility = eAccessPublic;
+
+ clang::CXXMethodDecl *cxx_method_decl;
+ cxx_method_decl = m_ast.AddMethodToCXXRecordType(
+ class_opaque_type.GetOpaqueQualType(),
+ type_name_cstr, clang_type, accessibility,
+ is_virtual, is_static, is_inline, is_explicit,
+ is_attr_used, is_artificial);
+
+ type_handled = cxx_method_decl != NULL;
+
+ if (type_handled) {
+ LinkDeclContextToDIE(
+ ClangASTContext::GetAsDeclContext(
+ cxx_method_decl),
+ die);
+
+ Host::SetCrashDescription(NULL);
- if (!function_decl)
- {
- // We just have a function that isn't part of a class
- function_decl = m_ast.CreateFunctionDeclaration (ignore_containing_context ? m_ast.GetTranslationUnitDecl() : containing_decl_ctx,
- type_name_cstr,
- clang_type,
- storage,
- is_inline);
-
- // if (template_param_infos.GetSize() > 0)
- // {
- // clang::FunctionTemplateDecl *func_template_decl = CreateFunctionTemplateDecl (containing_decl_ctx,
- // function_decl,
- // type_name_cstr,
- // template_param_infos);
- //
- // CreateFunctionTemplateSpecializationInfo (function_decl,
- // func_template_decl,
- // template_param_infos);
- // }
- // Add the decl to our DIE to decl context map
-
- lldbassert (function_decl);
-
- if (function_decl)
- {
- LinkDeclContextToDIE(function_decl, die);
-
- if (!function_param_decls.empty())
- m_ast.SetFunctionParameters (function_decl,
- &function_param_decls.front(),
- function_param_decls.size());
-
- ClangASTMetadata metadata;
- metadata.SetUserID(die.GetID());
-
- if (!object_pointer_name.empty())
- {
- metadata.SetObjectPtrName(object_pointer_name.c_str());
- if (log)
- log->Printf ("Setting object pointer name: %s on function object %p.",
- object_pointer_name.c_str(),
- static_cast<void*>(function_decl));
- }
- m_ast.SetMetadata (function_decl, metadata);
- }
+ ClangASTMetadata metadata;
+ metadata.SetUserID(die.GetID());
+
+ if (!object_pointer_name.empty()) {
+ metadata.SetObjectPtrName(
+ object_pointer_name.c_str());
+ if (log)
+ log->Printf(
+ "Setting object pointer name: %s on method "
+ "object %p.\n",
+ object_pointer_name.c_str(),
+ static_cast<void *>(cxx_method_decl));
}
+ m_ast.SetMetadata(cxx_method_decl, metadata);
+ } else {
+ ignore_containing_context = true;
+ }
}
+ }
+ } else {
+ // We were asked to parse the type for a method in a
+ // class, yet the
+ // class hasn't been asked to complete itself through the
+ // clang::ExternalASTSource protocol, so we need to just
+ // have the
+ // class complete itself and do things the right way, then
+ // our
+ // DIE should then have an entry in the
+ // dwarf->GetDIEToType() map. First
+ // we need to modify the dwarf->GetDIEToType() so it
+ // doesn't think we are
+ // trying to parse this DIE anymore...
+ dwarf->GetDIEToType()[die.GetDIE()] = NULL;
+
+ // Now we get the full type to force our class type to
+ // complete itself
+ // using the clang::ExternalASTSource protocol which will
+ // parse all
+ // base classes and all methods (including the method for
+ // this DIE).
+ class_type->GetFullCompilerType();
+
+ // The type for this DIE should have been filled in the
+ // function call above
+ type_ptr = dwarf->GetDIEToType()[die.GetDIE()];
+ if (type_ptr && type_ptr != DIE_IS_BEING_PARSED) {
+ type_sp = type_ptr->shared_from_this();
+ break;
+ }
+
+ // FIXME This is fixing some even uglier behavior but we
+ // really need to
+ // uniq the methods of each class as well as the class
+ // itself.
+ // <rdar://problem/11240464>
+ type_handled = true;
}
- type_sp.reset( new Type (die.GetID(),
- dwarf,
- type_name_const_str,
- 0,
- NULL,
- LLDB_INVALID_UID,
- Type::eEncodingIsUID,
- &decl,
- clang_type,
- Type::eResolveStateFull));
- assert(type_sp.get());
+ }
}
- break;
-
- case DW_TAG_array_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- DWARFFormValue type_die_form;
- 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 (attributes);
-
- if (num_attributes > 0)
- {
- uint32_t i;
- for (i=0; i<num_attributes; ++i)
- {
- attr = attributes.AttributeAtIndex(i);
- 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:
- type_name_cstr = form_value.AsCString();
- type_name_const_str.SetCString(type_name_cstr);
- break;
-
- case DW_AT_type: type_die_form = form_value; break;
- case DW_AT_byte_size: break; // byte_size = form_value.Unsigned(); break;
- case DW_AT_byte_stride: byte_stride = form_value.Unsigned(); break;
- case DW_AT_bit_stride: bit_stride = form_value.Unsigned(); break;
- case DW_AT_GNU_vector: is_vector = form_value.Boolean(); break;
- case DW_AT_accessibility: break; // accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
- case DW_AT_declaration: break; // is_forward_declaration = form_value.Boolean(); break;
- case DW_AT_allocated:
- case DW_AT_associated:
- case DW_AT_data_location:
- case DW_AT_description:
- case DW_AT_ordering:
- case DW_AT_start_scope:
- case DW_AT_visibility:
- case DW_AT_specification:
- case DW_AT_abstract_origin:
- case DW_AT_sibling:
- break;
- }
- }
- }
+ }
+ }
+ }
- DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr);
-
- DIERef type_die_ref(type_die_form);
- Type *element_type = dwarf->ResolveTypeUID(type_die_ref);
-
- if (element_type)
- {
- std::vector<uint64_t> element_orders;
- 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 ();
-
- if (ClangASTContext::IsCXXClassType(array_element_type) && array_element_type.GetCompleteType() == false)
- {
- ModuleSP module_sp = die.GetModule();
- if (module_sp)
- {
- if (die.GetCU()->GetProducer() == DWARFCompileUnit::eProducerClang)
- module_sp->ReportError ("DWARF DW_TAG_array_type DIE at 0x%8.8x has a class/union/struct element type DIE 0x%8.8x that is a forward declaration, not a complete definition.\nTry compiling the source file with -fno-limit-debug-info or disable -gmodule",
- die.GetOffset(),
- type_die_ref.die_offset);
- else
- module_sp->ReportError ("DWARF DW_TAG_array_type DIE at 0x%8.8x has a class/union/struct element type DIE 0x%8.8x 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(),
- type_die_ref.die_offset,
- die.GetLLDBCompileUnit() ? die.GetLLDBCompileUnit()->GetPath().c_str() : "the source file");
- }
+ if (!type_handled) {
+ clang::FunctionDecl *function_decl = nullptr;
- // We have no choice other than to pretend that the element class type
- // is complete. If we don't do this, clang will crash when trying
- // to layout the class. Since we provide layout assistance, all
- // ivars in this class and other classes will be fine, this is
- // the best we can do short of crashing.
- if (ClangASTContext::StartTagDeclarationDefinition(array_element_type))
- {
- ClangASTContext::CompleteTagDeclarationDefinition(array_element_type);
- }
- else
- {
- module_sp->ReportError ("DWARF DIE at 0x%8.8x was not able to start its definition.\nPlease file a bug and attach the file at the start of this error message",
- type_die_ref.die_offset);
- }
- }
+ if (abstract_origin_die_form.IsValid()) {
+ DWARFDIE abs_die =
+ dwarf->DebugInfo()->GetDIE(DIERef(abstract_origin_die_form));
- uint64_t array_element_bit_stride = byte_stride * 8 + bit_stride;
- if (element_orders.size() > 0)
- {
- uint64_t num_elements = 0;
- std::vector<uint64_t>::const_reverse_iterator pos;
- std::vector<uint64_t>::const_reverse_iterator end = element_orders.rend();
- for (pos = element_orders.rbegin(); pos != end; ++pos)
- {
- num_elements = *pos;
- clang_type = m_ast.CreateArrayType (array_element_type,
- num_elements,
- is_vector);
- array_element_type = clang_type;
- array_element_bit_stride = num_elements ?
- array_element_bit_stride * num_elements :
- array_element_bit_stride;
- }
- }
- else
- {
- clang_type = m_ast.CreateArrayType (array_element_type, 0, is_vector);
- }
- ConstString empty_name;
- type_sp.reset( new Type (die.GetID(),
- dwarf,
- empty_name,
- array_element_bit_stride / 8,
- NULL,
- DIERef(type_die_form).GetUID(dwarf),
- Type::eEncodingIsUID,
- &decl,
- clang_type,
- Type::eResolveStateFull));
- type_sp->SetEncodingType (element_type);
- }
- }
+ SymbolContext sc;
+
+ if (dwarf->ResolveType(abs_die)) {
+ function_decl = llvm::dyn_cast_or_null<clang::FunctionDecl>(
+ GetCachedClangDeclContextForDIE(abs_die));
+
+ if (function_decl) {
+ LinkDeclContextToDIE(function_decl, die);
}
- break;
-
- case DW_TAG_ptr_to_member_type:
- {
- DWARFFormValue type_die_form;
- DWARFFormValue containing_type_die_form;
-
- 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(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_type:
- type_die_form = form_value; break;
- case DW_AT_containing_type:
- containing_type_die_form = form_value; break;
- }
- }
- }
+ }
+ }
- Type *pointee_type = dwarf->ResolveTypeUID(DIERef(type_die_form));
- Type *class_type = dwarf->ResolveTypeUID(DIERef(containing_type_die_form));
+ if (!function_decl) {
+ // We just have a function that isn't part of a class
+ function_decl = m_ast.CreateFunctionDeclaration(
+ ignore_containing_context ? m_ast.GetTranslationUnitDecl()
+ : containing_decl_ctx,
+ type_name_cstr, clang_type, storage, is_inline);
+
+ // if (template_param_infos.GetSize() >
+ // 0)
+ // {
+ // clang::FunctionTemplateDecl
+ // *func_template_decl =
+ // CreateFunctionTemplateDecl
+ // (containing_decl_ctx,
+ // function_decl,
+ // type_name_cstr,
+ // template_param_infos);
+ //
+ // CreateFunctionTemplateSpecializationInfo
+ // (function_decl,
+ // func_template_decl,
+ // template_param_infos);
+ // }
+ // Add the decl to our DIE to decl context map
+
+ lldbassert(function_decl);
+
+ if (function_decl) {
+ LinkDeclContextToDIE(function_decl, die);
+
+ if (!function_param_decls.empty())
+ m_ast.SetFunctionParameters(function_decl,
+ &function_param_decls.front(),
+ function_param_decls.size());
+
+ ClangASTMetadata metadata;
+ metadata.SetUserID(die.GetID());
+
+ if (!object_pointer_name.empty()) {
+ metadata.SetObjectPtrName(object_pointer_name.c_str());
+ if (log)
+ log->Printf("Setting object pointer name: %s on function "
+ "object %p.",
+ object_pointer_name.c_str(),
+ static_cast<void *>(function_decl));
+ }
+ m_ast.SetMetadata(function_decl, metadata);
+ }
+ }
+ }
+ }
+ type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, 0, NULL,
+ LLDB_INVALID_UID, Type::eEncodingIsUID, &decl,
+ clang_type, Type::eResolveStateFull));
+ assert(type_sp.get());
+ } break;
+
+ case DW_TAG_array_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->GetDIEToType()[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ DWARFFormValue type_die_form;
+ 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(attributes);
- CompilerType pointee_clang_type = pointee_type->GetForwardCompilerType ();
- CompilerType class_clang_type = class_type->GetLayoutCompilerType ();
-
- clang_type = ClangASTContext::CreateMemberPointerType(class_clang_type, pointee_clang_type);
+ if (num_attributes > 0) {
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ attr = attributes.AttributeAtIndex(i);
+ 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:
+ type_name_cstr = form_value.AsCString();
+ type_name_const_str.SetCString(type_name_cstr);
+ break;
- byte_size = clang_type.GetByteSize(nullptr);
+ case DW_AT_type:
+ type_die_form = form_value;
+ break;
+ case DW_AT_byte_size:
+ break; // byte_size = form_value.Unsigned(); break;
+ case DW_AT_byte_stride:
+ byte_stride = form_value.Unsigned();
+ break;
+ case DW_AT_bit_stride:
+ bit_stride = form_value.Unsigned();
+ break;
+ case DW_AT_GNU_vector:
+ is_vector = form_value.Boolean();
+ break;
+ case DW_AT_accessibility:
+ break; // accessibility =
+ // DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
+ case DW_AT_declaration:
+ break; // is_forward_declaration = form_value.Boolean(); break;
+ case DW_AT_allocated:
+ case DW_AT_associated:
+ case DW_AT_data_location:
+ case DW_AT_description:
+ case DW_AT_ordering:
+ case DW_AT_start_scope:
+ case DW_AT_visibility:
+ case DW_AT_specification:
+ case DW_AT_abstract_origin:
+ case DW_AT_sibling:
+ break;
+ }
+ }
+ }
+
+ DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
+ DW_TAG_value_to_name(tag), type_name_cstr);
+
+ DIERef type_die_ref(type_die_form);
+ Type *element_type = dwarf->ResolveTypeUID(type_die_ref);
+
+ if (element_type) {
+ std::vector<uint64_t> element_orders;
+ 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();
+
+ if (ClangASTContext::IsCXXClassType(array_element_type) &&
+ array_element_type.GetCompleteType() == false) {
+ ModuleSP module_sp = die.GetModule();
+ if (module_sp) {
+ if (die.GetCU()->GetProducer() ==
+ DWARFCompileUnit::eProducerClang)
+ module_sp->ReportError(
+ "DWARF DW_TAG_array_type DIE at 0x%8.8x has a "
+ "class/union/struct element type DIE 0x%8.8x that is a "
+ "forward declaration, not a complete definition.\nTry "
+ "compiling the source file with -fno-limit-debug-info or "
+ "disable -gmodule",
+ die.GetOffset(), type_die_ref.die_offset);
+ else
+ module_sp->ReportError(
+ "DWARF DW_TAG_array_type DIE at 0x%8.8x has a "
+ "class/union/struct element type DIE 0x%8.8x 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(), type_die_ref.die_offset,
+ die.GetLLDBCompileUnit()
+ ? die.GetLLDBCompileUnit()->GetPath().c_str()
+ : "the source file");
+ }
+
+ // We have no choice other than to pretend that the element class
+ // type
+ // is complete. If we don't do this, clang will crash when trying
+ // to layout the class. Since we provide layout assistance, all
+ // ivars in this class and other classes will be fine, this is
+ // the best we can do short of crashing.
+ if (ClangASTContext::StartTagDeclarationDefinition(
+ array_element_type)) {
+ ClangASTContext::CompleteTagDeclarationDefinition(
+ array_element_type);
+ } else {
+ module_sp->ReportError("DWARF DIE at 0x%8.8x was not able to "
+ "start its definition.\nPlease file a "
+ "bug and attach the file at the start "
+ "of this error message",
+ type_die_ref.die_offset);
+ }
+ }
- type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_size, NULL,
- LLDB_INVALID_UID, Type::eEncodingIsUID, NULL, clang_type,
- Type::eResolveStateForward));
- }
+ uint64_t array_element_bit_stride = byte_stride * 8 + bit_stride;
+ if (element_orders.size() > 0) {
+ uint64_t num_elements = 0;
+ std::vector<uint64_t>::const_reverse_iterator pos;
+ std::vector<uint64_t>::const_reverse_iterator end =
+ element_orders.rend();
+ for (pos = element_orders.rbegin(); pos != end; ++pos) {
+ num_elements = *pos;
+ clang_type = m_ast.CreateArrayType(array_element_type,
+ num_elements, is_vector);
+ array_element_type = clang_type;
+ array_element_bit_stride =
+ num_elements ? array_element_bit_stride * num_elements
+ : array_element_bit_stride;
+ }
+ } else {
+ clang_type =
+ m_ast.CreateArrayType(array_element_type, 0, is_vector);
+ }
+ ConstString empty_name;
+ type_sp.reset(new Type(
+ die.GetID(), dwarf, empty_name, array_element_bit_stride / 8,
+ NULL, DIERef(type_die_form).GetUID(dwarf), Type::eEncodingIsUID,
+ &decl, clang_type, Type::eResolveStateFull));
+ type_sp->SetEncodingType(element_type);
+ }
+ }
+ } break;
- break;
- }
- 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(),
- tag,
- DW_TAG_value_to_name(tag));
- break;
+ case DW_TAG_ptr_to_member_type: {
+ DWARFFormValue type_die_form;
+ DWARFFormValue containing_type_die_form;
+
+ 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(i, form_value)) {
+ switch (attr) {
+ case DW_AT_type:
+ type_die_form = form_value;
+ break;
+ case DW_AT_containing_type:
+ containing_type_die_form = form_value;
+ break;
+ }
}
+ }
- if (type_sp.get())
- {
- DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
- dw_tag_t sc_parent_tag = sc_parent_die.Tag();
+ Type *pointee_type = dwarf->ResolveTypeUID(DIERef(type_die_form));
+ Type *class_type =
+ dwarf->ResolveTypeUID(DIERef(containing_type_die_form));
- SymbolContextScope * symbol_context_scope = NULL;
- if (sc_parent_tag == DW_TAG_compile_unit)
- {
- symbol_context_scope = sc.comp_unit;
- }
- else if (sc.function != NULL && sc_parent_die)
- {
- symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
- if (symbol_context_scope == NULL)
- symbol_context_scope = sc.function;
- }
+ CompilerType pointee_clang_type =
+ pointee_type->GetForwardCompilerType();
+ CompilerType class_clang_type = class_type->GetLayoutCompilerType();
- if (symbol_context_scope != NULL)
- {
- type_sp->SetSymbolContextScope(symbol_context_scope);
- }
+ clang_type = ClangASTContext::CreateMemberPointerType(
+ class_clang_type, pointee_clang_type);
- // We are ready to put this type into the uniqued list up at the module level
- type_list->Insert (type_sp);
+ byte_size = clang_type.GetByteSize(nullptr);
- dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
- }
+ type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str,
+ byte_size, NULL, LLDB_INVALID_UID,
+ Type::eEncodingIsUID, NULL, clang_type,
+ Type::eResolveStateForward));
}
- else if (type_ptr != DIE_IS_BEING_PARSED)
- {
- type_sp = type_ptr->shared_from_this();
+
+ break;
+ }
+ 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(), tag, DW_TAG_value_to_name(tag));
+ break;
+ }
+
+ if (type_sp.get()) {
+ 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) {
+ symbol_context_scope = sc.comp_unit;
+ } else if (sc.function != NULL && sc_parent_die) {
+ symbol_context_scope =
+ sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
+ if (symbol_context_scope == NULL)
+ symbol_context_scope = sc.function;
+ }
+
+ if (symbol_context_scope != NULL) {
+ type_sp->SetSymbolContextScope(symbol_context_scope);
}
+
+ // We are ready to put this type into the uniqued list up at the module
+ // level
+ type_list->Insert(type_sp);
+
+ dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ }
+ } else if (type_ptr != DIE_IS_BEING_PARSED) {
+ type_sp = type_ptr->shared_from_this();
}
- return type_sp;
+ }
+ return type_sp;
}
// DWARF parsing functions
-class DWARFASTParserClang::DelayedAddObjCClassProperty
-{
+class DWARFASTParserClang::DelayedAddObjCClassProperty {
public:
- DelayedAddObjCClassProperty(const CompilerType &class_opaque_type,
- const char *property_name,
- const CompilerType &property_opaque_type, // The property type is only required if you don't have an ivar decl
- clang::ObjCIvarDecl *ivar_decl,
- const char *property_setter_name,
- const char *property_getter_name,
- uint32_t property_attributes,
- const ClangASTMetadata *metadata) :
- m_class_opaque_type (class_opaque_type),
- m_property_name (property_name),
- m_property_opaque_type (property_opaque_type),
- m_ivar_decl (ivar_decl),
- m_property_setter_name (property_setter_name),
- m_property_getter_name (property_getter_name),
- m_property_attributes (property_attributes)
- {
- if (metadata != NULL)
- {
- m_metadata_ap.reset(new ClangASTMetadata());
- *m_metadata_ap = *metadata;
- }
+ DelayedAddObjCClassProperty(
+ const CompilerType &class_opaque_type, const char *property_name,
+ const CompilerType &property_opaque_type, // The property type is only
+ // required if you don't have an
+ // ivar decl
+ clang::ObjCIvarDecl *ivar_decl, const char *property_setter_name,
+ const char *property_getter_name, uint32_t property_attributes,
+ const ClangASTMetadata *metadata)
+ : m_class_opaque_type(class_opaque_type), m_property_name(property_name),
+ m_property_opaque_type(property_opaque_type), m_ivar_decl(ivar_decl),
+ m_property_setter_name(property_setter_name),
+ m_property_getter_name(property_getter_name),
+ m_property_attributes(property_attributes) {
+ if (metadata != NULL) {
+ m_metadata_ap.reset(new ClangASTMetadata());
+ *m_metadata_ap = *metadata;
}
-
- DelayedAddObjCClassProperty (const DelayedAddObjCClassProperty &rhs)
- {
- *this = rhs;
+ }
+
+ DelayedAddObjCClassProperty(const DelayedAddObjCClassProperty &rhs) {
+ *this = rhs;
+ }
+
+ DelayedAddObjCClassProperty &
+ operator=(const DelayedAddObjCClassProperty &rhs) {
+ m_class_opaque_type = rhs.m_class_opaque_type;
+ m_property_name = rhs.m_property_name;
+ m_property_opaque_type = rhs.m_property_opaque_type;
+ m_ivar_decl = rhs.m_ivar_decl;
+ m_property_setter_name = rhs.m_property_setter_name;
+ m_property_getter_name = rhs.m_property_getter_name;
+ m_property_attributes = rhs.m_property_attributes;
+
+ if (rhs.m_metadata_ap.get()) {
+ m_metadata_ap.reset(new ClangASTMetadata());
+ *m_metadata_ap = *rhs.m_metadata_ap;
}
+ return *this;
+ }
- DelayedAddObjCClassProperty& operator= (const DelayedAddObjCClassProperty &rhs)
- {
- m_class_opaque_type = rhs.m_class_opaque_type;
- m_property_name = rhs.m_property_name;
- m_property_opaque_type = rhs.m_property_opaque_type;
- m_ivar_decl = rhs.m_ivar_decl;
- m_property_setter_name = rhs.m_property_setter_name;
- m_property_getter_name = rhs.m_property_getter_name;
- m_property_attributes = rhs.m_property_attributes;
-
- if (rhs.m_metadata_ap.get())
- {
- m_metadata_ap.reset (new ClangASTMetadata());
- *m_metadata_ap = *rhs.m_metadata_ap;
- }
- return *this;
- }
-
- bool
- Finalize()
- {
- return ClangASTContext::AddObjCClassProperty (m_class_opaque_type,
- m_property_name,
- m_property_opaque_type,
- m_ivar_decl,
- m_property_setter_name,
- m_property_getter_name,
- m_property_attributes,
- m_metadata_ap.get());
- }
+ bool Finalize() {
+ return ClangASTContext::AddObjCClassProperty(
+ m_class_opaque_type, m_property_name, m_property_opaque_type,
+ m_ivar_decl, m_property_setter_name, m_property_getter_name,
+ m_property_attributes, m_metadata_ap.get());
+ }
private:
- CompilerType m_class_opaque_type;
- const char *m_property_name;
- CompilerType m_property_opaque_type;
- clang::ObjCIvarDecl *m_ivar_decl;
- const char *m_property_setter_name;
- const char *m_property_getter_name;
- uint32_t m_property_attributes;
- std::unique_ptr<ClangASTMetadata> m_metadata_ap;
+ CompilerType m_class_opaque_type;
+ const char *m_property_name;
+ CompilerType m_property_opaque_type;
+ clang::ObjCIvarDecl *m_ivar_decl;
+ const char *m_property_setter_name;
+ const char *m_property_getter_name;
+ uint32_t m_property_attributes;
+ std::unique_ptr<ClangASTMetadata> m_metadata_ap;
};
-bool
-DWARFASTParserClang::ParseTemplateDIE (const DWARFDIE &die,
- ClangASTContext::TemplateParameterInfos &template_param_infos)
-{
- const dw_tag_t tag = die.Tag();
-
- switch (tag)
- {
- case DW_TAG_template_type_parameter:
- case DW_TAG_template_value_parameter:
- {
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes (attributes);
- const char *name = nullptr;
- CompilerType clang_type;
- uint64_t uval64 = 0;
- bool uval64_valid = false;
- if (num_attributes > 0)
- {
- DWARFFormValue form_value;
- for (size_t i=0; i<num_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
-
- switch (attr)
- {
- case DW_AT_name:
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- name = form_value.AsCString();
- break;
-
- case DW_AT_type:
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- Type *lldb_type = die.ResolveTypeUID(DIERef(form_value));
- if (lldb_type)
- clang_type = lldb_type->GetForwardCompilerType ();
- }
- break;
+bool DWARFASTParserClang::ParseTemplateDIE(
+ const DWARFDIE &die,
+ ClangASTContext::TemplateParameterInfos &template_param_infos) {
+ const dw_tag_t tag = die.Tag();
- case DW_AT_const_value:
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- uval64_valid = true;
- uval64 = form_value.Unsigned();
- }
- break;
- default:
- break;
- }
- }
+ switch (tag) {
+ case DW_TAG_template_type_parameter:
+ case DW_TAG_template_value_parameter: {
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ const char *name = nullptr;
+ CompilerType clang_type;
+ uint64_t uval64 = 0;
+ bool uval64_valid = false;
+ if (num_attributes > 0) {
+ DWARFFormValue form_value;
+ for (size_t i = 0; i < num_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+
+ switch (attr) {
+ case DW_AT_name:
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ name = form_value.AsCString();
+ break;
+
+ case DW_AT_type:
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ Type *lldb_type = die.ResolveTypeUID(DIERef(form_value));
+ if (lldb_type)
+ clang_type = lldb_type->GetForwardCompilerType();
+ }
+ break;
+
+ case DW_AT_const_value:
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ uval64_valid = true;
+ uval64 = form_value.Unsigned();
+ }
+ break;
+ default:
+ break;
+ }
+ }
- clang::ASTContext *ast = m_ast.getASTContext();
- if (!clang_type)
- clang_type = m_ast.GetBasicType(eBasicTypeVoid);
-
- if (clang_type)
- {
- bool is_signed = false;
- if (name && name[0])
- template_param_infos.names.push_back(name);
- else
- template_param_infos.names.push_back(NULL);
-
- // Get the signed value for any integer or enumeration if available
- clang_type.IsIntegerOrEnumerationType (is_signed);
-
- if (tag == DW_TAG_template_value_parameter && uval64_valid)
- {
- llvm::APInt apint (clang_type.GetBitSize(nullptr), uval64, is_signed);
- template_param_infos.args.push_back(
- clang::TemplateArgument(*ast, llvm::APSInt(apint, !is_signed), ClangUtil::GetQualType(clang_type)));
- }
- else
- {
- template_param_infos.args.push_back(
- clang::TemplateArgument(ClangUtil::GetQualType(clang_type)));
- }
- }
- else
- {
- return false;
- }
+ clang::ASTContext *ast = m_ast.getASTContext();
+ if (!clang_type)
+ clang_type = m_ast.GetBasicType(eBasicTypeVoid);
- }
+ if (clang_type) {
+ bool is_signed = false;
+ if (name && name[0])
+ template_param_infos.names.push_back(name);
+ else
+ template_param_infos.names.push_back(NULL);
+
+ // Get the signed value for any integer or enumeration if available
+ clang_type.IsIntegerOrEnumerationType(is_signed);
+
+ if (tag == DW_TAG_template_value_parameter && uval64_valid) {
+ llvm::APInt apint(clang_type.GetBitSize(nullptr), uval64, is_signed);
+ template_param_infos.args.push_back(
+ clang::TemplateArgument(*ast, llvm::APSInt(apint, !is_signed),
+ ClangUtil::GetQualType(clang_type)));
+ } else {
+ template_param_infos.args.push_back(
+ clang::TemplateArgument(ClangUtil::GetQualType(clang_type)));
}
- return true;
-
- default:
- break;
+ } else {
+ return false;
+ }
}
- return false;
+ }
+ return true;
+
+ default:
+ break;
+ }
+ return false;
}
-bool
-DWARFASTParserClang::ParseTemplateParameterInfos (const DWARFDIE &parent_die,
- ClangASTContext::TemplateParameterInfos &template_param_infos)
-{
+bool DWARFASTParserClang::ParseTemplateParameterInfos(
+ const DWARFDIE &parent_die,
+ ClangASTContext::TemplateParameterInfos &template_param_infos) {
- if (!parent_die)
- return false;
+ if (!parent_die)
+ return false;
- Args template_parameter_names;
- for (DWARFDIE die = parent_die.GetFirstChild();
- die.IsValid();
- die = die.GetSibling())
- {
- const dw_tag_t tag = die.Tag();
+ Args template_parameter_names;
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+ const dw_tag_t tag = die.Tag();
- switch (tag)
- {
- case DW_TAG_template_type_parameter:
- case DW_TAG_template_value_parameter:
- ParseTemplateDIE (die, template_param_infos);
- break;
+ switch (tag) {
+ case DW_TAG_template_type_parameter:
+ case DW_TAG_template_value_parameter:
+ ParseTemplateDIE(die, template_param_infos);
+ break;
- default:
- break;
- }
+ default:
+ break;
}
- if (template_param_infos.args.empty())
- return false;
- return template_param_infos.args.size() == template_param_infos.names.size();
+ }
+ if (template_param_infos.args.empty())
+ return false;
+ return template_param_infos.args.size() == template_param_infos.names.size();
}
-bool
-DWARFASTParserClang::CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type, CompilerType &clang_type)
-{
- SymbolFileDWARF *dwarf = die.GetDWARF();
+bool DWARFASTParserClang::CompleteTypeFromDWARF(const DWARFDIE &die,
+ lldb_private::Type *type,
+ CompilerType &clang_type) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
- std::lock_guard<std::recursive_mutex> guard(dwarf->GetObjectFile()->GetModule()->GetMutex());
+ std::lock_guard<std::recursive_mutex> guard(
+ dwarf->GetObjectFile()->GetModule()->GetMutex());
- // Disable external storage for this type so we don't get anymore
- // clang::ExternalASTSource queries for this type.
- m_ast.SetHasExternalStorage (clang_type.GetOpaqueQualType(), false);
+ // Disable external storage for this type so we don't get anymore
+ // clang::ExternalASTSource queries for this type.
+ m_ast.SetHasExternalStorage(clang_type.GetOpaqueQualType(), false);
- if (!die)
- return false;
+ if (!die)
+ return false;
#if defined LLDB_CONFIGURATION_DEBUG
- //----------------------------------------------------------------------
- // For debugging purposes, the LLDB_DWARF_DONT_COMPLETE_TYPENAMES
- // environment variable can be set with one or more typenames separated
- // by ';' characters. This will cause this function to not complete any
- // types whose names match.
- //
- // Examples of setting this environment variable:
- //
- // LLDB_DWARF_DONT_COMPLETE_TYPENAMES=Foo
- // LLDB_DWARF_DONT_COMPLETE_TYPENAMES=Foo;Bar;Baz
- //----------------------------------------------------------------------
- const char *dont_complete_typenames_cstr = getenv("LLDB_DWARF_DONT_COMPLETE_TYPENAMES");
- if (dont_complete_typenames_cstr && dont_complete_typenames_cstr[0])
- {
- const char *die_name = die.GetName();
- if (die_name && die_name[0])
- {
- const char *match = strstr(dont_complete_typenames_cstr, die_name);
- if (match)
- {
- size_t die_name_length = strlen(die_name);
- while (match)
- {
- const char separator_char = ';';
- const char next_char = match[die_name_length];
- if (next_char == '\0' || next_char == separator_char)
- {
- if (match == dont_complete_typenames_cstr || match[-1] == separator_char)
- return false;
- }
- match = strstr(match+1, die_name);
- }
- }
+ //----------------------------------------------------------------------
+ // For debugging purposes, the LLDB_DWARF_DONT_COMPLETE_TYPENAMES
+ // environment variable can be set with one or more typenames separated
+ // by ';' characters. This will cause this function to not complete any
+ // types whose names match.
+ //
+ // Examples of setting this environment variable:
+ //
+ // LLDB_DWARF_DONT_COMPLETE_TYPENAMES=Foo
+ // LLDB_DWARF_DONT_COMPLETE_TYPENAMES=Foo;Bar;Baz
+ //----------------------------------------------------------------------
+ const char *dont_complete_typenames_cstr =
+ getenv("LLDB_DWARF_DONT_COMPLETE_TYPENAMES");
+ if (dont_complete_typenames_cstr && dont_complete_typenames_cstr[0]) {
+ const char *die_name = die.GetName();
+ if (die_name && die_name[0]) {
+ const char *match = strstr(dont_complete_typenames_cstr, die_name);
+ if (match) {
+ size_t die_name_length = strlen(die_name);
+ while (match) {
+ const char separator_char = ';';
+ const char next_char = match[die_name_length];
+ if (next_char == '\0' || next_char == separator_char) {
+ if (match == dont_complete_typenames_cstr ||
+ match[-1] == separator_char)
+ return false;
+ }
+ match = strstr(match + 1, die_name);
}
+ }
}
+ }
#endif
- const dw_tag_t tag = die.Tag();
+ const dw_tag_t tag = die.Tag();
+
+ 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...",
+ die.GetID(), die.GetTagAsCString(), type->GetName().AsCString());
+ assert(clang_type);
+ DWARFAttributes attributes;
+ switch (tag) {
+ case DW_TAG_structure_type:
+ case DW_TAG_union_type:
+ case DW_TAG_class_type: {
+ ClangASTImporter::LayoutInfo layout_info;
- 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...",
- die.GetID(),
- die.GetTagAsCString(),
- type->GetName().AsCString());
- assert (clang_type);
- DWARFAttributes attributes;
- switch (tag)
{
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_class_type:
- {
- ClangASTImporter::LayoutInfo layout_info;
-
- {
- if (die.HasChildren())
- {
- LanguageType class_language = eLanguageTypeUnknown;
- if (ClangASTContext::IsObjCObjectOrInterfaceType(clang_type))
- {
- class_language = eLanguageTypeObjC;
- // For objective C we don't start the definition when
- // the class is created.
- ClangASTContext::StartTagDeclarationDefinition (clang_type);
- }
-
- int tag_decl_kind = -1;
- AccessType default_accessibility = eAccessNone;
- if (tag == DW_TAG_structure_type)
- {
- tag_decl_kind = clang::TTK_Struct;
- default_accessibility = eAccessPublic;
- }
- else if (tag == DW_TAG_union_type)
- {
- tag_decl_kind = clang::TTK_Union;
- default_accessibility = eAccessPublic;
- }
- else if (tag == DW_TAG_class_type)
- {
- tag_decl_kind = clang::TTK_Class;
- default_accessibility = eAccessPrivate;
- }
+ if (die.HasChildren()) {
+ LanguageType class_language = eLanguageTypeUnknown;
+ if (ClangASTContext::IsObjCObjectOrInterfaceType(clang_type)) {
+ class_language = eLanguageTypeObjC;
+ // For objective C we don't start the definition when
+ // the class is created.
+ ClangASTContext::StartTagDeclarationDefinition(clang_type);
+ }
- SymbolContext sc(die.GetLLDBCompileUnit());
- std::vector<clang::CXXBaseSpecifier *> base_classes;
- std::vector<int> member_accessibilities;
- bool is_a_class = false;
- // Parse members and base classes first
- DWARFDIECollection member_function_dies;
-
- DelayedPropertyList delayed_properties;
- ParseChildMembers (sc,
- die,
- clang_type,
- class_language,
- base_classes,
- member_accessibilities,
- member_function_dies,
- delayed_properties,
- default_accessibility,
- is_a_class,
- layout_info);
-
- // Now parse any methods if there were any...
- size_t num_functions = member_function_dies.Size();
- if (num_functions > 0)
- {
- for (size_t i=0; i<num_functions; ++i)
- {
- dwarf->ResolveType(member_function_dies.GetDIEAtIndex(i));
- }
- }
+ int tag_decl_kind = -1;
+ AccessType default_accessibility = eAccessNone;
+ if (tag == DW_TAG_structure_type) {
+ tag_decl_kind = clang::TTK_Struct;
+ default_accessibility = eAccessPublic;
+ } else if (tag == DW_TAG_union_type) {
+ tag_decl_kind = clang::TTK_Union;
+ default_accessibility = eAccessPublic;
+ } else if (tag == DW_TAG_class_type) {
+ tag_decl_kind = clang::TTK_Class;
+ default_accessibility = eAccessPrivate;
+ }
- if (class_language == eLanguageTypeObjC)
- {
- ConstString class_name (clang_type.GetTypeName());
- if (class_name)
- {
- DIEArray method_die_offsets;
- dwarf->GetObjCMethodDIEOffsets(class_name, method_die_offsets);
-
- if (!method_die_offsets.empty())
- {
- DWARFDebugInfo* debug_info = dwarf->DebugInfo();
-
- const size_t num_matches = method_die_offsets.size();
- for (size_t i=0; i<num_matches; ++i)
- {
- const DIERef& die_ref = method_die_offsets[i];
- DWARFDIE method_die = debug_info->GetDIE (die_ref);
-
- if (method_die)
- method_die.ResolveType ();
- }
- }
+ SymbolContext sc(die.GetLLDBCompileUnit());
+ std::vector<clang::CXXBaseSpecifier *> base_classes;
+ std::vector<int> member_accessibilities;
+ bool is_a_class = false;
+ // Parse members and base classes first
+ DWARFDIECollection member_function_dies;
+
+ DelayedPropertyList delayed_properties;
+ ParseChildMembers(sc, die, clang_type, class_language, base_classes,
+ member_accessibilities, member_function_dies,
+ delayed_properties, default_accessibility, is_a_class,
+ layout_info);
+
+ // Now parse any methods if there were any...
+ size_t num_functions = member_function_dies.Size();
+ if (num_functions > 0) {
+ for (size_t i = 0; i < num_functions; ++i) {
+ dwarf->ResolveType(member_function_dies.GetDIEAtIndex(i));
+ }
+ }
- for (DelayedPropertyList::iterator pi = delayed_properties.begin(), pe = delayed_properties.end();
- pi != pe;
- ++pi)
- pi->Finalize();
- }
- }
+ if (class_language == eLanguageTypeObjC) {
+ ConstString class_name(clang_type.GetTypeName());
+ if (class_name) {
+ DIEArray method_die_offsets;
+ dwarf->GetObjCMethodDIEOffsets(class_name, method_die_offsets);
- // If we have a DW_TAG_structure_type instead of a DW_TAG_class_type we
- // need to tell the clang type it is actually a class.
- if (class_language != eLanguageTypeObjC)
- {
- if (is_a_class && tag_decl_kind != clang::TTK_Class)
- m_ast.SetTagTypeKind(ClangUtil::GetQualType(clang_type), clang::TTK_Class);
- }
+ if (!method_die_offsets.empty()) {
+ DWARFDebugInfo *debug_info = dwarf->DebugInfo();
- // Since DW_TAG_structure_type gets used for both classes
- // and structures, we may need to set any DW_TAG_member
- // fields to have a "private" access if none was specified.
- // When we parsed the child members we tracked that actual
- // accessibility value for each DW_TAG_member in the
- // "member_accessibilities" array. If the value for the
- // member is zero, then it was set to the "default_accessibility"
- // which for structs was "public". Below we correct this
- // by setting any fields to "private" that weren't correctly
- // set.
- if (is_a_class && !member_accessibilities.empty())
- {
- // This is a class and all members that didn't have
- // their access specified are private.
- m_ast.SetDefaultAccessForRecordFields (m_ast.GetAsRecordDecl(clang_type),
- eAccessPrivate,
- &member_accessibilities.front(),
- member_accessibilities.size());
- }
+ const size_t num_matches = method_die_offsets.size();
+ for (size_t i = 0; i < num_matches; ++i) {
+ const DIERef &die_ref = method_die_offsets[i];
+ DWARFDIE method_die = debug_info->GetDIE(die_ref);
- if (!base_classes.empty())
- {
- // Make sure all base classes refer to complete types and not
- // forward declarations. If we don't do this, clang will crash
- // with an assertion in the call to clang_type.SetBaseClassesForClassType()
- for (auto &base_class : base_classes)
- {
- clang::TypeSourceInfo *type_source_info = base_class->getTypeSourceInfo();
- if (type_source_info)
- {
- CompilerType base_class_type (&m_ast, type_source_info->getType().getAsOpaquePtr());
- if (base_class_type.GetCompleteType() == false)
- {
- auto module = dwarf->GetObjectFile()->GetModule();
- module->ReportError (
- ":: Class '%s' has a base class '%s' which does not have a complete definition.",
- die.GetName(),
- base_class_type.GetTypeName().GetCString());
- if (die.GetCU()->GetProducer() == DWARFCompileUnit::eProducerClang)
- module->ReportError (":: Try compiling the source file with -fno-limit-debug-info.");
-
- // We have no choice other than to pretend that the base class
- // is complete. If we don't do this, clang will crash when we
- // call setBases() inside of "clang_type.SetBaseClassesForClassType()"
- // below. Since we provide layout assistance, all ivars in this
- // class and other classes will be fine, this is the best we can do
- // short of crashing.
- if (ClangASTContext::StartTagDeclarationDefinition (base_class_type))
- {
- ClangASTContext::CompleteTagDeclarationDefinition (base_class_type);
- }
- }
- }
- }
- m_ast.SetBaseClassesForClassType (clang_type.GetOpaqueQualType(),
- &base_classes.front(),
- base_classes.size());
-
- // Clang will copy each CXXBaseSpecifier in "base_classes"
- // so we have to free them all.
- ClangASTContext::DeleteBaseClassSpecifiers (&base_classes.front(),
- base_classes.size());
- }
- }
+ if (method_die)
+ method_die.ResolveType();
+ }
}
- ClangASTContext::BuildIndirectFields (clang_type);
- ClangASTContext::CompleteTagDeclarationDefinition (clang_type);
+ for (DelayedPropertyList::iterator pi = delayed_properties.begin(),
+ pe = delayed_properties.end();
+ pi != pe; ++pi)
+ pi->Finalize();
+ }
+ }
- if (!layout_info.field_offsets.empty() ||
- !layout_info.base_offsets.empty() ||
- !layout_info.vbase_offsets.empty() )
- {
- if (type)
- layout_info.bit_size = type->GetByteSize() * 8;
- if (layout_info.bit_size == 0)
- layout_info.bit_size = die.GetAttributeValueAsUnsigned(DW_AT_byte_size, 0) * 8;
-
- clang::CXXRecordDecl *record_decl = m_ast.GetAsCXXRecordDecl(clang_type.GetOpaqueQualType());
- if (record_decl)
- {
- if (log)
- {
- ModuleSP module_sp = dwarf->GetObjectFile()->GetModule();
-
- if (module_sp)
- {
- module_sp->LogMessage (log,
- "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) caching layout info for record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u], base_offsets[%u], vbase_offsets[%u])",
- static_cast<void*>(clang_type.GetOpaqueQualType()),
- static_cast<void*>(record_decl),
- layout_info.bit_size,
- layout_info.alignment,
- static_cast<uint32_t>(layout_info.field_offsets.size()),
- static_cast<uint32_t>(layout_info.base_offsets.size()),
- static_cast<uint32_t>(layout_info.vbase_offsets.size()));
-
- uint32_t idx;
- {
- llvm::DenseMap<const clang::FieldDecl *, uint64_t>::const_iterator pos,
- end = layout_info.field_offsets.end();
- for (idx = 0, pos = layout_info.field_offsets.begin(); pos != end; ++pos, ++idx)
- {
- module_sp->LogMessage(log,
- "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) field[%u] = { bit_offset=%u, name='%s' }",
- static_cast<void *>(clang_type.GetOpaqueQualType()),
- idx,
- static_cast<uint32_t>(pos->second),
- pos->first->getNameAsString().c_str());
- }
- }
+ // If we have a DW_TAG_structure_type instead of a DW_TAG_class_type we
+ // need to tell the clang type it is actually a class.
+ if (class_language != eLanguageTypeObjC) {
+ if (is_a_class && tag_decl_kind != clang::TTK_Class)
+ m_ast.SetTagTypeKind(ClangUtil::GetQualType(clang_type),
+ clang::TTK_Class);
+ }
- {
- llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>::const_iterator base_pos,
- base_end = layout_info.base_offsets.end();
- for (idx = 0, base_pos = layout_info.base_offsets.begin(); base_pos != base_end; ++base_pos, ++idx)
- {
- module_sp->LogMessage(log,
- "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) base[%u] = { byte_offset=%u, name='%s' }",
- clang_type.GetOpaqueQualType(), idx, (uint32_t)base_pos->second.getQuantity(),
- base_pos->first->getNameAsString().c_str());
- }
- }
- {
- llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>::const_iterator vbase_pos,
- vbase_end = layout_info.vbase_offsets.end();
- for (idx = 0, vbase_pos = layout_info.vbase_offsets.begin(); vbase_pos != vbase_end; ++vbase_pos, ++idx)
- {
- module_sp->LogMessage(log,
- "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) vbase[%u] = { byte_offset=%u, name='%s' }",
- static_cast<void *>(clang_type.GetOpaqueQualType()), idx,
- static_cast<uint32_t>(vbase_pos->second.getQuantity()),
- vbase_pos->first->getNameAsString().c_str());
- }
- }
+ // Since DW_TAG_structure_type gets used for both classes
+ // and structures, we may need to set any DW_TAG_member
+ // fields to have a "private" access if none was specified.
+ // When we parsed the child members we tracked that actual
+ // accessibility value for each DW_TAG_member in the
+ // "member_accessibilities" array. If the value for the
+ // member is zero, then it was set to the "default_accessibility"
+ // which for structs was "public". Below we correct this
+ // by setting any fields to "private" that weren't correctly
+ // set.
+ if (is_a_class && !member_accessibilities.empty()) {
+ // This is a class and all members that didn't have
+ // their access specified are private.
+ m_ast.SetDefaultAccessForRecordFields(
+ m_ast.GetAsRecordDecl(clang_type), eAccessPrivate,
+ &member_accessibilities.front(), member_accessibilities.size());
+ }
- }
- }
- GetClangASTImporter().InsertRecordDecl(record_decl, layout_info);
+ if (!base_classes.empty()) {
+ // Make sure all base classes refer to complete types and not
+ // forward declarations. If we don't do this, clang will crash
+ // with an assertion in the call to
+ // clang_type.SetBaseClassesForClassType()
+ for (auto &base_class : base_classes) {
+ clang::TypeSourceInfo *type_source_info =
+ base_class->getTypeSourceInfo();
+ if (type_source_info) {
+ CompilerType base_class_type(
+ &m_ast, type_source_info->getType().getAsOpaquePtr());
+ if (base_class_type.GetCompleteType() == false) {
+ auto module = dwarf->GetObjectFile()->GetModule();
+ module->ReportError(":: Class '%s' has a base class '%s' which "
+ "does not have a complete definition.",
+ die.GetName(),
+ base_class_type.GetTypeName().GetCString());
+ if (die.GetCU()->GetProducer() ==
+ DWARFCompileUnit::eProducerClang)
+ module->ReportError(":: Try compiling the source file with "
+ "-fno-limit-debug-info.");
+
+ // We have no choice other than to pretend that the base class
+ // is complete. If we don't do this, clang will crash when we
+ // call setBases() inside of
+ // "clang_type.SetBaseClassesForClassType()"
+ // below. Since we provide layout assistance, all ivars in this
+ // class and other classes will be fine, this is the best we can
+ // do
+ // short of crashing.
+ if (ClangASTContext::StartTagDeclarationDefinition(
+ base_class_type)) {
+ ClangASTContext::CompleteTagDeclarationDefinition(
+ base_class_type);
}
+ }
}
+ }
+ m_ast.SetBaseClassesForClassType(clang_type.GetOpaqueQualType(),
+ &base_classes.front(),
+ base_classes.size());
+
+ // Clang will copy each CXXBaseSpecifier in "base_classes"
+ // so we have to free them all.
+ ClangASTContext::DeleteBaseClassSpecifiers(&base_classes.front(),
+ base_classes.size());
}
+ }
+ }
- return (bool)clang_type;
-
- case DW_TAG_enumeration_type:
- if (ClangASTContext::StartTagDeclarationDefinition (clang_type))
+ ClangASTContext::BuildIndirectFields(clang_type);
+ ClangASTContext::CompleteTagDeclarationDefinition(clang_type);
+
+ if (!layout_info.field_offsets.empty() ||
+ !layout_info.base_offsets.empty() ||
+ !layout_info.vbase_offsets.empty()) {
+ if (type)
+ layout_info.bit_size = type->GetByteSize() * 8;
+ if (layout_info.bit_size == 0)
+ layout_info.bit_size =
+ die.GetAttributeValueAsUnsigned(DW_AT_byte_size, 0) * 8;
+
+ clang::CXXRecordDecl *record_decl =
+ m_ast.GetAsCXXRecordDecl(clang_type.GetOpaqueQualType());
+ if (record_decl) {
+ if (log) {
+ ModuleSP module_sp = dwarf->GetObjectFile()->GetModule();
+
+ if (module_sp) {
+ module_sp->LogMessage(
+ log,
+ "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) "
+ "caching layout info for record_decl = %p, bit_size = %" PRIu64
+ ", alignment = %" PRIu64
+ ", field_offsets[%u], base_offsets[%u], vbase_offsets[%u])",
+ static_cast<void *>(clang_type.GetOpaqueQualType()),
+ static_cast<void *>(record_decl), layout_info.bit_size,
+ layout_info.alignment,
+ static_cast<uint32_t>(layout_info.field_offsets.size()),
+ static_cast<uint32_t>(layout_info.base_offsets.size()),
+ static_cast<uint32_t>(layout_info.vbase_offsets.size()));
+
+ uint32_t idx;
{
- if (die.HasChildren())
- {
- SymbolContext sc(die.GetLLDBCompileUnit());
- bool is_signed = false;
- clang_type.IsIntegerType(is_signed);
- ParseChildEnumerators(sc, clang_type, is_signed, type->GetByteSize(), die);
- }
- ClangASTContext::CompleteTagDeclarationDefinition (clang_type);
+ llvm::DenseMap<const clang::FieldDecl *, uint64_t>::const_iterator
+ pos,
+ end = layout_info.field_offsets.end();
+ for (idx = 0, pos = layout_info.field_offsets.begin(); pos != end;
+ ++pos, ++idx) {
+ module_sp->LogMessage(
+ log, "ClangASTContext::CompleteTypeFromDWARF (clang_type = "
+ "%p) field[%u] = { bit_offset=%u, name='%s' }",
+ static_cast<void *>(clang_type.GetOpaqueQualType()), idx,
+ static_cast<uint32_t>(pos->second),
+ pos->first->getNameAsString().c_str());
+ }
}
- return (bool)clang_type;
- default:
- assert(false && "not a forward clang type decl!");
- break;
+ {
+ llvm::DenseMap<const clang::CXXRecordDecl *,
+ clang::CharUnits>::const_iterator base_pos,
+ base_end = layout_info.base_offsets.end();
+ for (idx = 0, base_pos = layout_info.base_offsets.begin();
+ base_pos != base_end; ++base_pos, ++idx) {
+ module_sp->LogMessage(
+ log, "ClangASTContext::CompleteTypeFromDWARF (clang_type = "
+ "%p) base[%u] = { byte_offset=%u, name='%s' }",
+ clang_type.GetOpaqueQualType(), idx,
+ (uint32_t)base_pos->second.getQuantity(),
+ base_pos->first->getNameAsString().c_str());
+ }
+ }
+ {
+ llvm::DenseMap<const clang::CXXRecordDecl *,
+ clang::CharUnits>::const_iterator vbase_pos,
+ vbase_end = layout_info.vbase_offsets.end();
+ for (idx = 0, vbase_pos = layout_info.vbase_offsets.begin();
+ vbase_pos != vbase_end; ++vbase_pos, ++idx) {
+ module_sp->LogMessage(
+ log, "ClangASTContext::CompleteTypeFromDWARF (clang_type = "
+ "%p) vbase[%u] = { byte_offset=%u, name='%s' }",
+ static_cast<void *>(clang_type.GetOpaqueQualType()), idx,
+ static_cast<uint32_t>(vbase_pos->second.getQuantity()),
+ vbase_pos->first->getNameAsString().c_str());
+ }
+ }
+ }
+ }
+ GetClangASTImporter().InsertRecordDecl(record_decl, layout_info);
+ }
+ }
+ }
+
+ return (bool)clang_type;
+
+ case DW_TAG_enumeration_type:
+ if (ClangASTContext::StartTagDeclarationDefinition(clang_type)) {
+ if (die.HasChildren()) {
+ SymbolContext sc(die.GetLLDBCompileUnit());
+ bool is_signed = false;
+ clang_type.IsIntegerType(is_signed);
+ ParseChildEnumerators(sc, clang_type, is_signed, type->GetByteSize(),
+ die);
+ }
+ ClangASTContext::CompleteTagDeclarationDefinition(clang_type);
}
+ return (bool)clang_type;
- return false;
+ default:
+ assert(false && "not a forward clang type decl!");
+ break;
+ }
+
+ return false;
}
-std::vector<DWARFDIE>
-DWARFASTParserClang::GetDIEForDeclContext(lldb_private::CompilerDeclContext decl_context)
-{
- std::vector<DWARFDIE> result;
- for (auto it = m_decl_ctx_to_die.find((clang::DeclContext *)decl_context.GetOpaqueDeclContext()); it != m_decl_ctx_to_die.end(); it++)
- result.push_back(it->second);
- return result;
+std::vector<DWARFDIE> DWARFASTParserClang::GetDIEForDeclContext(
+ lldb_private::CompilerDeclContext decl_context) {
+ std::vector<DWARFDIE> result;
+ for (auto it = m_decl_ctx_to_die.find(
+ (clang::DeclContext *)decl_context.GetOpaqueDeclContext());
+ it != m_decl_ctx_to_die.end(); it++)
+ result.push_back(it->second);
+ return result;
}
-CompilerDecl
-DWARFASTParserClang::GetDeclForUIDFromDWARF (const DWARFDIE &die)
-{
- clang::Decl *clang_decl = GetClangDeclForDIE(die);
- if (clang_decl != nullptr)
- return CompilerDecl(&m_ast, clang_decl);
- return CompilerDecl();
+CompilerDecl DWARFASTParserClang::GetDeclForUIDFromDWARF(const DWARFDIE &die) {
+ clang::Decl *clang_decl = GetClangDeclForDIE(die);
+ if (clang_decl != nullptr)
+ return CompilerDecl(&m_ast, clang_decl);
+ return CompilerDecl();
}
CompilerDeclContext
-DWARFASTParserClang::GetDeclContextForUIDFromDWARF (const DWARFDIE &die)
-{
- clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE (die);
- if (clang_decl_ctx)
- return CompilerDeclContext(&m_ast, clang_decl_ctx);
- return CompilerDeclContext();
+DWARFASTParserClang::GetDeclContextForUIDFromDWARF(const DWARFDIE &die) {
+ clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE(die);
+ if (clang_decl_ctx)
+ return CompilerDeclContext(&m_ast, clang_decl_ctx);
+ return CompilerDeclContext();
}
CompilerDeclContext
-DWARFASTParserClang::GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die)
-{
- clang::DeclContext *clang_decl_ctx = GetClangDeclContextContainingDIE (die, nullptr);
- if (clang_decl_ctx)
- return CompilerDeclContext(&m_ast, clang_decl_ctx);
- return CompilerDeclContext();
+DWARFASTParserClang::GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) {
+ clang::DeclContext *clang_decl_ctx =
+ GetClangDeclContextContainingDIE(die, nullptr);
+ if (clang_decl_ctx)
+ return CompilerDeclContext(&m_ast, clang_decl_ctx);
+ return CompilerDeclContext();
}
-size_t
-DWARFASTParserClang::ParseChildEnumerators (const SymbolContext& sc,
- lldb_private::CompilerType &clang_type,
- bool is_signed,
- uint32_t enumerator_byte_size,
- const DWARFDIE &parent_die)
-{
- if (!parent_die)
- return 0;
-
- size_t enumerators_added = 0;
+size_t DWARFASTParserClang::ParseChildEnumerators(
+ const SymbolContext &sc, lldb_private::CompilerType &clang_type,
+ bool is_signed, uint32_t enumerator_byte_size, const DWARFDIE &parent_die) {
+ if (!parent_die)
+ return 0;
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
- {
- const dw_tag_t tag = die.Tag();
- if (tag == DW_TAG_enumerator)
- {
- DWARFAttributes attributes;
- const size_t num_child_attributes = die.GetAttributes(attributes);
- if (num_child_attributes > 0)
- {
- const char *name = NULL;
- bool got_value = false;
- int64_t enum_value = 0;
- Declaration decl;
-
- uint32_t i;
- for (i=0; i<num_child_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_const_value:
- got_value = true;
- if (is_signed)
- enum_value = form_value.Signed();
- else
- enum_value = form_value.Unsigned();
- break;
-
- case DW_AT_name:
- name = form_value.AsCString();
- break;
-
- case DW_AT_description:
- default:
- 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_sibling:
- break;
- }
- }
- }
+ size_t enumerators_added = 0;
- if (name && name[0] && got_value)
- {
- m_ast.AddEnumerationValueToEnumerationType (clang_type.GetOpaqueQualType(),
- m_ast.GetEnumerationIntegerType(clang_type.GetOpaqueQualType()),
- decl,
- name,
- enum_value,
- enumerator_byte_size * 8);
- ++enumerators_added;
- }
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+ const dw_tag_t tag = die.Tag();
+ if (tag == DW_TAG_enumerator) {
+ DWARFAttributes attributes;
+ const size_t num_child_attributes = die.GetAttributes(attributes);
+ if (num_child_attributes > 0) {
+ const char *name = NULL;
+ bool got_value = false;
+ int64_t enum_value = 0;
+ Declaration decl;
+
+ uint32_t i;
+ for (i = 0; i < num_child_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_const_value:
+ got_value = true;
+ if (is_signed)
+ enum_value = form_value.Signed();
+ else
+ enum_value = form_value.Unsigned();
+ break;
+
+ case DW_AT_name:
+ name = form_value.AsCString();
+ break;
+
+ case DW_AT_description:
+ default:
+ 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_sibling:
+ break;
}
+ }
+ }
+
+ if (name && name[0] && got_value) {
+ m_ast.AddEnumerationValueToEnumerationType(
+ clang_type.GetOpaqueQualType(),
+ m_ast.GetEnumerationIntegerType(clang_type.GetOpaqueQualType()),
+ decl, name, enum_value, enumerator_byte_size * 8);
+ ++enumerators_added;
}
+ }
}
- return enumerators_added;
+ }
+ return enumerators_added;
}
#if defined(LLDB_CONFIGURATION_DEBUG) || defined(LLDB_CONFIGURATION_RELEASE)
-class DIEStack
-{
+class DIEStack {
public:
-
- void Push (const DWARFDIE &die)
- {
- m_dies.push_back (die);
+ void Push(const DWARFDIE &die) { m_dies.push_back(die); }
+
+ 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++) {
+ std::string 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(), die.GetTagAsCString(),
+ qualified_name.c_str());
}
-
-
- 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++)
- {
- std::string 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(),
- die.GetTagAsCString(),
- qualified_name.c_str());
- }
- log->PutCString(log_strm.GetData());
- }
- void Pop ()
- {
- m_dies.pop_back();
+ log->PutCString(log_strm.GetData());
+ }
+ void Pop() { m_dies.pop_back(); }
+
+ class ScopedPopper {
+ public:
+ ScopedPopper(DIEStack &die_stack)
+ : m_die_stack(die_stack), m_valid(false) {}
+
+ void Push(const DWARFDIE &die) {
+ m_valid = true;
+ m_die_stack.Push(die);
}
- class ScopedPopper
- {
- public:
- ScopedPopper (DIEStack &die_stack) :
- m_die_stack (die_stack),
- m_valid (false)
- {
- }
-
- void
- Push (const DWARFDIE &die)
- {
- m_valid = true;
- m_die_stack.Push (die);
- }
-
- ~ScopedPopper ()
- {
- if (m_valid)
- m_die_stack.Pop();
- }
-
-
+ ~ScopedPopper() {
+ if (m_valid)
+ m_die_stack.Pop();
+ }
- protected:
- DIEStack &m_die_stack;
- bool m_valid;
- };
+ protected:
+ DIEStack &m_die_stack;
+ bool m_valid;
+ };
protected:
- typedef std::vector<DWARFDIE> Stack;
- Stack m_dies;
+ typedef std::vector<DWARFDIE> Stack;
+ Stack m_dies;
};
#endif
-Function *
-DWARFASTParserClang::ParseFunctionFromDWARF (const SymbolContext& sc,
- const DWARFDIE &die)
-{
- DWARFRangeList func_ranges;
- const char *name = NULL;
- const char *mangled = NULL;
- int decl_file = 0;
- int decl_line = 0;
- int decl_column = 0;
- int call_file = 0;
- int call_line = 0;
- int call_column = 0;
- DWARFExpression frame_base(die.GetCU());
-
- const dw_tag_t tag = die.Tag();
+Function *DWARFASTParserClang::ParseFunctionFromDWARF(const SymbolContext &sc,
+ const DWARFDIE &die) {
+ DWARFRangeList func_ranges;
+ const char *name = NULL;
+ const char *mangled = NULL;
+ int decl_file = 0;
+ int decl_line = 0;
+ int decl_column = 0;
+ int call_file = 0;
+ int call_line = 0;
+ int call_column = 0;
+ DWARFExpression frame_base(die.GetCU());
+
+ const dw_tag_t tag = die.Tag();
+
+ if (tag != DW_TAG_subprogram)
+ return NULL;
- if (tag != DW_TAG_subprogram)
- return NULL;
-
- if (die.GetDIENamesAndRanges (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(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);
+ }
- // 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 (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);
+ if (func_range.GetBaseAddress().IsValid()) {
+ Mangled func_name;
+ if (mangled)
+ func_name.SetValue(ConstString(mangled), true);
+ else if (die.GetParent().Tag() == DW_TAG_compile_unit &&
+ Language::LanguageIsCPlusPlus(die.GetLanguage()) && name &&
+ strcmp(name, "main") != 0) {
+ // If the mangled name is not present in the DWARF, generate the
+ // demangled name
+ // using the decl context. We skip if the function is "main" as its name
+ // is
+ // never mangled.
+ bool is_static = false;
+ bool is_variadic = false;
+ bool has_template_params = false;
+ unsigned type_quals = 0;
+ std::vector<CompilerType> param_types;
+ std::vector<clang::ParmVarDecl *> param_decls;
+ DWARFDeclContext decl_ctx;
+ StreamString sstr;
+
+ die.GetDWARFDeclContext(decl_ctx);
+ sstr << decl_ctx.GetQualifiedName();
+
+ clang::DeclContext *containing_decl_ctx =
+ GetClangDeclContextContainingDIE(die, nullptr);
+ ParseChildParameters(sc, containing_decl_ctx, die, true, is_static,
+ is_variadic, has_template_params, param_types,
+ param_decls, type_quals);
+ sstr << "(";
+ for (size_t i = 0; i < param_types.size(); i++) {
+ if (i > 0)
+ sstr << ", ";
+ sstr << param_types[i].GetTypeName();
+ }
+ if (is_variadic)
+ sstr << ", ...";
+ sstr << ")";
+ if (type_quals & clang::Qualifiers::Const)
+ sstr << " const";
+
+ func_name.SetValue(ConstString(sstr.GetData()), false);
+ } else
+ func_name.SetValue(ConstString(name), false);
+
+ FunctionSP func_sp;
+ std::unique_ptr<Declaration> decl_ap;
+ if (decl_file != 0 || decl_line != 0 || decl_column != 0)
+ decl_ap.reset(new Declaration(
+ sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
+ decl_line, decl_column));
+
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ // Supply the type _only_ if it has already been parsed
+ Type *func_type = dwarf->GetDIEToType().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 = die.GetID();
+ func_sp.reset(new Function(sc.comp_unit,
+ func_user_id, // UserID is the DIE offset
+ func_user_id, func_name, func_type,
+ func_range)); // first address range
+
+ if (func_sp.get() != NULL) {
+ if (frame_base.IsValid())
+ func_sp->GetFrameBaseExpression() = frame_base;
+ sc.comp_unit->AddFunction(func_sp);
+ return func_sp.get();
}
+ }
+ }
+ }
+ return NULL;
+}
- if (func_range.GetBaseAddress().IsValid())
- {
- Mangled func_name;
- if (mangled)
- func_name.SetValue(ConstString(mangled), true);
- else if (die.GetParent().Tag() == DW_TAG_compile_unit &&
- Language::LanguageIsCPlusPlus(die.GetLanguage()) &&
- name && strcmp(name, "main") != 0)
- {
- // If the mangled name is not present in the DWARF, generate the demangled name
- // using the decl context. We skip if the function is "main" as its name is
- // never mangled.
- bool is_static = false;
- bool is_variadic = false;
- bool has_template_params = false;
- unsigned type_quals = 0;
- std::vector<CompilerType> param_types;
- std::vector<clang::ParmVarDecl*> param_decls;
- DWARFDeclContext decl_ctx;
- StreamString sstr;
-
- die.GetDWARFDeclContext(decl_ctx);
- sstr << decl_ctx.GetQualifiedName();
-
- clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE(die, nullptr);
- ParseChildParameters(sc,
- containing_decl_ctx,
- die,
- true,
- is_static,
- is_variadic,
- has_template_params,
- param_types,
- param_decls,
- type_quals);
- sstr << "(";
- for (size_t i = 0; i < param_types.size(); i++)
- {
- if (i > 0)
- sstr << ", ";
- sstr << param_types[i].GetTypeName();
+bool DWARFASTParserClang::ParseChildMembers(
+ const SymbolContext &sc, const DWARFDIE &parent_die,
+ CompilerType &class_clang_type, const LanguageType class_language,
+ std::vector<clang::CXXBaseSpecifier *> &base_classes,
+ std::vector<int> &member_accessibilities,
+ DWARFDIECollection &member_function_dies,
+ DelayedPropertyList &delayed_properties, AccessType &default_accessibility,
+ bool &is_a_class, ClangASTImporter::LayoutInfo &layout_info) {
+ if (!parent_die)
+ return 0;
+
+ // Get the parent byte size so we can verify any members will fit
+ const uint64_t parent_byte_size =
+ parent_die.GetAttributeValueAsUnsigned(DW_AT_byte_size, UINT64_MAX) * 8;
+ const uint64_t parent_bit_size =
+ parent_byte_size == UINT64_MAX ? UINT64_MAX : parent_byte_size * 8;
+
+ uint32_t member_idx = 0;
+ BitfieldInfo last_field_info;
+
+ ModuleSP module_sp = parent_die.GetDWARF()->GetObjectFile()->GetModule();
+ ClangASTContext *ast =
+ llvm::dyn_cast_or_null<ClangASTContext>(class_clang_type.GetTypeSystem());
+ if (ast == nullptr)
+ return 0;
+
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+ dw_tag_t tag = die.Tag();
+
+ switch (tag) {
+ case DW_TAG_member:
+ case DW_TAG_APPLE_property: {
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ if (num_attributes > 0) {
+ Declaration decl;
+ // DWARFExpression location;
+ const char *name = NULL;
+ const char *prop_name = NULL;
+ const char *prop_getter_name = NULL;
+ const char *prop_setter_name = NULL;
+ uint32_t prop_attributes = 0;
+
+ bool is_artificial = false;
+ DWARFFormValue encoding_form;
+ AccessType accessibility = eAccessNone;
+ uint32_t member_byte_offset =
+ (parent_die.Tag() == DW_TAG_union_type) ? 0 : UINT32_MAX;
+ size_t byte_size = 0;
+ int64_t bit_offset = 0;
+ uint64_t data_bit_offset = UINT64_MAX;
+ size_t bit_size = 0;
+ bool is_external =
+ false; // On DW_TAG_members, this means the member is static
+ uint32_t i;
+ for (i = 0; i < num_attributes && !is_artificial; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue 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();
+ break;
+ case DW_AT_type:
+ encoding_form = form_value;
+ break;
+ case DW_AT_bit_offset:
+ bit_offset = form_value.Signed();
+ break;
+ case DW_AT_bit_size:
+ bit_size = form_value.Unsigned();
+ break;
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ break;
+ case DW_AT_data_bit_offset:
+ data_bit_offset = form_value.Unsigned();
+ break;
+ case DW_AT_data_member_location:
+ if (form_value.BlockData()) {
+ Value initialValue(0);
+ Value memberOffset(0);
+ 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(
+ nullptr, // ExecutionContext *
+ nullptr, // ClangExpressionVariableList *
+ nullptr, // ClangExpressionDeclMap *
+ nullptr, // RegisterContext *
+ module_sp, debug_info_data, die.GetCU(), block_offset,
+ block_length, eRegisterKindDWARF, &initialValue,
+ nullptr, memberOffset, nullptr)) {
+ member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
}
- if (is_variadic)
- sstr << ", ...";
- sstr << ")";
- if (type_quals & clang::Qualifiers::Const)
- sstr << " const";
+ } else {
+ // With DWARF 3 and later, if the value is an integer constant,
+ // this form value is the offset in bytes from the beginning
+ // of the containing entity.
+ member_byte_offset = form_value.Unsigned();
+ }
+ break;
+
+ 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();
+ break;
+ 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();
+ break;
+ case DW_AT_APPLE_property_attribute:
+ prop_attributes = form_value.Unsigned();
+ break;
+ case DW_AT_external:
+ is_external = form_value.Boolean();
+ break;
- func_name.SetValue(ConstString(sstr.GetData()), false);
+ default:
+ case DW_AT_declaration:
+ case DW_AT_description:
+ case DW_AT_mutable:
+ case DW_AT_visibility:
+ case DW_AT_sibling:
+ break;
}
- else
- func_name.SetValue(ConstString(name), false);
-
- FunctionSP func_sp;
- std::unique_ptr<Declaration> decl_ap;
- if (decl_file != 0 || decl_line != 0 || decl_column != 0)
- decl_ap.reset(new Declaration (sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
- decl_line,
- decl_column));
-
- SymbolFileDWARF *dwarf = die.GetDWARF();
- // Supply the type _only_ if it has already been parsed
- Type *func_type = dwarf->GetDIEToType().lookup (die.GetDIE());
+ }
+ }
- assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
+ if (prop_name) {
+ ConstString fixed_getter;
+ ConstString fixed_setter;
- if (dwarf->FixupAddress (func_range.GetBaseAddress()))
- {
- const user_id_t func_user_id = die.GetID();
- func_sp.reset(new Function (sc.comp_unit,
- func_user_id, // UserID is the DIE offset
- func_user_id,
- func_name,
- func_type,
- func_range)); // first address range
-
- if (func_sp.get() != NULL)
- {
- if (frame_base.IsValid())
- func_sp->GetFrameBaseExpression() = frame_base;
- sc.comp_unit->AddFunction(func_sp);
- return func_sp.get();
- }
- }
- }
- }
- return NULL;
-}
+ // Check if the property getter/setter were provided as full
+ // names. We want basenames, so we extract them.
-bool
-DWARFASTParserClang::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &parent_die,
- CompilerType &class_clang_type, const LanguageType class_language,
- std::vector<clang::CXXBaseSpecifier *> &base_classes,
- std::vector<int> &member_accessibilities,
- DWARFDIECollection &member_function_dies,
- DelayedPropertyList &delayed_properties, AccessType &default_accessibility,
- bool &is_a_class, ClangASTImporter::LayoutInfo &layout_info)
-{
- if (!parent_die)
- return 0;
-
- // Get the parent byte size so we can verify any members will fit
- const uint64_t parent_byte_size = parent_die.GetAttributeValueAsUnsigned(DW_AT_byte_size, UINT64_MAX) * 8;
- const uint64_t parent_bit_size = parent_byte_size == UINT64_MAX ? UINT64_MAX : parent_byte_size * 8;
-
- uint32_t member_idx = 0;
- BitfieldInfo last_field_info;
-
- ModuleSP module_sp = parent_die.GetDWARF()->GetObjectFile()->GetModule();
- ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(class_clang_type.GetTypeSystem());
- if (ast == nullptr)
- return 0;
-
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
- {
- dw_tag_t tag = die.Tag();
+ if (prop_getter_name && prop_getter_name[0] == '-') {
+ ObjCLanguage::MethodName prop_getter_method(prop_getter_name, true);
+ prop_getter_name = prop_getter_method.GetSelector().GetCString();
+ }
- switch (tag)
- {
- case DW_TAG_member:
- case DW_TAG_APPLE_property:
- {
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes (attributes);
- if (num_attributes > 0)
- {
- Declaration decl;
- //DWARFExpression location;
- const char *name = NULL;
- const char *prop_name = NULL;
- const char *prop_getter_name = NULL;
- const char *prop_setter_name = NULL;
- uint32_t prop_attributes = 0;
-
-
- bool is_artificial = false;
- DWARFFormValue encoding_form;
- AccessType accessibility = eAccessNone;
- uint32_t member_byte_offset = (parent_die.Tag() == DW_TAG_union_type) ? 0 : UINT32_MAX;
- size_t byte_size = 0;
- int64_t bit_offset = 0;
- uint64_t data_bit_offset = UINT64_MAX;
- size_t bit_size = 0;
- bool is_external = false; // On DW_TAG_members, this means the member is static
- uint32_t i;
- for (i=0; i<num_attributes && !is_artificial; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue 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(); break;
- case DW_AT_type: encoding_form = form_value; break;
- case DW_AT_bit_offset: bit_offset = form_value.Signed(); break;
- case DW_AT_bit_size: bit_size = form_value.Unsigned(); break;
- case DW_AT_byte_size: byte_size = form_value.Unsigned(); break;
- case DW_AT_data_bit_offset: data_bit_offset = form_value.Unsigned(); break;
- case DW_AT_data_member_location:
- if (form_value.BlockData())
- {
- Value initialValue(0);
- Value memberOffset(0);
- 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(nullptr, // ExecutionContext *
- nullptr, // ClangExpressionVariableList *
- nullptr, // ClangExpressionDeclMap *
- nullptr, // RegisterContext *
- module_sp,
- debug_info_data,
- die.GetCU(),
- block_offset,
- block_length,
- eRegisterKindDWARF,
- &initialValue,
- nullptr,
- memberOffset,
- nullptr))
- {
- member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
- }
- }
- else
- {
- // With DWARF 3 and later, if the value is an integer constant,
- // this form value is the offset in bytes from the beginning
- // of the containing entity.
- member_byte_offset = form_value.Unsigned();
- }
- break;
-
- 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();
- break;
- 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();
- break;
- case DW_AT_APPLE_property_attribute: prop_attributes = form_value.Unsigned(); break;
- case DW_AT_external: is_external = form_value.Boolean(); break;
-
- default:
- case DW_AT_declaration:
- case DW_AT_description:
- case DW_AT_mutable:
- case DW_AT_visibility:
- case DW_AT_sibling:
- break;
- }
- }
- }
+ if (prop_setter_name && prop_setter_name[0] == '-') {
+ ObjCLanguage::MethodName prop_setter_method(prop_setter_name, true);
+ prop_setter_name = prop_setter_method.GetSelector().GetCString();
+ }
- if (prop_name)
- {
- ConstString fixed_getter;
- ConstString fixed_setter;
+ // If the names haven't been provided, they need to be
+ // filled in.
- // Check if the property getter/setter were provided as full
- // names. We want basenames, so we extract them.
+ if (!prop_getter_name) {
+ prop_getter_name = prop_name;
+ }
+ if (!prop_setter_name && prop_name[0] &&
+ !(prop_attributes & DW_APPLE_PROPERTY_readonly)) {
+ StreamString ss;
- if (prop_getter_name && prop_getter_name[0] == '-')
- {
- ObjCLanguage::MethodName prop_getter_method(prop_getter_name, true);
- prop_getter_name = prop_getter_method.GetSelector().GetCString();
- }
+ ss.Printf("set%c%s:", toupper(prop_name[0]), &prop_name[1]);
- if (prop_setter_name && prop_setter_name[0] == '-')
- {
- ObjCLanguage::MethodName prop_setter_method(prop_setter_name, true);
- prop_setter_name = prop_setter_method.GetSelector().GetCString();
- }
+ fixed_setter.SetCString(ss.GetData());
+ prop_setter_name = fixed_setter.GetCString();
+ }
+ }
- // If the names haven't been provided, they need to be
- // filled in.
+ // Clang has a DWARF generation bug where sometimes it
+ // represents fields that are references with bad byte size
+ // and bit size/offset information such as:
+ //
+ // DW_AT_byte_size( 0x00 )
+ // DW_AT_bit_size( 0x40 )
+ // DW_AT_bit_offset( 0xffffffffffffffc0 )
+ //
+ // So check the bit offset to make sure it is sane, and if
+ // the values are not sane, remove them. If we don't do this
+ // then we will end up with a crash if we try to use this
+ // type in an expression when clang becomes unhappy with its
+ // recycled debug info.
+
+ if (byte_size == 0 && bit_offset < 0) {
+ bit_size = 0;
+ bit_offset = 0;
+ }
- if (!prop_getter_name)
- {
- prop_getter_name = prop_name;
- }
- if (!prop_setter_name && prop_name[0] && !(prop_attributes & DW_APPLE_PROPERTY_readonly))
- {
- StreamString ss;
+ // FIXME: Make Clang ignore Objective-C accessibility for expressions
+ if (class_language == eLanguageTypeObjC ||
+ class_language == eLanguageTypeObjC_plus_plus)
+ accessibility = eAccessNone;
+
+ if (member_idx == 0 && !is_artificial && name &&
+ (strstr(name, "_vptr$") == name)) {
+ // Not all compilers will mark the vtable pointer
+ // member as artificial (llvm-gcc). We can't have
+ // the virtual members in our classes otherwise it
+ // throws off all child offsets since we end up
+ // having and extra pointer sized member in our
+ // class layouts.
+ is_artificial = true;
+ }
- ss.Printf("set%c%s:",
- toupper(prop_name[0]),
- &prop_name[1]);
+ // Handle static members
+ if (is_external && member_byte_offset == UINT32_MAX) {
+ Type *var_type = die.ResolveTypeUID(DIERef(encoding_form));
+
+ if (var_type) {
+ if (accessibility == eAccessNone)
+ accessibility = eAccessPublic;
+ ClangASTContext::AddVariableToRecordType(
+ class_clang_type, name, var_type->GetLayoutCompilerType(),
+ accessibility);
+ }
+ break;
+ }
- fixed_setter.SetCString(ss.GetData());
- prop_setter_name = fixed_setter.GetCString();
- }
- }
+ if (is_artificial == false) {
+ Type *member_type = die.ResolveTypeUID(DIERef(encoding_form));
+
+ clang::FieldDecl *field_decl = NULL;
+ if (tag == DW_TAG_member) {
+ if (member_type) {
+ if (accessibility == eAccessNone)
+ accessibility = default_accessibility;
+ member_accessibilities.push_back(accessibility);
+
+ uint64_t field_bit_offset =
+ (member_byte_offset == UINT32_MAX ? 0
+ : (member_byte_offset * 8));
+ if (bit_size > 0) {
+
+ BitfieldInfo this_field_info;
+ this_field_info.bit_offset = field_bit_offset;
+ this_field_info.bit_size = bit_size;
+
+ /////////////////////////////////////////////////////////////
+ // How to locate a field given the DWARF debug information
+ //
+ // AT_byte_size indicates the size of the word in which the
+ // bit offset must be interpreted.
+ //
+ // AT_data_member_location indicates the byte offset of the
+ // word from the base address of the structure.
+ //
+ // AT_bit_offset indicates how many bits into the word
+ // (according to the host endianness) the low-order bit of
+ // the field starts. AT_bit_offset can be negative.
+ //
+ // AT_bit_size indicates the size of the field in bits.
+ /////////////////////////////////////////////////////////////
+
+ if (data_bit_offset != UINT64_MAX) {
+ this_field_info.bit_offset = data_bit_offset;
+ } else {
+ if (byte_size == 0)
+ byte_size = member_type->GetByteSize();
+
+ ObjectFile *objfile = die.GetDWARF()->GetObjectFile();
+ if (objfile->GetByteOrder() == eByteOrderLittle) {
+ this_field_info.bit_offset += byte_size * 8;
+ this_field_info.bit_offset -= (bit_offset + bit_size);
+ } else {
+ this_field_info.bit_offset += bit_offset;
+ }
+ }
- // Clang has a DWARF generation bug where sometimes it
- // represents fields that are references with bad byte size
- // and bit size/offset information such as:
- //
- // DW_AT_byte_size( 0x00 )
- // DW_AT_bit_size( 0x40 )
- // DW_AT_bit_offset( 0xffffffffffffffc0 )
- //
- // So check the bit offset to make sure it is sane, and if
- // the values are not sane, remove them. If we don't do this
- // then we will end up with a crash if we try to use this
- // type in an expression when clang becomes unhappy with its
- // recycled debug info.
-
- if (byte_size == 0 && bit_offset < 0)
- {
- bit_size = 0;
- bit_offset = 0;
- }
+ if ((this_field_info.bit_offset >= parent_bit_size) ||
+ !last_field_info.NextBitfieldOffsetIsValid(
+ this_field_info.bit_offset)) {
+ ObjectFile *objfile = die.GetDWARF()->GetObjectFile();
+ objfile->GetModule()->ReportWarning(
+ "0x%8.8" PRIx64 ": %s bitfield named \"%s\" has invalid "
+ "bit offset (0x%8.8" PRIx64
+ ") member will be ignored. Please file a bug against the "
+ "compiler and include the preprocessed output for %s\n",
+ die.GetID(), DW_TAG_value_to_name(tag), name,
+ this_field_info.bit_offset,
+ sc.comp_unit ? sc.comp_unit->GetPath().c_str()
+ : "the source file");
+ this_field_info.Clear();
+ continue;
+ }
- // FIXME: Make Clang ignore Objective-C accessibility for expressions
- if (class_language == eLanguageTypeObjC ||
- class_language == eLanguageTypeObjC_plus_plus)
- accessibility = eAccessNone;
-
- if (member_idx == 0 && !is_artificial && name && (strstr (name, "_vptr$") == name))
- {
- // Not all compilers will mark the vtable pointer
- // member as artificial (llvm-gcc). We can't have
- // the virtual members in our classes otherwise it
- // throws off all child offsets since we end up
- // having and extra pointer sized member in our
- // class layouts.
- is_artificial = true;
+ // Update the field bit offset we will report for layout
+ field_bit_offset = this_field_info.bit_offset;
+
+ // If the member to be emitted did not start on a character
+ // boundary and there is
+ // empty space between the last field and this one, then we need
+ // to emit an
+ // anonymous member filling up the space up to its start. There
+ // are three cases
+ // here:
+ //
+ // 1 If the previous member ended on a character boundary, then
+ // we can emit an
+ // anonymous member starting at the most recent character
+ // boundary.
+ //
+ // 2 If the previous member did not end on a character boundary
+ // and the distance
+ // from the end of the previous member to the current member
+ // is less than a
+ // word width, then we can emit an anonymous member starting
+ // right after the
+ // previous member and right before this member.
+ //
+ // 3 If the previous member did not end on a character boundary
+ // and the distance
+ // from the end of the previous member to the current member
+ // is greater than
+ // or equal a word width, then we act as in Case 1.
+
+ const uint64_t character_width = 8;
+ const uint64_t word_width = 32;
+
+ // Objective-C has invalid DW_AT_bit_offset values in older
+ // versions
+ // of clang, so we have to be careful and only insert unnamed
+ // bitfields
+ // if we have a new enough clang.
+ bool detect_unnamed_bitfields = true;
+
+ if (class_language == eLanguageTypeObjC ||
+ class_language == eLanguageTypeObjC_plus_plus)
+ detect_unnamed_bitfields =
+ die.GetCU()->Supports_unnamed_objc_bitfields();
+
+ if (detect_unnamed_bitfields) {
+ BitfieldInfo anon_field_info;
+
+ if ((this_field_info.bit_offset % character_width) !=
+ 0) // not char aligned
+ {
+ uint64_t last_field_end = 0;
+
+ if (last_field_info.IsValid())
+ last_field_end =
+ last_field_info.bit_offset + last_field_info.bit_size;
+
+ if (this_field_info.bit_offset != last_field_end) {
+ if (((last_field_end % character_width) == 0) || // case 1
+ (this_field_info.bit_offset - last_field_end >=
+ word_width)) // case 3
+ {
+ anon_field_info.bit_size =
+ this_field_info.bit_offset % character_width;
+ anon_field_info.bit_offset =
+ this_field_info.bit_offset -
+ anon_field_info.bit_size;
+ } else // case 2
+ {
+ anon_field_info.bit_size =
+ this_field_info.bit_offset - last_field_end;
+ anon_field_info.bit_offset = last_field_end;
+ }
}
-
- // Handle static members
- if (is_external && member_byte_offset == UINT32_MAX)
- {
- Type *var_type = die.ResolveTypeUID(DIERef(encoding_form));
-
- if (var_type)
- {
- if (accessibility == eAccessNone)
- accessibility = eAccessPublic;
- ClangASTContext::AddVariableToRecordType (class_clang_type,
- name,
- var_type->GetLayoutCompilerType (),
- accessibility);
- }
- break;
+ }
+
+ if (anon_field_info.IsValid()) {
+ clang::FieldDecl *unnamed_bitfield_decl =
+ ClangASTContext::AddFieldToRecordType(
+ class_clang_type, NULL,
+ m_ast.GetBuiltinTypeForEncodingAndBitSize(
+ eEncodingSint, word_width),
+ accessibility, anon_field_info.bit_size);
+
+ layout_info.field_offsets.insert(std::make_pair(
+ unnamed_bitfield_decl, anon_field_info.bit_offset));
+ }
+ }
+ last_field_info = this_field_info;
+ } else {
+ last_field_info.Clear();
+ }
+
+ CompilerType member_clang_type =
+ member_type->GetLayoutCompilerType();
+ if (!member_clang_type.IsCompleteType())
+ member_clang_type.GetCompleteType();
+
+ {
+ // Older versions of clang emit array[0] and array[1] in the
+ // same way (<rdar://problem/12566646>).
+ // If the current field is at the end of the structure, then
+ // there is definitely no room for extra
+ // elements and we override the type to array[0].
+
+ CompilerType member_array_element_type;
+ uint64_t member_array_size;
+ bool member_array_is_incomplete;
+
+ if (member_clang_type.IsArrayType(
+ &member_array_element_type, &member_array_size,
+ &member_array_is_incomplete) &&
+ !member_array_is_incomplete) {
+ 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 &&
+ (member_array_size != 0 ||
+ member_byte_offset > parent_byte_size)) {
+ module_sp->ReportError(
+ "0x%8.8" PRIx64
+ ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64
+ " which extends beyond the bounds of 0x%8.8" PRIx64,
+ die.GetID(), name, encoding_form.Reference(),
+ parent_die.GetID());
}
- if (is_artificial == false)
- {
- Type *member_type = die.ResolveTypeUID(DIERef(encoding_form));
-
- clang::FieldDecl *field_decl = NULL;
- if (tag == DW_TAG_member)
- {
- if (member_type)
- {
- if (accessibility == eAccessNone)
- accessibility = default_accessibility;
- member_accessibilities.push_back(accessibility);
-
- uint64_t field_bit_offset = (member_byte_offset == UINT32_MAX ? 0 : (member_byte_offset * 8));
- if (bit_size > 0)
- {
-
- BitfieldInfo this_field_info;
- this_field_info.bit_offset = field_bit_offset;
- this_field_info.bit_size = bit_size;
-
- /////////////////////////////////////////////////////////////
- // How to locate a field given the DWARF debug information
- //
- // AT_byte_size indicates the size of the word in which the
- // bit offset must be interpreted.
- //
- // AT_data_member_location indicates the byte offset of the
- // word from the base address of the structure.
- //
- // AT_bit_offset indicates how many bits into the word
- // (according to the host endianness) the low-order bit of
- // the field starts. AT_bit_offset can be negative.
- //
- // AT_bit_size indicates the size of the field in bits.
- /////////////////////////////////////////////////////////////
-
- if (data_bit_offset != UINT64_MAX)
- {
- this_field_info.bit_offset = data_bit_offset;
- }
- else
- {
- if (byte_size == 0)
- byte_size = member_type->GetByteSize();
-
- ObjectFile *objfile = die.GetDWARF()->GetObjectFile();
- if (objfile->GetByteOrder() == eByteOrderLittle)
- {
- this_field_info.bit_offset += byte_size * 8;
- this_field_info.bit_offset -= (bit_offset + bit_size);
- }
- else
- {
- this_field_info.bit_offset += bit_offset;
- }
- }
-
- if ((this_field_info.bit_offset >= parent_bit_size) || !last_field_info.NextBitfieldOffsetIsValid(this_field_info.bit_offset))
- {
- ObjectFile *objfile = die.GetDWARF()->GetObjectFile();
- objfile->GetModule()->ReportWarning("0x%8.8" PRIx64 ": %s bitfield named \"%s\" has invalid bit offset (0x%8.8" PRIx64 ") member will be ignored. Please file a bug against the compiler and include the preprocessed output for %s\n",
- die.GetID(),
- DW_TAG_value_to_name(tag),
- name,
- this_field_info.bit_offset,
- sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file");
- this_field_info.Clear();
- continue;
- }
-
- // Update the field bit offset we will report for layout
- field_bit_offset = this_field_info.bit_offset;
-
- // If the member to be emitted did not start on a character boundary and there is
- // empty space between the last field and this one, then we need to emit an
- // anonymous member filling up the space up to its start. There are three cases
- // here:
- //
- // 1 If the previous member ended on a character boundary, then we can emit an
- // anonymous member starting at the most recent character boundary.
- //
- // 2 If the previous member did not end on a character boundary and the distance
- // from the end of the previous member to the current member is less than a
- // word width, then we can emit an anonymous member starting right after the
- // previous member and right before this member.
- //
- // 3 If the previous member did not end on a character boundary and the distance
- // from the end of the previous member to the current member is greater than
- // or equal a word width, then we act as in Case 1.
-
- const uint64_t character_width = 8;
- const uint64_t word_width = 32;
-
- // Objective-C has invalid DW_AT_bit_offset values in older versions
- // of clang, so we have to be careful and only insert unnamed bitfields
- // if we have a new enough clang.
- bool detect_unnamed_bitfields = true;
-
- if (class_language == eLanguageTypeObjC || class_language == eLanguageTypeObjC_plus_plus)
- detect_unnamed_bitfields = die.GetCU()->Supports_unnamed_objc_bitfields ();
-
- if (detect_unnamed_bitfields)
- {
- BitfieldInfo anon_field_info;
-
- if ((this_field_info.bit_offset % character_width) != 0) // not char aligned
- {
- uint64_t last_field_end = 0;
-
- if (last_field_info.IsValid())
- last_field_end = last_field_info.bit_offset + last_field_info.bit_size;
-
- if (this_field_info.bit_offset != last_field_end)
- {
- if (((last_field_end % character_width) == 0) || // case 1
- (this_field_info.bit_offset - last_field_end >= word_width)) // case 3
- {
- anon_field_info.bit_size = this_field_info.bit_offset % character_width;
- anon_field_info.bit_offset = this_field_info.bit_offset - anon_field_info.bit_size;
- }
- else // case 2
- {
- anon_field_info.bit_size = this_field_info.bit_offset - last_field_end;
- anon_field_info.bit_offset = last_field_end;
- }
- }
- }
-
- if (anon_field_info.IsValid())
- {
- clang::FieldDecl *unnamed_bitfield_decl =
- ClangASTContext::AddFieldToRecordType (class_clang_type,
- NULL,
- m_ast.GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, word_width),
- accessibility,
- anon_field_info.bit_size);
-
- layout_info.field_offsets.insert(
- std::make_pair(unnamed_bitfield_decl, anon_field_info.bit_offset));
- }
- }
- last_field_info = this_field_info;
- }
- else
- {
- last_field_info.Clear();
- }
-
- CompilerType member_clang_type = member_type->GetLayoutCompilerType ();
- if (!member_clang_type.IsCompleteType())
- member_clang_type.GetCompleteType();
-
- {
- // Older versions of clang emit array[0] and array[1] in the same way (<rdar://problem/12566646>).
- // If the current field is at the end of the structure, then there is definitely no room for extra
- // elements and we override the type to array[0].
-
- CompilerType member_array_element_type;
- uint64_t member_array_size;
- bool member_array_is_incomplete;
-
- if (member_clang_type.IsArrayType(&member_array_element_type,
- &member_array_size,
- &member_array_is_incomplete) &&
- !member_array_is_incomplete)
- {
- 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 && (member_array_size != 0 || member_byte_offset > parent_byte_size))
- {
- module_sp->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which extends beyond the bounds of 0x%8.8" PRIx64,
- die.GetID(),
- name,
- encoding_form.Reference(),
- parent_die.GetID());
- }
-
- member_clang_type = m_ast.CreateArrayType(member_array_element_type, 0, false);
- }
- }
- }
-
- if (ClangASTContext::IsCXXClassType(member_clang_type) && member_clang_type.GetCompleteType() == false)
- {
- if (die.GetCU()->GetProducer() == DWARFCompileUnit::eProducerClang)
- module_sp->ReportError ("DWARF DIE at 0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type is a forward declaration, not a complete definition.\nTry compiling the source file with -fno-limit-debug-info",
- parent_die.GetOffset(),
- parent_die.GetName(),
- die.GetOffset(),
- name);
- else
- module_sp->ReportError ("DWARF DIE at 0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type is a forward declaration, not a complete definition.\nPlease file a bug against the compiler and include the preprocessed output for %s",
- parent_die.GetOffset(),
- parent_die.GetName(),
- die.GetOffset(),
- name,
- sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file");
- // We have no choice other than to pretend that the member class
- // is complete. If we don't do this, clang will crash when trying
- // to layout the class. Since we provide layout assistance, all
- // ivars in this class and other classes will be fine, this is
- // the best we can do short of crashing.
- if (ClangASTContext::StartTagDeclarationDefinition(member_clang_type))
- {
- ClangASTContext::CompleteTagDeclarationDefinition(member_clang_type);
- }
- else
- {
- module_sp->ReportError ("DWARF DIE at 0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type claims to be a C++ class but we were not able to start its definition.\nPlease file a bug and attach the file at the start of this error message",
- parent_die.GetOffset(),
- parent_die.GetName(),
- die.GetOffset(),
- name);
- }
- }
-
- field_decl = ClangASTContext::AddFieldToRecordType (class_clang_type,
- name,
- member_clang_type,
- accessibility,
- bit_size);
-
- m_ast.SetMetadataAsUserID (field_decl, die.GetID());
-
- layout_info.field_offsets.insert(std::make_pair(field_decl, field_bit_offset));
- }
- else
- {
- 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",
- die.GetID(),
- name,
- encoding_form.Reference());
- else
- module_sp->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member refers to type 0x%8.8" PRIx64 " which was unable to be parsed",
- die.GetID(),
- encoding_form.Reference());
- }
- }
-
- if (prop_name != NULL && member_type)
- {
- clang::ObjCIvarDecl *ivar_decl = NULL;
+ member_clang_type = m_ast.CreateArrayType(
+ member_array_element_type, 0, false);
+ }
+ }
+ }
+
+ if (ClangASTContext::IsCXXClassType(member_clang_type) &&
+ member_clang_type.GetCompleteType() == false) {
+ if (die.GetCU()->GetProducer() ==
+ DWARFCompileUnit::eProducerClang)
+ module_sp->ReportError(
+ "DWARF DIE at 0x%8.8x (class %s) has a member variable "
+ "0x%8.8x (%s) whose type is a forward declaration, not a "
+ "complete definition.\nTry compiling the source file "
+ "with -fno-limit-debug-info",
+ parent_die.GetOffset(), parent_die.GetName(),
+ die.GetOffset(), name);
+ else
+ module_sp->ReportError(
+ "DWARF DIE at 0x%8.8x (class %s) has a member variable "
+ "0x%8.8x (%s) whose type is a forward declaration, not a "
+ "complete definition.\nPlease file a bug against the "
+ "compiler and include the preprocessed output for %s",
+ parent_die.GetOffset(), parent_die.GetName(),
+ die.GetOffset(), name,
+ sc.comp_unit ? sc.comp_unit->GetPath().c_str()
+ : "the source file");
+ // We have no choice other than to pretend that the member class
+ // is complete. If we don't do this, clang will crash when
+ // trying
+ // to layout the class. Since we provide layout assistance, all
+ // ivars in this class and other classes will be fine, this is
+ // the best we can do short of crashing.
+ if (ClangASTContext::StartTagDeclarationDefinition(
+ member_clang_type)) {
+ ClangASTContext::CompleteTagDeclarationDefinition(
+ member_clang_type);
+ } else {
+ module_sp->ReportError(
+ "DWARF DIE at 0x%8.8x (class %s) has a member variable "
+ "0x%8.8x (%s) whose type claims to be a C++ class but we "
+ "were not able to start its definition.\nPlease file a "
+ "bug and attach the file at the start of this error "
+ "message",
+ parent_die.GetOffset(), parent_die.GetName(),
+ die.GetOffset(), name);
+ }
+ }
+
+ field_decl = ClangASTContext::AddFieldToRecordType(
+ class_clang_type, name, member_clang_type, accessibility,
+ bit_size);
+
+ m_ast.SetMetadataAsUserID(field_decl, die.GetID());
+
+ layout_info.field_offsets.insert(
+ std::make_pair(field_decl, field_bit_offset));
+ } else {
+ 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",
+ die.GetID(), name, encoding_form.Reference());
+ else
+ module_sp->ReportError(
+ "0x%8.8" PRIx64
+ ": DW_TAG_member refers to type 0x%8.8" PRIx64
+ " which was unable to be parsed",
+ die.GetID(), encoding_form.Reference());
+ }
+ }
- if (field_decl)
- {
- ivar_decl = clang::dyn_cast<clang::ObjCIvarDecl>(field_decl);
- assert (ivar_decl != NULL);
- }
+ if (prop_name != NULL && member_type) {
+ clang::ObjCIvarDecl *ivar_decl = NULL;
- ClangASTMetadata metadata;
- metadata.SetUserID (die.GetID());
- delayed_properties.push_back(DelayedAddObjCClassProperty(class_clang_type,
- prop_name,
- member_type->GetLayoutCompilerType (),
- ivar_decl,
- prop_setter_name,
- prop_getter_name,
- prop_attributes,
- &metadata));
-
- if (ivar_decl)
- m_ast.SetMetadataAsUserID (ivar_decl, die.GetID());
- }
- }
- }
- ++member_idx;
+ if (field_decl) {
+ ivar_decl = clang::dyn_cast<clang::ObjCIvarDecl>(field_decl);
+ assert(ivar_decl != NULL);
}
- break;
- case DW_TAG_subprogram:
- // Let the type parsing code handle this one for us.
- member_function_dies.Append (die);
- break;
+ ClangASTMetadata metadata;
+ metadata.SetUserID(die.GetID());
+ delayed_properties.push_back(DelayedAddObjCClassProperty(
+ class_clang_type, prop_name,
+ member_type->GetLayoutCompilerType(), ivar_decl,
+ prop_setter_name, prop_getter_name, prop_attributes,
+ &metadata));
+
+ if (ivar_decl)
+ m_ast.SetMetadataAsUserID(ivar_decl, die.GetID());
+ }
+ }
+ }
+ ++member_idx;
+ } break;
+
+ case DW_TAG_subprogram:
+ // Let the type parsing code handle this one for us.
+ member_function_dies.Append(die);
+ break;
+
+ case DW_TAG_inheritance: {
+ is_a_class = true;
+ if (default_accessibility == eAccessNone)
+ default_accessibility = eAccessPrivate;
+ // TODO: implement DW_TAG_inheritance type parsing
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ if (num_attributes > 0) {
+ Declaration decl;
+ DWARFExpression location(die.GetCU());
+ DWARFFormValue encoding_form;
+ AccessType accessibility = default_accessibility;
+ bool is_virtual = false;
+ bool is_base_of_class = true;
+ off_t member_byte_offset = 0;
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue 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_type:
+ encoding_form = form_value;
+ break;
+ case DW_AT_data_member_location:
+ if (form_value.BlockData()) {
+ Value initialValue(0);
+ Value memberOffset(0);
+ 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(
+ nullptr, nullptr, nullptr, nullptr, module_sp,
+ debug_info_data, die.GetCU(), block_offset,
+ block_length, eRegisterKindDWARF, &initialValue,
+ nullptr, memberOffset, nullptr)) {
+ member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
+ }
+ } else {
+ // With DWARF 3 and later, if the value is an integer constant,
+ // this form value is the offset in bytes from the beginning
+ // of the containing entity.
+ member_byte_offset = form_value.Unsigned();
+ }
+ break;
- case DW_TAG_inheritance:
- {
- is_a_class = true;
- if (default_accessibility == eAccessNone)
- default_accessibility = eAccessPrivate;
- // TODO: implement DW_TAG_inheritance type parsing
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes (attributes);
- if (num_attributes > 0)
- {
- Declaration decl;
- DWARFExpression location(die.GetCU());
- DWARFFormValue encoding_form;
- AccessType accessibility = default_accessibility;
- bool is_virtual = false;
- bool is_base_of_class = true;
- off_t member_byte_offset = 0;
- uint32_t i;
- for (i=0; i<num_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue 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_type: encoding_form = form_value; break;
- case DW_AT_data_member_location:
- if (form_value.BlockData())
- {
- Value initialValue(0);
- Value memberOffset(0);
- 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 (nullptr,
- nullptr,
- nullptr,
- nullptr,
- module_sp,
- debug_info_data,
- die.GetCU(),
- block_offset,
- block_length,
- eRegisterKindDWARF,
- &initialValue,
- nullptr,
- memberOffset,
- nullptr))
- {
- member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
- }
- }
- else
- {
- // With DWARF 3 and later, if the value is an integer constant,
- // this form value is the offset in bytes from the beginning
- // of the containing entity.
- member_byte_offset = form_value.Unsigned();
- }
- break;
-
- case DW_AT_accessibility:
- accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned());
- break;
-
- case DW_AT_virtuality:
- is_virtual = form_value.Boolean();
- break;
-
- case DW_AT_sibling:
- break;
-
- default:
- break;
- }
- }
- }
+ case DW_AT_accessibility:
+ accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned());
+ break;
- Type *base_class_type = die.ResolveTypeUID(DIERef(encoding_form));
- if (base_class_type == NULL)
- {
- module_sp->ReportError("0x%8.8x: DW_TAG_inheritance failed to resolve the base class at 0x%8.8" PRIx64 " from enclosing type 0x%8.8x. \nPlease file a bug and attach the file at the start of this error message",
- die.GetOffset(),
- encoding_form.Reference(),
- parent_die.GetOffset());
- break;
- }
+ case DW_AT_virtuality:
+ is_virtual = form_value.Boolean();
+ break;
- CompilerType base_class_clang_type = base_class_type->GetFullCompilerType ();
- assert (base_class_clang_type);
- if (class_language == eLanguageTypeObjC)
- {
- ast->SetObjCSuperClass(class_clang_type, base_class_clang_type);
- }
- else
- {
- base_classes.push_back (ast->CreateBaseClassSpecifier (base_class_clang_type.GetOpaqueQualType(),
- accessibility,
- is_virtual,
- is_base_of_class));
-
- if (is_virtual)
- {
- // Do not specify any offset for virtual inheritance. The DWARF produced by clang doesn't
- // give us a constant offset, but gives us a DWARF expressions that requires an actual object
- // in memory. the DW_AT_data_member_location for a virtual base class looks like:
- // DW_AT_data_member_location( DW_OP_dup, DW_OP_deref, DW_OP_constu(0x00000018), DW_OP_minus, DW_OP_deref, DW_OP_plus )
- // Given this, there is really no valid response we can give to clang for virtual base
- // class offsets, and this should eventually be removed from LayoutRecordType() in the external
- // AST source in clang.
- }
- else
- {
- layout_info.base_offsets.insert(
- std::make_pair(ast->GetAsCXXRecordDecl(base_class_clang_type.GetOpaqueQualType()),
- clang::CharUnits::fromQuantity(member_byte_offset)));
- }
- }
- }
- }
- break;
+ case DW_AT_sibling:
+ break;
default:
- break;
+ break;
+ }
+ }
}
- }
-
- return true;
-}
+ Type *base_class_type = die.ResolveTypeUID(DIERef(encoding_form));
+ if (base_class_type == NULL) {
+ module_sp->ReportError("0x%8.8x: DW_TAG_inheritance failed to "
+ "resolve the base class at 0x%8.8" PRIx64
+ " from enclosing type 0x%8.8x. \nPlease file "
+ "a bug and attach the file at the start of "
+ "this error message",
+ die.GetOffset(), encoding_form.Reference(),
+ parent_die.GetOffset());
+ break;
+ }
-size_t
-DWARFASTParserClang::ParseChildParameters (const SymbolContext& sc,
- clang::DeclContext *containing_decl_ctx,
- const DWARFDIE &parent_die,
- bool skip_artificial,
- bool &is_static,
- bool &is_variadic,
- bool &has_template_params,
- std::vector<CompilerType>& function_param_types,
- std::vector<clang::ParmVarDecl*>& function_param_decls,
- unsigned &type_quals)
-{
- if (!parent_die)
- return 0;
-
- size_t arg_idx = 0;
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
- {
- const dw_tag_t tag = die.Tag();
- switch (tag)
- {
- case DW_TAG_formal_parameter:
- {
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- if (num_attributes > 0)
- {
- const char *name = NULL;
- Declaration decl;
- DWARFFormValue param_type_die_form;
- bool is_artificial = false;
- // one of None, Auto, Register, Extern, Static, PrivateExtern
-
- clang::StorageClass storage = clang::SC_None;
- uint32_t i;
- for (i=0; i<num_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue 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();
- break;
- case DW_AT_type: param_type_die_form = form_value; break;
- case DW_AT_artificial: is_artificial = form_value.Boolean(); break;
- case DW_AT_location:
- // if (form_value.BlockData())
- // {
- // const DWARFDataExtractor& debug_info_data = debug_info();
- // uint32_t block_length = form_value.Unsigned();
- // DWARFDataExtractor location(debug_info_data, form_value.BlockData() - debug_info_data.GetDataStart(), block_length);
- // }
- // else
- // {
- // }
- // break;
- case DW_AT_const_value:
- case DW_AT_default_value:
- case DW_AT_description:
- case DW_AT_endianity:
- case DW_AT_is_optional:
- case DW_AT_segment:
- case DW_AT_variable_parameter:
- default:
- case DW_AT_abstract_origin:
- case DW_AT_sibling:
- break;
- }
- }
- }
+ CompilerType base_class_clang_type =
+ base_class_type->GetFullCompilerType();
+ assert(base_class_clang_type);
+ if (class_language == eLanguageTypeObjC) {
+ ast->SetObjCSuperClass(class_clang_type, base_class_clang_type);
+ } else {
+ base_classes.push_back(ast->CreateBaseClassSpecifier(
+ base_class_clang_type.GetOpaqueQualType(), accessibility,
+ is_virtual, is_base_of_class));
+
+ if (is_virtual) {
+ // Do not specify any offset for virtual inheritance. The DWARF
+ // produced by clang doesn't
+ // give us a constant offset, but gives us a DWARF expressions that
+ // requires an actual object
+ // in memory. the DW_AT_data_member_location for a virtual base
+ // class looks like:
+ // DW_AT_data_member_location( DW_OP_dup, DW_OP_deref,
+ // DW_OP_constu(0x00000018), DW_OP_minus, DW_OP_deref,
+ // DW_OP_plus )
+ // Given this, there is really no valid response we can give to
+ // clang for virtual base
+ // class offsets, and this should eventually be removed from
+ // LayoutRecordType() in the external
+ // AST source in clang.
+ } else {
+ layout_info.base_offsets.insert(std::make_pair(
+ ast->GetAsCXXRecordDecl(
+ base_class_clang_type.GetOpaqueQualType()),
+ clang::CharUnits::fromQuantity(member_byte_offset)));
+ }
+ }
+ }
+ } break;
- bool skip = false;
- if (skip_artificial)
- {
- if (is_artificial)
- {
- // In order to determine if a C++ member function is
- // "const" we have to look at the const-ness of "this"...
- // Ugly, but that
- if (arg_idx == 0)
- {
- if (DeclKindIsCXXClass(containing_decl_ctx->getDeclKind()))
- {
- // Often times compilers omit the "this" name for the
- // specification DIEs, so we can't rely upon the name
- // being in the formal parameter DIE...
- if (name == NULL || ::strcmp(name, "this")==0)
- {
- Type *this_type = die.ResolveTypeUID (DIERef(param_type_die_form));
- if (this_type)
- {
- uint32_t encoding_mask = this_type->GetEncodingMask();
- if (encoding_mask & Type::eEncodingIsPointerUID)
- {
- is_static = false;
-
- if (encoding_mask & (1u << Type::eEncodingIsConstUID))
- type_quals |= clang::Qualifiers::Const;
- if (encoding_mask & (1u << Type::eEncodingIsVolatileUID))
- type_quals |= clang::Qualifiers::Volatile;
- }
- }
- }
- }
- }
- skip = true;
- }
- else
- {
-
- // HACK: Objective C formal parameters "self" and "_cmd"
- // are not marked as artificial in the DWARF...
- CompileUnit *comp_unit = die.GetLLDBCompileUnit();
- if (comp_unit)
- {
- switch (comp_unit->GetLanguage())
- {
- case eLanguageTypeObjC:
- case eLanguageTypeObjC_plus_plus:
- if (name && name[0] && (strcmp (name, "self") == 0 || strcmp (name, "_cmd") == 0))
- skip = true;
- break;
- default:
- break;
- }
- }
- }
- }
+ default:
+ break;
+ }
+ }
- if (!skip)
- {
- Type *type = die.ResolveTypeUID(DIERef(param_type_die_form));
- if (type)
- {
- function_param_types.push_back (type->GetForwardCompilerType ());
+ return true;
+}
- clang::ParmVarDecl *param_var_decl = m_ast.CreateParameterDeclaration (name,
- type->GetForwardCompilerType (),
- storage);
- assert(param_var_decl);
- function_param_decls.push_back(param_var_decl);
+size_t DWARFASTParserClang::ParseChildParameters(
+ const SymbolContext &sc, clang::DeclContext *containing_decl_ctx,
+ const DWARFDIE &parent_die, bool skip_artificial, bool &is_static,
+ bool &is_variadic, bool &has_template_params,
+ std::vector<CompilerType> &function_param_types,
+ std::vector<clang::ParmVarDecl *> &function_param_decls,
+ unsigned &type_quals) {
+ if (!parent_die)
+ return 0;
+
+ size_t arg_idx = 0;
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+ const dw_tag_t tag = die.Tag();
+ switch (tag) {
+ case DW_TAG_formal_parameter: {
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ if (num_attributes > 0) {
+ const char *name = NULL;
+ Declaration decl;
+ DWARFFormValue param_type_die_form;
+ bool is_artificial = false;
+ // one of None, Auto, Register, Extern, Static, PrivateExtern
+
+ clang::StorageClass storage = clang::SC_None;
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue 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();
+ break;
+ case DW_AT_type:
+ param_type_die_form = form_value;
+ break;
+ case DW_AT_artificial:
+ is_artificial = form_value.Boolean();
+ break;
+ case DW_AT_location:
+ // if (form_value.BlockData())
+ // {
+ // const DWARFDataExtractor&
+ // debug_info_data = debug_info();
+ // uint32_t block_length =
+ // form_value.Unsigned();
+ // DWARFDataExtractor
+ // location(debug_info_data,
+ // form_value.BlockData() -
+ // debug_info_data.GetDataStart(),
+ // block_length);
+ // }
+ // else
+ // {
+ // }
+ // break;
+ case DW_AT_const_value:
+ case DW_AT_default_value:
+ case DW_AT_description:
+ case DW_AT_endianity:
+ case DW_AT_is_optional:
+ case DW_AT_segment:
+ case DW_AT_variable_parameter:
+ default:
+ case DW_AT_abstract_origin:
+ case DW_AT_sibling:
+ break;
+ }
+ }
+ }
- m_ast.SetMetadataAsUserID (param_var_decl, die.GetID());
- }
+ bool skip = false;
+ if (skip_artificial) {
+ if (is_artificial) {
+ // In order to determine if a C++ member function is
+ // "const" we have to look at the const-ness of "this"...
+ // Ugly, but that
+ if (arg_idx == 0) {
+ if (DeclKindIsCXXClass(containing_decl_ctx->getDeclKind())) {
+ // Often times compilers omit the "this" name for the
+ // specification DIEs, so we can't rely upon the name
+ // being in the formal parameter DIE...
+ if (name == NULL || ::strcmp(name, "this") == 0) {
+ Type *this_type =
+ die.ResolveTypeUID(DIERef(param_type_die_form));
+ if (this_type) {
+ uint32_t encoding_mask = this_type->GetEncodingMask();
+ if (encoding_mask & Type::eEncodingIsPointerUID) {
+ is_static = false;
+
+ if (encoding_mask & (1u << Type::eEncodingIsConstUID))
+ type_quals |= clang::Qualifiers::Const;
+ if (encoding_mask & (1u << Type::eEncodingIsVolatileUID))
+ type_quals |= clang::Qualifiers::Volatile;
}
+ }
}
- arg_idx++;
+ }
}
+ skip = true;
+ } else {
+
+ // HACK: Objective C formal parameters "self" and "_cmd"
+ // are not marked as artificial in the DWARF...
+ CompileUnit *comp_unit = die.GetLLDBCompileUnit();
+ if (comp_unit) {
+ switch (comp_unit->GetLanguage()) {
+ case eLanguageTypeObjC:
+ case eLanguageTypeObjC_plus_plus:
+ if (name && name[0] &&
+ (strcmp(name, "self") == 0 || strcmp(name, "_cmd") == 0))
+ skip = true;
break;
-
- case DW_TAG_unspecified_parameters:
- is_variadic = true;
+ default:
break;
+ }
+ }
+ }
+ }
- case DW_TAG_template_type_parameter:
- case DW_TAG_template_value_parameter:
- // The one caller of this was never using the template_param_infos,
- // and the local variable was taking up a large amount of stack space
- // in SymbolFileDWARF::ParseType() so this was removed. If we ever need
- // the template params back, we can add them back.
- // ParseTemplateDIE (dwarf_cu, die, template_param_infos);
- has_template_params = true;
- break;
+ if (!skip) {
+ Type *type = die.ResolveTypeUID(DIERef(param_type_die_form));
+ if (type) {
+ function_param_types.push_back(type->GetForwardCompilerType());
- default:
- break;
+ clang::ParmVarDecl *param_var_decl =
+ m_ast.CreateParameterDeclaration(
+ name, type->GetForwardCompilerType(), storage);
+ assert(param_var_decl);
+ function_param_decls.push_back(param_var_decl);
+
+ m_ast.SetMetadataAsUserID(param_var_decl, die.GetID());
+ }
}
+ }
+ arg_idx++;
+ } break;
+
+ case DW_TAG_unspecified_parameters:
+ is_variadic = true;
+ break;
+
+ case DW_TAG_template_type_parameter:
+ case DW_TAG_template_value_parameter:
+ // The one caller of this was never using the template_param_infos,
+ // and the local variable was taking up a large amount of stack space
+ // in SymbolFileDWARF::ParseType() so this was removed. If we ever need
+ // the template params back, we can add them back.
+ // ParseTemplateDIE (dwarf_cu, die, template_param_infos);
+ has_template_params = true;
+ break;
+
+ default:
+ break;
}
- return arg_idx;
+ }
+ return arg_idx;
}
-void
-DWARFASTParserClang::ParseChildArrayInfo (const SymbolContext& sc,
- 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)
- return;
-
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
- {
- const dw_tag_t tag = die.Tag();
- switch (tag)
- {
- case DW_TAG_subrange_type:
- {
- DWARFAttributes attributes;
- const size_t num_child_attributes = die.GetAttributes(attributes);
- if (num_child_attributes > 0)
- {
- uint64_t num_elements = 0;
- uint64_t lower_bound = 0;
- uint64_t upper_bound = 0;
- bool upper_bound_valid = false;
- uint32_t i;
- for (i=0; i<num_child_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- break;
-
- case DW_AT_count:
- num_elements = form_value.Unsigned();
- break;
-
- case DW_AT_bit_stride:
- bit_stride = form_value.Unsigned();
- break;
-
- case DW_AT_byte_stride:
- byte_stride = form_value.Unsigned();
- break;
-
- case DW_AT_lower_bound:
- lower_bound = form_value.Unsigned();
- break;
-
- case DW_AT_upper_bound:
- upper_bound_valid = true;
- upper_bound = form_value.Unsigned();
- break;
-
- default:
- case DW_AT_abstract_origin:
- case DW_AT_accessibility:
- case DW_AT_allocated:
- case DW_AT_associated:
- case DW_AT_data_location:
- case DW_AT_declaration:
- case DW_AT_description:
- case DW_AT_sibling:
- case DW_AT_threads_scaled:
- case DW_AT_type:
- case DW_AT_visibility:
- break;
- }
- }
- }
+void DWARFASTParserClang::ParseChildArrayInfo(
+ const SymbolContext &sc, 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)
+ return;
- if (num_elements == 0)
- {
- if (upper_bound_valid && upper_bound >= lower_bound)
- num_elements = upper_bound - lower_bound + 1;
- }
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+ const dw_tag_t tag = die.Tag();
+ switch (tag) {
+ case DW_TAG_subrange_type: {
+ DWARFAttributes attributes;
+ const size_t num_child_attributes = die.GetAttributes(attributes);
+ if (num_child_attributes > 0) {
+ uint64_t num_elements = 0;
+ uint64_t lower_bound = 0;
+ uint64_t upper_bound = 0;
+ bool upper_bound_valid = false;
+ uint32_t i;
+ for (i = 0; i < num_child_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ break;
+
+ case DW_AT_count:
+ num_elements = form_value.Unsigned();
+ break;
+
+ case DW_AT_bit_stride:
+ bit_stride = form_value.Unsigned();
+ break;
+
+ case DW_AT_byte_stride:
+ byte_stride = form_value.Unsigned();
+ break;
+
+ case DW_AT_lower_bound:
+ lower_bound = form_value.Unsigned();
+ break;
+
+ case DW_AT_upper_bound:
+ upper_bound_valid = true;
+ upper_bound = form_value.Unsigned();
+ break;
- element_orders.push_back (num_elements);
- }
+ default:
+ case DW_AT_abstract_origin:
+ case DW_AT_accessibility:
+ case DW_AT_allocated:
+ case DW_AT_associated:
+ case DW_AT_data_location:
+ case DW_AT_declaration:
+ case DW_AT_description:
+ case DW_AT_sibling:
+ case DW_AT_threads_scaled:
+ case DW_AT_type:
+ case DW_AT_visibility:
+ break;
}
- break;
+ }
}
- }
-}
-
-Type *
-DWARFASTParserClang::GetTypeForDIE (const DWARFDIE &die)
-{
- if (die)
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- if (num_attributes > 0)
- {
- DWARFFormValue type_die_form;
- for (size_t i = 0; i < num_attributes; ++i)
- {
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- if (attr == DW_AT_type && attributes.ExtractFormValueAtIndex(i, form_value))
- return dwarf->ResolveTypeUID(dwarf->GetDIE (DIERef(form_value)), true);
- }
+ if (num_elements == 0) {
+ if (upper_bound_valid && upper_bound >= lower_bound)
+ num_elements = upper_bound - lower_bound + 1;
}
- }
- return nullptr;
+ element_orders.push_back(num_elements);
+ }
+ } break;
+ }
+ }
}
-clang::Decl *
-DWARFASTParserClang::GetClangDeclForDIE (const DWARFDIE &die)
-{
- if (!die)
- return nullptr;
-
- switch (die.Tag())
- {
- case DW_TAG_variable:
- case DW_TAG_constant:
- case DW_TAG_formal_parameter:
- case DW_TAG_imported_declaration:
- case DW_TAG_imported_module:
- break;
- default:
- return nullptr;
+Type *DWARFASTParserClang::GetTypeForDIE(const DWARFDIE &die) {
+ if (die) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ if (num_attributes > 0) {
+ DWARFFormValue type_die_form;
+ for (size_t i = 0; i < num_attributes; ++i) {
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+
+ if (attr == DW_AT_type &&
+ attributes.ExtractFormValueAtIndex(i, form_value))
+ return dwarf->ResolveTypeUID(dwarf->GetDIE(DIERef(form_value)), true);
+ }
}
+ }
- DIEToDeclMap::iterator cache_pos = m_die_to_decl.find(die.GetDIE());
- if (cache_pos != m_die_to_decl.end())
- return cache_pos->second;
+ return nullptr;
+}
- if (DWARFDIE spec_die = die.GetReferencedDIE(DW_AT_specification))
- {
- clang::Decl *decl = GetClangDeclForDIE(spec_die);
- m_die_to_decl[die.GetDIE()] = decl;
- m_decl_to_die[decl].insert(die.GetDIE());
- return decl;
- }
-
- if (DWARFDIE abstract_origin_die = die.GetReferencedDIE(DW_AT_abstract_origin))
- {
- clang::Decl *decl = GetClangDeclForDIE(abstract_origin_die);
- m_die_to_decl[die.GetDIE()] = decl;
- m_decl_to_die[decl].insert(die.GetDIE());
- return decl;
- }
+clang::Decl *DWARFASTParserClang::GetClangDeclForDIE(const DWARFDIE &die) {
+ if (!die)
+ return nullptr;
- clang::Decl *decl = nullptr;
- switch (die.Tag())
- {
- case DW_TAG_variable:
- case DW_TAG_constant:
- case DW_TAG_formal_parameter:
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- Type *type = GetTypeForDIE(die);
- if (dwarf && type)
- {
- const char *name = die.GetName();
- clang::DeclContext *decl_context =
- ClangASTContext::DeclContextGetAsDeclContext(dwarf->GetDeclContextContainingUID(die.GetID()));
- decl = m_ast.CreateVariableDeclaration(decl_context, name,
- ClangUtil::GetQualType(type->GetForwardCompilerType()));
- }
- break;
- }
- case DW_TAG_imported_declaration:
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import);
- if (imported_uid)
- {
- CompilerDecl imported_decl = imported_uid.GetDecl();
- if (imported_decl)
- {
- clang::DeclContext *decl_context = ClangASTContext::DeclContextGetAsDeclContext(dwarf->GetDeclContextContainingUID(die.GetID()));
- if (clang::NamedDecl *clang_imported_decl = llvm::dyn_cast<clang::NamedDecl>((clang::Decl *)imported_decl.GetOpaqueDecl()))
- decl = m_ast.CreateUsingDeclaration(decl_context, clang_imported_decl);
- }
- }
- break;
- }
- case DW_TAG_imported_module:
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import);
+ switch (die.Tag()) {
+ case DW_TAG_variable:
+ case DW_TAG_constant:
+ case DW_TAG_formal_parameter:
+ case DW_TAG_imported_declaration:
+ case DW_TAG_imported_module:
+ break;
+ default:
+ return nullptr;
+ }
- if (imported_uid)
- {
- CompilerDeclContext imported_decl_ctx = imported_uid.GetDeclContext();
- if (imported_decl_ctx)
- {
- clang::DeclContext *decl_context = ClangASTContext::DeclContextGetAsDeclContext(dwarf->GetDeclContextContainingUID(die.GetID()));
- if (clang::NamespaceDecl *ns_decl = ClangASTContext::DeclContextGetAsNamespaceDecl(imported_decl_ctx))
- decl = m_ast.CreateUsingDirectiveDeclaration(decl_context, ns_decl);
- }
- }
- break;
- }
- default:
- break;
- }
+ DIEToDeclMap::iterator cache_pos = m_die_to_decl.find(die.GetDIE());
+ if (cache_pos != m_die_to_decl.end())
+ return cache_pos->second;
+ if (DWARFDIE spec_die = die.GetReferencedDIE(DW_AT_specification)) {
+ clang::Decl *decl = GetClangDeclForDIE(spec_die);
m_die_to_decl[die.GetDIE()] = decl;
m_decl_to_die[decl].insert(die.GetDIE());
+ return decl;
+ }
+ if (DWARFDIE abstract_origin_die =
+ die.GetReferencedDIE(DW_AT_abstract_origin)) {
+ clang::Decl *decl = GetClangDeclForDIE(abstract_origin_die);
+ m_die_to_decl[die.GetDIE()] = decl;
+ m_decl_to_die[decl].insert(die.GetDIE());
return decl;
-}
+ }
-clang::DeclContext *
-DWARFASTParserClang::GetClangDeclContextForDIE (const DWARFDIE &die)
-{
- if (die)
- {
- clang::DeclContext *decl_ctx = GetCachedClangDeclContextForDIE (die);
- if (decl_ctx)
- return decl_ctx;
-
- bool try_parsing_type = true;
- switch (die.Tag())
- {
- case DW_TAG_compile_unit:
- decl_ctx = m_ast.GetTranslationUnitDecl();
- try_parsing_type = false;
- break;
+ clang::Decl *decl = nullptr;
+ switch (die.Tag()) {
+ case DW_TAG_variable:
+ case DW_TAG_constant:
+ case DW_TAG_formal_parameter: {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ Type *type = GetTypeForDIE(die);
+ if (dwarf && type) {
+ const char *name = die.GetName();
+ clang::DeclContext *decl_context =
+ ClangASTContext::DeclContextGetAsDeclContext(
+ dwarf->GetDeclContextContainingUID(die.GetID()));
+ decl = m_ast.CreateVariableDeclaration(
+ decl_context, name,
+ ClangUtil::GetQualType(type->GetForwardCompilerType()));
+ }
+ break;
+ }
+ case DW_TAG_imported_declaration: {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import);
+ if (imported_uid) {
+ CompilerDecl imported_decl = imported_uid.GetDecl();
+ if (imported_decl) {
+ clang::DeclContext *decl_context =
+ ClangASTContext::DeclContextGetAsDeclContext(
+ dwarf->GetDeclContextContainingUID(die.GetID()));
+ if (clang::NamedDecl *clang_imported_decl =
+ llvm::dyn_cast<clang::NamedDecl>(
+ (clang::Decl *)imported_decl.GetOpaqueDecl()))
+ decl =
+ m_ast.CreateUsingDeclaration(decl_context, clang_imported_decl);
+ }
+ }
+ break;
+ }
+ case DW_TAG_imported_module: {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import);
+
+ if (imported_uid) {
+ CompilerDeclContext imported_decl_ctx = imported_uid.GetDeclContext();
+ if (imported_decl_ctx) {
+ clang::DeclContext *decl_context =
+ ClangASTContext::DeclContextGetAsDeclContext(
+ dwarf->GetDeclContextContainingUID(die.GetID()));
+ if (clang::NamespaceDecl *ns_decl =
+ ClangASTContext::DeclContextGetAsNamespaceDecl(
+ imported_decl_ctx))
+ decl = m_ast.CreateUsingDirectiveDeclaration(decl_context, ns_decl);
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
- case DW_TAG_namespace:
- decl_ctx = ResolveNamespaceDIE (die);
- try_parsing_type = false;
- break;
+ m_die_to_decl[die.GetDIE()] = decl;
+ m_decl_to_die[decl].insert(die.GetDIE());
- case DW_TAG_lexical_block:
- decl_ctx = (clang::DeclContext *)ResolveBlockDIE(die);
- try_parsing_type = false;
- break;
+ return decl;
+}
- default:
- break;
- }
+clang::DeclContext *
+DWARFASTParserClang::GetClangDeclContextForDIE(const DWARFDIE &die) {
+ if (die) {
+ clang::DeclContext *decl_ctx = GetCachedClangDeclContextForDIE(die);
+ if (decl_ctx)
+ return decl_ctx;
+
+ bool try_parsing_type = true;
+ switch (die.Tag()) {
+ case DW_TAG_compile_unit:
+ decl_ctx = m_ast.GetTranslationUnitDecl();
+ try_parsing_type = false;
+ break;
+
+ case DW_TAG_namespace:
+ decl_ctx = ResolveNamespaceDIE(die);
+ try_parsing_type = false;
+ break;
+
+ case DW_TAG_lexical_block:
+ decl_ctx = (clang::DeclContext *)ResolveBlockDIE(die);
+ try_parsing_type = false;
+ break;
+
+ default:
+ break;
+ }
- if (decl_ctx == nullptr && try_parsing_type)
- {
- Type* type = die.GetDWARF()->ResolveType (die);
- if (type)
- decl_ctx = GetCachedClangDeclContextForDIE (die);
- }
+ if (decl_ctx == nullptr && try_parsing_type) {
+ Type *type = die.GetDWARF()->ResolveType(die);
+ if (type)
+ decl_ctx = GetCachedClangDeclContextForDIE(die);
+ }
- if (decl_ctx)
- {
- LinkDeclContextToDIE (decl_ctx, die);
- return decl_ctx;
- }
+ if (decl_ctx) {
+ LinkDeclContextToDIE(decl_ctx, die);
+ return decl_ctx;
}
- return nullptr;
+ }
+ return nullptr;
}
-clang::BlockDecl *
-DWARFASTParserClang::ResolveBlockDIE (const DWARFDIE &die)
-{
- if (die && die.Tag() == DW_TAG_lexical_block)
- {
- clang::BlockDecl *decl = llvm::cast_or_null<clang::BlockDecl>(m_die_to_decl_ctx[die.GetDIE()]);
-
- if (!decl)
- {
- DWARFDIE decl_context_die;
- clang::DeclContext *decl_context = GetClangDeclContextContainingDIE(die, &decl_context_die);
- decl = m_ast.CreateBlockDeclaration(decl_context);
+clang::BlockDecl *DWARFASTParserClang::ResolveBlockDIE(const DWARFDIE &die) {
+ if (die && die.Tag() == DW_TAG_lexical_block) {
+ clang::BlockDecl *decl =
+ llvm::cast_or_null<clang::BlockDecl>(m_die_to_decl_ctx[die.GetDIE()]);
- if (decl)
- LinkDeclContextToDIE((clang::DeclContext *)decl, die);
- }
+ if (!decl) {
+ DWARFDIE decl_context_die;
+ clang::DeclContext *decl_context =
+ GetClangDeclContextContainingDIE(die, &decl_context_die);
+ decl = m_ast.CreateBlockDeclaration(decl_context);
- return decl;
+ if (decl)
+ LinkDeclContextToDIE((clang::DeclContext *)decl, die);
}
- return nullptr;
+
+ return decl;
+ }
+ return nullptr;
}
clang::NamespaceDecl *
-DWARFASTParserClang::ResolveNamespaceDIE (const DWARFDIE &die)
-{
- 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.GetDIE()]);
- if (namespace_decl)
- return namespace_decl;
- else
- {
- const char *namespace_name = die.GetName();
- clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (die, nullptr);
- namespace_decl = m_ast.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*>(m_ast.getASTContext()),
- die.GetID(),
- namespace_name,
- static_cast<void*>(namespace_decl),
- static_cast<void*>(namespace_decl->getOriginalNamespace()));
- }
- else
- {
- dwarf->GetObjectFile()->GetModule()->LogMessage (log,
- "ASTContext => %p: 0x%8.8" PRIx64 ": DW_TAG_namespace (anonymous) => clang::NamespaceDecl *%p (original = %p)",
- static_cast<void*>(m_ast.getASTContext()),
- die.GetID(),
- static_cast<void*>(namespace_decl),
- static_cast<void*>(namespace_decl->getOriginalNamespace()));
- }
- }
-
- if (namespace_decl)
- LinkDeclContextToDIE((clang::DeclContext*)namespace_decl, die);
- return namespace_decl;
+DWARFASTParserClang::ResolveNamespaceDIE(const DWARFDIE &die) {
+ 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.GetDIE()]);
+ if (namespace_decl)
+ return namespace_decl;
+ else {
+ const char *namespace_name = die.GetName();
+ clang::DeclContext *containing_decl_ctx =
+ GetClangDeclContextContainingDIE(die, nullptr);
+ namespace_decl = m_ast.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 *>(m_ast.getASTContext()), die.GetID(),
+ namespace_name, static_cast<void *>(namespace_decl),
+ static_cast<void *>(namespace_decl->getOriginalNamespace()));
+ } else {
+ dwarf->GetObjectFile()->GetModule()->LogMessage(
+ log, "ASTContext => %p: 0x%8.8" PRIx64
+ ": DW_TAG_namespace (anonymous) => clang::NamespaceDecl *%p "
+ "(original = %p)",
+ static_cast<void *>(m_ast.getASTContext()), die.GetID(),
+ static_cast<void *>(namespace_decl),
+ static_cast<void *>(namespace_decl->getOriginalNamespace()));
}
+ }
+
+ if (namespace_decl)
+ LinkDeclContextToDIE((clang::DeclContext *)namespace_decl, die);
+ return namespace_decl;
}
- return nullptr;
+ }
+ return nullptr;
}
-clang::DeclContext *
-DWARFASTParserClang::GetClangDeclContextContainingDIE (const DWARFDIE &die,
- DWARFDIE *decl_ctx_die_copy)
-{
- SymbolFileDWARF *dwarf = die.GetDWARF();
+clang::DeclContext *DWARFASTParserClang::GetClangDeclContextContainingDIE(
+ const DWARFDIE &die, DWARFDIE *decl_ctx_die_copy) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
- DWARFDIE decl_ctx_die = dwarf->GetDeclContextDIEContainingDIE (die);
+ DWARFDIE decl_ctx_die = dwarf->GetDeclContextDIEContainingDIE(die);
- if (decl_ctx_die_copy)
- *decl_ctx_die_copy = decl_ctx_die;
+ if (decl_ctx_die_copy)
+ *decl_ctx_die_copy = decl_ctx_die;
- if (decl_ctx_die)
- {
- clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE (decl_ctx_die);
- if (clang_decl_ctx)
- return clang_decl_ctx;
- }
- return m_ast.GetTranslationUnitDecl();
+ if (decl_ctx_die) {
+ clang::DeclContext *clang_decl_ctx =
+ GetClangDeclContextForDIE(decl_ctx_die);
+ if (clang_decl_ctx)
+ return clang_decl_ctx;
+ }
+ return m_ast.GetTranslationUnitDecl();
}
clang::DeclContext *
-DWARFASTParserClang::GetCachedClangDeclContextForDIE (const DWARFDIE &die)
-{
- if (die)
- {
- DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find(die.GetDIE());
- if (pos != m_die_to_decl_ctx.end())
- return pos->second;
- }
- return nullptr;
+DWARFASTParserClang::GetCachedClangDeclContextForDIE(const DWARFDIE &die) {
+ if (die) {
+ DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find(die.GetDIE());
+ if (pos != m_die_to_decl_ctx.end())
+ return pos->second;
+ }
+ return nullptr;
}
-void
-DWARFASTParserClang::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());
- m_decl_ctx_to_die.insert(std::make_pair(decl_ctx, die));
+void DWARFASTParserClang::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());
+ m_decl_ctx_to_die.insert(std::make_pair(decl_ctx, die));
}
-bool
-DWARFASTParserClang::CopyUniqueClassMethodTypes (const DWARFDIE &src_class_die,
- const DWARFDIE &dst_class_die,
- lldb_private::Type *class_type,
- DWARFDIECollection &failures)
-{
- if (!class_type || !src_class_die || !dst_class_die)
- return false;
- if (src_class_die.Tag() != dst_class_die.Tag())
- return false;
+bool DWARFASTParserClang::CopyUniqueClassMethodTypes(
+ const DWARFDIE &src_class_die, const DWARFDIE &dst_class_die,
+ lldb_private::Type *class_type, DWARFDIECollection &failures) {
+ if (!class_type || !src_class_die || !dst_class_die)
+ return false;
+ 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
- // parsed so we can then unique those types to their equivalent counterparts
- // in "dst_cu" and "dst_class_die"
- class_type->GetFullCompilerType ();
-
- 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)
- {
- // 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(DW_AT_declaration, 0) == 1)
- {
- const char *src_name = src_die.GetMangledName ();
- if (src_name)
- {
- ConstString src_const_name(src_name);
- 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);
- }
- }
+ // We need to complete the class type so we can get all of the method types
+ // parsed so we can then unique those types to their equivalent counterparts
+ // in "dst_cu" and "dst_class_die"
+ class_type->GetFullCompilerType();
+
+ 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) {
+ // 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(DW_AT_declaration, 0) == 1) {
+ const char *src_name = src_die.GetMangledName();
+ if (src_name) {
+ ConstString src_const_name(src_name);
+ 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);
}
+ }
}
- for (dst_die = dst_class_die.GetFirstChild(); dst_die.IsValid(); dst_die = dst_die.GetSibling())
- {
- 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(DW_AT_declaration, 0) == 1)
- {
- const char *dst_name = dst_die.GetMangledName ();
- if (dst_name)
- {
- ConstString dst_const_name(dst_name);
- 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);
- }
- }
+ }
+ for (dst_die = dst_class_die.GetFirstChild(); dst_die.IsValid();
+ dst_die = dst_die.GetSibling()) {
+ 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(DW_AT_declaration, 0) == 1) {
+ const char *dst_name = dst_die.GetMangledName();
+ if (dst_name) {
+ ConstString dst_const_name(dst_name);
+ 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);
}
+ }
}
- const uint32_t src_size = src_name_to_die.GetSize ();
- const uint32_t dst_size = dst_name_to_die.GetSize ();
- Log *log = nullptr; // (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO | DWARF_LOG_TYPE_COMPLETION));
-
- // Is everything kosher so we can go through the members at top speed?
- bool fast_path = true;
-
- if (src_size != dst_size)
- {
- if (src_size != 0 && dst_size != 0)
- {
- 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_size,
- dst_size);
- }
-
- fast_path = false;
+ }
+ const uint32_t src_size = src_name_to_die.GetSize();
+ const uint32_t dst_size = dst_name_to_die.GetSize();
+ Log *log = nullptr; // (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO |
+ // DWARF_LOG_TYPE_COMPLETION));
+
+ // Is everything kosher so we can go through the members at top speed?
+ bool fast_path = true;
+
+ if (src_size != dst_size) {
+ if (src_size != 0 && dst_size != 0) {
+ 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_size, dst_size);
}
- uint32_t idx;
+ fast_path = false;
+ }
- if (fast_path)
- {
- for (idx = 0; idx < src_size; ++idx)
- {
- src_die = src_name_to_die.GetValueAtIndexUnchecked (idx);
- dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx);
+ uint32_t idx;
- 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(),
- src_die.GetTagAsCString(),
- dst_die.GetOffset(),
- dst_die.GetTagAsCString());
- fast_path = false;
- }
+ if (fast_path) {
+ for (idx = 0; idx < src_size; ++idx) {
+ src_die = src_name_to_die.GetValueAtIndexUnchecked(idx);
+ dst_die = dst_name_to_die.GetValueAtIndexUnchecked(idx);
- const char *src_name = src_die.GetMangledName ();
- const char *dst_name = dst_die.GetMangledName ();
+ 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(), src_die.GetTagAsCString(),
+ dst_die.GetOffset(), dst_die.GetTagAsCString());
+ fast_path = false;
+ }
- // Make sure the names match
- if (src_name == dst_name || (strcmp (src_name, dst_name) == 0))
- continue;
+ const char *src_name = src_die.GetMangledName();
+ const char *dst_name = dst_die.GetMangledName();
- 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_name,
- dst_die.GetOffset(),
- dst_name);
-
- fast_path = false;
- }
- }
+ // Make sure the names match
+ if (src_name == dst_name || (strcmp(src_name, dst_name) == 0))
+ continue;
- DWARFASTParserClang *src_dwarf_ast_parser = (DWARFASTParserClang *)src_die.GetDWARFParser();
- DWARFASTParserClang *dst_dwarf_ast_parser = (DWARFASTParserClang *)dst_die.GetDWARFParser();
+ 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_name, dst_die.GetOffset(),
+ dst_name);
- // Now do the work of linking the DeclContexts and Types.
- if (fast_path)
- {
- // We can do this quickly. Just run across the tables index-for-index since
- // we know each node has matching names and tags.
- for (idx = 0; idx < src_size; ++idx)
- {
- src_die = src_name_to_die.GetValueAtIndexUnchecked (idx);
- dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx);
-
- clang::DeclContext *src_decl_ctx = src_dwarf_ast_parser->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_dwarf_ast_parser->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());
- }
-
- Type *src_child_type = dst_die.GetDWARF()->GetDIEToType()[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_die.GetDWARF()->GetDIEToType()[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());
- }
- }
+ fast_path = false;
}
- else
- {
- // We must do this slowly. For each member of the destination, look
- // up a member in the source with the same name, check its tag, and
- // unique them if everything matches up. Report failures.
-
- if (!src_name_to_die.IsEmpty() && !dst_name_to_die.IsEmpty())
- {
- src_name_to_die.Sort();
-
- for (idx = 0; idx < dst_size; ++idx)
- {
- 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, DWARFDIE());
-
- if (src_die && (src_die.Tag() == dst_die.Tag()))
- {
- clang::DeclContext *src_decl_ctx = src_dwarf_ast_parser->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_dwarf_ast_parser->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());
- }
-
- Type *src_child_type = dst_die.GetDWARF()->GetDIEToType()[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_die.GetDWARF()->GetDIEToType()[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());
- }
- }
- else
- {
- if (log)
- log->Printf ("warning: couldn't find a match for 0x%8.8x", dst_die.GetOffset());
-
- failures.Append(dst_die);
- }
- }
- }
+ }
+
+ DWARFASTParserClang *src_dwarf_ast_parser =
+ (DWARFASTParserClang *)src_die.GetDWARFParser();
+ DWARFASTParserClang *dst_dwarf_ast_parser =
+ (DWARFASTParserClang *)dst_die.GetDWARFParser();
+
+ // Now do the work of linking the DeclContexts and Types.
+ if (fast_path) {
+ // We can do this quickly. Just run across the tables index-for-index since
+ // we know each node has matching names and tags.
+ for (idx = 0; idx < src_size; ++idx) {
+ src_die = src_name_to_die.GetValueAtIndexUnchecked(idx);
+ dst_die = dst_name_to_die.GetValueAtIndexUnchecked(idx);
+
+ clang::DeclContext *src_decl_ctx =
+ src_dwarf_ast_parser->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_dwarf_ast_parser->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());
+ }
+
+ Type *src_child_type =
+ dst_die.GetDWARF()->GetDIEToType()[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_die.GetDWARF()->GetDIEToType()[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());
+ }
}
-
- const uint32_t src_size_artificial = src_name_to_die_artificial.GetSize ();
- const uint32_t dst_size_artificial = dst_name_to_die_artificial.GetSize ();
-
- if (src_size_artificial && dst_size_artificial)
- {
- dst_name_to_die_artificial.Sort();
-
- for (idx = 0; idx < src_size_artificial; ++idx)
- {
- 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, DWARFDIE());
-
- if (dst_die)
- {
- // Both classes have the artificial types, link them
- clang::DeclContext *src_decl_ctx = src_dwarf_ast_parser->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_dwarf_ast_parser->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());
- }
-
- Type *src_child_type = dst_die.GetDWARF()->GetDIEToType()[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_die.GetDWARF()->GetDIEToType()[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());
- }
- }
+ } else {
+ // We must do this slowly. For each member of the destination, look
+ // up a member in the source with the same name, check its tag, and
+ // unique them if everything matches up. Report failures.
+
+ if (!src_name_to_die.IsEmpty() && !dst_name_to_die.IsEmpty()) {
+ src_name_to_die.Sort();
+
+ for (idx = 0; idx < dst_size; ++idx) {
+ 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, DWARFDIE());
+
+ if (src_die && (src_die.Tag() == dst_die.Tag())) {
+ clang::DeclContext *src_decl_ctx =
+ src_dwarf_ast_parser->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_dwarf_ast_parser->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());
+ }
+
+ Type *src_child_type =
+ dst_die.GetDWARF()->GetDIEToType()[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_die.GetDWARF()->GetDIEToType()[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());
+ }
+ } else {
+ if (log)
+ log->Printf("warning: couldn't find a match for 0x%8.8x",
+ dst_die.GetOffset());
+
+ failures.Append(dst_die);
}
+ }
}
+ }
+
+ const uint32_t src_size_artificial = src_name_to_die_artificial.GetSize();
+ const uint32_t dst_size_artificial = dst_name_to_die_artificial.GetSize();
+
+ if (src_size_artificial && dst_size_artificial) {
+ dst_name_to_die_artificial.Sort();
+
+ for (idx = 0; idx < src_size_artificial; ++idx) {
+ 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, DWARFDIE());
+
+ if (dst_die) {
+ // Both classes have the artificial types, link them
+ clang::DeclContext *src_decl_ctx =
+ src_dwarf_ast_parser->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_dwarf_ast_parser->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());
+ }
- if (dst_size_artificial)
- {
- for (idx = 0; idx < dst_size_artificial; ++idx)
- {
- 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);
-
- failures.Append(dst_die);
+ Type *src_child_type =
+ dst_die.GetDWARF()->GetDIEToType()[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_die.GetDWARF()->GetDIEToType()[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());
}
+ }
}
+ }
+
+ if (dst_size_artificial) {
+ for (idx = 0; idx < dst_size_artificial; ++idx) {
+ 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);
+
+ failures.Append(dst_die);
+ }
+ }
- return (failures.Size() != 0);
+ return (failures.Size() != 0);
}
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
index 0826423b035..3d6d08eef9e 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
@@ -13,10 +13,10 @@
// C Includes
// C++ Includes
// Other libraries and framework includes
+#include "clang/AST/CharUnits.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
-#include "clang/AST/CharUnits.h"
// Project includes
#include "DWARFASTParser.h"
@@ -29,149 +29,131 @@
class DWARFDebugInfoEntry;
class DWARFDIECollection;
-class DWARFASTParserClang : public DWARFASTParser
-{
+class DWARFASTParserClang : public DWARFASTParser {
public:
- DWARFASTParserClang (lldb_private::ClangASTContext &ast);
-
- ~DWARFASTParserClang() override;
+ DWARFASTParserClang(lldb_private::ClangASTContext &ast);
- // DWARFASTParser interface.
- lldb::TypeSP
- ParseTypeFromDWARF (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die,
- lldb_private::Log *log,
- bool *type_is_new_ptr) override;
+ ~DWARFASTParserClang() override;
+ // DWARFASTParser interface.
+ lldb::TypeSP ParseTypeFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die, lldb_private::Log *log,
+ bool *type_is_new_ptr) override;
- lldb_private::Function *
- ParseFunctionFromDWARF (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die) override;
+ lldb_private::Function *
+ ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die) override;
- bool
- CompleteTypeFromDWARF (const DWARFDIE &die,
- lldb_private::Type *type,
- lldb_private::CompilerType &compiler_type) override;
+ bool
+ CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
+ lldb_private::CompilerType &compiler_type) override;
- lldb_private::CompilerDecl
- GetDeclForUIDFromDWARF (const DWARFDIE &die) override;
+ lldb_private::CompilerDecl
+ GetDeclForUIDFromDWARF(const DWARFDIE &die) override;
- std::vector<DWARFDIE>
- GetDIEForDeclContext (lldb_private::CompilerDeclContext decl_context) override;
+ std::vector<DWARFDIE>
+ GetDIEForDeclContext(lldb_private::CompilerDeclContext decl_context) override;
- lldb_private::CompilerDeclContext
- GetDeclContextForUIDFromDWARF (const DWARFDIE &die) override;
+ lldb_private::CompilerDeclContext
+ GetDeclContextForUIDFromDWARF(const DWARFDIE &die) override;
- lldb_private::CompilerDeclContext
- GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die) override;
+ lldb_private::CompilerDeclContext
+ GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) override;
- lldb_private::ClangASTImporter &
- GetClangASTImporter();
+ lldb_private::ClangASTImporter &GetClangASTImporter();
protected:
- class DelayedAddObjCClassProperty;
- typedef std::vector <DelayedAddObjCClassProperty> DelayedPropertyList;
-
- clang::BlockDecl *
- ResolveBlockDIE (const DWARFDIE &die);
-
- clang::NamespaceDecl *
- ResolveNamespaceDIE (const DWARFDIE &die);
-
- bool
- ParseTemplateDIE (const DWARFDIE &die,
- lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
- bool
- ParseTemplateParameterInfos (const DWARFDIE &parent_die,
- lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
-
- bool
- ParseChildMembers(const lldb_private::SymbolContext &sc, const DWARFDIE &die,
- lldb_private::CompilerType &class_compiler_type, const lldb::LanguageType class_language,
- std::vector<clang::CXXBaseSpecifier *> &base_classes, std::vector<int> &member_accessibilities,
- DWARFDIECollection &member_function_dies, DelayedPropertyList &delayed_properties,
- lldb::AccessType &default_accessibility, bool &is_a_class,
- lldb_private::ClangASTImporter::LayoutInfo &layout_info);
-
- size_t
- ParseChildParameters (const lldb_private::SymbolContext& sc,
- clang::DeclContext *containing_decl_ctx,
- const DWARFDIE &parent_die,
- bool skip_artificial,
- bool &is_static,
- bool &is_variadic,
- bool &has_template_params,
- std::vector<lldb_private::CompilerType>& function_args,
- std::vector<clang::ParmVarDecl*>& function_param_decls,
- unsigned &type_quals);
-
- void
- ParseChildArrayInfo (const lldb_private::SymbolContext& sc,
- const DWARFDIE &parent_die,
- int64_t& first_index,
- std::vector<uint64_t>& element_orders,
- uint32_t& byte_stride,
- uint32_t& bit_stride);
-
- size_t
- ParseChildEnumerators (const lldb_private::SymbolContext& sc,
- lldb_private::CompilerType &compiler_type,
- bool is_signed,
- uint32_t enumerator_byte_size,
- const DWARFDIE &parent_die);
-
- lldb_private::Type *
- GetTypeForDIE (const DWARFDIE &die);
-
- clang::Decl *
- GetClangDeclForDIE (const DWARFDIE &die);
-
- clang::DeclContext *
- GetClangDeclContextForDIE (const DWARFDIE &die);
-
- clang::DeclContext *
- GetClangDeclContextContainingDIE (const DWARFDIE &die,
- DWARFDIE *decl_ctx_die);
-
- bool
- CopyUniqueClassMethodTypes (const DWARFDIE &src_class_die,
- const DWARFDIE &dst_class_die,
- lldb_private::Type *class_type,
- DWARFDIECollection &failures);
-
- clang::DeclContext *
- GetCachedClangDeclContextForDIE (const DWARFDIE &die);
-
- void
- LinkDeclContextToDIE (clang::DeclContext *decl_ctx,
- const DWARFDIE &die);
-
- void
- LinkDeclToDIE (clang::Decl *decl, const DWARFDIE &die);
-
- lldb::TypeSP
- ParseTypeFromDWO (const DWARFDIE &die, lldb_private::Log *log);
-
- //----------------------------------------------------------------------
- // Return true if this type is a declaration to a type in an external
- // module.
- //----------------------------------------------------------------------
- lldb::ModuleSP
- GetModuleForType (const DWARFDIE &die);
-
- typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet;
- typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap;
- //typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet> DeclContextToDIEMap;
- typedef std::multimap<const clang::DeclContext *, const DWARFDIE> DeclContextToDIEMap;
- typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::Decl *> DIEToDeclMap;
- typedef llvm::DenseMap<const clang::Decl *, DIEPointerSet> DeclToDIEMap;
-
- lldb_private::ClangASTContext &m_ast;
- DIEToDeclMap m_die_to_decl;
- DeclToDIEMap m_decl_to_die;
- DIEToDeclContextMap m_die_to_decl_ctx;
- DeclContextToDIEMap m_decl_ctx_to_die;
- std::unique_ptr<lldb_private::ClangASTImporter> m_clang_ast_importer_ap;
+ class DelayedAddObjCClassProperty;
+ typedef std::vector<DelayedAddObjCClassProperty> DelayedPropertyList;
+
+ clang::BlockDecl *ResolveBlockDIE(const DWARFDIE &die);
+
+ clang::NamespaceDecl *ResolveNamespaceDIE(const DWARFDIE &die);
+
+ bool ParseTemplateDIE(const DWARFDIE &die,
+ lldb_private::ClangASTContext::TemplateParameterInfos
+ &template_param_infos);
+ bool ParseTemplateParameterInfos(
+ const DWARFDIE &parent_die,
+ lldb_private::ClangASTContext::TemplateParameterInfos
+ &template_param_infos);
+
+ bool
+ ParseChildMembers(const lldb_private::SymbolContext &sc, const DWARFDIE &die,
+ lldb_private::CompilerType &class_compiler_type,
+ const lldb::LanguageType class_language,
+ std::vector<clang::CXXBaseSpecifier *> &base_classes,
+ std::vector<int> &member_accessibilities,
+ DWARFDIECollection &member_function_dies,
+ DelayedPropertyList &delayed_properties,
+ lldb::AccessType &default_accessibility, bool &is_a_class,
+ lldb_private::ClangASTImporter::LayoutInfo &layout_info);
+
+ size_t
+ ParseChildParameters(const lldb_private::SymbolContext &sc,
+ clang::DeclContext *containing_decl_ctx,
+ const DWARFDIE &parent_die, bool skip_artificial,
+ bool &is_static, bool &is_variadic,
+ bool &has_template_params,
+ std::vector<lldb_private::CompilerType> &function_args,
+ std::vector<clang::ParmVarDecl *> &function_param_decls,
+ unsigned &type_quals);
+
+ void ParseChildArrayInfo(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &parent_die, int64_t &first_index,
+ std::vector<uint64_t> &element_orders,
+ uint32_t &byte_stride, uint32_t &bit_stride);
+
+ size_t ParseChildEnumerators(const lldb_private::SymbolContext &sc,
+ lldb_private::CompilerType &compiler_type,
+ bool is_signed, uint32_t enumerator_byte_size,
+ const DWARFDIE &parent_die);
+
+ lldb_private::Type *GetTypeForDIE(const DWARFDIE &die);
+
+ clang::Decl *GetClangDeclForDIE(const DWARFDIE &die);
+
+ clang::DeclContext *GetClangDeclContextForDIE(const DWARFDIE &die);
+
+ clang::DeclContext *GetClangDeclContextContainingDIE(const DWARFDIE &die,
+ DWARFDIE *decl_ctx_die);
+
+ bool CopyUniqueClassMethodTypes(const DWARFDIE &src_class_die,
+ const DWARFDIE &dst_class_die,
+ lldb_private::Type *class_type,
+ DWARFDIECollection &failures);
+
+ clang::DeclContext *GetCachedClangDeclContextForDIE(const DWARFDIE &die);
+
+ void LinkDeclContextToDIE(clang::DeclContext *decl_ctx, const DWARFDIE &die);
+
+ void LinkDeclToDIE(clang::Decl *decl, const DWARFDIE &die);
+
+ lldb::TypeSP ParseTypeFromDWO(const DWARFDIE &die, lldb_private::Log *log);
+
+ //----------------------------------------------------------------------
+ // Return true if this type is a declaration to a type in an external
+ // module.
+ //----------------------------------------------------------------------
+ lldb::ModuleSP GetModuleForType(const DWARFDIE &die);
+
+ typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet;
+ typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *>
+ DIEToDeclContextMap;
+ // typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet>
+ // DeclContextToDIEMap;
+ typedef std::multimap<const clang::DeclContext *, const DWARFDIE>
+ DeclContextToDIEMap;
+ typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::Decl *>
+ DIEToDeclMap;
+ typedef llvm::DenseMap<const clang::Decl *, DIEPointerSet> DeclToDIEMap;
+
+ lldb_private::ClangASTContext &m_ast;
+ DIEToDeclMap m_die_to_decl;
+ DeclToDIEMap m_decl_to_die;
+ DIEToDeclContextMap m_die_to_decl_ctx;
+ DeclContextToDIEMap m_decl_ctx_to_die;
+ std::unique_ptr<lldb_private::ClangASTImporter> m_clang_ast_importer_ap;
};
#endif // SymbolFileDWARF_DWARFASTParserClang_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp
index 346e2d63b90..2507465750c 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp
@@ -11,11 +11,11 @@
#include "DWARFASTParserGo.h"
#include "DWARFCompileUnit.h"
+#include "DWARFDIE.h"
+#include "DWARFDIECollection.h"
#include "DWARFDebugInfo.h"
#include "DWARFDeclContext.h"
#include "DWARFDefines.h"
-#include "DWARFDIE.h"
-#include "DWARFDIECollection.h"
#include "SymbolFileDWARF.h"
#include "SymbolFileDWARFDebugMap.h"
#include "UniqueDWARFASTType.h"
@@ -44,787 +44,732 @@
using namespace lldb;
using namespace lldb_private;
-DWARFASTParserGo::DWARFASTParserGo(GoASTContext &ast)
- : m_ast(ast)
-{
-}
+DWARFASTParserGo::DWARFASTParserGo(GoASTContext &ast) : m_ast(ast) {}
-DWARFASTParserGo::~DWARFASTParserGo()
-{
-}
+DWARFASTParserGo::~DWARFASTParserGo() {}
-TypeSP
-DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, const DWARFDIE &die, lldb_private::Log *log,
- bool *type_is_new_ptr)
-{
- TypeSP type_sp;
+TypeSP DWARFASTParserGo::ParseTypeFromDWARF(
+ const lldb_private::SymbolContext &sc, const DWARFDIE &die,
+ lldb_private::Log *log, bool *type_is_new_ptr) {
+ TypeSP type_sp;
- if (type_is_new_ptr)
- *type_is_new_ptr = false;
+ if (type_is_new_ptr)
+ *type_is_new_ptr = false;
- if (die)
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- if (log)
- {
- dwarf->GetObjectFile()->GetModule()->LogMessage(
- log, "DWARFASTParserGo::ParseTypeFromDWARF (die = 0x%8.8x) %s name = '%s')", die.GetOffset(),
- DW_TAG_value_to_name(die.Tag()), die.GetName());
- }
+ if (die) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ if (log) {
+ dwarf->GetObjectFile()->GetModule()->LogMessage(
+ log, "DWARFASTParserGo::ParseTypeFromDWARF (die = 0x%8.8x) %s name = "
+ "'%s')",
+ die.GetOffset(), DW_TAG_value_to_name(die.Tag()), die.GetName());
+ }
- 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();
-
- bool is_forward_declaration = false;
- DWARFAttributes attributes;
- const char *type_name_cstr = NULL;
- ConstString type_name_const_str;
- Type::ResolveState resolve_state = Type::eResolveStateUnresolved;
- uint64_t byte_size = 0;
- uint64_t go_kind = 0;
- Declaration decl;
-
- Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID;
- CompilerType compiler_type;
- DWARFFormValue form_value;
-
- dw_attr_t attr;
-
- switch (tag)
- {
- case DW_TAG_base_type:
- case DW_TAG_pointer_type:
- case DW_TAG_typedef:
- case DW_TAG_unspecified_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- const size_t num_attributes = die.GetAttributes(attributes);
- lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
-
- if (num_attributes > 0)
- {
- uint32_t i;
- for (i = 0; i < num_attributes; ++i)
- {
- attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- type_name_cstr = form_value.AsCString();
- if (type_name_cstr)
- type_name_const_str.SetCString(type_name_cstr);
- break;
- case DW_AT_byte_size:
- byte_size = form_value.Unsigned();
- break;
- case DW_AT_encoding:
- // = form_value.Unsigned();
- break;
- case DW_AT_type:
- encoding_uid = form_value.Reference();
- break;
- case DW_AT_go_kind:
- go_kind = form_value.Unsigned();
- break;
- default:
- // Do we care about DW_AT_go_key or DW_AT_go_elem?
- break;
- }
- }
- }
- }
-
- 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)
- {
- default:
- break;
-
- case DW_TAG_unspecified_type:
- resolve_state = Type::eResolveStateFull;
- compiler_type = m_ast.CreateVoidType(type_name_const_str);
- break;
-
- case DW_TAG_base_type:
- resolve_state = Type::eResolveStateFull;
- compiler_type = m_ast.CreateBaseType(go_kind, type_name_const_str, byte_size);
- break;
-
- case DW_TAG_pointer_type:
- encoding_data_type = Type::eEncodingIsPointerUID;
- break;
- case DW_TAG_typedef:
- encoding_data_type = Type::eEncodingIsTypedefUID;
- CompilerType impl;
- Type *type = dwarf->ResolveTypeUID(encoding_uid);
- if (type)
- {
- if (go_kind == 0 && type->GetName() == type_name_const_str)
- {
- // Go emits extra typedefs as a forward declaration. Ignore these.
- dwarf->m_die_to_type[die.GetDIE()] = type;
- return type->shared_from_this();
- }
- impl = type->GetForwardCompilerType();
- compiler_type = m_ast.CreateTypedefType (go_kind, type_name_const_str, impl);
- }
- break;
- }
-
- type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_size,
- NULL, encoding_uid, encoding_data_type, &decl, compiler_type, resolve_state));
-
- dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
- }
+ 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();
+
+ bool is_forward_declaration = false;
+ DWARFAttributes attributes;
+ const char *type_name_cstr = NULL;
+ ConstString type_name_const_str;
+ Type::ResolveState resolve_state = Type::eResolveStateUnresolved;
+ uint64_t byte_size = 0;
+ uint64_t go_kind = 0;
+ Declaration decl;
+
+ Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID;
+ CompilerType compiler_type;
+ DWARFFormValue form_value;
+
+ dw_attr_t attr;
+
+ switch (tag) {
+ case DW_TAG_base_type:
+ case DW_TAG_pointer_type:
+ case DW_TAG_typedef:
+ case DW_TAG_unspecified_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ const size_t num_attributes = die.GetAttributes(attributes);
+ lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
+
+ if (num_attributes > 0) {
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ attr = attributes.AttributeAtIndex(i);
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ type_name_cstr = form_value.AsCString();
+ if (type_name_cstr)
+ type_name_const_str.SetCString(type_name_cstr);
+ break;
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
break;
+ case DW_AT_encoding:
+ // = form_value.Unsigned();
+ break;
+ case DW_AT_type:
+ encoding_uid = form_value.Reference();
+ break;
+ case DW_AT_go_kind:
+ go_kind = form_value.Unsigned();
+ break;
+ default:
+ // Do we care about DW_AT_go_key or DW_AT_go_elem?
+ break;
+ }
+ }
+ }
+ }
- case DW_TAG_structure_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
- bool byte_size_valid = false;
-
- 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(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- type_name_cstr = form_value.AsCString();
- type_name_const_str.SetCString(type_name_cstr);
- break;
-
- case DW_AT_byte_size:
- byte_size = form_value.Unsigned();
- byte_size_valid = true;
- break;
-
- case DW_AT_go_kind:
- go_kind = form_value.Unsigned();
- break;
-
- // TODO: Should we use SLICETYPE's DW_AT_go_elem?
- default:
- break;
- }
- }
- }
- }
-
- // TODO(ribrdb): Do we need this?
-
- // UniqueDWARFASTType is large, so don't create a local variables on the
- // stack, put it on the heap. This function is often called recursively
- // and clang isn't good and sharing the stack space for variables in different blocks.
- std::unique_ptr<UniqueDWARFASTType> unique_ast_entry_ap(new UniqueDWARFASTType());
-
- // Only try and unique the type if it has a name.
- if (type_name_const_str &&
- dwarf->GetUniqueDWARFASTTypeMap().Find(type_name_const_str, die, decl,
- byte_size_valid ? byte_size : -1, *unique_ast_entry_ap))
- {
- // We have already parsed this type or from another
- // compile unit. GCC loves to use the "one definition
- // rule" which can result in multiple definitions
- // of the same class over and over in each compile
- // unit.
- type_sp = unique_ast_entry_ap->m_type_sp;
- if (type_sp)
- {
- dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
- return type_sp;
- }
- }
-
- DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
- DW_TAG_value_to_name(tag), type_name_cstr);
-
- bool compiler_type_was_created = false;
- compiler_type.SetCompilerType(&m_ast, dwarf->m_forward_decl_die_to_clang_type.lookup(die.GetDIE()));
- if (!compiler_type)
- {
- compiler_type_was_created = true;
- compiler_type = m_ast.CreateStructType(go_kind, type_name_const_str, byte_size);
- }
-
- type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_size,
- NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type,
- Type::eResolveStateForward));
-
- // Add our type to the unique type map so we don't
- // 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_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)
- {
- // Always start the definition for a class type so that
- // 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)
- {
- // No children for this struct/union/class, lets finish it
- m_ast.CompleteStructType(compiler_type);
- }
- else if (compiler_type_was_created)
- {
- // Leave this as a forward declaration until we need
- // to know the details of the type. lldb_private::Type
- // will automatically call the SymbolFile virtual function
- // "SymbolFileDWARF::CompleteType(Type *)"
- // When the definition needs to be defined.
- dwarf->m_forward_decl_die_to_clang_type[die.GetDIE()] = compiler_type.GetOpaqueQualType();
- dwarf->m_forward_decl_clang_type_to_die[compiler_type.GetOpaqueQualType()] = die.GetDIERef();
- // SetHasExternalStorage (compiler_type.GetOpaqueQualType(), true);
- }
- }
- }
+ 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) {
+ default:
+ break;
+
+ case DW_TAG_unspecified_type:
+ resolve_state = Type::eResolveStateFull;
+ compiler_type = m_ast.CreateVoidType(type_name_const_str);
+ break;
+
+ case DW_TAG_base_type:
+ resolve_state = Type::eResolveStateFull;
+ compiler_type =
+ m_ast.CreateBaseType(go_kind, type_name_const_str, byte_size);
+ break;
+
+ case DW_TAG_pointer_type:
+ encoding_data_type = Type::eEncodingIsPointerUID;
+ break;
+ case DW_TAG_typedef:
+ encoding_data_type = Type::eEncodingIsTypedefUID;
+ CompilerType impl;
+ Type *type = dwarf->ResolveTypeUID(encoding_uid);
+ if (type) {
+ if (go_kind == 0 && type->GetName() == type_name_const_str) {
+ // Go emits extra typedefs as a forward declaration. Ignore these.
+ dwarf->m_die_to_type[die.GetDIE()] = type;
+ return type->shared_from_this();
+ }
+ impl = type->GetForwardCompilerType();
+ compiler_type =
+ m_ast.CreateTypedefType(go_kind, type_name_const_str, impl);
+ }
+ break;
+ }
+
+ type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str,
+ byte_size, NULL, encoding_uid,
+ encoding_data_type, &decl, compiler_type,
+ resolve_state));
+
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+ } break;
+
+ case DW_TAG_structure_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+ bool byte_size_valid = false;
+
+ 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(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ type_name_cstr = form_value.AsCString();
+ type_name_const_str.SetCString(type_name_cstr);
break;
- case DW_TAG_subprogram:
- case DW_TAG_subroutine_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- bool is_variadic = false;
- clang::StorageClass storage = clang::SC_None; //, Extern, Static, PrivateExtern
-
- 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(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- type_name_cstr = form_value.AsCString();
- type_name_const_str.SetCString(type_name_cstr);
- break;
-
- case DW_AT_external:
- if (form_value.Unsigned())
- {
- if (storage == clang::SC_None)
- storage = clang::SC_Extern;
- else
- storage = clang::SC_PrivateExtern;
- }
- break;
-
- case DW_AT_high_pc:
- case DW_AT_low_pc:
- break;
- }
- }
- }
- }
-
- DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
- DW_TAG_value_to_name(tag), type_name_cstr);
-
- std::vector<CompilerType> function_param_types;
-
- // Parse the function children for the parameters
-
- if (die.HasChildren())
- {
- ParseChildParameters(sc, die, is_variadic, function_param_types);
- }
-
- // compiler_type will get the function prototype clang type after this call
- compiler_type = m_ast.CreateFunctionType(type_name_const_str, function_param_types.data(),
- function_param_types.size(), is_variadic);
-
- type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, 0, NULL,
- LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type,
- Type::eResolveStateFull));
- assert(type_sp.get());
- }
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ byte_size_valid = true;
break;
- case DW_TAG_array_type:
- {
- // Set a bit that lets us know that we are currently parsing this
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- 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;
- 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(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- type_name_cstr = form_value.AsCString();
- type_name_const_str.SetCString(type_name_cstr);
- break;
-
- case DW_AT_type:
- type_die_offset = form_value.Reference();
- break;
- case DW_AT_byte_size:
- break; // byte_size = form_value.Unsigned(); break;
- case DW_AT_go_kind:
- go_kind = form_value.Unsigned();
- break;
- default:
- break;
- }
- }
- }
-
- 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, die, first_index, element_orders, byte_stride, bit_stride);
- if (byte_stride == 0)
- byte_stride = element_type->GetByteSize();
- CompilerType array_element_type = element_type->GetForwardCompilerType();
- if (element_orders.size() > 0)
- {
- if (element_orders.size() > 1)
- printf("golang: unsupported multi-dimensional array %s\n", type_name_cstr);
- compiler_type =
- m_ast.CreateArrayType(type_name_const_str, array_element_type, element_orders[0]);
- }
- else
- {
- compiler_type = m_ast.CreateArrayType(type_name_const_str, array_element_type, 0);
- }
- type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str,
- byte_stride, NULL, type_die_offset, Type::eEncodingIsUID, &decl,
- compiler_type, Type::eResolveStateFull));
- type_sp->SetEncodingType(element_type);
- }
- }
- }
+ case DW_AT_go_kind:
+ go_kind = form_value.Unsigned();
break;
- 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(), tag, DW_TAG_value_to_name(tag));
- break;
+ // TODO: Should we use SLICETYPE's DW_AT_go_elem?
+ default:
+ break;
+ }
}
+ }
+ }
- if (type_sp.get())
- {
- DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
- dw_tag_t sc_parent_tag = sc_parent_die.Tag();
+ // TODO(ribrdb): Do we need this?
+
+ // UniqueDWARFASTType is large, so don't create a local variables on the
+ // stack, put it on the heap. This function is often called recursively
+ // and clang isn't good and sharing the stack space for variables in
+ // different blocks.
+ std::unique_ptr<UniqueDWARFASTType> unique_ast_entry_ap(
+ new UniqueDWARFASTType());
+
+ // Only try and unique the type if it has a name.
+ if (type_name_const_str &&
+ dwarf->GetUniqueDWARFASTTypeMap().Find(
+ type_name_const_str, die, decl,
+ byte_size_valid ? byte_size : -1, *unique_ast_entry_ap)) {
+ // We have already parsed this type or from another
+ // compile unit. GCC loves to use the "one definition
+ // rule" which can result in multiple definitions
+ // of the same class over and over in each compile
+ // unit.
+ type_sp = unique_ast_entry_ap->m_type_sp;
+ if (type_sp) {
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+ return type_sp;
+ }
+ }
- SymbolContextScope *symbol_context_scope = NULL;
- if (sc_parent_tag == DW_TAG_compile_unit)
- {
- symbol_context_scope = sc.comp_unit;
- }
- else if (sc.function != NULL && sc_parent_die)
- {
- symbol_context_scope =
- sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
- if (symbol_context_scope == NULL)
- symbol_context_scope = sc.function;
- }
+ DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
+ DW_TAG_value_to_name(tag), type_name_cstr);
+
+ bool compiler_type_was_created = false;
+ compiler_type.SetCompilerType(
+ &m_ast,
+ dwarf->m_forward_decl_die_to_clang_type.lookup(die.GetDIE()));
+ if (!compiler_type) {
+ compiler_type_was_created = true;
+ compiler_type =
+ m_ast.CreateStructType(go_kind, type_name_const_str, byte_size);
+ }
- if (symbol_context_scope != NULL)
- {
- type_sp->SetSymbolContextScope(symbol_context_scope);
- }
+ type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str,
+ byte_size, NULL, LLDB_INVALID_UID,
+ Type::eEncodingIsUID, &decl, compiler_type,
+ Type::eResolveStateForward));
+
+ // Add our type to the unique type map so we don't
+ // 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_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) {
+ // Always start the definition for a class type so that
+ // 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) {
+ // No children for this struct/union/class, lets finish it
+ m_ast.CompleteStructType(compiler_type);
+ } else if (compiler_type_was_created) {
+ // Leave this as a forward declaration until we need
+ // to know the details of the type. lldb_private::Type
+ // will automatically call the SymbolFile virtual function
+ // "SymbolFileDWARF::CompleteType(Type *)"
+ // When the definition needs to be defined.
+ dwarf->m_forward_decl_die_to_clang_type[die.GetDIE()] =
+ compiler_type.GetOpaqueQualType();
+ dwarf->m_forward_decl_clang_type_to_die[compiler_type
+ .GetOpaqueQualType()] =
+ die.GetDIERef();
+ // SetHasExternalStorage (compiler_type.GetOpaqueQualType(), true);
+ }
+ }
+ } break;
+
+ case DW_TAG_subprogram:
+ case DW_TAG_subroutine_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ bool is_variadic = false;
+ clang::StorageClass storage =
+ clang::SC_None; //, Extern, Static, PrivateExtern
+
+ 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(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ type_name_cstr = form_value.AsCString();
+ type_name_const_str.SetCString(type_name_cstr);
+ break;
- // We are ready to put this type into the uniqued list up at the module level
- type_list->Insert(type_sp);
+ case DW_AT_external:
+ if (form_value.Unsigned()) {
+ if (storage == clang::SC_None)
+ storage = clang::SC_Extern;
+ else
+ storage = clang::SC_PrivateExtern;
+ }
+ break;
- dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+ case DW_AT_high_pc:
+ case DW_AT_low_pc:
+ break;
+ }
}
+ }
}
- else if (type_ptr != DIE_IS_BEING_PARSED)
- {
- type_sp = type_ptr->shared_from_this();
- }
- }
- return type_sp;
-}
-size_t
-DWARFASTParserGo::ParseChildParameters(const SymbolContext &sc,
+ DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(),
+ DW_TAG_value_to_name(tag), type_name_cstr);
- const DWARFDIE &parent_die, bool &is_variadic,
- std::vector<CompilerType> &function_param_types)
-{
- if (!parent_die)
- return 0;
+ std::vector<CompilerType> function_param_types;
- size_t arg_idx = 0;
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
- {
+ // Parse the function children for the parameters
- dw_tag_t tag = die.Tag();
- switch (tag)
- {
- case DW_TAG_formal_parameter:
- {
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- if (num_attributes > 0)
- {
- Declaration decl;
- DWARFFormValue param_type_die_offset;
-
- uint32_t i;
- for (i = 0; i < num_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- // = form_value.AsCString();
- break;
- case DW_AT_type:
- param_type_die_offset = form_value;
- break;
- case DW_AT_location:
- // if (form_value.BlockData())
- // {
- // const DWARFDataExtractor& debug_info_data =
- // debug_info();
- // uint32_t block_length = form_value.Unsigned();
- // DWARFDataExtractor location(debug_info_data,
- // form_value.BlockData() - debug_info_data.GetDataStart(),
- // block_length);
- // }
- // else
- // {
- // }
- // break;
- default:
- break;
- }
- }
- }
-
- Type *type = parent_die.ResolveTypeUID(DIERef(param_type_die_offset));
- if (type)
- {
- function_param_types.push_back(type->GetForwardCompilerType());
- }
- }
- arg_idx++;
- }
- break;
+ if (die.HasChildren()) {
+ ParseChildParameters(sc, die, is_variadic, function_param_types);
+ }
- case DW_TAG_unspecified_parameters:
- is_variadic = true;
+ // compiler_type will get the function prototype clang type after this
+ // call
+ compiler_type = m_ast.CreateFunctionType(
+ type_name_const_str, function_param_types.data(),
+ function_param_types.size(), is_variadic);
+
+ type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, 0, NULL,
+ LLDB_INVALID_UID, Type::eEncodingIsUID, &decl,
+ compiler_type, Type::eResolveStateFull));
+ assert(type_sp.get());
+ } break;
+
+ case DW_TAG_array_type: {
+ // Set a bit that lets us know that we are currently parsing this
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ 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;
+ 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(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ type_name_cstr = form_value.AsCString();
+ type_name_const_str.SetCString(type_name_cstr);
break;
- default:
+ case DW_AT_type:
+ type_die_offset = form_value.Reference();
+ break;
+ case DW_AT_byte_size:
+ break; // byte_size = form_value.Unsigned(); break;
+ case DW_AT_go_kind:
+ go_kind = form_value.Unsigned();
+ break;
+ default:
break;
+ }
+ }
+ }
+
+ 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, die, first_index, element_orders,
+ byte_stride, bit_stride);
+ if (byte_stride == 0)
+ byte_stride = element_type->GetByteSize();
+ CompilerType array_element_type =
+ element_type->GetForwardCompilerType();
+ if (element_orders.size() > 0) {
+ if (element_orders.size() > 1)
+ printf("golang: unsupported multi-dimensional array %s\n",
+ type_name_cstr);
+ compiler_type = m_ast.CreateArrayType(
+ type_name_const_str, array_element_type, element_orders[0]);
+ } else {
+ compiler_type = m_ast.CreateArrayType(type_name_const_str,
+ array_element_type, 0);
+ }
+ type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str,
+ byte_stride, NULL, type_die_offset,
+ Type::eEncodingIsUID, &decl, compiler_type,
+ Type::eResolveStateFull));
+ type_sp->SetEncodingType(element_type);
+ }
+ }
+ } break;
+
+ 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(), tag, DW_TAG_value_to_name(tag));
+ break;
+ }
+
+ if (type_sp.get()) {
+ 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) {
+ symbol_context_scope = sc.comp_unit;
+ } else if (sc.function != NULL && sc_parent_die) {
+ symbol_context_scope =
+ sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
+ if (symbol_context_scope == NULL)
+ symbol_context_scope = sc.function;
}
+
+ if (symbol_context_scope != NULL) {
+ type_sp->SetSymbolContextScope(symbol_context_scope);
+ }
+
+ // We are ready to put this type into the uniqued list up at the module
+ // level
+ type_list->Insert(type_sp);
+
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+ }
+ } else if (type_ptr != DIE_IS_BEING_PARSED) {
+ type_sp = type_ptr->shared_from_this();
}
- return arg_idx;
+ }
+ return type_sp;
}
-void
-DWARFASTParserGo::ParseChildArrayInfo(const SymbolContext &sc, 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)
- return;
-
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
- {
- const dw_tag_t tag = die.Tag();
- switch (tag)
- {
- case DW_TAG_subrange_type:
- {
- DWARFAttributes attributes;
- const size_t num_child_attributes = die.GetAttributes(attributes);
- if (num_child_attributes > 0)
- {
- uint64_t num_elements = 0;
- uint32_t i;
- for (i = 0; i < num_child_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_count:
- num_elements = form_value.Unsigned();
- break;
-
- default:
- case DW_AT_type:
- break;
- }
- }
- }
-
- element_orders.push_back(num_elements);
- }
+size_t DWARFASTParserGo::ParseChildParameters(
+ const SymbolContext &sc,
+
+ const DWARFDIE &parent_die, bool &is_variadic,
+ std::vector<CompilerType> &function_param_types) {
+ if (!parent_die)
+ return 0;
+
+ size_t arg_idx = 0;
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+
+ dw_tag_t tag = die.Tag();
+ switch (tag) {
+ case DW_TAG_formal_parameter: {
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ if (num_attributes > 0) {
+ Declaration decl;
+ DWARFFormValue param_type_die_offset;
+
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ // = form_value.AsCString();
+ break;
+ case DW_AT_type:
+ param_type_die_offset = form_value;
+ break;
+ case DW_AT_location:
+ // if (form_value.BlockData())
+ // {
+ // const DWARFDataExtractor&
+ // debug_info_data =
+ // debug_info();
+ // uint32_t block_length =
+ // form_value.Unsigned();
+ // DWARFDataExtractor
+ // location(debug_info_data,
+ // form_value.BlockData() -
+ // debug_info_data.GetDataStart(),
+ // block_length);
+ // }
+ // else
+ // {
+ // }
+ // break;
+ default:
+ break;
}
- break;
+ }
+ }
+
+ Type *type = parent_die.ResolveTypeUID(DIERef(param_type_die_offset));
+ if (type) {
+ function_param_types.push_back(type->GetForwardCompilerType());
}
+ }
+ arg_idx++;
+ } break;
+
+ case DW_TAG_unspecified_parameters:
+ is_variadic = true;
+ break;
+
+ default:
+ break;
}
+ }
+ return arg_idx;
}
-bool
-DWARFASTParserGo::CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type, CompilerType &compiler_type)
-{
- if (!die)
- return false;
+void DWARFASTParserGo::ParseChildArrayInfo(
+ const SymbolContext &sc, 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)
+ return;
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
const dw_tag_t tag = die.Tag();
+ switch (tag) {
+ case DW_TAG_subrange_type: {
+ DWARFAttributes attributes;
+ const size_t num_child_attributes = die.GetAttributes(attributes);
+ if (num_child_attributes > 0) {
+ uint64_t num_elements = 0;
+ uint32_t i;
+ for (i = 0; i < num_child_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_count:
+ num_elements = form_value.Unsigned();
+ break;
- 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...", die.GetID(),
- DW_TAG_value_to_name(tag), type->GetName().AsCString());
- assert(compiler_type);
- DWARFAttributes attributes;
-
- switch (tag)
- {
- case DW_TAG_structure_type:
- {
- {
- if (die.HasChildren())
- {
- SymbolContext sc(die.GetLLDBCompileUnit());
-
- ParseChildMembers(sc, die, compiler_type);
- }
+ default:
+ case DW_AT_type:
+ break;
}
- m_ast.CompleteStructType(compiler_type);
- return (bool)compiler_type;
+ }
}
- default:
- assert(false && "not a forward go type decl!");
- break;
+ element_orders.push_back(num_elements);
+ }
+ } break;
}
+ }
+}
+bool DWARFASTParserGo::CompleteTypeFromDWARF(const DWARFDIE &die,
+ lldb_private::Type *type,
+ CompilerType &compiler_type) {
+ if (!die)
return false;
-}
-size_t
-DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &parent_die, CompilerType &class_compiler_type)
-{
- size_t count = 0;
- uint32_t member_idx = 0;
+ const dw_tag_t tag = die.Tag();
- ModuleSP module_sp = parent_die.GetDWARF()->GetObjectFile()->GetModule();
- GoASTContext *ast = llvm::dyn_cast_or_null<GoASTContext>(class_compiler_type.GetTypeSystem());
- if (ast == nullptr)
- return 0;
+ 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...",
+ die.GetID(), DW_TAG_value_to_name(tag), type->GetName().AsCString());
+ assert(compiler_type);
+ DWARFAttributes attributes;
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
+ switch (tag) {
+ case DW_TAG_structure_type: {
{
- dw_tag_t tag = die.Tag();
-
- switch (tag)
- {
- case DW_TAG_member:
- {
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- if (num_attributes > 0)
- {
- Declaration decl;
- const char *name = NULL;
-
- DWARFFormValue encoding_uid;
- uint32_t member_byte_offset = UINT32_MAX;
- uint32_t i;
- for (i = 0; i < num_attributes; ++i)
- {
- const dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- name = form_value.AsCString();
- break;
- case DW_AT_type:
- encoding_uid = form_value;
- break;
- case DW_AT_data_member_location:
- if (form_value.BlockData())
- {
- Value initialValue(0);
- Value memberOffset(0);
- 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 *
- NULL, // ClangExpressionVariableList *
- NULL, // ClangExpressionDeclMap *
- NULL, // RegisterContext *
- module_sp, debug_info_data, die.GetCU(),
- block_offset, block_length, eRegisterKindDWARF,
- &initialValue, NULL, memberOffset, NULL))
- {
- member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
- }
- }
- else
- {
- // With DWARF 3 and later, if the value is an integer constant,
- // this form value is the offset in bytes from the beginning
- // of the containing entity.
- member_byte_offset = form_value.Unsigned();
- }
- break;
-
- default:
- break;
- }
- }
- }
-
- Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid));
- if (member_type)
- {
- CompilerType member_go_type = member_type->GetFullCompilerType();
- ConstString name_const_str(name);
- m_ast.AddFieldToStruct(class_compiler_type, name_const_str, member_go_type, member_byte_offset);
- }
+ if (die.HasChildren()) {
+ SymbolContext sc(die.GetLLDBCompileUnit());
+
+ ParseChildMembers(sc, die, compiler_type);
+ }
+ }
+ m_ast.CompleteStructType(compiler_type);
+ return (bool)compiler_type;
+ }
+
+ default:
+ assert(false && "not a forward go type decl!");
+ break;
+ }
+
+ return false;
+}
+
+size_t DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc,
+ const DWARFDIE &parent_die,
+ CompilerType &class_compiler_type) {
+ size_t count = 0;
+ uint32_t member_idx = 0;
+
+ ModuleSP module_sp = parent_die.GetDWARF()->GetObjectFile()->GetModule();
+ GoASTContext *ast =
+ llvm::dyn_cast_or_null<GoASTContext>(class_compiler_type.GetTypeSystem());
+ if (ast == nullptr)
+ return 0;
+
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+ dw_tag_t tag = die.Tag();
+
+ switch (tag) {
+ case DW_TAG_member: {
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ if (num_attributes > 0) {
+ Declaration decl;
+ const char *name = NULL;
+
+ DWARFFormValue encoding_uid;
+ uint32_t member_byte_offset = UINT32_MAX;
+ uint32_t i;
+ for (i = 0; i < num_attributes; ++i) {
+ const dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ name = form_value.AsCString();
+ break;
+ case DW_AT_type:
+ encoding_uid = form_value;
+ break;
+ case DW_AT_data_member_location:
+ if (form_value.BlockData()) {
+ Value initialValue(0);
+ Value memberOffset(0);
+ 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 *
+ NULL, // ClangExpressionVariableList *
+ NULL, // ClangExpressionDeclMap *
+ NULL, // RegisterContext *
+ module_sp, debug_info_data, die.GetCU(), block_offset,
+ block_length, eRegisterKindDWARF, &initialValue, NULL,
+ memberOffset, NULL)) {
+ member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
}
- ++member_idx;
- }
- break;
+ } else {
+ // With DWARF 3 and later, if the value is an integer constant,
+ // this form value is the offset in bytes from the beginning
+ // of the containing entity.
+ member_byte_offset = form_value.Unsigned();
+ }
+ break;
default:
- break;
+ break;
+ }
+ }
}
+
+ Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid));
+ if (member_type) {
+ CompilerType member_go_type = member_type->GetFullCompilerType();
+ ConstString name_const_str(name);
+ m_ast.AddFieldToStruct(class_compiler_type, name_const_str,
+ member_go_type, member_byte_offset);
+ }
+ }
+ ++member_idx;
+ } break;
+
+ default:
+ break;
}
+ }
- return count;
+ return count;
}
-Function *
-DWARFASTParserGo::ParseFunctionFromDWARF(const SymbolContext &sc, const DWARFDIE &die)
-{
- DWARFRangeList func_ranges;
- const char *name = NULL;
- const char *mangled = NULL;
- int decl_file = 0;
- int decl_line = 0;
- int decl_column = 0;
- int call_file = 0;
- int call_line = 0;
- int call_column = 0;
- DWARFExpression frame_base(die.GetCU());
-
- assert(die.Tag() == DW_TAG_subprogram);
-
- if (die.Tag() != DW_TAG_subprogram)
- return NULL;
-
- 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(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);
- }
+Function *DWARFASTParserGo::ParseFunctionFromDWARF(const SymbolContext &sc,
+ const DWARFDIE &die) {
+ DWARFRangeList func_ranges;
+ const char *name = NULL;
+ const char *mangled = NULL;
+ int decl_file = 0;
+ int decl_line = 0;
+ int decl_column = 0;
+ int call_file = 0;
+ int call_line = 0;
+ int call_column = 0;
+ DWARFExpression frame_base(die.GetCU());
+
+ assert(die.Tag() == DW_TAG_subprogram);
+
+ if (die.Tag() != DW_TAG_subprogram)
+ return NULL;
- if (func_range.GetBaseAddress().IsValid())
- {
- Mangled func_name;
- func_name.SetValue(ConstString(name), false);
-
- FunctionSP func_sp;
- std::unique_ptr<Declaration> decl_ap;
- if (decl_file != 0 || decl_line != 0 || decl_column != 0)
- decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), 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.GetDIE());
-
- assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
-
- if (dwarf->FixupAddress(func_range.GetBaseAddress()))
- {
- const user_id_t func_user_id = die.GetID();
- func_sp.reset(new Function(sc.comp_unit,
- func_user_id, // UserID is the DIE offset
- func_user_id,
- func_name,
- func_type,
- func_range)); // first address range
-
- if (func_sp.get() != NULL)
- {
- if (frame_base.IsValid())
- func_sp->GetFrameBaseExpression() = frame_base;
- sc.comp_unit->AddFunction(func_sp);
- return func_sp.get();
- }
- }
+ 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(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);
+ }
+
+ if (func_range.GetBaseAddress().IsValid()) {
+ Mangled func_name;
+ func_name.SetValue(ConstString(name), false);
+
+ FunctionSP func_sp;
+ std::unique_ptr<Declaration> decl_ap;
+ if (decl_file != 0 || decl_line != 0 || decl_column != 0)
+ decl_ap.reset(new Declaration(
+ sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
+ 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.GetDIE());
+
+ assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
+
+ if (dwarf->FixupAddress(func_range.GetBaseAddress())) {
+ const user_id_t func_user_id = die.GetID();
+ func_sp.reset(new Function(sc.comp_unit,
+ func_user_id, // UserID is the DIE offset
+ func_user_id, func_name, func_type,
+ func_range)); // first address range
+
+ if (func_sp.get() != NULL) {
+ if (frame_base.IsValid())
+ func_sp->GetFrameBaseExpression() = frame_base;
+ sc.comp_unit->AddFunction(func_sp);
+ return func_sp.get();
}
+ }
}
- return NULL;
+ }
+ return NULL;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.h
index 5039fc7f767..2a7c3871a30 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.h
@@ -18,67 +18,67 @@
#include "llvm/ADT/SmallVector.h"
// Project includes
-#include "lldb/Core/PluginInterface.h"
-#include "lldb/Symbol/GoASTContext.h"
-#include "DWARFDefines.h"
#include "DWARFASTParser.h"
#include "DWARFDIE.h"
+#include "DWARFDefines.h"
+#include "lldb/Core/PluginInterface.h"
+#include "lldb/Symbol/GoASTContext.h"
class DWARFDebugInfoEntry;
class DWARFDIECollection;
-class DWARFASTParserGo : public DWARFASTParser
-{
+class DWARFASTParserGo : public DWARFASTParser {
public:
- DWARFASTParserGo(lldb_private::GoASTContext &ast);
+ DWARFASTParserGo(lldb_private::GoASTContext &ast);
- ~DWARFASTParserGo() override;
+ ~DWARFASTParserGo() override;
- lldb::TypeSP ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, const DWARFDIE &die, lldb_private::Log *log,
- bool *type_is_new_ptr) override;
+ lldb::TypeSP ParseTypeFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die, lldb_private::Log *log,
+ bool *type_is_new_ptr) override;
- lldb_private::Function *
- ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc,
- const DWARFDIE &die) override;
+ lldb_private::Function *
+ ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die) override;
- bool
- CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
- lldb_private::CompilerType &go_type) override;
+ bool CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
+ lldb_private::CompilerType &go_type) override;
- lldb_private::CompilerDeclContext
- GetDeclContextForUIDFromDWARF(const DWARFDIE &die) override
- {
- return lldb_private::CompilerDeclContext();
- }
+ lldb_private::CompilerDeclContext
+ GetDeclContextForUIDFromDWARF(const DWARFDIE &die) override {
+ return lldb_private::CompilerDeclContext();
+ }
- lldb_private::CompilerDeclContext
- GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) override
- {
- return lldb_private::CompilerDeclContext();
- }
+ lldb_private::CompilerDeclContext
+ GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) override {
+ return lldb_private::CompilerDeclContext();
+ }
- lldb_private::CompilerDecl
- GetDeclForUIDFromDWARF (const DWARFDIE &die) override
- {
- return lldb_private::CompilerDecl();
- }
+ lldb_private::CompilerDecl
+ GetDeclForUIDFromDWARF(const DWARFDIE &die) override {
+ return lldb_private::CompilerDecl();
+ }
- std::vector<DWARFDIE>
- GetDIEForDeclContext (lldb_private::CompilerDeclContext decl_context) override
- {
- return std::vector<DWARFDIE>();
- }
+ std::vector<DWARFDIE> GetDIEForDeclContext(
+ lldb_private::CompilerDeclContext decl_context) override {
+ return std::vector<DWARFDIE>();
+ }
private:
- size_t ParseChildParameters(const lldb_private::SymbolContext &sc, const DWARFDIE &parent_die, bool &is_variadic,
- std::vector<lldb_private::CompilerType> &function_param_types);
- void ParseChildArrayInfo(const lldb_private::SymbolContext &sc, const DWARFDIE &parent_die, int64_t &first_index,
- std::vector<uint64_t> &element_orders, uint32_t &byte_stride, uint32_t &bit_stride);
-
- size_t ParseChildMembers(const lldb_private::SymbolContext &sc, const DWARFDIE &die,
- lldb_private::CompilerType &class_compiler_type);
-
- lldb_private::GoASTContext &m_ast;
+ size_t ParseChildParameters(
+ const lldb_private::SymbolContext &sc, const DWARFDIE &parent_die,
+ bool &is_variadic,
+ std::vector<lldb_private::CompilerType> &function_param_types);
+ void ParseChildArrayInfo(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &parent_die, int64_t &first_index,
+ std::vector<uint64_t> &element_orders,
+ uint32_t &byte_stride, uint32_t &bit_stride);
+
+ size_t ParseChildMembers(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die,
+ lldb_private::CompilerType &class_compiler_type);
+
+ lldb_private::GoASTContext &m_ast;
};
#endif // SymbolFileDWARF_DWARFASTParserGo_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp
index b21bf2ded48..8b5202ba265 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp
@@ -23,533 +23,487 @@
using namespace lldb;
using namespace lldb_private;
-DWARFASTParserJava::DWARFASTParserJava(JavaASTContext &ast) : m_ast(ast)
-{
-}
-
-DWARFASTParserJava::~DWARFASTParserJava()
-{
-}
-
-TypeSP
-DWARFASTParserJava::ParseBaseTypeFromDIE(const DWARFDIE &die)
-{
- SymbolFileDWARF *dwarf = die.GetDWARF();
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- ConstString type_name;
- uint64_t byte_size = 0;
-
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- for (uint32_t i = 0; i < num_attributes; ++i)
- {
- DWARFFormValue form_value;
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- type_name.SetCString(form_value.AsCString());
- break;
- case DW_AT_byte_size:
- byte_size = form_value.Unsigned();
- break;
- case DW_AT_encoding:
- break;
- default:
- assert(false && "Unsupported attribute for DW_TAG_base_type");
- }
- }
+DWARFASTParserJava::DWARFASTParserJava(JavaASTContext &ast) : m_ast(ast) {}
+
+DWARFASTParserJava::~DWARFASTParserJava() {}
+
+TypeSP DWARFASTParserJava::ParseBaseTypeFromDIE(const DWARFDIE &die) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ ConstString type_name;
+ uint64_t byte_size = 0;
+
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ for (uint32_t i = 0; i < num_attributes; ++i) {
+ DWARFFormValue form_value;
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ type_name.SetCString(form_value.AsCString());
+ break;
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ break;
+ case DW_AT_encoding:
+ break;
+ default:
+ assert(false && "Unsupported attribute for DW_TAG_base_type");
+ }
}
+ }
- Declaration decl;
- CompilerType compiler_type = m_ast.CreateBaseType(type_name);
- return std::make_shared<Type>(die.GetID(), dwarf, type_name, byte_size, nullptr, LLDB_INVALID_UID,
- Type::eEncodingIsUID, decl, compiler_type, Type::eResolveStateFull);
+ Declaration decl;
+ CompilerType compiler_type = m_ast.CreateBaseType(type_name);
+ return std::make_shared<Type>(die.GetID(), dwarf, type_name, byte_size,
+ nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID,
+ decl, compiler_type, Type::eResolveStateFull);
}
-TypeSP
-DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die)
-{
- SymbolFileDWARF *dwarf = die.GetDWARF();
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- ConstString linkage_name;
- DWARFFormValue type_attr_value;
- lldb::addr_t data_offset = LLDB_INVALID_ADDRESS;
- DWARFExpression length_expression(die.GetCU());
-
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- for (uint32_t i = 0; i < num_attributes; ++i)
- {
+TypeSP DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ ConstString linkage_name;
+ DWARFFormValue type_attr_value;
+ lldb::addr_t data_offset = LLDB_INVALID_ADDRESS;
+ DWARFExpression length_expression(die.GetCU());
+
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ for (uint32_t i = 0; i < num_attributes; ++i) {
+ DWARFFormValue form_value;
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_linkage_name:
+ linkage_name.SetCString(form_value.AsCString());
+ break;
+ case DW_AT_type:
+ type_attr_value = form_value;
+ break;
+ case DW_AT_data_member_location:
+ data_offset = form_value.Unsigned();
+ break;
+ case DW_AT_declaration:
+ break;
+ default:
+ assert(false && "Unsupported attribute for DW_TAG_array_type");
+ }
+ }
+ }
+
+ for (DWARFDIE child_die = die.GetFirstChild(); child_die.IsValid();
+ child_die = child_die.GetSibling()) {
+ if (child_die.Tag() == DW_TAG_subrange_type) {
+ DWARFAttributes attributes;
+ const size_t num_attributes = child_die.GetAttributes(attributes);
+ for (uint32_t i = 0; i < num_attributes; ++i) {
DWARFFormValue form_value;
dw_attr_t attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_linkage_name:
- linkage_name.SetCString(form_value.AsCString());
- break;
- case DW_AT_type:
- type_attr_value = form_value;
- break;
- case DW_AT_data_member_location:
- data_offset = form_value.Unsigned();
- break;
- case DW_AT_declaration:
- break;
- default:
- assert(false && "Unsupported attribute for DW_TAG_array_type");
- }
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_count:
+ if (form_value.BlockData())
+ length_expression.CopyOpcodeData(
+ form_value.BlockData(), form_value.Unsigned(),
+ child_die.GetCU()->GetByteOrder(),
+ child_die.GetCU()->GetAddressByteSize());
+ break;
+ default:
+ assert(false && "Unsupported attribute for DW_TAG_subrange_type");
+ }
}
+ }
+ } else {
+ assert(false && "Unsupported child for DW_TAG_array_type");
}
+ }
- for (DWARFDIE child_die = die.GetFirstChild(); child_die.IsValid(); child_die = child_die.GetSibling())
- {
- if (child_die.Tag() == DW_TAG_subrange_type)
- {
- DWARFAttributes attributes;
- const size_t num_attributes = child_die.GetAttributes(attributes);
- for (uint32_t i = 0; i < num_attributes; ++i)
- {
- DWARFFormValue form_value;
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_count:
- if (form_value.BlockData())
- length_expression.CopyOpcodeData(form_value.BlockData(), form_value.Unsigned(),
- child_die.GetCU()->GetByteOrder(),
- child_die.GetCU()->GetAddressByteSize());
- break;
- default:
- assert(false && "Unsupported attribute for DW_TAG_subrange_type");
- }
- }
- }
- }
- else
- {
- assert(false && "Unsupported child for DW_TAG_array_type");
- }
- }
+ DIERef type_die_ref(type_attr_value);
+ Type *element_type = dwarf->ResolveTypeUID(type_die_ref);
+ if (!element_type)
+ return nullptr;
- DIERef type_die_ref(type_attr_value);
- Type *element_type = dwarf->ResolveTypeUID(type_die_ref);
- if (!element_type)
- return nullptr;
-
- CompilerType element_compiler_type = element_type->GetForwardCompilerType();
- CompilerType array_compiler_type =
- m_ast.CreateArrayType(linkage_name, element_compiler_type, length_expression, data_offset);
-
- Declaration decl;
- TypeSP type_sp(new Type(die.GetID(), dwarf, array_compiler_type.GetTypeName(), -1, nullptr,
- type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl,
- array_compiler_type, Type::eResolveStateFull));
- type_sp->SetEncodingType(element_type);
- return type_sp;
+ CompilerType element_compiler_type = element_type->GetForwardCompilerType();
+ CompilerType array_compiler_type = m_ast.CreateArrayType(
+ linkage_name, element_compiler_type, length_expression, data_offset);
+
+ Declaration decl;
+ TypeSP type_sp(new Type(die.GetID(), dwarf, array_compiler_type.GetTypeName(),
+ -1, nullptr, type_die_ref.GetUID(dwarf),
+ Type::eEncodingIsUID, &decl, array_compiler_type,
+ Type::eResolveStateFull));
+ type_sp->SetEncodingType(element_type);
+ return type_sp;
}
-TypeSP
-DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die)
-{
- SymbolFileDWARF *dwarf = die.GetDWARF();
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- Declaration decl;
- DWARFFormValue type_attr_value;
-
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- for (uint32_t i = 0; i < num_attributes; ++i)
- {
- DWARFFormValue form_value;
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_type:
- type_attr_value = form_value;
- break;
- default:
- assert(false && "Unsupported attribute for DW_TAG_array_type");
- }
- }
+TypeSP DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ Declaration decl;
+ DWARFFormValue type_attr_value;
+
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ for (uint32_t i = 0; i < num_attributes; ++i) {
+ DWARFFormValue form_value;
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_type:
+ type_attr_value = form_value;
+ break;
+ default:
+ assert(false && "Unsupported attribute for DW_TAG_array_type");
+ }
}
+ }
- DIERef type_die_ref(type_attr_value);
- Type *pointee_type = dwarf->ResolveTypeUID(type_die_ref);
- if (!pointee_type)
- return nullptr;
-
- CompilerType pointee_compiler_type = pointee_type->GetForwardCompilerType();
- CompilerType reference_compiler_type = m_ast.CreateReferenceType(pointee_compiler_type);
- TypeSP type_sp(new Type(die.GetID(), dwarf, reference_compiler_type.GetTypeName(), -1, nullptr,
- type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl,
- reference_compiler_type, Type::eResolveStateFull));
- type_sp->SetEncodingType(pointee_type);
- return type_sp;
-}
+ DIERef type_die_ref(type_attr_value);
+ Type *pointee_type = dwarf->ResolveTypeUID(type_die_ref);
+ if (!pointee_type)
+ return nullptr;
-lldb::TypeSP
-DWARFASTParserJava::ParseClassTypeFromDIE(const DWARFDIE &die, bool &is_new_type)
-{
- SymbolFileDWARF *dwarf = die.GetDWARF();
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- Declaration decl;
- ConstString name;
- ConstString linkage_name;
- bool is_forward_declaration = false;
- uint32_t byte_size = 0;
-
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- for (uint32_t i = 0; i < num_attributes; ++i)
- {
- DWARFFormValue form_value;
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- name.SetCString(form_value.AsCString());
- break;
- case DW_AT_declaration:
- is_forward_declaration = form_value.Boolean();
- break;
- case DW_AT_byte_size:
- byte_size = form_value.Unsigned();
- break;
- case DW_AT_linkage_name:
- linkage_name.SetCString(form_value.AsCString());
- break;
- default:
- assert(false && "Unsupported attribute for DW_TAG_class_type");
- }
- }
- }
+ CompilerType pointee_compiler_type = pointee_type->GetForwardCompilerType();
+ CompilerType reference_compiler_type =
+ m_ast.CreateReferenceType(pointee_compiler_type);
+ TypeSP type_sp(
+ new Type(die.GetID(), dwarf, reference_compiler_type.GetTypeName(), -1,
+ nullptr, type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl,
+ reference_compiler_type, Type::eResolveStateFull));
+ type_sp->SetEncodingType(pointee_type);
+ return type_sp;
+}
- UniqueDWARFASTType unique_ast_entry;
- if (name)
- {
- std::string qualified_name;
- if (die.GetQualifiedName(qualified_name))
- {
- name.SetCString(qualified_name.c_str());
- if (dwarf->GetUniqueDWARFASTTypeMap().Find(name, die, Declaration(), -1, unique_ast_entry))
- {
- if (unique_ast_entry.m_type_sp)
- {
- dwarf->GetDIEToType()[die.GetDIE()] = unique_ast_entry.m_type_sp.get();
- is_new_type = false;
- return unique_ast_entry.m_type_sp;
- }
- }
- }
+lldb::TypeSP DWARFASTParserJava::ParseClassTypeFromDIE(const DWARFDIE &die,
+ bool &is_new_type) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ Declaration decl;
+ ConstString name;
+ ConstString linkage_name;
+ bool is_forward_declaration = false;
+ uint32_t byte_size = 0;
+
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ for (uint32_t i = 0; i < num_attributes; ++i) {
+ DWARFFormValue form_value;
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ name.SetCString(form_value.AsCString());
+ break;
+ case DW_AT_declaration:
+ is_forward_declaration = form_value.Boolean();
+ break;
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ break;
+ case DW_AT_linkage_name:
+ linkage_name.SetCString(form_value.AsCString());
+ break;
+ default:
+ assert(false && "Unsupported attribute for DW_TAG_class_type");
+ }
}
-
- if (is_forward_declaration)
- {
- DWARFDeclContext die_decl_ctx;
- die.GetDWARFDeclContext(die_decl_ctx);
-
- TypeSP type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx);
- if (type_sp)
- {
- // We found a real definition for this type elsewhere so lets use it
- dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
- is_new_type = false;
- return type_sp;
+ }
+
+ UniqueDWARFASTType unique_ast_entry;
+ if (name) {
+ std::string qualified_name;
+ if (die.GetQualifiedName(qualified_name)) {
+ name.SetCString(qualified_name.c_str());
+ if (dwarf->GetUniqueDWARFASTTypeMap().Find(name, die, Declaration(), -1,
+ unique_ast_entry)) {
+ if (unique_ast_entry.m_type_sp) {
+ dwarf->GetDIEToType()[die.GetDIE()] =
+ unique_ast_entry.m_type_sp.get();
+ is_new_type = false;
+ return unique_ast_entry.m_type_sp;
}
+ }
}
-
- CompilerType compiler_type(&m_ast, dwarf->GetForwardDeclDieToClangType().lookup(die.GetDIE()));
- if (!compiler_type)
- compiler_type = m_ast.CreateObjectType(name, linkage_name, byte_size);
-
- is_new_type = true;
- TypeSP type_sp(new Type(die.GetID(), dwarf, name,
- -1, // byte size isn't specified
- nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type,
- Type::eResolveStateForward));
-
- // Add our type to the unique type map
- unique_ast_entry.m_type_sp = type_sp;
- unique_ast_entry.m_die = die;
- unique_ast_entry.m_declaration = decl;
- unique_ast_entry.m_byte_size = -1;
- dwarf->GetUniqueDWARFASTTypeMap().Insert(name, unique_ast_entry);
-
- if (!is_forward_declaration)
- {
- // Leave this as a forward declaration until we need to know the details of the type
- dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] = compiler_type.GetOpaqueQualType();
- dwarf->GetForwardDeclClangTypeToDie()[compiler_type.GetOpaqueQualType()] = die.GetDIERef();
+ }
+
+ if (is_forward_declaration) {
+ DWARFDeclContext die_decl_ctx;
+ die.GetDWARFDeclContext(die_decl_ctx);
+
+ TypeSP type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx);
+ if (type_sp) {
+ // We found a real definition for this type elsewhere so lets use it
+ dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
+ is_new_type = false;
+ return type_sp;
}
- return type_sp;
+ }
+
+ CompilerType compiler_type(
+ &m_ast, dwarf->GetForwardDeclDieToClangType().lookup(die.GetDIE()));
+ if (!compiler_type)
+ compiler_type = m_ast.CreateObjectType(name, linkage_name, byte_size);
+
+ is_new_type = true;
+ TypeSP type_sp(new Type(die.GetID(), dwarf, name,
+ -1, // byte size isn't specified
+ nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID,
+ &decl, compiler_type, Type::eResolveStateForward));
+
+ // Add our type to the unique type map
+ unique_ast_entry.m_type_sp = type_sp;
+ unique_ast_entry.m_die = die;
+ unique_ast_entry.m_declaration = decl;
+ unique_ast_entry.m_byte_size = -1;
+ dwarf->GetUniqueDWARFASTTypeMap().Insert(name, unique_ast_entry);
+
+ if (!is_forward_declaration) {
+ // Leave this as a forward declaration until we need to know the details of
+ // the type
+ dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] =
+ compiler_type.GetOpaqueQualType();
+ dwarf->GetForwardDeclClangTypeToDie()[compiler_type.GetOpaqueQualType()] =
+ die.GetDIERef();
+ }
+ return type_sp;
}
-lldb::TypeSP
-DWARFASTParserJava::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, const DWARFDIE &die,
- lldb_private::Log *log, bool *type_is_new_ptr)
-{
- if (type_is_new_ptr)
- *type_is_new_ptr = false;
-
- if (!die)
- return nullptr;
-
- SymbolFileDWARF *dwarf = die.GetDWARF();
-
- Type *type_ptr = dwarf->m_die_to_type.lookup(die.GetDIE());
- if (type_ptr == DIE_IS_BEING_PARSED)
- return nullptr;
- if (type_ptr != nullptr)
- return type_ptr->shared_from_this();
-
- TypeSP type_sp;
- if (type_is_new_ptr)
- *type_is_new_ptr = true;
-
- switch (die.Tag())
- {
- case DW_TAG_base_type:
- {
- type_sp = ParseBaseTypeFromDIE(die);
- break;
- }
- case DW_TAG_array_type:
- {
- type_sp = ParseArrayTypeFromDIE(die);
- break;
- }
- case DW_TAG_class_type:
- {
- bool is_new_type = false;
- type_sp = ParseClassTypeFromDIE(die, is_new_type);
- if (!is_new_type)
- return type_sp;
- break;
- }
- case DW_TAG_reference_type:
- {
- type_sp = ParseReferenceTypeFromDIE(die);
- break;
- }
- }
+lldb::TypeSP DWARFASTParserJava::ParseTypeFromDWARF(
+ const lldb_private::SymbolContext &sc, const DWARFDIE &die,
+ lldb_private::Log *log, bool *type_is_new_ptr) {
+ if (type_is_new_ptr)
+ *type_is_new_ptr = false;
- if (!type_sp)
- return nullptr;
+ if (!die)
+ return nullptr;
- DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
- dw_tag_t sc_parent_tag = sc_parent_die.Tag();
+ SymbolFileDWARF *dwarf = die.GetDWARF();
- SymbolContextScope *symbol_context_scope = nullptr;
- if (sc_parent_tag == DW_TAG_compile_unit)
- {
- symbol_context_scope = sc.comp_unit;
- }
- else if (sc.function != nullptr && sc_parent_die)
- {
- symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
- if (symbol_context_scope == nullptr)
- symbol_context_scope = sc.function;
- }
+ Type *type_ptr = dwarf->m_die_to_type.lookup(die.GetDIE());
+ if (type_ptr == DIE_IS_BEING_PARSED)
+ return nullptr;
+ if (type_ptr != nullptr)
+ return type_ptr->shared_from_this();
+
+ TypeSP type_sp;
+ if (type_is_new_ptr)
+ *type_is_new_ptr = true;
+
+ switch (die.Tag()) {
+ case DW_TAG_base_type: {
+ type_sp = ParseBaseTypeFromDIE(die);
+ break;
+ }
+ case DW_TAG_array_type: {
+ type_sp = ParseArrayTypeFromDIE(die);
+ break;
+ }
+ case DW_TAG_class_type: {
+ bool is_new_type = false;
+ type_sp = ParseClassTypeFromDIE(die, is_new_type);
+ if (!is_new_type)
+ return type_sp;
+ break;
+ }
+ case DW_TAG_reference_type: {
+ type_sp = ParseReferenceTypeFromDIE(die);
+ break;
+ }
+ }
+
+ if (!type_sp)
+ return nullptr;
+
+ DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
+ dw_tag_t sc_parent_tag = sc_parent_die.Tag();
+
+ SymbolContextScope *symbol_context_scope = nullptr;
+ if (sc_parent_tag == DW_TAG_compile_unit) {
+ symbol_context_scope = sc.comp_unit;
+ } else if (sc.function != nullptr && sc_parent_die) {
+ symbol_context_scope =
+ sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
+ if (symbol_context_scope == nullptr)
+ symbol_context_scope = sc.function;
+ }
- if (symbol_context_scope != nullptr)
- type_sp->SetSymbolContextScope(symbol_context_scope);
+ if (symbol_context_scope != nullptr)
+ type_sp->SetSymbolContextScope(symbol_context_scope);
- dwarf->GetTypeList()->Insert(type_sp);
- dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+ dwarf->GetTypeList()->Insert(type_sp);
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
- return type_sp;
+ return type_sp;
}
-lldb_private::Function *
-DWARFASTParserJava::ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc, const DWARFDIE &die)
-{
- assert(die.Tag() == DW_TAG_subprogram);
-
- const char *name = nullptr;
- const char *mangled = nullptr;
- int decl_file = 0;
- int decl_line = 0;
- int decl_column = 0;
- int call_file = 0;
- int call_line = 0;
- int call_column = 0;
- DWARFRangeList func_ranges;
- DWARFExpression frame_base(die.GetCU());
-
- 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(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);
- }
+lldb_private::Function *DWARFASTParserJava::ParseFunctionFromDWARF(
+ const lldb_private::SymbolContext &sc, const DWARFDIE &die) {
+ assert(die.Tag() == DW_TAG_subprogram);
+
+ const char *name = nullptr;
+ const char *mangled = nullptr;
+ int decl_file = 0;
+ int decl_line = 0;
+ int decl_column = 0;
+ int call_file = 0;
+ int call_line = 0;
+ int call_column = 0;
+ DWARFRangeList func_ranges;
+ DWARFExpression frame_base(die.GetCU());
+
+ 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(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);
+ }
- if (func_range.GetBaseAddress().IsValid())
- {
- std::unique_ptr<Declaration> decl_ap;
- if (decl_file != 0 || decl_line != 0 || decl_column != 0)
- decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), decl_line,
- decl_column));
-
- if (die.GetDWARF()->FixupAddress(func_range.GetBaseAddress()))
- {
- FunctionSP func_sp(new Function(sc.comp_unit, die.GetID(), die.GetID(),
- Mangled(ConstString(name), false),
- nullptr, // No function types in java
- func_range));
- if (frame_base.IsValid())
- func_sp->GetFrameBaseExpression() = frame_base;
- sc.comp_unit->AddFunction(func_sp);
-
- return func_sp.get();
- }
- }
+ if (func_range.GetBaseAddress().IsValid()) {
+ std::unique_ptr<Declaration> decl_ap;
+ if (decl_file != 0 || decl_line != 0 || decl_column != 0)
+ decl_ap.reset(new Declaration(
+ sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
+ decl_line, decl_column));
+
+ if (die.GetDWARF()->FixupAddress(func_range.GetBaseAddress())) {
+ FunctionSP func_sp(new Function(sc.comp_unit, die.GetID(), die.GetID(),
+ Mangled(ConstString(name), false),
+ nullptr, // No function types in java
+ func_range));
+ if (frame_base.IsValid())
+ func_sp->GetFrameBaseExpression() = frame_base;
+ sc.comp_unit->AddFunction(func_sp);
+
+ return func_sp.get();
+ }
}
- return nullptr;
+ }
+ return nullptr;
}
-bool
-DWARFASTParserJava::CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
- lldb_private::CompilerType &java_type)
-{
- switch (die.Tag())
- {
- case DW_TAG_class_type:
- {
- if (die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0) == 0)
- {
- if (die.HasChildren())
- ParseChildMembers(die, java_type);
- m_ast.CompleteObjectType(java_type);
- return java_type.IsValid();
- }
- }
+bool DWARFASTParserJava::CompleteTypeFromDWARF(
+ const DWARFDIE &die, lldb_private::Type *type,
+ lldb_private::CompilerType &java_type) {
+ switch (die.Tag()) {
+ case DW_TAG_class_type: {
+ if (die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0) == 0) {
+ if (die.HasChildren())
+ ParseChildMembers(die, java_type);
+ m_ast.CompleteObjectType(java_type);
+ return java_type.IsValid();
+ }
+ } break;
+ default:
+ assert(false && "Not a forward java type declaration!");
+ break;
+ }
+ return false;
+}
+
+void DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die,
+ CompilerType &compiler_type) {
+ DWARFCompileUnit *dwarf_cu = parent_die.GetCU();
+ for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid();
+ die = die.GetSibling()) {
+ switch (die.Tag()) {
+ case DW_TAG_member: {
+ const char *name = nullptr;
+ DWARFFormValue encoding_uid;
+ uint32_t member_byte_offset = UINT32_MAX;
+ DWARFExpression member_location_expression(dwarf_cu);
+
+ DWARFAttributes attributes;
+ size_t num_attributes = die.GetAttributes(attributes);
+ for (size_t i = 0; i < num_attributes; ++i) {
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attributes.AttributeAtIndex(i)) {
+ case DW_AT_name:
+ name = form_value.AsCString();
+ break;
+ case DW_AT_type:
+ encoding_uid = form_value;
+ break;
+ case DW_AT_data_member_location:
+ if (form_value.BlockData())
+ member_location_expression.CopyOpcodeData(
+ form_value.BlockData(), form_value.Unsigned(),
+ dwarf_cu->GetByteOrder(), dwarf_cu->GetAddressByteSize());
+ else
+ member_byte_offset = form_value.Unsigned();
+ break;
+ case DW_AT_artificial:
+ static_cast<void>(form_value.Boolean());
+ break;
+ case DW_AT_accessibility:
+ // TODO: Handle when needed
break;
- default:
- assert(false && "Not a forward java type declaration!");
+ default:
+ assert(false && "Unhandled attribute for DW_TAG_member");
break;
+ }
+ }
+ }
+
+ if (strcmp(name, ".dynamic_type") == 0)
+ m_ast.SetDynamicTypeId(compiler_type, member_location_expression);
+ else {
+ if (Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid)))
+ m_ast.AddMemberToObject(compiler_type, ConstString(name),
+ member_type->GetFullCompilerType(),
+ member_byte_offset);
+ }
+ break;
}
- return false;
-}
+ case DW_TAG_inheritance: {
+ DWARFFormValue encoding_uid;
+ uint32_t member_byte_offset = UINT32_MAX;
-void
-DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType &compiler_type)
-{
- DWARFCompileUnit *dwarf_cu = parent_die.GetCU();
- for (DWARFDIE die = parent_die.GetFirstChild(); die.IsValid(); die = die.GetSibling())
- {
- switch (die.Tag())
- {
- case DW_TAG_member:
- {
- const char *name = nullptr;
- DWARFFormValue encoding_uid;
- uint32_t member_byte_offset = UINT32_MAX;
- DWARFExpression member_location_expression(dwarf_cu);
-
- DWARFAttributes attributes;
- size_t num_attributes = die.GetAttributes(attributes);
- for (size_t i = 0; i < num_attributes; ++i)
- {
- DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attributes.AttributeAtIndex(i))
- {
- case DW_AT_name:
- name = form_value.AsCString();
- break;
- case DW_AT_type:
- encoding_uid = form_value;
- break;
- case DW_AT_data_member_location:
- if (form_value.BlockData())
- member_location_expression.CopyOpcodeData(
- form_value.BlockData(), form_value.Unsigned(), dwarf_cu->GetByteOrder(),
- dwarf_cu->GetAddressByteSize());
- else
- member_byte_offset = form_value.Unsigned();
- break;
- case DW_AT_artificial:
- static_cast<void>(form_value.Boolean());
- break;
- case DW_AT_accessibility:
- // TODO: Handle when needed
- break;
- default:
- assert(false && "Unhandled attribute for DW_TAG_member");
- break;
- }
- }
- }
-
- if (strcmp(name, ".dynamic_type") == 0)
- m_ast.SetDynamicTypeId(compiler_type, member_location_expression);
- else
- {
- if (Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid)))
- m_ast.AddMemberToObject(compiler_type, ConstString(name), member_type->GetFullCompilerType(),
- member_byte_offset);
- }
- break;
- }
- case DW_TAG_inheritance:
- {
- DWARFFormValue encoding_uid;
- uint32_t member_byte_offset = UINT32_MAX;
-
- DWARFAttributes attributes;
- size_t num_attributes = die.GetAttributes(attributes);
- for (size_t i = 0; i < num_attributes; ++i)
- {
- DWARFFormValue form_value;
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attributes.AttributeAtIndex(i))
- {
- case DW_AT_type:
- encoding_uid = form_value;
- break;
- case DW_AT_data_member_location:
- member_byte_offset = form_value.Unsigned();
- break;
- case DW_AT_accessibility:
- // In java all base class is public so we can ignore this attribute
- break;
- default:
- assert(false && "Unhandled attribute for DW_TAG_member");
- break;
- }
- }
- }
- if (Type *base_type = die.ResolveTypeUID(DIERef(encoding_uid)))
- m_ast.AddBaseClassToObject(compiler_type, base_type->GetFullCompilerType(), member_byte_offset);
- break;
- }
- default:
- break;
+ DWARFAttributes attributes;
+ size_t num_attributes = die.GetAttributes(attributes);
+ for (size_t i = 0; i < num_attributes; ++i) {
+ DWARFFormValue form_value;
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attributes.AttributeAtIndex(i)) {
+ case DW_AT_type:
+ encoding_uid = form_value;
+ break;
+ case DW_AT_data_member_location:
+ member_byte_offset = form_value.Unsigned();
+ break;
+ case DW_AT_accessibility:
+ // In java all base class is public so we can ignore this attribute
+ break;
+ default:
+ assert(false && "Unhandled attribute for DW_TAG_member");
+ break;
+ }
}
+ }
+ if (Type *base_type = die.ResolveTypeUID(DIERef(encoding_uid)))
+ m_ast.AddBaseClassToObject(compiler_type,
+ base_type->GetFullCompilerType(),
+ member_byte_offset);
+ break;
+ }
+ default:
+ break;
}
+ }
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.h
index 6a7eee75e6f..01d81833d51 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.h
@@ -27,64 +27,55 @@
class DWARFDebugInfoEntry;
class DWARFDIECollection;
-class DWARFASTParserJava : public DWARFASTParser
-{
+class DWARFASTParserJava : public DWARFASTParser {
public:
- DWARFASTParserJava(lldb_private::JavaASTContext &ast);
- ~DWARFASTParserJava() override;
-
- lldb::TypeSP
- ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, const DWARFDIE &die, lldb_private::Log *log,
- bool *type_is_new_ptr) override;
-
- lldb_private::Function *
- ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc, const DWARFDIE &die) override;
-
- bool
- CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
- lldb_private::CompilerType &java_type) override;
-
- lldb_private::CompilerDeclContext
- GetDeclContextForUIDFromDWARF(const DWARFDIE &die) override
- {
- return lldb_private::CompilerDeclContext();
- }
-
- lldb_private::CompilerDeclContext
- GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) override
- {
- return lldb_private::CompilerDeclContext();
- }
-
- lldb_private::CompilerDecl
- GetDeclForUIDFromDWARF(const DWARFDIE &die) override
- {
- return lldb_private::CompilerDecl();
- }
-
- std::vector<DWARFDIE>
- GetDIEForDeclContext(lldb_private::CompilerDeclContext decl_context) override
- {
- return std::vector<DWARFDIE>();
- }
-
- void
- ParseChildMembers(const DWARFDIE &parent_die, lldb_private::CompilerType &class_compiler_type);
+ DWARFASTParserJava(lldb_private::JavaASTContext &ast);
+ ~DWARFASTParserJava() override;
+
+ lldb::TypeSP ParseTypeFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die, lldb_private::Log *log,
+ bool *type_is_new_ptr) override;
+
+ lldb_private::Function *
+ ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die) override;
+
+ bool CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
+ lldb_private::CompilerType &java_type) override;
+
+ lldb_private::CompilerDeclContext
+ GetDeclContextForUIDFromDWARF(const DWARFDIE &die) override {
+ return lldb_private::CompilerDeclContext();
+ }
+
+ lldb_private::CompilerDeclContext
+ GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) override {
+ return lldb_private::CompilerDeclContext();
+ }
+
+ lldb_private::CompilerDecl
+ GetDeclForUIDFromDWARF(const DWARFDIE &die) override {
+ return lldb_private::CompilerDecl();
+ }
+
+ std::vector<DWARFDIE> GetDIEForDeclContext(
+ lldb_private::CompilerDeclContext decl_context) override {
+ return std::vector<DWARFDIE>();
+ }
+
+ void ParseChildMembers(const DWARFDIE &parent_die,
+ lldb_private::CompilerType &class_compiler_type);
private:
- lldb_private::JavaASTContext &m_ast;
+ lldb_private::JavaASTContext &m_ast;
- lldb::TypeSP
- ParseBaseTypeFromDIE(const DWARFDIE &die);
+ lldb::TypeSP ParseBaseTypeFromDIE(const DWARFDIE &die);
- lldb::TypeSP
- ParseArrayTypeFromDIE(const DWARFDIE &die);
+ lldb::TypeSP ParseArrayTypeFromDIE(const DWARFDIE &die);
- lldb::TypeSP
- ParseReferenceTypeFromDIE(const DWARFDIE &die);
+ lldb::TypeSP ParseReferenceTypeFromDIE(const DWARFDIE &die);
- lldb::TypeSP
- ParseClassTypeFromDIE(const DWARFDIE &die, bool &is_new_type);
+ lldb::TypeSP ParseClassTypeFromDIE(const DWARFDIE &die, bool &is_new_type);
};
#endif // SymbolFileDWARF_DWARFASTParserJava_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp
index 989c812f7b1..0cf7ff2b938 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp
@@ -14,219 +14,196 @@
using namespace lldb;
using namespace lldb_private;
-DWARFASTParserOCaml::DWARFASTParserOCaml (OCamlASTContext &ast) :
- m_ast (ast)
-{}
-
-DWARFASTParserOCaml::~DWARFASTParserOCaml () {}
-
-TypeSP
-DWARFASTParserOCaml::ParseBaseTypeFromDIE(const DWARFDIE &die)
-{
- SymbolFileDWARF *dwarf = die.GetDWARF();
- dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
-
- ConstString type_name;
- uint64_t byte_size = 0;
-
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- for (uint32_t i = 0; i < num_attributes; ++i)
- {
- DWARFFormValue form_value;
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- {
- switch (attr)
- {
- case DW_AT_name:
- type_name.SetCString(form_value.AsCString());
- break;
- case DW_AT_byte_size:
- byte_size = form_value.Unsigned();
- break;
- case DW_AT_encoding:
- break;
- default:
- assert(false && "Unsupported attribute for DW_TAG_base_type");
- }
- }
+DWARFASTParserOCaml::DWARFASTParserOCaml(OCamlASTContext &ast) : m_ast(ast) {}
+
+DWARFASTParserOCaml::~DWARFASTParserOCaml() {}
+
+TypeSP DWARFASTParserOCaml::ParseBaseTypeFromDIE(const DWARFDIE &die) {
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
+
+ ConstString type_name;
+ uint64_t byte_size = 0;
+
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ for (uint32_t i = 0; i < num_attributes; ++i) {
+ DWARFFormValue form_value;
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ if (attributes.ExtractFormValueAtIndex(i, form_value)) {
+ switch (attr) {
+ case DW_AT_name:
+ type_name.SetCString(form_value.AsCString());
+ break;
+ case DW_AT_byte_size:
+ byte_size = form_value.Unsigned();
+ break;
+ case DW_AT_encoding:
+ break;
+ default:
+ assert(false && "Unsupported attribute for DW_TAG_base_type");
+ }
}
+ }
- Declaration decl;
- CompilerType compiler_type = m_ast.CreateBaseType(type_name, byte_size);
- return std::make_shared<Type>(die.GetID(), dwarf, type_name, byte_size, nullptr, LLDB_INVALID_UID,
- Type::eEncodingIsUID, decl, compiler_type, Type::eResolveStateFull);
+ Declaration decl;
+ CompilerType compiler_type = m_ast.CreateBaseType(type_name, byte_size);
+ return std::make_shared<Type>(die.GetID(), dwarf, type_name, byte_size,
+ nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID,
+ decl, compiler_type, Type::eResolveStateFull);
}
-lldb::TypeSP
-DWARFASTParserOCaml::ParseTypeFromDWARF (const SymbolContext& sc,
- const DWARFDIE &die,
- Log *log,
- bool *type_is_new_ptr)
-{
- if (type_is_new_ptr)
- *type_is_new_ptr = false;
-
- if (!die)
- return nullptr;
+lldb::TypeSP DWARFASTParserOCaml::ParseTypeFromDWARF(const SymbolContext &sc,
+ const DWARFDIE &die,
+ Log *log,
+ bool *type_is_new_ptr) {
+ if (type_is_new_ptr)
+ *type_is_new_ptr = false;
+
+ if (!die)
+ return nullptr;
+
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+
+ Type *type_ptr = dwarf->m_die_to_type.lookup(die.GetDIE());
+ if (type_ptr == DIE_IS_BEING_PARSED)
+ return nullptr;
+ if (type_ptr != nullptr)
+ return type_ptr->shared_from_this();
+
+ TypeSP type_sp;
+ if (type_is_new_ptr)
+ *type_is_new_ptr = true;
+
+ switch (die.Tag()) {
+ case DW_TAG_base_type: {
+ type_sp = ParseBaseTypeFromDIE(die);
+ break;
+ }
+ case DW_TAG_array_type: {
+ break;
+ }
+ case DW_TAG_class_type: {
+ break;
+ }
+ case DW_TAG_reference_type: {
+ break;
+ }
+ }
+
+ if (!type_sp)
+ return nullptr;
+
+ DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
+ dw_tag_t sc_parent_tag = sc_parent_die.Tag();
+
+ SymbolContextScope *symbol_context_scope = nullptr;
+ if (sc_parent_tag == DW_TAG_compile_unit) {
+ symbol_context_scope = sc.comp_unit;
+ } else if (sc.function != nullptr && sc_parent_die) {
+ symbol_context_scope =
+ sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
+ if (symbol_context_scope == nullptr)
+ symbol_context_scope = sc.function;
+ }
+
+ if (symbol_context_scope != nullptr)
+ type_sp->SetSymbolContextScope(symbol_context_scope);
+
+ dwarf->GetTypeList()->Insert(type_sp);
+ dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+
+ return type_sp;
+}
+Function *DWARFASTParserOCaml::ParseFunctionFromDWARF(const SymbolContext &sc,
+ const DWARFDIE &die) {
+ DWARFRangeList func_ranges;
+ const char *name = NULL;
+ const char *mangled = NULL;
+ int decl_file = 0;
+ int decl_line = 0;
+ int decl_column = 0;
+ int call_file = 0;
+ int call_line = 0;
+ int call_column = 0;
+ DWARFExpression frame_base(die.GetCU());
+
+ Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_LANGUAGE));
+
+ if (die) {
SymbolFileDWARF *dwarf = die.GetDWARF();
-
- Type *type_ptr = dwarf->m_die_to_type.lookup(die.GetDIE());
- if (type_ptr == DIE_IS_BEING_PARSED)
- return nullptr;
- if (type_ptr != nullptr)
- return type_ptr->shared_from_this();
-
- TypeSP type_sp;
- if (type_is_new_ptr)
- *type_is_new_ptr = true;
-
- switch (die.Tag())
- {
- case DW_TAG_base_type:
- {
- type_sp = ParseBaseTypeFromDIE(die);
- break;
- }
- case DW_TAG_array_type:
- {
- break;
- }
- case DW_TAG_class_type:
- {
- break;
- }
- case DW_TAG_reference_type:
- {
- break;
- }
+ if (log) {
+ dwarf->GetObjectFile()->GetModule()->LogMessage(
+ log, "DWARFASTParserOCaml::ParseFunctionFromDWARF (die = 0x%8.8x) %s "
+ "name = '%s')",
+ die.GetOffset(), DW_TAG_value_to_name(die.Tag()), die.GetName());
}
+ }
- if (!type_sp)
- return nullptr;
+ assert(die.Tag() == DW_TAG_subprogram);
- DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
- dw_tag_t sc_parent_tag = sc_parent_die.Tag();
+ if (die.Tag() != DW_TAG_subprogram)
+ return NULL;
- SymbolContextScope *symbol_context_scope = nullptr;
- if (sc_parent_tag == DW_TAG_compile_unit)
- {
- symbol_context_scope = sc.comp_unit;
- }
- else if (sc.function != nullptr && sc_parent_die)
- {
- symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
- if (symbol_context_scope == nullptr)
- symbol_context_scope = sc.function;
+ if (die.GetDIENamesAndRanges(name, mangled, func_ranges, decl_file, decl_line,
+ decl_column, call_file, call_line, call_column,
+ &frame_base)) {
+ 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(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);
}
- if (symbol_context_scope != nullptr)
- type_sp->SetSymbolContextScope(symbol_context_scope);
+ if (func_range.GetBaseAddress().IsValid()) {
+ Mangled func_name;
- dwarf->GetTypeList()->Insert(type_sp);
- dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
+ func_name.SetValue(ConstString(name), true);
- return type_sp;
-}
+ FunctionSP func_sp;
+ std::unique_ptr<Declaration> decl_ap;
+ if (decl_file != 0 || decl_line != 0 || decl_column != 0)
+ decl_ap.reset(new Declaration(
+ sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
+ decl_line, decl_column));
-Function *
-DWARFASTParserOCaml::ParseFunctionFromDWARF (const SymbolContext& sc,
- const DWARFDIE &die)
-{
- DWARFRangeList func_ranges;
- const char *name = NULL;
- const char *mangled = NULL;
- int decl_file = 0;
- int decl_line = 0;
- int decl_column = 0;
- int call_file = 0;
- int call_line = 0;
- int call_column = 0;
- DWARFExpression frame_base(die.GetCU());
-
- Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_LANGUAGE));
-
- if (die)
- {
- SymbolFileDWARF *dwarf = die.GetDWARF();
- if (log)
- {
- dwarf->GetObjectFile()->GetModule()->LogMessage(
- log, "DWARFASTParserOCaml::ParseFunctionFromDWARF (die = 0x%8.8x) %s name = '%s')", die.GetOffset(),
- DW_TAG_value_to_name(die.Tag()), die.GetName());
- }
- }
+ SymbolFileDWARF *dwarf = die.GetDWARF();
+ Type *func_type = dwarf->m_die_to_type.lookup(die.GetDIE());
- assert(die.Tag() == DW_TAG_subprogram);
-
- if (die.Tag() != DW_TAG_subprogram)
- return NULL;
-
- if (die.GetDIENamesAndRanges(name, mangled, func_ranges, decl_file, decl_line, decl_column, call_file, call_line,
- call_column, &frame_base))
- {
- 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(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);
- }
+ assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
+
+ if (dwarf->FixupAddress(func_range.GetBaseAddress())) {
+ const user_id_t func_user_id = die.GetID();
+ func_sp.reset(new Function(sc.comp_unit,
+ func_user_id, // UserID is the DIE offset
+ func_user_id, func_name, func_type,
+ func_range)); // first address range
- if (func_range.GetBaseAddress().IsValid())
- {
- Mangled func_name;
-
- func_name.SetValue(ConstString(name), true);
-
- FunctionSP func_sp;
- std::unique_ptr<Declaration> decl_ap;
- if (decl_file != 0 || decl_line != 0 || decl_column != 0)
- decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), decl_line,
- decl_column));
-
- SymbolFileDWARF *dwarf = die.GetDWARF();
- 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 = die.GetID();
- func_sp.reset(new Function(sc.comp_unit,
- func_user_id, // UserID is the DIE offset
- func_user_id,
- func_name,
- func_type,
- func_range)); // first address range
-
- if (func_sp.get() != NULL)
- {
- if (frame_base.IsValid())
- func_sp->GetFrameBaseExpression() = frame_base;
- sc.comp_unit->AddFunction(func_sp);
- return func_sp.get();
- }
- }
+ if (func_sp.get() != NULL) {
+ if (frame_base.IsValid())
+ func_sp->GetFrameBaseExpression() = frame_base;
+ sc.comp_unit->AddFunction(func_sp);
+ return func_sp.get();
}
+ }
}
+ }
- return NULL;
+ return NULL;
}
lldb_private::CompilerDeclContext
-DWARFASTParserOCaml::GetDeclContextForUIDFromDWARF (const DWARFDIE &die)
-{
- return CompilerDeclContext();
+DWARFASTParserOCaml::GetDeclContextForUIDFromDWARF(const DWARFDIE &die) {
+ return CompilerDeclContext();
}
lldb_private::CompilerDeclContext
-DWARFASTParserOCaml::GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die)
-{
- return CompilerDeclContext();
+DWARFASTParserOCaml::GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) {
+ return CompilerDeclContext();
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h
index 5fbd1f6c7c3..e3b2279ca8f 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h
@@ -5,8 +5,8 @@
#include "DWARFASTParser.h"
#include "DWARFCompileUnit.h"
-#include "DWARFDebugInfo.h"
#include "DWARFDIE.h"
+#include "DWARFDebugInfo.h"
#include "DWARFDefines.h"
#include "SymbolFileDWARF.h"
@@ -15,46 +15,46 @@
class DWARFDebugInfoEntry;
class DWARFDIECollection;
-class DWARFASTParserOCaml : public DWARFASTParser
-{
+class DWARFASTParserOCaml : public DWARFASTParser {
public:
- DWARFASTParserOCaml (lldb_private::OCamlASTContext &ast);
+ DWARFASTParserOCaml(lldb_private::OCamlASTContext &ast);
- virtual ~DWARFASTParserOCaml ();
+ virtual ~DWARFASTParserOCaml();
- lldb::TypeSP
- ParseBaseTypeFromDIE(const DWARFDIE &die);
+ lldb::TypeSP ParseBaseTypeFromDIE(const DWARFDIE &die);
- lldb::TypeSP
- ParseTypeFromDWARF (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die,
- lldb_private::Log *log,
- bool *type_is_new_ptr) override;
+ lldb::TypeSP ParseTypeFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die, lldb_private::Log *log,
+ bool *type_is_new_ptr) override;
- lldb_private::Function *
- ParseFunctionFromDWARF (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die) override;
+ lldb_private::Function *
+ ParseFunctionFromDWARF(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die) override;
- bool
- CompleteTypeFromDWARF (const DWARFDIE &die,
- lldb_private::Type *type,
- lldb_private::CompilerType &compiler_type) override { return false; }
+ bool
+ CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type *type,
+ lldb_private::CompilerType &compiler_type) override {
+ return false;
+ }
- lldb_private::CompilerDecl
- GetDeclForUIDFromDWARF (const DWARFDIE &die) override { return lldb_private::CompilerDecl(); }
+ lldb_private::CompilerDecl
+ GetDeclForUIDFromDWARF(const DWARFDIE &die) override {
+ return lldb_private::CompilerDecl();
+ }
- lldb_private::CompilerDeclContext
- GetDeclContextForUIDFromDWARF (const DWARFDIE &die) override;
+ lldb_private::CompilerDeclContext
+ GetDeclContextForUIDFromDWARF(const DWARFDIE &die) override;
- lldb_private::CompilerDeclContext
- GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die) override;
+ lldb_private::CompilerDeclContext
+ GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) override;
- std::vector<DWARFDIE>
- GetDIEForDeclContext (lldb_private::CompilerDeclContext decl_context) override { return {}; }
+ std::vector<DWARFDIE> GetDIEForDeclContext(
+ lldb_private::CompilerDeclContext decl_context) override {
+ return {};
+ }
protected:
-
- lldb_private::OCamlASTContext &m_ast;
+ lldb_private::OCamlASTContext &m_ast;
};
-#endif // SymbolFileDWARF_DWARFASTParserOCaml_h_
+#endif // SymbolFileDWARF_DWARFASTParserOCaml_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp
index 14fc2cea232..bc49fc5de2c 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp
@@ -15,103 +15,80 @@
using namespace lldb_private;
-DWARFAbbreviationDeclaration::DWARFAbbreviationDeclaration() :
- m_code (InvalidCode),
- m_tag (0),
- m_has_children (0),
- m_attributes()
-{
-}
+DWARFAbbreviationDeclaration::DWARFAbbreviationDeclaration()
+ : m_code(InvalidCode), m_tag(0), m_has_children(0), m_attributes() {}
-DWARFAbbreviationDeclaration::DWARFAbbreviationDeclaration(dw_tag_t tag, uint8_t has_children) :
- m_code (InvalidCode),
- m_tag (tag),
- m_has_children (has_children),
- m_attributes()
-{
-}
+DWARFAbbreviationDeclaration::DWARFAbbreviationDeclaration(dw_tag_t tag,
+ uint8_t has_children)
+ : m_code(InvalidCode), m_tag(tag), m_has_children(has_children),
+ m_attributes() {}
-bool
-DWARFAbbreviationDeclaration::Extract(const DWARFDataExtractor& data, lldb::offset_t* offset_ptr)
-{
- return Extract(data, offset_ptr, data.GetULEB128(offset_ptr));
+bool DWARFAbbreviationDeclaration::Extract(const DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr) {
+ return Extract(data, offset_ptr, data.GetULEB128(offset_ptr));
}
-bool
-DWARFAbbreviationDeclaration::Extract(const DWARFDataExtractor& data, lldb::offset_t *offset_ptr, dw_uleb128_t code)
-{
- m_code = code;
- m_attributes.clear();
- if (m_code)
- {
- m_tag = data.GetULEB128(offset_ptr);
- m_has_children = data.GetU8(offset_ptr);
-
- while (data.ValidOffset(*offset_ptr))
- {
- dw_attr_t attr = data.GetULEB128(offset_ptr);
- dw_form_t form = data.GetULEB128(offset_ptr);
-
- if (attr && form)
- m_attributes.push_back(DWARFAttribute(attr, form));
- else
- break;
- }
-
- return m_tag != 0;
- }
- else
- {
- m_tag = 0;
- m_has_children = 0;
+bool DWARFAbbreviationDeclaration::Extract(const DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr,
+ dw_uleb128_t code) {
+ m_code = code;
+ m_attributes.clear();
+ if (m_code) {
+ m_tag = data.GetULEB128(offset_ptr);
+ m_has_children = data.GetU8(offset_ptr);
+
+ while (data.ValidOffset(*offset_ptr)) {
+ dw_attr_t attr = data.GetULEB128(offset_ptr);
+ dw_form_t form = data.GetULEB128(offset_ptr);
+
+ if (attr && form)
+ m_attributes.push_back(DWARFAttribute(attr, form));
+ else
+ break;
}
- return false;
-}
+ return m_tag != 0;
+ } else {
+ m_tag = 0;
+ m_has_children = 0;
+ }
+ return false;
+}
-void
-DWARFAbbreviationDeclaration::Dump(Stream *s) const
-{
- s->Printf("Debug Abbreviation Declaration: code = 0x%4.4x, tag = %s, has_children = %s\n", m_code, DW_TAG_value_to_name(m_tag), DW_CHILDREN_value_to_name(m_has_children));
+void DWARFAbbreviationDeclaration::Dump(Stream *s) const {
+ s->Printf("Debug Abbreviation Declaration: code = 0x%4.4x, tag = %s, "
+ "has_children = %s\n",
+ m_code, DW_TAG_value_to_name(m_tag),
+ DW_CHILDREN_value_to_name(m_has_children));
- DWARFAttribute::const_iterator pos;
+ DWARFAttribute::const_iterator pos;
- for (pos = m_attributes.begin(); pos != m_attributes.end(); ++pos)
- s->Printf(" attr = %s, form = %s\n", DW_AT_value_to_name(pos->get_attr()), DW_FORM_value_to_name(pos->get_form()));
+ for (pos = m_attributes.begin(); pos != m_attributes.end(); ++pos)
+ s->Printf(" attr = %s, form = %s\n",
+ DW_AT_value_to_name(pos->get_attr()),
+ DW_FORM_value_to_name(pos->get_form()));
- s->Printf("\n");
+ s->Printf("\n");
}
-
-
-bool
-DWARFAbbreviationDeclaration::IsValid()
-{
- return m_code != 0 && m_tag != 0;
+bool DWARFAbbreviationDeclaration::IsValid() {
+ return m_code != 0 && m_tag != 0;
}
-
-
uint32_t
-DWARFAbbreviationDeclaration::FindAttributeIndex(dw_attr_t attr) const
-{
- uint32_t i;
- const uint32_t kNumAttributes = m_attributes.size();
- for (i = 0; i < kNumAttributes; ++i)
- {
- if (m_attributes[i].get_attr() == attr)
- return i;
- }
- return DW_INVALID_INDEX;
+DWARFAbbreviationDeclaration::FindAttributeIndex(dw_attr_t attr) const {
+ uint32_t i;
+ const uint32_t kNumAttributes = m_attributes.size();
+ for (i = 0; i < kNumAttributes; ++i) {
+ if (m_attributes[i].get_attr() == attr)
+ return i;
+ }
+ return DW_INVALID_INDEX;
}
-
-bool
-DWARFAbbreviationDeclaration::operator == (const DWARFAbbreviationDeclaration& rhs) const
-{
- return Tag() == rhs.Tag()
- && HasChildren() == rhs.HasChildren()
- && Attributes() == rhs.Attributes();
+bool DWARFAbbreviationDeclaration::
+operator==(const DWARFAbbreviationDeclaration &rhs) const {
+ return Tag() == rhs.Tag() && HasChildren() == rhs.HasChildren() &&
+ Attributes() == rhs.Attributes();
}
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h
index 0ef153a704c..28e713f9beb 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h
@@ -10,63 +10,66 @@
#ifndef liblldb_DWARFAbbreviationDeclaration_h_
#define liblldb_DWARFAbbreviationDeclaration_h_
-#include "SymbolFileDWARF.h"
#include "DWARFAttribute.h"
+#include "SymbolFileDWARF.h"
class DWARFCompileUnit;
-class DWARFAbbreviationDeclaration
-{
+class DWARFAbbreviationDeclaration {
public:
- enum { InvalidCode = 0 };
- DWARFAbbreviationDeclaration();
+ enum { InvalidCode = 0 };
+ DWARFAbbreviationDeclaration();
+
+ // For hand crafting an abbreviation declaration
+ DWARFAbbreviationDeclaration(dw_tag_t tag, uint8_t has_children);
+ void AddAttribute(const DWARFAttribute &attr) {
+ m_attributes.push_back(attr);
+ }
- // For hand crafting an abbreviation declaration
- DWARFAbbreviationDeclaration(dw_tag_t tag, uint8_t has_children);
- void AddAttribute(const DWARFAttribute& attr)
- {
- m_attributes.push_back(attr);
- }
+ dw_uleb128_t Code() const { return m_code; }
+ void SetCode(dw_uleb128_t code) { m_code = code; }
+ dw_tag_t Tag() const { return m_tag; }
+ bool HasChildren() const { return m_has_children; }
+ size_t NumAttributes() const { return m_attributes.size(); }
+ dw_attr_t GetAttrByIndex(uint32_t idx) const {
+ return m_attributes.size() > idx ? m_attributes[idx].get_attr() : 0;
+ }
+ dw_form_t GetFormByIndex(uint32_t idx) const {
+ return m_attributes.size() > idx ? m_attributes[idx].get_form() : 0;
+ }
+ bool GetAttrAndFormByIndex(uint32_t idx, dw_attr_t &attr,
+ dw_form_t &form) const {
+ if (m_attributes.size() > idx) {
+ m_attributes[idx].get(attr, form);
+ return true;
+ }
+ attr = form = 0;
+ return false;
+ }
- dw_uleb128_t Code() const { return m_code; }
- void SetCode(dw_uleb128_t code) { m_code = code; }
- dw_tag_t Tag() const { return m_tag; }
- bool HasChildren() const { return m_has_children; }
- size_t NumAttributes() const { return m_attributes.size(); }
- dw_attr_t GetAttrByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_attr() : 0; }
- dw_form_t GetFormByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_form() : 0; }
- bool GetAttrAndFormByIndex(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const
- {
- if (m_attributes.size() > idx)
- {
- m_attributes[idx].get(attr, form);
- return true;
- }
- attr = form = 0;
- return false;
- }
+ // idx is assumed to be valid when calling GetAttrAndFormByIndexUnchecked()
+ void GetAttrAndFormByIndexUnchecked(uint32_t idx, dw_attr_t &attr,
+ dw_form_t &form) const {
+ m_attributes[idx].get(attr, form);
+ }
+ dw_form_t GetFormByIndexUnchecked(uint32_t idx) const {
+ return m_attributes[idx].get_form();
+ }
+ uint32_t FindAttributeIndex(dw_attr_t attr) const;
+ bool Extract(const lldb_private::DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr);
+ bool Extract(const lldb_private::DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr, dw_uleb128_t code);
+ bool IsValid();
+ void Dump(lldb_private::Stream *s) const;
+ bool operator==(const DWARFAbbreviationDeclaration &rhs) const;
+ const DWARFAttribute::collection &Attributes() const { return m_attributes; }
- // idx is assumed to be valid when calling GetAttrAndFormByIndexUnchecked()
- void GetAttrAndFormByIndexUnchecked(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const
- {
- m_attributes[idx].get(attr, form);
- }
- dw_form_t GetFormByIndexUnchecked (uint32_t idx) const
- {
- return m_attributes[idx].get_form();
- }
- uint32_t FindAttributeIndex(dw_attr_t attr) const;
- bool Extract(const lldb_private::DWARFDataExtractor& data, lldb::offset_t *offset_ptr);
- bool Extract(const lldb_private::DWARFDataExtractor& data, lldb::offset_t *offset_ptr, dw_uleb128_t code);
- bool IsValid();
- void Dump(lldb_private::Stream *s) const;
- bool operator == (const DWARFAbbreviationDeclaration& rhs) const;
- const DWARFAttribute::collection& Attributes() const { return m_attributes; }
protected:
- dw_uleb128_t m_code;
- dw_tag_t m_tag;
- uint8_t m_has_children;
- DWARFAttribute::collection m_attributes;
+ dw_uleb128_t m_code;
+ dw_tag_t m_tag;
+ uint8_t m_has_children;
+ DWARFAttribute::collection m_attributes;
};
-#endif // liblldb_DWARFAbbreviationDeclaration_h_
+#endif // liblldb_DWARFAbbreviationDeclaration_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp
index a522bcb3528..d2573f3742b 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp
@@ -8,83 +8,67 @@
//===----------------------------------------------------------------------===//
#include "DWARFAttribute.h"
-#include "DWARFDebugInfo.h"
#include "DWARFCompileUnit.h"
+#include "DWARFDebugInfo.h"
-DWARFAttributes::DWARFAttributes() :
- m_infos()
-{
-}
+DWARFAttributes::DWARFAttributes() : m_infos() {}
-DWARFAttributes::~DWARFAttributes()
-{
-}
+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;
+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);
+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::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::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);
+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::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;
+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;
}
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h
index f5ca9cce525..317e710e6d9 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h
@@ -10,72 +10,76 @@
#ifndef SymbolFileDWARF_DWARFAttribute_h_
#define SymbolFileDWARF_DWARFAttribute_h_
-#include "llvm/ADT/SmallVector.h"
#include "DWARFDefines.h"
+#include "llvm/ADT/SmallVector.h"
#include <vector>
class DWARFCompileUnit;
class DWARFFormValue;
-class DWARFAttribute
-{
+class DWARFAttribute {
public:
- DWARFAttribute(dw_attr_t attr, dw_form_t form) :
- m_attr (attr),
- m_form (form)
- {
- }
+ DWARFAttribute(dw_attr_t attr, dw_form_t form) : m_attr(attr), m_form(form) {}
- 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
- {
- attr = m_attr;
- form = m_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;
+ 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 {
+ attr = m_attr;
+ form = m_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:
- dw_attr_t m_attr;
- dw_form_t m_form;
+ dw_attr_t m_attr;
+ dw_form_t m_form;
};
-
-class DWARFAttributes
-{
+class DWARFAttributes {
public:
- DWARFAttributes();
- ~DWARFAttributes();
+ 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(); }
+ 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;
+ 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_
+#endif // SymbolFileDWARF_DWARFAttribute_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
index 6ef0d0ac045..5257e943c61 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
@@ -9,6 +9,7 @@
#include "DWARFCompileUnit.h"
+#include "Plugins/Language/ObjC/ObjCLanguage.h"
#include "lldb/Core/Mangled.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/Stream.h"
@@ -18,130 +19,108 @@
#include "lldb/Symbol/CompileUnit.h"
#include "lldb/Symbol/LineTable.h"
#include "lldb/Symbol/ObjectFile.h"
-#include "Plugins/Language/ObjC/ObjCLanguage.h"
+#include "DWARFDIECollection.h"
#include "DWARFDebugAbbrev.h"
#include "DWARFDebugAranges.h"
#include "DWARFDebugInfo.h"
-#include "DWARFDIECollection.h"
#include "DWARFFormValue.h"
#include "LogChannelDWARF.h"
#include "NameToDIE.h"
#include "SymbolFileDWARF.h"
-#include "SymbolFileDWARFDwo.h"
#include "SymbolFileDWARFDebugMap.h"
+#include "SymbolFileDWARFDwo.h"
using namespace lldb;
using namespace lldb_private;
using namespace std;
-
extern int g_verbose;
-DWARFCompileUnit::DWARFCompileUnit(SymbolFileDWARF* dwarf2Data) :
- m_dwarf2Data (dwarf2Data),
- m_abbrevs (NULL),
- m_user_data (NULL),
- m_die_array (),
- m_func_aranges_ap (),
- m_base_addr (0),
- m_offset (DW_INVALID_OFFSET),
- m_length (0),
- m_version (0),
- m_addr_size (DWARFCompileUnit::GetDefaultAddressSize()),
- m_producer (eProducerInvalid),
- m_producer_version_major (0),
- m_producer_version_minor (0),
- m_producer_version_update (0),
- m_language_type (eLanguageTypeUnknown),
- m_is_dwarf64 (false),
- m_is_optimized (eLazyBoolCalculate),
- m_addr_base (0),
- m_base_obj_offset (DW_INVALID_OFFSET)
-{
+DWARFCompileUnit::DWARFCompileUnit(SymbolFileDWARF *dwarf2Data)
+ : m_dwarf2Data(dwarf2Data), m_abbrevs(NULL), m_user_data(NULL),
+ m_die_array(), m_func_aranges_ap(), m_base_addr(0),
+ m_offset(DW_INVALID_OFFSET), m_length(0), m_version(0),
+ m_addr_size(DWARFCompileUnit::GetDefaultAddressSize()),
+ m_producer(eProducerInvalid), m_producer_version_major(0),
+ m_producer_version_minor(0), m_producer_version_update(0),
+ m_language_type(eLanguageTypeUnknown), m_is_dwarf64(false),
+ m_is_optimized(eLazyBoolCalculate), m_addr_base(0),
+ m_base_obj_offset(DW_INVALID_OFFSET) {}
+
+DWARFCompileUnit::~DWARFCompileUnit() {}
+
+void DWARFCompileUnit::Clear() {
+ m_offset = DW_INVALID_OFFSET;
+ m_length = 0;
+ m_version = 0;
+ m_abbrevs = NULL;
+ m_addr_size = DWARFCompileUnit::GetDefaultAddressSize();
+ m_base_addr = 0;
+ m_die_array.clear();
+ m_func_aranges_ap.reset();
+ m_user_data = NULL;
+ m_producer = eProducerInvalid;
+ m_language_type = eLanguageTypeUnknown;
+ m_is_dwarf64 = false;
+ m_is_optimized = eLazyBoolCalculate;
+ m_addr_base = 0;
+ m_base_obj_offset = DW_INVALID_OFFSET;
}
-DWARFCompileUnit::~DWARFCompileUnit()
-{}
-
-void
-DWARFCompileUnit::Clear()
-{
- m_offset = DW_INVALID_OFFSET;
- m_length = 0;
- m_version = 0;
- m_abbrevs = NULL;
- m_addr_size = DWARFCompileUnit::GetDefaultAddressSize();
- m_base_addr = 0;
- m_die_array.clear();
- m_func_aranges_ap.reset();
- m_user_data = NULL;
- m_producer = eProducerInvalid;
- m_language_type = eLanguageTypeUnknown;
- m_is_dwarf64 = false;
- m_is_optimized = eLazyBoolCalculate;
- m_addr_base = 0;
- m_base_obj_offset = DW_INVALID_OFFSET;
-}
+bool DWARFCompileUnit::Extract(const DWARFDataExtractor &debug_info,
+ lldb::offset_t *offset_ptr) {
+ Clear();
-bool
-DWARFCompileUnit::Extract(const DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr)
-{
- Clear();
-
- m_offset = *offset_ptr;
-
- if (debug_info.ValidOffset(*offset_ptr))
- {
- dw_offset_t abbr_offset;
- const DWARFDebugAbbrev *abbr = m_dwarf2Data->DebugAbbrev();
- m_length = debug_info.GetDWARFInitialLength(offset_ptr);
- m_is_dwarf64 = debug_info.IsDWARF64();
- m_version = debug_info.GetU16(offset_ptr);
- abbr_offset = debug_info.GetDWARFOffset(offset_ptr);
- m_addr_size = debug_info.GetU8 (offset_ptr);
-
- bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset()-1);
- bool version_OK = SymbolFileDWARF::SupportedVersion(m_version);
- bool abbr_offset_OK = m_dwarf2Data->get_debug_abbrev_data().ValidOffset(abbr_offset);
- bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8));
-
- if (length_OK && version_OK && addr_size_OK && abbr_offset_OK && abbr != NULL)
- {
- m_abbrevs = abbr->GetAbbreviationDeclarationSet(abbr_offset);
- return true;
- }
+ m_offset = *offset_ptr;
- // reset the offset to where we tried to parse from if anything went wrong
- *offset_ptr = m_offset;
- }
-
- return false;
-}
+ if (debug_info.ValidOffset(*offset_ptr)) {
+ dw_offset_t abbr_offset;
+ const DWARFDebugAbbrev *abbr = m_dwarf2Data->DebugAbbrev();
+ m_length = debug_info.GetDWARFInitialLength(offset_ptr);
+ m_is_dwarf64 = debug_info.IsDWARF64();
+ m_version = debug_info.GetU16(offset_ptr);
+ abbr_offset = debug_info.GetDWARFOffset(offset_ptr);
+ m_addr_size = debug_info.GetU8(offset_ptr);
+ bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset() - 1);
+ bool version_OK = SymbolFileDWARF::SupportedVersion(m_version);
+ bool abbr_offset_OK =
+ m_dwarf2Data->get_debug_abbrev_data().ValidOffset(abbr_offset);
+ bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8));
-void
-DWARFCompileUnit::ClearDIEs(bool keep_compile_unit_die)
-{
- if (m_die_array.size() > 1)
- {
- // std::vectors never get any smaller when resized to a smaller size,
- // or when clear() or erase() are called, the size will report that it
- // is smaller, but the memory allocated remains intact (call capacity()
- // to see this). So we need to create a temporary vector and swap the
- // contents which will cause just the internal pointers to be swapped
- // so that when "tmp_array" goes out of scope, it will destroy the
- // contents.
-
- // Save at least the compile unit DIE
- DWARFDebugInfoEntry::collection tmp_array;
- m_die_array.swap(tmp_array);
- if (keep_compile_unit_die)
- m_die_array.push_back(tmp_array.front());
+ if (length_OK && version_OK && addr_size_OK && abbr_offset_OK &&
+ abbr != NULL) {
+ m_abbrevs = abbr->GetAbbreviationDeclarationSet(abbr_offset);
+ return true;
}
- if (m_dwo_symbol_file)
- m_dwo_symbol_file->GetCompileUnit()->ClearDIEs(keep_compile_unit_die);
+ // reset the offset to where we tried to parse from if anything went wrong
+ *offset_ptr = m_offset;
+ }
+
+ return false;
+}
+
+void DWARFCompileUnit::ClearDIEs(bool keep_compile_unit_die) {
+ if (m_die_array.size() > 1) {
+ // std::vectors never get any smaller when resized to a smaller size,
+ // or when clear() or erase() are called, the size will report that it
+ // is smaller, but the memory allocated remains intact (call capacity()
+ // to see this). So we need to create a temporary vector and swap the
+ // contents which will cause just the internal pointers to be swapped
+ // so that when "tmp_array" goes out of scope, it will destroy the
+ // contents.
+
+ // Save at least the compile unit DIE
+ DWARFDebugInfoEntry::collection tmp_array;
+ m_die_array.swap(tmp_array);
+ if (keep_compile_unit_die)
+ m_die_array.push_back(tmp_array.front());
+ }
+
+ if (m_dwo_symbol_file)
+ m_dwo_symbol_file->GetCompileUnit()->ClearDIEs(keep_compile_unit_die);
}
//----------------------------------------------------------------------
@@ -150,454 +129,420 @@ DWARFCompileUnit::ClearDIEs(bool keep_compile_unit_die)
// Parses a compile unit and indexes its DIEs if it hasn't already been
// done.
//----------------------------------------------------------------------
-size_t
-DWARFCompileUnit::ExtractDIEsIfNeeded (bool cu_die_only)
-{
- const size_t initial_die_array_size = m_die_array.size();
- if ((cu_die_only && initial_die_array_size > 0) || initial_die_array_size > 1)
- return 0; // Already parsed
-
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "%8.8x: DWARFCompileUnit::ExtractDIEsIfNeeded( cu_die_only = %i )",
- m_offset,
- cu_die_only);
-
- // Set the offset to that of the first DIE and calculate the start of the
- // next compilation unit header.
- lldb::offset_t offset = GetFirstDIEOffset();
- lldb::offset_t next_cu_offset = GetNextCompileUnitOffset();
-
- DWARFDebugInfoEntry die;
- // Keep a flat array of the DIE for binary lookup by DIE offset
- if (!cu_die_only)
- {
- Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO | DWARF_LOG_LOOKUPS));
- if (log)
- {
- m_dwarf2Data->GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
- "DWARFCompileUnit::ExtractDIEsIfNeeded () for compile unit at .debug_info[0x%8.8x]",
- GetOffset());
- }
+size_t DWARFCompileUnit::ExtractDIEsIfNeeded(bool cu_die_only) {
+ const size_t initial_die_array_size = m_die_array.size();
+ if ((cu_die_only && initial_die_array_size > 0) || initial_die_array_size > 1)
+ return 0; // Already parsed
+
+ Timer scoped_timer(
+ LLVM_PRETTY_FUNCTION,
+ "%8.8x: DWARFCompileUnit::ExtractDIEsIfNeeded( cu_die_only = %i )",
+ m_offset, cu_die_only);
+
+ // Set the offset to that of the first DIE and calculate the start of the
+ // next compilation unit header.
+ lldb::offset_t offset = GetFirstDIEOffset();
+ lldb::offset_t next_cu_offset = GetNextCompileUnitOffset();
+
+ DWARFDebugInfoEntry die;
+ // Keep a flat array of the DIE for binary lookup by DIE offset
+ if (!cu_die_only) {
+ Log *log(
+ LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO | DWARF_LOG_LOOKUPS));
+ if (log) {
+ m_dwarf2Data->GetObjectFile()->GetModule()->LogMessageVerboseBacktrace(
+ log, "DWARFCompileUnit::ExtractDIEsIfNeeded () for compile unit at "
+ ".debug_info[0x%8.8x]",
+ GetOffset());
}
-
- uint32_t depth = 0;
- // We are in our compile unit, parse starting at the offset
- // we were told to parse
- const DWARFDataExtractor& debug_info_data = m_dwarf2Data->get_debug_info_data();
- std::vector<uint32_t> die_index_stack;
- die_index_stack.reserve(32);
- die_index_stack.push_back(0);
- bool prev_die_had_children = false;
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize(), m_is_dwarf64);
- while (offset < next_cu_offset &&
- die.FastExtract (debug_info_data, this, fixed_form_sizes, &offset))
- {
-// if (log)
-// log->Printf("0x%8.8x: %*.*s%s%s",
-// die.GetOffset(),
-// depth * 2, depth * 2, "",
-// DW_TAG_value_to_name (die.Tag()),
-// die.HasChildren() ? " *" : "");
-
- const bool null_die = die.IsNULL();
- if (depth == 0)
- {
- if (initial_die_array_size == 0)
- AddCompileUnitDIE(die);
- uint64_t base_addr = die.GetAttributeValueAsAddress(m_dwarf2Data, this, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
- if (base_addr == LLDB_INVALID_ADDRESS)
- base_addr = die.GetAttributeValueAsAddress(m_dwarf2Data, this, DW_AT_entry_pc, 0);
- SetBaseAddress (base_addr);
- if (cu_die_only)
- return 1;
- }
- else
- {
- if (null_die)
- {
- if (prev_die_had_children)
- {
- // This will only happen if a DIE says is has children
- // but all it contains is a NULL tag. Since we are removing
- // the NULL DIEs from the list (saves up to 25% in C++ code),
- // we need a way to let the DIE know that it actually doesn't
- // have children.
- if (!m_die_array.empty())
- m_die_array.back().SetEmptyChildren(true);
- }
- }
- else
- {
- die.SetParentIndex(m_die_array.size() - die_index_stack[depth-1]);
-
- if (die_index_stack.back())
- m_die_array[die_index_stack.back()].SetSiblingIndex(m_die_array.size()-die_index_stack.back());
-
- // Only push the DIE if it isn't a NULL DIE
- m_die_array.push_back(die);
- }
+ }
+
+ uint32_t depth = 0;
+ // We are in our compile unit, parse starting at the offset
+ // we were told to parse
+ const DWARFDataExtractor &debug_info_data =
+ m_dwarf2Data->get_debug_info_data();
+ std::vector<uint32_t> die_index_stack;
+ die_index_stack.reserve(32);
+ die_index_stack.push_back(0);
+ bool prev_die_had_children = false;
+ DWARFFormValue::FixedFormSizes fixed_form_sizes =
+ DWARFFormValue::GetFixedFormSizesForAddressSize(GetAddressByteSize(),
+ m_is_dwarf64);
+ while (offset < next_cu_offset &&
+ die.FastExtract(debug_info_data, this, fixed_form_sizes, &offset)) {
+ // if (log)
+ // log->Printf("0x%8.8x: %*.*s%s%s",
+ // die.GetOffset(),
+ // depth * 2, depth * 2, "",
+ // DW_TAG_value_to_name (die.Tag()),
+ // die.HasChildren() ? " *" : "");
+
+ const bool null_die = die.IsNULL();
+ if (depth == 0) {
+ if (initial_die_array_size == 0)
+ AddCompileUnitDIE(die);
+ uint64_t base_addr = die.GetAttributeValueAsAddress(
+ m_dwarf2Data, this, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
+ if (base_addr == LLDB_INVALID_ADDRESS)
+ base_addr = die.GetAttributeValueAsAddress(m_dwarf2Data, this,
+ DW_AT_entry_pc, 0);
+ SetBaseAddress(base_addr);
+ if (cu_die_only)
+ return 1;
+ } else {
+ if (null_die) {
+ if (prev_die_had_children) {
+ // This will only happen if a DIE says is has children
+ // but all it contains is a NULL tag. Since we are removing
+ // the NULL DIEs from the list (saves up to 25% in C++ code),
+ // we need a way to let the DIE know that it actually doesn't
+ // have children.
+ if (!m_die_array.empty())
+ m_die_array.back().SetEmptyChildren(true);
}
+ } else {
+ die.SetParentIndex(m_die_array.size() - die_index_stack[depth - 1]);
- if (null_die)
- {
- // NULL DIE.
- if (!die_index_stack.empty())
- die_index_stack.pop_back();
-
- if (depth > 0)
- --depth;
- if (depth == 0)
- break; // We are done with this compile unit!
-
- prev_die_had_children = false;
- }
- else
- {
- die_index_stack.back() = m_die_array.size() - 1;
- // Normal DIE
- const bool die_has_children = die.HasChildren();
- if (die_has_children)
- {
- die_index_stack.push_back(0);
- ++depth;
- }
- prev_die_had_children = die_has_children;
- }
- }
+ if (die_index_stack.back())
+ m_die_array[die_index_stack.back()].SetSiblingIndex(
+ m_die_array.size() - die_index_stack.back());
- // Give a little bit of info if we encounter corrupt DWARF (our offset
- // should always terminate at or before the start of the next compilation
- // unit header).
- if (offset > next_cu_offset)
- {
- m_dwarf2Data->GetObjectFile()->GetModule()->ReportWarning ("DWARF compile unit extends beyond its bounds cu 0x%8.8x at 0x%8.8" PRIx64 "\n",
- GetOffset(),
- offset);
+ // Only push the DIE if it isn't a NULL DIE
+ m_die_array.push_back(die);
+ }
}
- // Since std::vector objects will double their size, we really need to
- // make a new array with the perfect size so we don't end up wasting
- // space. So here we copy and swap to make sure we don't have any extra
- // memory taken up.
-
- if (m_die_array.size () < m_die_array.capacity())
- {
- DWARFDebugInfoEntry::collection exact_size_die_array (m_die_array.begin(), m_die_array.end());
- exact_size_die_array.swap (m_die_array);
- }
- Log *verbose_log (LogChannelDWARF::GetLogIfAll (DWARF_LOG_DEBUG_INFO | DWARF_LOG_VERBOSE));
- if (verbose_log)
- {
- StreamString strm;
- Dump(&strm);
- if (m_die_array.empty())
- strm.Printf("error: no DIE for compile unit");
- else
- m_die_array[0].Dump(m_dwarf2Data, this, strm, UINT32_MAX);
- verbose_log->PutCString (strm.GetString().c_str());
+ if (null_die) {
+ // NULL DIE.
+ if (!die_index_stack.empty())
+ die_index_stack.pop_back();
+
+ if (depth > 0)
+ --depth;
+ if (depth == 0)
+ break; // We are done with this compile unit!
+
+ prev_die_had_children = false;
+ } else {
+ die_index_stack.back() = m_die_array.size() - 1;
+ // Normal DIE
+ const bool die_has_children = die.HasChildren();
+ if (die_has_children) {
+ die_index_stack.push_back(0);
+ ++depth;
+ }
+ prev_die_had_children = die_has_children;
}
+ }
+
+ // Give a little bit of info if we encounter corrupt DWARF (our offset
+ // should always terminate at or before the start of the next compilation
+ // unit header).
+ if (offset > next_cu_offset) {
+ m_dwarf2Data->GetObjectFile()->GetModule()->ReportWarning(
+ "DWARF compile unit extends beyond its bounds cu 0x%8.8x at "
+ "0x%8.8" PRIx64 "\n",
+ GetOffset(), offset);
+ }
+
+ // Since std::vector objects will double their size, we really need to
+ // make a new array with the perfect size so we don't end up wasting
+ // space. So here we copy and swap to make sure we don't have any extra
+ // memory taken up.
+
+ if (m_die_array.size() < m_die_array.capacity()) {
+ DWARFDebugInfoEntry::collection exact_size_die_array(m_die_array.begin(),
+ m_die_array.end());
+ exact_size_die_array.swap(m_die_array);
+ }
+ Log *verbose_log(
+ LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO | DWARF_LOG_VERBOSE));
+ if (verbose_log) {
+ StreamString strm;
+ Dump(&strm);
+ if (m_die_array.empty())
+ strm.Printf("error: no DIE for compile unit");
+ else
+ m_die_array[0].Dump(m_dwarf2Data, this, strm, UINT32_MAX);
+ verbose_log->PutCString(strm.GetString().c_str());
+ }
- if (!m_dwo_symbol_file)
- return m_die_array.size();
+ if (!m_dwo_symbol_file)
+ return m_die_array.size();
- DWARFCompileUnit* dwo_cu = m_dwo_symbol_file->GetCompileUnit();
- size_t dwo_die_count = dwo_cu->ExtractDIEsIfNeeded(cu_die_only);
- return m_die_array.size() + dwo_die_count - 1; // We have 2 CU die, but we want to count it only as one
+ DWARFCompileUnit *dwo_cu = m_dwo_symbol_file->GetCompileUnit();
+ size_t dwo_die_count = dwo_cu->ExtractDIEsIfNeeded(cu_die_only);
+ return m_die_array.size() + dwo_die_count -
+ 1; // We have 2 CU die, but we want to count it only as one
}
-void
-DWARFCompileUnit::AddCompileUnitDIE(DWARFDebugInfoEntry& die)
-{
- assert (m_die_array.empty() && "Compile unit DIE already added");
- AddDIE(die);
-
- const DWARFDebugInfoEntry &cu_die = m_die_array.front();
- std::unique_ptr<SymbolFileDWARFDwo> dwo_symbol_file = m_dwarf2Data->GetDwoSymbolFileForCompileUnit(*this, cu_die);
- if (!dwo_symbol_file)
- return;
-
- DWARFCompileUnit* dwo_cu = dwo_symbol_file->GetCompileUnit();
- if (!dwo_cu)
- return; // Can't fetch the compile unit from the dwo file.
-
- DWARFDIE dwo_cu_die = dwo_cu->GetCompileUnitDIEOnly();
- if (!dwo_cu_die.IsValid())
- return; // Can't fetch the compile unit DIE from the dwo file.
-
- uint64_t main_dwo_id = cu_die.GetAttributeValueAsUnsigned(m_dwarf2Data,
- this,
- DW_AT_GNU_dwo_id,
- 0);
- uint64_t sub_dwo_id = dwo_cu_die.GetAttributeValueAsUnsigned(DW_AT_GNU_dwo_id, 0);
- if (main_dwo_id != sub_dwo_id)
- return; // The 2 dwo ID isn't match. Don't use the dwo file as it belongs to a differectn compilation.
-
- m_dwo_symbol_file = std::move(dwo_symbol_file);
-
- dw_addr_t addr_base = cu_die.GetAttributeValueAsUnsigned(m_dwarf2Data,
- this,
- DW_AT_GNU_addr_base,
- 0);
- dwo_cu->SetAddrBase(addr_base, m_offset);
+void DWARFCompileUnit::AddCompileUnitDIE(DWARFDebugInfoEntry &die) {
+ assert(m_die_array.empty() && "Compile unit DIE already added");
+ AddDIE(die);
+
+ const DWARFDebugInfoEntry &cu_die = m_die_array.front();
+ std::unique_ptr<SymbolFileDWARFDwo> dwo_symbol_file =
+ m_dwarf2Data->GetDwoSymbolFileForCompileUnit(*this, cu_die);
+ if (!dwo_symbol_file)
+ return;
+
+ DWARFCompileUnit *dwo_cu = dwo_symbol_file->GetCompileUnit();
+ if (!dwo_cu)
+ return; // Can't fetch the compile unit from the dwo file.
+
+ DWARFDIE dwo_cu_die = dwo_cu->GetCompileUnitDIEOnly();
+ if (!dwo_cu_die.IsValid())
+ return; // Can't fetch the compile unit DIE from the dwo file.
+
+ uint64_t main_dwo_id = cu_die.GetAttributeValueAsUnsigned(
+ m_dwarf2Data, this, DW_AT_GNU_dwo_id, 0);
+ uint64_t sub_dwo_id =
+ dwo_cu_die.GetAttributeValueAsUnsigned(DW_AT_GNU_dwo_id, 0);
+ if (main_dwo_id != sub_dwo_id)
+ return; // The 2 dwo ID isn't match. Don't use the dwo file as it belongs to
+ // a differectn compilation.
+
+ m_dwo_symbol_file = std::move(dwo_symbol_file);
+
+ dw_addr_t addr_base = cu_die.GetAttributeValueAsUnsigned(
+ m_dwarf2Data, this, DW_AT_GNU_addr_base, 0);
+ dwo_cu->SetAddrBase(addr_base, m_offset);
}
-dw_offset_t
-DWARFCompileUnit::GetAbbrevOffset() const
-{
- return m_abbrevs ? m_abbrevs->GetOffset() : DW_INVALID_OFFSET;
+dw_offset_t DWARFCompileUnit::GetAbbrevOffset() const {
+ return m_abbrevs ? m_abbrevs->GetOffset() : DW_INVALID_OFFSET;
}
-
-
-bool
-DWARFCompileUnit::Verify(Stream *s) const
-{
- const DWARFDataExtractor& debug_info = m_dwarf2Data->get_debug_info_data();
- bool valid_offset = debug_info.ValidOffset(m_offset);
- bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset()-1);
- bool version_OK = SymbolFileDWARF::SupportedVersion(m_version);
- bool abbr_offset_OK = m_dwarf2Data->get_debug_abbrev_data().ValidOffset(GetAbbrevOffset());
- bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8));
- bool verbose = s->GetVerbose();
- if (valid_offset && length_OK && version_OK && addr_size_OK && abbr_offset_OK)
- {
- if (verbose)
- s->Printf(" 0x%8.8x: OK\n", m_offset);
- return true;
- }
- else
- {
- s->Printf(" 0x%8.8x: ", m_offset);
-
- m_dwarf2Data->get_debug_info_data().Dump (s, m_offset, lldb::eFormatHex, 1, Size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
- s->EOL();
- if (valid_offset)
- {
- if (!length_OK)
- s->Printf(" The length (0x%8.8x) for this compile unit is too large for the .debug_info provided.\n", m_length);
- if (!version_OK)
- s->Printf(" The 16 bit compile unit header version is not supported.\n");
- if (!abbr_offset_OK)
- s->Printf(" The offset into the .debug_abbrev section (0x%8.8x) is not valid.\n", GetAbbrevOffset());
- if (!addr_size_OK)
- s->Printf(" The address size is unsupported: 0x%2.2x\n", m_addr_size);
- }
- else
- s->Printf(" The start offset of the compile unit header in the .debug_info is invalid.\n");
- }
- return false;
+bool DWARFCompileUnit::Verify(Stream *s) const {
+ const DWARFDataExtractor &debug_info = m_dwarf2Data->get_debug_info_data();
+ bool valid_offset = debug_info.ValidOffset(m_offset);
+ bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset() - 1);
+ bool version_OK = SymbolFileDWARF::SupportedVersion(m_version);
+ bool abbr_offset_OK =
+ m_dwarf2Data->get_debug_abbrev_data().ValidOffset(GetAbbrevOffset());
+ bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8));
+ bool verbose = s->GetVerbose();
+ if (valid_offset && length_OK && version_OK && addr_size_OK &&
+ abbr_offset_OK) {
+ if (verbose)
+ s->Printf(" 0x%8.8x: OK\n", m_offset);
+ return true;
+ } else {
+ s->Printf(" 0x%8.8x: ", m_offset);
+
+ m_dwarf2Data->get_debug_info_data().Dump(s, m_offset, lldb::eFormatHex, 1,
+ Size(), 32, LLDB_INVALID_ADDRESS,
+ 0, 0);
+ s->EOL();
+ if (valid_offset) {
+ if (!length_OK)
+ s->Printf(" The length (0x%8.8x) for this compile unit is too "
+ "large for the .debug_info provided.\n",
+ m_length);
+ if (!version_OK)
+ s->Printf(" The 16 bit compile unit header version is not "
+ "supported.\n");
+ if (!abbr_offset_OK)
+ s->Printf(" The offset into the .debug_abbrev section (0x%8.8x) "
+ "is not valid.\n",
+ GetAbbrevOffset());
+ if (!addr_size_OK)
+ s->Printf(" The address size is unsupported: 0x%2.2x\n",
+ m_addr_size);
+ } else
+ s->Printf(" The start offset of the compile unit header in the "
+ ".debug_info is invalid.\n");
+ }
+ return false;
}
-
-void
-DWARFCompileUnit::Dump(Stream *s) const
-{
- s->Printf("0x%8.8x: Compile Unit: length = 0x%8.8x, version = 0x%4.4x, abbr_offset = 0x%8.8x, addr_size = 0x%2.2x (next CU at {0x%8.8x})\n",
- m_offset, m_length, m_version, GetAbbrevOffset(), m_addr_size, GetNextCompileUnitOffset());
+void DWARFCompileUnit::Dump(Stream *s) const {
+ s->Printf("0x%8.8x: Compile Unit: length = 0x%8.8x, version = 0x%4.4x, "
+ "abbr_offset = 0x%8.8x, addr_size = 0x%2.2x (next CU at "
+ "{0x%8.8x})\n",
+ m_offset, m_length, m_version, GetAbbrevOffset(), m_addr_size,
+ GetNextCompileUnitOffset());
}
-
static uint8_t g_default_addr_size = 4;
-uint8_t
-DWARFCompileUnit::GetAddressByteSize(const DWARFCompileUnit* cu)
-{
- if (cu)
- return cu->GetAddressByteSize();
- return DWARFCompileUnit::GetDefaultAddressSize();
+uint8_t DWARFCompileUnit::GetAddressByteSize(const DWARFCompileUnit *cu) {
+ if (cu)
+ return cu->GetAddressByteSize();
+ return DWARFCompileUnit::GetDefaultAddressSize();
}
-bool
-DWARFCompileUnit::IsDWARF64(const DWARFCompileUnit* cu)
-{
- if (cu)
- return cu->IsDWARF64();
- return false;
+bool DWARFCompileUnit::IsDWARF64(const DWARFCompileUnit *cu) {
+ if (cu)
+ return cu->IsDWARF64();
+ return false;
}
-uint8_t
-DWARFCompileUnit::GetDefaultAddressSize()
-{
- return g_default_addr_size;
+uint8_t DWARFCompileUnit::GetDefaultAddressSize() {
+ return g_default_addr_size;
}
-void
-DWARFCompileUnit::SetDefaultAddressSize(uint8_t addr_size)
-{
- g_default_addr_size = addr_size;
+void DWARFCompileUnit::SetDefaultAddressSize(uint8_t addr_size) {
+ g_default_addr_size = addr_size;
}
-lldb::user_id_t
-DWARFCompileUnit::GetID () const
-{
- dw_offset_t local_id = m_base_obj_offset != DW_INVALID_OFFSET ? m_base_obj_offset : m_offset;
- if (m_dwarf2Data)
- return DIERef(local_id, local_id).GetUID(m_dwarf2Data);
- else
- return local_id;
+lldb::user_id_t DWARFCompileUnit::GetID() const {
+ dw_offset_t local_id =
+ m_base_obj_offset != DW_INVALID_OFFSET ? m_base_obj_offset : m_offset;
+ if (m_dwarf2Data)
+ return DIERef(local_id, local_id).GetUID(m_dwarf2Data);
+ else
+ return local_id;
}
-void
-DWARFCompileUnit::BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
- DWARFDebugAranges* debug_aranges)
-{
- // This function is usually called if there in no .debug_aranges section
- // in order to produce a compile unit level set of address ranges that
- // is accurate.
-
- size_t num_debug_aranges = debug_aranges->GetNumRanges();
-
- // First get the compile unit DIE only and check if it has a DW_AT_ranges
- const DWARFDebugInfoEntry* die = GetCompileUnitDIEPtrOnly();
-
- const dw_offset_t cu_offset = GetOffset();
- if (die)
- {
- DWARFRangeList ranges;
- const size_t num_ranges = die->GetAttributeAddressRanges(dwarf2Data, this, ranges, false);
- if (num_ranges > 0)
- {
- // This compile unit has DW_AT_ranges, assume this is correct if it
- // is present since clang no longer makes .debug_aranges by default
- // and it emits DW_AT_ranges for DW_TAG_compile_units. GCC also does
- // this with recent GCC builds.
- for (size_t i=0; i<num_ranges; ++i)
- {
- const DWARFRangeList::Entry &range = ranges.GetEntryRef(i);
- debug_aranges->AppendRange(cu_offset, range.GetRangeBase(), range.GetRangeEnd());
- }
-
- return; // We got all of our ranges from the DW_AT_ranges attribute
- }
+void DWARFCompileUnit::BuildAddressRangeTable(
+ SymbolFileDWARF *dwarf2Data, DWARFDebugAranges *debug_aranges) {
+ // This function is usually called if there in no .debug_aranges section
+ // in order to produce a compile unit level set of address ranges that
+ // is accurate.
+
+ size_t num_debug_aranges = debug_aranges->GetNumRanges();
+
+ // First get the compile unit DIE only and check if it has a DW_AT_ranges
+ const DWARFDebugInfoEntry *die = GetCompileUnitDIEPtrOnly();
+
+ const dw_offset_t cu_offset = GetOffset();
+ if (die) {
+ DWARFRangeList ranges;
+ const size_t num_ranges =
+ die->GetAttributeAddressRanges(dwarf2Data, this, ranges, false);
+ if (num_ranges > 0) {
+ // This compile unit has DW_AT_ranges, assume this is correct if it
+ // is present since clang no longer makes .debug_aranges by default
+ // and it emits DW_AT_ranges for DW_TAG_compile_units. GCC also does
+ // this with recent GCC builds.
+ for (size_t i = 0; i < num_ranges; ++i) {
+ const DWARFRangeList::Entry &range = ranges.GetEntryRef(i);
+ debug_aranges->AppendRange(cu_offset, range.GetRangeBase(),
+ range.GetRangeEnd());
+ }
+
+ return; // We got all of our ranges from the DW_AT_ranges attribute
}
- // We don't have a DW_AT_ranges attribute, so we need to parse the DWARF
-
- // If the DIEs weren't parsed, then we don't want all dies for all compile units
- // to stay loaded when they weren't needed. So we can end up parsing the DWARF
- // and then throwing them all away to keep memory usage down.
- const bool clear_dies = ExtractDIEsIfNeeded (false) > 1;
-
- die = DIEPtr();
- if (die)
- die->BuildAddressRangeTable(dwarf2Data, this, debug_aranges);
-
- if (debug_aranges->GetNumRanges() == num_debug_aranges)
- {
- // We got nothing from the functions, maybe we have a line tables only
- // situation. Check the line tables and build the arange table from this.
- SymbolContext sc;
- sc.comp_unit = dwarf2Data->GetCompUnitForDWARFCompUnit(this);
- if (sc.comp_unit)
- {
- SymbolFileDWARFDebugMap *debug_map_sym_file = m_dwarf2Data->GetDebugMapSymfile();
- if (debug_map_sym_file == NULL)
- {
- LineTable *line_table = sc.comp_unit->GetLineTable();
-
- if (line_table)
- {
- LineTable::FileAddressRanges file_ranges;
- const bool append = true;
- const size_t num_ranges = line_table->GetContiguousFileAddressRanges (file_ranges, append);
- for (uint32_t idx=0; idx<num_ranges; ++idx)
- {
- const LineTable::FileAddressRanges::Entry &range = file_ranges.GetEntryRef(idx);
- debug_aranges->AppendRange(cu_offset, range.GetRangeBase(), range.GetRangeEnd());
- }
- }
- }
- else
- debug_map_sym_file->AddOSOARanges(dwarf2Data,debug_aranges);
+ }
+ // We don't have a DW_AT_ranges attribute, so we need to parse the DWARF
+
+ // If the DIEs weren't parsed, then we don't want all dies for all compile
+ // units
+ // to stay loaded when they weren't needed. So we can end up parsing the DWARF
+ // and then throwing them all away to keep memory usage down.
+ const bool clear_dies = ExtractDIEsIfNeeded(false) > 1;
+
+ die = DIEPtr();
+ if (die)
+ die->BuildAddressRangeTable(dwarf2Data, this, debug_aranges);
+
+ if (debug_aranges->GetNumRanges() == num_debug_aranges) {
+ // We got nothing from the functions, maybe we have a line tables only
+ // situation. Check the line tables and build the arange table from this.
+ SymbolContext sc;
+ sc.comp_unit = dwarf2Data->GetCompUnitForDWARFCompUnit(this);
+ if (sc.comp_unit) {
+ SymbolFileDWARFDebugMap *debug_map_sym_file =
+ m_dwarf2Data->GetDebugMapSymfile();
+ if (debug_map_sym_file == NULL) {
+ LineTable *line_table = sc.comp_unit->GetLineTable();
+
+ if (line_table) {
+ LineTable::FileAddressRanges file_ranges;
+ const bool append = true;
+ const size_t num_ranges =
+ line_table->GetContiguousFileAddressRanges(file_ranges, append);
+ for (uint32_t idx = 0; idx < num_ranges; ++idx) {
+ const LineTable::FileAddressRanges::Entry &range =
+ file_ranges.GetEntryRef(idx);
+ debug_aranges->AppendRange(cu_offset, range.GetRangeBase(),
+ range.GetRangeEnd());
+ }
}
+ } else
+ debug_map_sym_file->AddOSOARanges(dwarf2Data, debug_aranges);
}
-
- if (debug_aranges->GetNumRanges() == num_debug_aranges)
- {
- // We got nothing from the functions, maybe we have a line tables only
- // situation. Check the line tables and build the arange table from this.
- SymbolContext sc;
- sc.comp_unit = dwarf2Data->GetCompUnitForDWARFCompUnit(this);
- if (sc.comp_unit)
- {
- LineTable *line_table = sc.comp_unit->GetLineTable();
-
- if (line_table)
- {
- LineTable::FileAddressRanges file_ranges;
- const bool append = true;
- const size_t num_ranges = line_table->GetContiguousFileAddressRanges (file_ranges, append);
- for (uint32_t idx=0; idx<num_ranges; ++idx)
- {
- const LineTable::FileAddressRanges::Entry &range = file_ranges.GetEntryRef(idx);
- debug_aranges->AppendRange(GetOffset(), range.GetRangeBase(), range.GetRangeEnd());
- }
- }
+ }
+
+ if (debug_aranges->GetNumRanges() == num_debug_aranges) {
+ // We got nothing from the functions, maybe we have a line tables only
+ // situation. Check the line tables and build the arange table from this.
+ SymbolContext sc;
+ sc.comp_unit = dwarf2Data->GetCompUnitForDWARFCompUnit(this);
+ if (sc.comp_unit) {
+ LineTable *line_table = sc.comp_unit->GetLineTable();
+
+ if (line_table) {
+ LineTable::FileAddressRanges file_ranges;
+ const bool append = true;
+ const size_t num_ranges =
+ line_table->GetContiguousFileAddressRanges(file_ranges, append);
+ for (uint32_t idx = 0; idx < num_ranges; ++idx) {
+ const LineTable::FileAddressRanges::Entry &range =
+ file_ranges.GetEntryRef(idx);
+ debug_aranges->AppendRange(GetOffset(), range.GetRangeBase(),
+ range.GetRangeEnd());
}
+ }
}
-
- // Keep memory down by clearing DIEs if this generate function
- // caused them to be parsed
- if (clear_dies)
- ClearDIEs (true);
+ }
+ // Keep memory down by clearing DIEs if this generate function
+ // caused them to be parsed
+ if (clear_dies)
+ ClearDIEs(true);
}
+const DWARFDebugAranges &DWARFCompileUnit::GetFunctionAranges() {
+ if (m_func_aranges_ap.get() == NULL) {
+ m_func_aranges_ap.reset(new DWARFDebugAranges());
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES));
-const DWARFDebugAranges &
-DWARFCompileUnit::GetFunctionAranges ()
-{
- if (m_func_aranges_ap.get() == NULL)
- {
- m_func_aranges_ap.reset (new DWARFDebugAranges());
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES));
-
- if (log)
- {
- m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage (log,
- "DWARFCompileUnit::GetFunctionAranges() for compile unit at .debug_info[0x%8.8x]",
- GetOffset());
- }
- const DWARFDebugInfoEntry* die = DIEPtr();
- if (die)
- die->BuildFunctionAddressRangeTable (m_dwarf2Data, this, m_func_aranges_ap.get());
-
- if (m_dwo_symbol_file)
- {
- DWARFCompileUnit* dwo_cu = m_dwo_symbol_file->GetCompileUnit();
- const DWARFDebugInfoEntry* dwo_die = dwo_cu->DIEPtr();
- if (dwo_die)
- dwo_die->BuildFunctionAddressRangeTable (m_dwo_symbol_file.get(),
- dwo_cu,
- m_func_aranges_ap.get());
- }
-
- const bool minimize = false;
- m_func_aranges_ap->Sort(minimize);
+ if (log) {
+ m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage(
+ log, "DWARFCompileUnit::GetFunctionAranges() for compile unit at "
+ ".debug_info[0x%8.8x]",
+ GetOffset());
+ }
+ const DWARFDebugInfoEntry *die = DIEPtr();
+ if (die)
+ die->BuildFunctionAddressRangeTable(m_dwarf2Data, this,
+ m_func_aranges_ap.get());
+
+ if (m_dwo_symbol_file) {
+ DWARFCompileUnit *dwo_cu = m_dwo_symbol_file->GetCompileUnit();
+ const DWARFDebugInfoEntry *dwo_die = dwo_cu->DIEPtr();
+ if (dwo_die)
+ dwo_die->BuildFunctionAddressRangeTable(m_dwo_symbol_file.get(), dwo_cu,
+ m_func_aranges_ap.get());
}
- return *m_func_aranges_ap.get();
+
+ const bool minimize = false;
+ m_func_aranges_ap->Sort(minimize);
+ }
+ return *m_func_aranges_ap.get();
}
DWARFDIE
-DWARFCompileUnit::LookupAddress (const dw_addr_t address)
-{
- if (DIE())
- {
- const DWARFDebugAranges &func_aranges = GetFunctionAranges ();
-
- // Re-check the aranges auto pointer contents in case it was created above
- if (!func_aranges.IsEmpty())
- return GetDIE(func_aranges.FindAddress(address));
- }
- return DWARFDIE();
+DWARFCompileUnit::LookupAddress(const dw_addr_t address) {
+ if (DIE()) {
+ const DWARFDebugAranges &func_aranges = GetFunctionAranges();
+
+ // Re-check the aranges auto pointer contents in case it was created above
+ if (!func_aranges.IsEmpty())
+ return GetDIE(func_aranges.FindAddress(address));
+ }
+ return DWARFDIE();
}
//----------------------------------------------------------------------
// Compare function DWARFDebugAranges::Range structures
//----------------------------------------------------------------------
-static bool CompareDIEOffset (const DWARFDebugInfoEntry& die, const dw_offset_t die_offset)
-{
- return die.GetOffset() < die_offset;
+static bool CompareDIEOffset(const DWARFDebugInfoEntry &die,
+ const dw_offset_t die_offset) {
+ return die.GetOffset() < die_offset;
}
//----------------------------------------------------------------------
@@ -609,627 +554,571 @@ static bool CompareDIEOffset (const DWARFDebugInfoEntry& die, const dw_offset_t
// from the DWARF file.
//----------------------------------------------------------------------
DWARFDIE
-DWARFCompileUnit::GetDIE (dw_offset_t die_offset)
-{
- if (die_offset != DW_INVALID_OFFSET)
- {
- if (m_dwo_symbol_file)
- return m_dwo_symbol_file->GetCompileUnit()->GetDIE(die_offset);
-
- if (ContainsDIEOffset(die_offset))
- {
- ExtractDIEsIfNeeded (false);
- 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
- {
- // Don't specify the compile unit offset as we don't know it because the DIE belongs to
- // a different compile unit in the same symbol file.
- return m_dwarf2Data->DebugInfo()->GetDIEForDIEOffset(die_offset);
- }
+DWARFCompileUnit::GetDIE(dw_offset_t die_offset) {
+ if (die_offset != DW_INVALID_OFFSET) {
+ if (m_dwo_symbol_file)
+ return m_dwo_symbol_file->GetCompileUnit()->GetDIE(die_offset);
+
+ if (ContainsDIEOffset(die_offset)) {
+ ExtractDIEsIfNeeded(false);
+ 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 {
+ // Don't specify the compile unit offset as we don't know it because the
+ // DIE belongs to
+ // a different compile unit in the same symbol file.
+ return m_dwarf2Data->DebugInfo()->GetDIEForDIEOffset(die_offset);
}
- return DWARFDIE(); // Not found
+ }
+ return DWARFDIE(); // Not found
}
-size_t
-DWARFCompileUnit::AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& dies, uint32_t depth) const
-{
- size_t old_size = dies.Size();
- DWARFDebugInfoEntry::const_iterator pos;
- DWARFDebugInfoEntry::const_iterator end = m_die_array.end();
- for (pos = m_die_array.begin(); pos != end; ++pos)
- {
- if (pos->Tag() == tag)
- dies.Append (DWARFDIE(this, &(*pos)));
- }
-
- // Return the number of DIEs added to the collection
- return dies.Size() - old_size;
+size_t DWARFCompileUnit::AppendDIEsWithTag(const dw_tag_t tag,
+ DWARFDIECollection &dies,
+ uint32_t depth) const {
+ size_t old_size = dies.Size();
+ DWARFDebugInfoEntry::const_iterator pos;
+ DWARFDebugInfoEntry::const_iterator end = m_die_array.end();
+ for (pos = m_die_array.begin(); pos != end; ++pos) {
+ if (pos->Tag() == tag)
+ dies.Append(DWARFDIE(this, &(*pos)));
+ }
+
+ // Return the number of DIEs added to the collection
+ return dies.Size() - old_size;
}
-//void
-//DWARFCompileUnit::AddGlobalDIEByIndex (uint32_t die_idx)
+// void
+// DWARFCompileUnit::AddGlobalDIEByIndex (uint32_t die_idx)
//{
// m_global_die_indexes.push_back (die_idx);
//}
//
//
-//void
-//DWARFCompileUnit::AddGlobal (const DWARFDebugInfoEntry* die)
+// void
+// DWARFCompileUnit::AddGlobal (const DWARFDebugInfoEntry* die)
//{
// // Indexes to all file level global and static variables
// m_global_die_indexes;
-//
+//
// if (m_die_array.empty())
// return;
-//
+//
// const DWARFDebugInfoEntry* first_die = &m_die_array[0];
// const DWARFDebugInfoEntry* end = first_die + m_die_array.size();
// if (first_die <= die && die < end)
// m_global_die_indexes.push_back (die - first_die);
//}
+void DWARFCompileUnit::Index(NameToDIE &func_basenames,
+ NameToDIE &func_fullnames, NameToDIE &func_methods,
+ NameToDIE &func_selectors,
+ NameToDIE &objc_class_selectors,
+ NameToDIE &globals, NameToDIE &types,
+ NameToDIE &namespaces) {
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+
+ if (log) {
+ m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage(
+ log,
+ "DWARFCompileUnit::Index() for compile unit at .debug_info[0x%8.8x]",
+ GetOffset());
+ }
+
+ const LanguageType cu_language = GetLanguageType();
+ DWARFFormValue::FixedFormSizes fixed_form_sizes =
+ DWARFFormValue::GetFixedFormSizesForAddressSize(GetAddressByteSize(),
+ m_is_dwarf64);
+
+ IndexPrivate(this, cu_language, fixed_form_sizes, GetOffset(), func_basenames,
+ func_fullnames, func_methods, func_selectors,
+ objc_class_selectors, globals, types, namespaces);
+
+ SymbolFileDWARFDwo *dwo_symbol_file = GetDwoSymbolFile();
+ if (dwo_symbol_file) {
+ IndexPrivate(dwo_symbol_file->GetCompileUnit(), cu_language,
+ fixed_form_sizes, GetOffset(), func_basenames, func_fullnames,
+ func_methods, func_selectors, objc_class_selectors, globals,
+ types, namespaces);
+ }
+}
-void
-DWARFCompileUnit::Index (NameToDIE& func_basenames,
- NameToDIE& func_fullnames,
- NameToDIE& func_methods,
- NameToDIE& func_selectors,
- NameToDIE& objc_class_selectors,
- NameToDIE& globals,
- NameToDIE& types,
- NameToDIE& namespaces)
-{
- Log *log (LogChannelDWARF::GetLogIfAll (DWARF_LOG_LOOKUPS));
-
- if (log)
- {
- m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage (log,
- "DWARFCompileUnit::Index() for compile unit at .debug_info[0x%8.8x]",
- GetOffset());
- }
+void DWARFCompileUnit::IndexPrivate(
+ DWARFCompileUnit *dwarf_cu, const LanguageType cu_language,
+ const DWARFFormValue::FixedFormSizes &fixed_form_sizes,
+ const dw_offset_t cu_offset, NameToDIE &func_basenames,
+ NameToDIE &func_fullnames, NameToDIE &func_methods,
+ NameToDIE &func_selectors, NameToDIE &objc_class_selectors,
+ NameToDIE &globals, NameToDIE &types, NameToDIE &namespaces) {
+ DWARFDebugInfoEntry::const_iterator pos;
+ DWARFDebugInfoEntry::const_iterator begin = dwarf_cu->m_die_array.begin();
+ DWARFDebugInfoEntry::const_iterator end = dwarf_cu->m_die_array.end();
+ for (pos = begin; pos != end; ++pos) {
+ const DWARFDebugInfoEntry &die = *pos;
+
+ const dw_tag_t tag = die.Tag();
+
+ switch (tag) {
+ case DW_TAG_array_type:
+ case DW_TAG_base_type:
+ case DW_TAG_class_type:
+ case DW_TAG_constant:
+ case DW_TAG_enumeration_type:
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_namespace:
+ case DW_TAG_string_type:
+ case DW_TAG_structure_type:
+ case DW_TAG_subprogram:
+ case DW_TAG_subroutine_type:
+ case DW_TAG_typedef:
+ case DW_TAG_union_type:
+ case DW_TAG_unspecified_type:
+ case DW_TAG_variable:
+ break;
- const LanguageType cu_language = GetLanguageType();
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize(), m_is_dwarf64);
-
- IndexPrivate(this,
- cu_language,
- fixed_form_sizes,
- GetOffset(),
- func_basenames,
- func_fullnames,
- func_methods,
- func_selectors,
- objc_class_selectors,
- globals,
- types,
- namespaces);
-
- SymbolFileDWARFDwo* dwo_symbol_file = GetDwoSymbolFile();
- if (dwo_symbol_file)
- {
- IndexPrivate(dwo_symbol_file->GetCompileUnit(),
- cu_language,
- fixed_form_sizes,
- GetOffset(),
- func_basenames,
- func_fullnames,
- func_methods,
- func_selectors,
- objc_class_selectors,
- globals,
- types,
- namespaces);
+ default:
+ continue;
}
-}
-void
-DWARFCompileUnit::IndexPrivate (DWARFCompileUnit* dwarf_cu,
- const LanguageType cu_language,
- const DWARFFormValue::FixedFormSizes& fixed_form_sizes,
- const dw_offset_t cu_offset,
- NameToDIE& func_basenames,
- NameToDIE& func_fullnames,
- NameToDIE& func_methods,
- NameToDIE& func_selectors,
- NameToDIE& objc_class_selectors,
- NameToDIE& globals,
- NameToDIE& types,
- NameToDIE& namespaces)
-{
- DWARFDebugInfoEntry::const_iterator pos;
- DWARFDebugInfoEntry::const_iterator begin = dwarf_cu->m_die_array.begin();
- DWARFDebugInfoEntry::const_iterator end = dwarf_cu->m_die_array.end();
- for (pos = begin; pos != end; ++pos)
- {
- const DWARFDebugInfoEntry &die = *pos;
-
- const dw_tag_t tag = die.Tag();
-
- switch (tag)
- {
- case DW_TAG_array_type:
- case DW_TAG_base_type:
- case DW_TAG_class_type:
- case DW_TAG_constant:
- case DW_TAG_enumeration_type:
- case DW_TAG_inlined_subroutine:
- case DW_TAG_namespace:
- case DW_TAG_string_type:
- case DW_TAG_structure_type:
- case DW_TAG_subprogram:
- case DW_TAG_subroutine_type:
- case DW_TAG_typedef:
- case DW_TAG_union_type:
- case DW_TAG_unspecified_type:
- case DW_TAG_variable:
- break;
-
- default:
- continue;
- }
-
- DWARFAttributes attributes;
- const char *name = NULL;
- const char *mangled_cstr = NULL;
- bool is_declaration = false;
- //bool is_artificial = false;
- bool has_address = false;
- bool has_location_or_const_value = false;
- bool is_global_or_static_variable = false;
-
- DWARFFormValue specification_die_form;
- const size_t num_attributes = die.GetAttributes(dwarf_cu, fixed_form_sizes, attributes);
- if (num_attributes > 0)
- {
- for (uint32_t i=0; i<num_attributes; ++i)
- {
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- switch (attr)
- {
- case DW_AT_name:
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- name = form_value.AsCString();
- break;
-
- case DW_AT_declaration:
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- is_declaration = form_value.Unsigned() != 0;
- break;
-
-// case DW_AT_artificial:
-// 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(i, form_value))
- mangled_cstr = form_value.AsCString();
- break;
-
- case DW_AT_low_pc:
- case DW_AT_high_pc:
- case DW_AT_ranges:
- has_address = true;
- break;
-
- case DW_AT_entry_pc:
- has_address = true;
- break;
-
- case DW_AT_location:
- case DW_AT_const_value:
- has_location_or_const_value = true;
- if (tag == DW_TAG_variable)
- {
- const DWARFDebugInfoEntry* parent_die = die.GetParent();
- while ( parent_die != NULL )
- {
- switch (parent_die->Tag())
- {
- case DW_TAG_subprogram:
- case DW_TAG_lexical_block:
- case DW_TAG_inlined_subroutine:
- // Even if this is a function level static, we don't add it. We could theoretically
- // add these if we wanted to by introspecting into the DW_AT_location and seeing
- // if the location describes a hard coded address, but we dont want the performance
- // penalty of that right now.
- is_global_or_static_variable = 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.
- break;
-
- case DW_TAG_compile_unit:
- is_global_or_static_variable = true;
- parent_die = NULL; // Terminate the while loop.
- break;
-
- default:
- parent_die = parent_die->GetParent(); // Keep going in the while loop.
- break;
- }
- }
- }
- break;
-
- case DW_AT_specification:
- if (attributes.ExtractFormValueAtIndex(i, form_value))
- specification_die_form = form_value;
- break;
- }
+ DWARFAttributes attributes;
+ const char *name = NULL;
+ const char *mangled_cstr = NULL;
+ bool is_declaration = false;
+ // bool is_artificial = false;
+ bool has_address = false;
+ bool has_location_or_const_value = false;
+ bool is_global_or_static_variable = false;
+
+ DWARFFormValue specification_die_form;
+ const size_t num_attributes =
+ die.GetAttributes(dwarf_cu, fixed_form_sizes, attributes);
+ if (num_attributes > 0) {
+ for (uint32_t i = 0; i < num_attributes; ++i) {
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ switch (attr) {
+ case DW_AT_name:
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ name = form_value.AsCString();
+ break;
+
+ case DW_AT_declaration:
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ is_declaration = form_value.Unsigned() != 0;
+ break;
+
+ // case DW_AT_artificial:
+ // 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(i, form_value))
+ mangled_cstr = form_value.AsCString();
+ break;
+
+ case DW_AT_low_pc:
+ case DW_AT_high_pc:
+ case DW_AT_ranges:
+ has_address = true;
+ break;
+
+ case DW_AT_entry_pc:
+ has_address = true;
+ break;
+
+ case DW_AT_location:
+ case DW_AT_const_value:
+ has_location_or_const_value = true;
+ if (tag == DW_TAG_variable) {
+ const DWARFDebugInfoEntry *parent_die = die.GetParent();
+ while (parent_die != NULL) {
+ switch (parent_die->Tag()) {
+ case DW_TAG_subprogram:
+ case DW_TAG_lexical_block:
+ case DW_TAG_inlined_subroutine:
+ // Even if this is a function level static, we don't add it. We
+ // could theoretically
+ // add these if we wanted to by introspecting into the
+ // DW_AT_location and seeing
+ // if the location describes a hard coded address, but we dont
+ // want the performance
+ // penalty of that right now.
+ is_global_or_static_variable = 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.
+ break;
+
+ case DW_TAG_compile_unit:
+ is_global_or_static_variable = true;
+ parent_die = NULL; // Terminate the while loop.
+ break;
+
+ default:
+ parent_die =
+ parent_die->GetParent(); // Keep going in the while loop.
+ break;
+ }
}
+ }
+ break;
+
+ case DW_AT_specification:
+ if (attributes.ExtractFormValueAtIndex(i, form_value))
+ specification_die_form = form_value;
+ break;
}
+ }
+ }
- switch (tag)
- {
- case DW_TAG_subprogram:
- if (has_address)
- {
- if (name)
- {
- ObjCLanguage::MethodName objc_method(name, true);
- if (objc_method.IsValid(true))
- {
- ConstString objc_class_name_with_category (objc_method.GetClassNameWithCategory());
- ConstString objc_selector_name (objc_method.GetSelector());
- ConstString objc_fullname_no_category_name (objc_method.GetFullNameWithoutCategory(true));
- ConstString objc_class_name_no_category (objc_method.GetClassName());
- func_fullnames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- if (objc_class_name_with_category)
- objc_class_selectors.Insert(objc_class_name_with_category, DIERef(cu_offset, die.GetOffset()));
- if (objc_class_name_no_category && objc_class_name_no_category != objc_class_name_with_category)
- objc_class_selectors.Insert(objc_class_name_no_category, DIERef(cu_offset, die.GetOffset()));
- if (objc_selector_name)
- func_selectors.Insert (objc_selector_name, DIERef(cu_offset, die.GetOffset()));
- if (objc_fullname_no_category_name)
- func_fullnames.Insert (objc_fullname_no_category_name, DIERef(cu_offset, die.GetOffset()));
- }
- // If we have a mangled name, then the DW_AT_name attribute
- // is usually the method name without the class or any parameters
- const DWARFDebugInfoEntry *parent = die.GetParent();
- bool is_method = false;
- if (parent)
- {
- dw_tag_t parent_tag = parent->Tag();
- if (parent_tag == DW_TAG_class_type || parent_tag == DW_TAG_structure_type)
- {
- is_method = true;
- }
- else
- {
- if (specification_die_form.IsValid())
- {
- DWARFDIE specification_die = dwarf_cu->GetSymbolFileDWARF()->DebugInfo()->GetDIE (DIERef(specification_die_form));
- if (specification_die.GetParent().IsStructOrClass())
- is_method = true;
- }
- }
- }
-
-
- if (is_method)
- func_methods.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- else
- func_basenames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
-
- if (!is_method && !mangled_cstr && !objc_method.IsValid(true))
- func_fullnames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- }
- if (mangled_cstr)
- {
- // Make sure our mangled name isn't the same string table entry
- // as our name. If it starts with '_', then it is ok, else compare
- // the string to make sure it isn't the same and we don't end up
- // with duplicate entries
- if (name && name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
- {
- Mangled mangled (ConstString(mangled_cstr), true);
- func_fullnames.Insert (mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset()));
- ConstString demangled = mangled.GetDemangledName(cu_language);
- if (demangled)
- func_fullnames.Insert (demangled, DIERef(cu_offset, die.GetOffset()));
- }
- }
+ switch (tag) {
+ case DW_TAG_subprogram:
+ if (has_address) {
+ if (name) {
+ ObjCLanguage::MethodName objc_method(name, true);
+ if (objc_method.IsValid(true)) {
+ ConstString objc_class_name_with_category(
+ objc_method.GetClassNameWithCategory());
+ ConstString objc_selector_name(objc_method.GetSelector());
+ ConstString objc_fullname_no_category_name(
+ objc_method.GetFullNameWithoutCategory(true));
+ ConstString objc_class_name_no_category(objc_method.GetClassName());
+ func_fullnames.Insert(ConstString(name),
+ DIERef(cu_offset, die.GetOffset()));
+ if (objc_class_name_with_category)
+ objc_class_selectors.Insert(objc_class_name_with_category,
+ DIERef(cu_offset, die.GetOffset()));
+ if (objc_class_name_no_category &&
+ objc_class_name_no_category != objc_class_name_with_category)
+ objc_class_selectors.Insert(objc_class_name_no_category,
+ DIERef(cu_offset, die.GetOffset()));
+ if (objc_selector_name)
+ func_selectors.Insert(objc_selector_name,
+ DIERef(cu_offset, die.GetOffset()));
+ if (objc_fullname_no_category_name)
+ func_fullnames.Insert(objc_fullname_no_category_name,
+ DIERef(cu_offset, die.GetOffset()));
+ }
+ // If we have a mangled name, then the DW_AT_name attribute
+ // is usually the method name without the class or any parameters
+ const DWARFDebugInfoEntry *parent = die.GetParent();
+ bool is_method = false;
+ if (parent) {
+ dw_tag_t parent_tag = parent->Tag();
+ if (parent_tag == DW_TAG_class_type ||
+ parent_tag == DW_TAG_structure_type) {
+ is_method = true;
+ } else {
+ if (specification_die_form.IsValid()) {
+ DWARFDIE specification_die =
+ dwarf_cu->GetSymbolFileDWARF()->DebugInfo()->GetDIE(
+ DIERef(specification_die_form));
+ if (specification_die.GetParent().IsStructOrClass())
+ is_method = true;
+ }
}
- break;
-
- case DW_TAG_inlined_subroutine:
- if (has_address)
- {
- if (name)
- func_basenames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- if (mangled_cstr)
- {
- // Make sure our mangled name isn't the same string table entry
- // as our name. If it starts with '_', then it is ok, else compare
- // the string to make sure it isn't the same and we don't end up
- // with duplicate entries
- if (name && name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
- {
- Mangled mangled (ConstString(mangled_cstr), true);
- func_fullnames.Insert (mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset()));
- ConstString demangled = mangled.GetDemangledName(cu_language);
- if (demangled)
- func_fullnames.Insert (demangled, DIERef(cu_offset, die.GetOffset()));
- }
- }
- else
- func_fullnames.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- }
- break;
-
- case DW_TAG_array_type:
- case DW_TAG_base_type:
- case DW_TAG_class_type:
- case DW_TAG_constant:
- case DW_TAG_enumeration_type:
- case DW_TAG_string_type:
- case DW_TAG_structure_type:
- case DW_TAG_subroutine_type:
- case DW_TAG_typedef:
- case DW_TAG_union_type:
- case DW_TAG_unspecified_type:
- if (name && !is_declaration)
- types.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- if (mangled_cstr && !is_declaration)
- types.Insert (ConstString(mangled_cstr), DIERef(cu_offset, die.GetOffset()));
- break;
-
- case DW_TAG_namespace:
- if (name)
- namespaces.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- break;
-
- case DW_TAG_variable:
- if (name && has_location_or_const_value && is_global_or_static_variable)
- {
- globals.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
- // Be sure to include variables by their mangled and demangled
- // names if they have any since a variable can have a basename
- // "i", a mangled named "_ZN12_GLOBAL__N_11iE" and a demangled
- // mangled name "(anonymous namespace)::i"...
-
- // Make sure our mangled name isn't the same string table entry
- // as our name. If it starts with '_', then it is ok, else compare
- // the string to make sure it isn't the same and we don't end up
- // with duplicate entries
- if (mangled_cstr && name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
- {
- Mangled mangled (ConstString(mangled_cstr), true);
- globals.Insert (mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset()));
- ConstString demangled = mangled.GetDemangledName(cu_language);
- if (demangled)
- globals.Insert (demangled, DIERef(cu_offset, die.GetOffset()));
- }
- }
- break;
-
- default:
- continue;
+ }
+
+ if (is_method)
+ func_methods.Insert(ConstString(name),
+ DIERef(cu_offset, die.GetOffset()));
+ else
+ func_basenames.Insert(ConstString(name),
+ DIERef(cu_offset, die.GetOffset()));
+
+ if (!is_method && !mangled_cstr && !objc_method.IsValid(true))
+ func_fullnames.Insert(ConstString(name),
+ DIERef(cu_offset, die.GetOffset()));
}
- }
-}
+ if (mangled_cstr) {
+ // Make sure our mangled name isn't the same string table entry
+ // as our name. If it starts with '_', then it is ok, else compare
+ // the string to make sure it isn't the same and we don't end up
+ // with duplicate entries
+ if (name && name != mangled_cstr &&
+ ((mangled_cstr[0] == '_') ||
+ (::strcmp(name, mangled_cstr) != 0))) {
+ Mangled mangled(ConstString(mangled_cstr), true);
+ func_fullnames.Insert(mangled.GetMangledName(),
+ DIERef(cu_offset, die.GetOffset()));
+ ConstString demangled = mangled.GetDemangledName(cu_language);
+ if (demangled)
+ func_fullnames.Insert(demangled,
+ DIERef(cu_offset, die.GetOffset()));
+ }
+ }
+ }
+ break;
+
+ case DW_TAG_inlined_subroutine:
+ if (has_address) {
+ if (name)
+ func_basenames.Insert(ConstString(name),
+ DIERef(cu_offset, die.GetOffset()));
+ if (mangled_cstr) {
+ // Make sure our mangled name isn't the same string table entry
+ // as our name. If it starts with '_', then it is ok, else compare
+ // the string to make sure it isn't the same and we don't end up
+ // with duplicate entries
+ if (name && name != mangled_cstr &&
+ ((mangled_cstr[0] == '_') ||
+ (::strcmp(name, mangled_cstr) != 0))) {
+ Mangled mangled(ConstString(mangled_cstr), true);
+ func_fullnames.Insert(mangled.GetMangledName(),
+ DIERef(cu_offset, die.GetOffset()));
+ ConstString demangled = mangled.GetDemangledName(cu_language);
+ if (demangled)
+ func_fullnames.Insert(demangled,
+ DIERef(cu_offset, die.GetOffset()));
+ }
+ } else
+ func_fullnames.Insert(ConstString(name),
+ DIERef(cu_offset, die.GetOffset()));
+ }
+ break;
+
+ case DW_TAG_array_type:
+ case DW_TAG_base_type:
+ case DW_TAG_class_type:
+ case DW_TAG_constant:
+ case DW_TAG_enumeration_type:
+ case DW_TAG_string_type:
+ case DW_TAG_structure_type:
+ case DW_TAG_subroutine_type:
+ case DW_TAG_typedef:
+ case DW_TAG_union_type:
+ case DW_TAG_unspecified_type:
+ if (name && !is_declaration)
+ types.Insert(ConstString(name), DIERef(cu_offset, die.GetOffset()));
+ if (mangled_cstr && !is_declaration)
+ types.Insert(ConstString(mangled_cstr),
+ DIERef(cu_offset, die.GetOffset()));
+ break;
+
+ case DW_TAG_namespace:
+ if (name)
+ namespaces.Insert(ConstString(name),
+ DIERef(cu_offset, die.GetOffset()));
+ break;
+
+ case DW_TAG_variable:
+ if (name && has_location_or_const_value && is_global_or_static_variable) {
+ globals.Insert(ConstString(name), DIERef(cu_offset, die.GetOffset()));
+ // Be sure to include variables by their mangled and demangled
+ // names if they have any since a variable can have a basename
+ // "i", a mangled named "_ZN12_GLOBAL__N_11iE" and a demangled
+ // mangled name "(anonymous namespace)::i"...
+
+ // Make sure our mangled name isn't the same string table entry
+ // as our name. If it starts with '_', then it is ok, else compare
+ // the string to make sure it isn't the same and we don't end up
+ // with duplicate entries
+ if (mangled_cstr && name != mangled_cstr &&
+ ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0))) {
+ Mangled mangled(ConstString(mangled_cstr), true);
+ globals.Insert(mangled.GetMangledName(),
+ DIERef(cu_offset, die.GetOffset()));
+ ConstString demangled = mangled.GetDemangledName(cu_language);
+ if (demangled)
+ globals.Insert(demangled, DIERef(cu_offset, die.GetOffset()));
+ }
+ }
+ break;
-bool
-DWARFCompileUnit::Supports_unnamed_objc_bitfields ()
-{
- if (GetProducer() == eProducerClang)
- {
- const uint32_t major_version = GetProducerVersionMajor();
- if (major_version > 425 || (major_version == 425 && GetProducerVersionUpdate() >= 13))
- return true;
- else
- return false;
+ default:
+ continue;
}
- return true; // Assume all other compilers didn't have incorrect ObjC bitfield info
+ }
}
-bool
-DWARFCompileUnit::Supports_DW_AT_APPLE_objc_complete_type ()
-{
- if (GetProducer() == eProducerLLVMGCC)
- return false;
- return true;
+bool DWARFCompileUnit::Supports_unnamed_objc_bitfields() {
+ if (GetProducer() == eProducerClang) {
+ const uint32_t major_version = GetProducerVersionMajor();
+ if (major_version > 425 ||
+ (major_version == 425 && GetProducerVersionUpdate() >= 13))
+ return true;
+ else
+ return false;
+ }
+ return true; // Assume all other compilers didn't have incorrect ObjC bitfield
+ // info
}
-bool
-DWARFCompileUnit::DW_AT_decl_file_attributes_are_invalid()
-{
- // llvm-gcc makes completely invalid decl file attributes and won't ever
- // be fixed, so we need to know to ignore these.
- return GetProducer() == eProducerLLVMGCC;
+bool DWARFCompileUnit::Supports_DW_AT_APPLE_objc_complete_type() {
+ if (GetProducer() == eProducerLLVMGCC)
+ return false;
+ return true;
}
-void
-DWARFCompileUnit::ParseProducerInfo ()
-{
- m_producer_version_major = UINT32_MAX;
- m_producer_version_minor = UINT32_MAX;
- m_producer_version_update = UINT32_MAX;
+bool DWARFCompileUnit::DW_AT_decl_file_attributes_are_invalid() {
+ // llvm-gcc makes completely invalid decl file attributes and won't ever
+ // be fixed, so we need to know to ignore these.
+ return GetProducer() == eProducerLLVMGCC;
+}
- const DWARFDebugInfoEntry *die = GetCompileUnitDIEPtrOnly();
- if (die)
- {
-
- const char *producer_cstr = die->GetAttributeValueAsString(m_dwarf2Data, this, DW_AT_producer, NULL);
- if (producer_cstr)
- {
- RegularExpression llvm_gcc_regex("^4\\.[012]\\.[01] \\(Based on Apple Inc\\. build [0-9]+\\) \\(LLVM build [\\.0-9]+\\)$");
- if (llvm_gcc_regex.Execute (producer_cstr))
- {
- m_producer = eProducerLLVMGCC;
- }
- else if (strstr(producer_cstr, "clang"))
- {
- static RegularExpression g_clang_version_regex("clang-([0-9]+)\\.([0-9]+)\\.([0-9]+)");
- RegularExpression::Match regex_match(3);
- if (g_clang_version_regex.Execute (producer_cstr, &regex_match))
- {
- std::string str;
- if (regex_match.GetMatchAtIndex (producer_cstr, 1, str))
- m_producer_version_major = StringConvert::ToUInt32(str.c_str(), UINT32_MAX, 10);
- if (regex_match.GetMatchAtIndex (producer_cstr, 2, str))
- m_producer_version_minor = StringConvert::ToUInt32(str.c_str(), UINT32_MAX, 10);
- if (regex_match.GetMatchAtIndex (producer_cstr, 3, str))
- m_producer_version_update = StringConvert::ToUInt32(str.c_str(), UINT32_MAX, 10);
- }
- m_producer = eProducerClang;
- }
- else if (strstr(producer_cstr, "GNU"))
- m_producer = eProducerGCC;
+void DWARFCompileUnit::ParseProducerInfo() {
+ m_producer_version_major = UINT32_MAX;
+ m_producer_version_minor = UINT32_MAX;
+ m_producer_version_update = UINT32_MAX;
+
+ const DWARFDebugInfoEntry *die = GetCompileUnitDIEPtrOnly();
+ if (die) {
+
+ const char *producer_cstr = die->GetAttributeValueAsString(
+ m_dwarf2Data, this, DW_AT_producer, NULL);
+ if (producer_cstr) {
+ RegularExpression llvm_gcc_regex("^4\\.[012]\\.[01] \\(Based on Apple "
+ "Inc\\. build [0-9]+\\) \\(LLVM build "
+ "[\\.0-9]+\\)$");
+ if (llvm_gcc_regex.Execute(producer_cstr)) {
+ m_producer = eProducerLLVMGCC;
+ } else if (strstr(producer_cstr, "clang")) {
+ static RegularExpression g_clang_version_regex(
+ "clang-([0-9]+)\\.([0-9]+)\\.([0-9]+)");
+ RegularExpression::Match regex_match(3);
+ if (g_clang_version_regex.Execute(producer_cstr, &regex_match)) {
+ std::string str;
+ if (regex_match.GetMatchAtIndex(producer_cstr, 1, str))
+ m_producer_version_major =
+ StringConvert::ToUInt32(str.c_str(), UINT32_MAX, 10);
+ if (regex_match.GetMatchAtIndex(producer_cstr, 2, str))
+ m_producer_version_minor =
+ StringConvert::ToUInt32(str.c_str(), UINT32_MAX, 10);
+ if (regex_match.GetMatchAtIndex(producer_cstr, 3, str))
+ m_producer_version_update =
+ StringConvert::ToUInt32(str.c_str(), UINT32_MAX, 10);
}
+ m_producer = eProducerClang;
+ } else if (strstr(producer_cstr, "GNU"))
+ m_producer = eProducerGCC;
}
- if (m_producer == eProducerInvalid)
- m_producer = eProcucerOther;
+ }
+ if (m_producer == eProducerInvalid)
+ m_producer = eProcucerOther;
}
-DWARFCompileUnit::Producer
-DWARFCompileUnit::GetProducer ()
-{
- if (m_producer == eProducerInvalid)
- ParseProducerInfo ();
- return m_producer;
+DWARFCompileUnit::Producer DWARFCompileUnit::GetProducer() {
+ if (m_producer == eProducerInvalid)
+ ParseProducerInfo();
+ return m_producer;
}
-
-uint32_t
-DWARFCompileUnit::GetProducerVersionMajor()
-{
- if (m_producer_version_major == 0)
- ParseProducerInfo ();
- return m_producer_version_major;
+uint32_t DWARFCompileUnit::GetProducerVersionMajor() {
+ if (m_producer_version_major == 0)
+ ParseProducerInfo();
+ return m_producer_version_major;
}
-uint32_t
-DWARFCompileUnit::GetProducerVersionMinor()
-{
- if (m_producer_version_minor == 0)
- ParseProducerInfo ();
- return m_producer_version_minor;
+uint32_t DWARFCompileUnit::GetProducerVersionMinor() {
+ if (m_producer_version_minor == 0)
+ ParseProducerInfo();
+ return m_producer_version_minor;
}
-uint32_t
-DWARFCompileUnit::GetProducerVersionUpdate()
-{
- if (m_producer_version_update == 0)
- ParseProducerInfo ();
- return m_producer_version_update;
+uint32_t DWARFCompileUnit::GetProducerVersionUpdate() {
+ if (m_producer_version_update == 0)
+ ParseProducerInfo();
+ return m_producer_version_update;
}
-LanguageType
-DWARFCompileUnit::LanguageTypeFromDWARF(uint64_t val)
-{
- // Note: user languages between lo_user and hi_user
- // must be handled explicitly here.
- switch (val)
- {
- case DW_LANG_Mips_Assembler:
- return eLanguageTypeMipsAssembler;
- case DW_LANG_GOOGLE_RenderScript:
- return eLanguageTypeExtRenderScript;
- default:
- return static_cast<LanguageType>(val);
- }
+LanguageType DWARFCompileUnit::LanguageTypeFromDWARF(uint64_t val) {
+ // Note: user languages between lo_user and hi_user
+ // must be handled explicitly here.
+ switch (val) {
+ case DW_LANG_Mips_Assembler:
+ return eLanguageTypeMipsAssembler;
+ case DW_LANG_GOOGLE_RenderScript:
+ return eLanguageTypeExtRenderScript;
+ default:
+ return static_cast<LanguageType>(val);
+ }
}
-LanguageType
-DWARFCompileUnit::GetLanguageType()
-{
- if (m_language_type != eLanguageTypeUnknown)
- return m_language_type;
-
- const DWARFDebugInfoEntry *die = GetCompileUnitDIEPtrOnly();
- if (die)
- m_language_type = LanguageTypeFromDWARF(die->GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_language, 0));
+LanguageType DWARFCompileUnit::GetLanguageType() {
+ if (m_language_type != eLanguageTypeUnknown)
return m_language_type;
-}
-bool
-DWARFCompileUnit::IsDWARF64() const
-{
- return m_is_dwarf64;
+ const DWARFDebugInfoEntry *die = GetCompileUnitDIEPtrOnly();
+ if (die)
+ m_language_type = LanguageTypeFromDWARF(die->GetAttributeValueAsUnsigned(
+ m_dwarf2Data, this, DW_AT_language, 0));
+ return m_language_type;
}
-bool
-DWARFCompileUnit::GetIsOptimized ()
-{
- if (m_is_optimized == eLazyBoolCalculate)
- {
- const DWARFDebugInfoEntry *die = GetCompileUnitDIEPtrOnly();
- if (die)
- {
- m_is_optimized = eLazyBoolNo;
- if (die->GetAttributeValueAsUnsigned (m_dwarf2Data, this, DW_AT_APPLE_optimized, 0) == 1)
- {
- m_is_optimized = eLazyBoolYes;
- }
- }
- }
- if (m_is_optimized == eLazyBoolYes)
- {
- return true;
- }
- else
- {
- return false;
+bool DWARFCompileUnit::IsDWARF64() const { return m_is_dwarf64; }
+
+bool DWARFCompileUnit::GetIsOptimized() {
+ if (m_is_optimized == eLazyBoolCalculate) {
+ const DWARFDebugInfoEntry *die = GetCompileUnitDIEPtrOnly();
+ if (die) {
+ m_is_optimized = eLazyBoolNo;
+ if (die->GetAttributeValueAsUnsigned(m_dwarf2Data, this,
+ DW_AT_APPLE_optimized, 0) == 1) {
+ m_is_optimized = eLazyBoolYes;
+ }
}
+ }
+ if (m_is_optimized == eLazyBoolYes) {
+ return true;
+ } else {
+ return false;
+ }
}
-DWARFFormValue::FixedFormSizes
-DWARFCompileUnit::GetFixedFormSizes ()
-{
- return DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize(), IsDWARF64());
+DWARFFormValue::FixedFormSizes DWARFCompileUnit::GetFixedFormSizes() {
+ return DWARFFormValue::GetFixedFormSizesForAddressSize(GetAddressByteSize(),
+ IsDWARF64());
}
-TypeSystem *
-DWARFCompileUnit::GetTypeSystem ()
-{
- if (m_dwarf2Data)
- return m_dwarf2Data->GetTypeSystemForLanguage(GetLanguageType());
- else
- return nullptr;
+TypeSystem *DWARFCompileUnit::GetTypeSystem() {
+ if (m_dwarf2Data)
+ return m_dwarf2Data->GetTypeSystemForLanguage(GetLanguageType());
+ else
+ return nullptr;
}
-void
-DWARFCompileUnit::SetUserData(void *d)
-{
- m_user_data = d;
- if (m_dwo_symbol_file)
- m_dwo_symbol_file->GetCompileUnit()->SetUserData(d);
+void DWARFCompileUnit::SetUserData(void *d) {
+ m_user_data = d;
+ if (m_dwo_symbol_file)
+ m_dwo_symbol_file->GetCompileUnit()->SetUserData(d);
}
-void
-DWARFCompileUnit::SetAddrBase(dw_addr_t addr_base, dw_offset_t base_obj_offset)
-{
- m_addr_base = addr_base;
- m_base_obj_offset = base_obj_offset;
+void DWARFCompileUnit::SetAddrBase(dw_addr_t addr_base,
+ dw_offset_t base_obj_offset) {
+ m_addr_base = addr_base;
+ m_base_obj_offset = base_obj_offset;
}
-lldb::ByteOrder
-DWARFCompileUnit::GetByteOrder() const
-{
- return m_dwarf2Data->GetObjectFile()->GetByteOrder();
+lldb::ByteOrder DWARFCompileUnit::GetByteOrder() const {
+ return m_dwarf2Data->GetObjectFile()->GetByteOrder();
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
index 8d96e3698ab..acfbcac210b 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
@@ -10,258 +10,212 @@
#ifndef SymbolFileDWARF_DWARFCompileUnit_h_
#define SymbolFileDWARF_DWARFCompileUnit_h_
-#include "lldb/lldb-enumerations.h"
-#include "DWARFDebugInfoEntry.h"
#include "DWARFDIE.h"
+#include "DWARFDebugInfoEntry.h"
+#include "lldb/lldb-enumerations.h"
class NameToDIE;
class SymbolFileDWARF;
class SymbolFileDWARFDwo;
-class DWARFCompileUnit
-{
+class DWARFCompileUnit {
public:
- enum Producer
- {
- eProducerInvalid = 0,
- eProducerClang,
- eProducerGCC,
- eProducerLLVMGCC,
- eProcucerOther
- };
-
- DWARFCompileUnit(SymbolFileDWARF* dwarf2Data);
- ~DWARFCompileUnit();
-
- bool Extract(const lldb_private::DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr);
- size_t ExtractDIEsIfNeeded (bool cu_die_only);
- 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(); }
- dw_offset_t GetNextCompileUnitOffset() const { return m_offset + m_length + (m_is_dwarf64 ? 12 : 4); }
- size_t GetDebugInfoSize() const { return m_length + (m_is_dwarf64 ? 12 : 4) - Size(); /* Size in bytes of the .debug_info data associated with this compile unit. */ }
- uint32_t GetLength() const { return m_length; }
- uint16_t GetVersion() const { return m_version; }
- const DWARFAbbreviationDeclarationSet* GetAbbreviations() const { return m_abbrevs; }
- dw_offset_t GetAbbrevOffset() const;
- uint8_t GetAddressByteSize() const { return m_addr_size; }
- dw_addr_t GetBaseAddress() const { return m_base_addr; }
- dw_addr_t GetAddrBase() const { return m_addr_base; }
- void SetAddrBase(dw_addr_t addr_base, dw_offset_t base_obj_offset);
- void ClearDIEs(bool keep_compile_unit_die);
- void BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
- DWARFDebugAranges* debug_aranges);
-
- lldb::ByteOrder
- GetByteOrder() const;
-
- lldb_private::TypeSystem *
- GetTypeSystem();
-
- DWARFFormValue::FixedFormSizes
- GetFixedFormSizes ();
-
- void
- SetBaseAddress(dw_addr_t base_addr)
- {
- m_base_addr = base_addr;
- }
-
- DWARFDIE
- GetCompileUnitDIEOnly()
- {
- return DWARFDIE(this, GetCompileUnitDIEPtrOnly());
- }
-
- DWARFDIE
- DIE ()
- {
- return DWARFDIE(this, DIEPtr());
- }
-
- void
- AddDIE (DWARFDebugInfoEntry& die)
- {
- // The average bytes per DIE entry has been seen to be
- // around 14-20 so lets pre-reserve half of that since
- // we are now stripping the NULL tags.
-
- // Only reserve the memory if we are adding children of
- // the main compile unit DIE. The compile unit DIE is always
- // the first entry, so if our size is 1, then we are adding
- // the first compile unit child DIE and should reserve
- // the memory.
- if (m_die_array.empty())
- m_die_array.reserve(GetDebugInfoSize() / 24);
- m_die_array.push_back(die);
- }
-
- void
- AddCompileUnitDIE (DWARFDebugInfoEntry& die);
-
- bool
- HasDIEsParsed () const
- {
- return m_die_array.size() > 1;
- }
-
- DWARFDIE
- GetDIE (dw_offset_t die_offset);
-
- static uint8_t
- GetAddressByteSize(const DWARFCompileUnit* cu);
-
- static bool
- IsDWARF64(const DWARFCompileUnit* cu);
-
- static uint8_t
- GetDefaultAddressSize();
-
- static void
- SetDefaultAddressSize(uint8_t addr_size);
-
- void *
- GetUserData() const
- {
- return m_user_data;
- }
-
- void
- SetUserData(void *d);
-
- bool
- Supports_DW_AT_APPLE_objc_complete_type ();
-
- bool
- DW_AT_decl_file_attributes_are_invalid();
-
- bool
- Supports_unnamed_objc_bitfields ();
-
- void
- Index (NameToDIE& func_basenames,
- NameToDIE& func_fullnames,
- NameToDIE& func_methods,
- NameToDIE& func_selectors,
- NameToDIE& objc_class_selectors,
- NameToDIE& globals,
- NameToDIE& types,
- NameToDIE& namespaces);
-
- const DWARFDebugAranges &
- GetFunctionAranges ();
-
- SymbolFileDWARF*
- GetSymbolFileDWARF () const
- {
- return m_dwarf2Data;
- }
-
- Producer
- GetProducer ();
-
- uint32_t
- GetProducerVersionMajor();
-
- uint32_t
- GetProducerVersionMinor();
-
- uint32_t
- GetProducerVersionUpdate();
-
- static lldb::LanguageType
- LanguageTypeFromDWARF(uint64_t val);
-
- lldb::LanguageType
- GetLanguageType();
-
- bool
- IsDWARF64() const;
-
- bool
- GetIsOptimized ();
-
- SymbolFileDWARFDwo*
- GetDwoSymbolFile() const
- {
- return m_dwo_symbol_file.get();
- }
-
- dw_offset_t
- GetBaseObjOffset() const
- {
- return m_base_obj_offset;
- }
+ enum Producer {
+ eProducerInvalid = 0,
+ eProducerClang,
+ eProducerGCC,
+ eProducerLLVMGCC,
+ eProcucerOther
+ };
+
+ DWARFCompileUnit(SymbolFileDWARF *dwarf2Data);
+ ~DWARFCompileUnit();
+
+ bool Extract(const lldb_private::DWARFDataExtractor &debug_info,
+ lldb::offset_t *offset_ptr);
+ size_t ExtractDIEsIfNeeded(bool cu_die_only);
+ 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(); }
+ dw_offset_t GetNextCompileUnitOffset() const {
+ return m_offset + m_length + (m_is_dwarf64 ? 12 : 4);
+ }
+ size_t GetDebugInfoSize() const {
+ return m_length + (m_is_dwarf64 ? 12 : 4) - Size(); /* Size in bytes of the
+ .debug_info data
+ associated with this
+ compile unit. */
+ }
+ uint32_t GetLength() const { return m_length; }
+ uint16_t GetVersion() const { return m_version; }
+ const DWARFAbbreviationDeclarationSet *GetAbbreviations() const {
+ return m_abbrevs;
+ }
+ dw_offset_t GetAbbrevOffset() const;
+ uint8_t GetAddressByteSize() const { return m_addr_size; }
+ dw_addr_t GetBaseAddress() const { return m_base_addr; }
+ dw_addr_t GetAddrBase() const { return m_addr_base; }
+ void SetAddrBase(dw_addr_t addr_base, dw_offset_t base_obj_offset);
+ void ClearDIEs(bool keep_compile_unit_die);
+ void BuildAddressRangeTable(SymbolFileDWARF *dwarf2Data,
+ DWARFDebugAranges *debug_aranges);
+
+ lldb::ByteOrder GetByteOrder() const;
+
+ lldb_private::TypeSystem *GetTypeSystem();
+
+ DWARFFormValue::FixedFormSizes GetFixedFormSizes();
+
+ void SetBaseAddress(dw_addr_t base_addr) { m_base_addr = base_addr; }
+
+ DWARFDIE
+ GetCompileUnitDIEOnly() { return DWARFDIE(this, GetCompileUnitDIEPtrOnly()); }
+
+ DWARFDIE
+ DIE() { return DWARFDIE(this, DIEPtr()); }
+
+ void AddDIE(DWARFDebugInfoEntry &die) {
+ // The average bytes per DIE entry has been seen to be
+ // around 14-20 so lets pre-reserve half of that since
+ // we are now stripping the NULL tags.
+
+ // Only reserve the memory if we are adding children of
+ // the main compile unit DIE. The compile unit DIE is always
+ // the first entry, so if our size is 1, then we are adding
+ // the first compile unit child DIE and should reserve
+ // the memory.
+ if (m_die_array.empty())
+ m_die_array.reserve(GetDebugInfoSize() / 24);
+ m_die_array.push_back(die);
+ }
+
+ void AddCompileUnitDIE(DWARFDebugInfoEntry &die);
+
+ bool HasDIEsParsed() const { return m_die_array.size() > 1; }
+
+ DWARFDIE
+ GetDIE(dw_offset_t die_offset);
+
+ static uint8_t GetAddressByteSize(const DWARFCompileUnit *cu);
+
+ static bool IsDWARF64(const DWARFCompileUnit *cu);
+
+ static uint8_t GetDefaultAddressSize();
+
+ static void SetDefaultAddressSize(uint8_t addr_size);
+
+ void *GetUserData() const { return m_user_data; }
+
+ void SetUserData(void *d);
+
+ bool Supports_DW_AT_APPLE_objc_complete_type();
+
+ bool DW_AT_decl_file_attributes_are_invalid();
+
+ bool Supports_unnamed_objc_bitfields();
+
+ void Index(NameToDIE &func_basenames, NameToDIE &func_fullnames,
+ NameToDIE &func_methods, NameToDIE &func_selectors,
+ NameToDIE &objc_class_selectors, NameToDIE &globals,
+ NameToDIE &types, NameToDIE &namespaces);
+
+ const DWARFDebugAranges &GetFunctionAranges();
+
+ SymbolFileDWARF *GetSymbolFileDWARF() const { return m_dwarf2Data; }
+
+ Producer GetProducer();
+
+ uint32_t GetProducerVersionMajor();
+
+ uint32_t GetProducerVersionMinor();
+
+ uint32_t GetProducerVersionUpdate();
+
+ static lldb::LanguageType LanguageTypeFromDWARF(uint64_t val);
+
+ lldb::LanguageType GetLanguageType();
+
+ bool IsDWARF64() const;
+
+ bool GetIsOptimized();
+
+ SymbolFileDWARFDwo *GetDwoSymbolFile() const {
+ return m_dwo_symbol_file.get();
+ }
+
+ dw_offset_t GetBaseObjOffset() const { return m_base_obj_offset; }
protected:
- SymbolFileDWARF* m_dwarf2Data;
- std::unique_ptr<SymbolFileDWARFDwo> m_dwo_symbol_file;
- const DWARFAbbreviationDeclarationSet *m_abbrevs;
- void * m_user_data;
- DWARFDebugInfoEntry::collection m_die_array; // The compile unit debug information entry item
- std::unique_ptr<DWARFDebugAranges> m_func_aranges_ap; // A table similar to the .debug_aranges table, but this one points to the exact DW_TAG_subprogram DIEs
- dw_addr_t m_base_addr;
- dw_offset_t m_offset;
- dw_offset_t m_length;
- uint16_t m_version;
- uint8_t m_addr_size;
- Producer m_producer;
- uint32_t m_producer_version_major;
- uint32_t m_producer_version_minor;
- uint32_t m_producer_version_update;
- lldb::LanguageType m_language_type;
- bool m_is_dwarf64;
- lldb_private::LazyBool m_is_optimized;
- dw_addr_t m_addr_base; // Value of DW_AT_addr_base
- dw_offset_t m_base_obj_offset; // If this is a dwo compile unit this is the offset of
- // the base compile unit in the main object file
-
- void
- ParseProducerInfo ();
-
- static void
- IndexPrivate (DWARFCompileUnit* dwarf_cu,
- const lldb::LanguageType cu_language,
- const DWARFFormValue::FixedFormSizes& fixed_form_sizes,
- const dw_offset_t cu_offset,
- NameToDIE& func_basenames,
- NameToDIE& func_fullnames,
- NameToDIE& func_methods,
- NameToDIE& func_selectors,
- NameToDIE& objc_class_selectors,
- NameToDIE& globals,
- NameToDIE& types,
- NameToDIE& namespaces);
+ SymbolFileDWARF *m_dwarf2Data;
+ std::unique_ptr<SymbolFileDWARFDwo> m_dwo_symbol_file;
+ const DWARFAbbreviationDeclarationSet *m_abbrevs;
+ void *m_user_data;
+ DWARFDebugInfoEntry::collection
+ m_die_array; // The compile unit debug information entry item
+ std::unique_ptr<DWARFDebugAranges> m_func_aranges_ap; // A table similar to
+ // the .debug_aranges
+ // table, but this one
+ // points to the exact
+ // DW_TAG_subprogram
+ // DIEs
+ dw_addr_t m_base_addr;
+ dw_offset_t m_offset;
+ dw_offset_t m_length;
+ uint16_t m_version;
+ uint8_t m_addr_size;
+ Producer m_producer;
+ uint32_t m_producer_version_major;
+ uint32_t m_producer_version_minor;
+ uint32_t m_producer_version_update;
+ lldb::LanguageType m_language_type;
+ bool m_is_dwarf64;
+ lldb_private::LazyBool m_is_optimized;
+ dw_addr_t m_addr_base; // Value of DW_AT_addr_base
+ dw_offset_t
+ m_base_obj_offset; // If this is a dwo compile unit this is the offset of
+ // the base compile unit in the main object file
+
+ void ParseProducerInfo();
+
+ static void
+ IndexPrivate(DWARFCompileUnit *dwarf_cu, const lldb::LanguageType cu_language,
+ const DWARFFormValue::FixedFormSizes &fixed_form_sizes,
+ const dw_offset_t cu_offset, NameToDIE &func_basenames,
+ NameToDIE &func_fullnames, NameToDIE &func_methods,
+ NameToDIE &func_selectors, NameToDIE &objc_class_selectors,
+ NameToDIE &globals, NameToDIE &types, NameToDIE &namespaces);
private:
-
- const DWARFDebugInfoEntry*
- GetCompileUnitDIEPtrOnly()
- {
- ExtractDIEsIfNeeded (true);
- if (m_die_array.empty())
- return NULL;
- return &m_die_array[0];
- }
-
- const DWARFDebugInfoEntry*
- DIEPtr()
- {
- ExtractDIEsIfNeeded (false);
- if (m_die_array.empty())
- return NULL;
- return &m_die_array[0];
- }
-
-
- DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit);
+ const DWARFDebugInfoEntry *GetCompileUnitDIEPtrOnly() {
+ ExtractDIEsIfNeeded(true);
+ if (m_die_array.empty())
+ return NULL;
+ return &m_die_array[0];
+ }
+
+ const DWARFDebugInfoEntry *DIEPtr() {
+ ExtractDIEsIfNeeded(false);
+ if (m_die_array.empty())
+ return NULL;
+ return &m_die_array[0];
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(DWARFCompileUnit);
};
-#endif // SymbolFileDWARF_DWARFCompileUnit_h_
+#endif // SymbolFileDWARF_DWARFCompileUnit_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
index 0f02c74fd2e..5222419d323 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
@@ -11,13 +11,13 @@
#include "DWARFASTParser.h"
#include "DWARFCompileUnit.h"
+#include "DWARFDIECollection.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 "SymbolFileDWARF.h"
@@ -28,543 +28,441 @@
using namespace lldb_private;
-DIERef
-DWARFDIE::GetDIERef() const
-{
- if (!IsValid())
- return DIERef();
+DIERef DWARFDIE::GetDIERef() const {
+ if (!IsValid())
+ return DIERef();
- dw_offset_t cu_offset = m_cu->GetOffset();
- if (m_cu->GetBaseObjOffset() != DW_INVALID_OFFSET)
- cu_offset = m_cu->GetBaseObjOffset();
- return DIERef(cu_offset, m_die->GetOffset());
+ dw_offset_t cu_offset = m_cu->GetOffset();
+ if (m_cu->GetBaseObjOffset() != DW_INVALID_OFFSET)
+ cu_offset = m_cu->GetBaseObjOffset();
+ return DIERef(cu_offset, m_die->GetOffset());
}
-dw_tag_t
-DWARFDIE::Tag() const
-{
- if (m_die)
- return m_die->Tag();
- else
- return 0;
+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());
+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::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::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::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::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();
+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;
+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;
+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;
+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;
}
DWARFDIE
-DWARFDIE::GetAttributeValueAsReferenceDIE (const dw_attr_t attr) const
-{
- if (IsValid())
- {
- DWARFCompileUnit *cu = GetCU();
- SymbolFileDWARF *dwarf = cu->GetSymbolFileDWARF();
- const bool check_specification_or_abstract_origin = true;
- DWARFFormValue form_value;
- if (m_die->GetAttributeValue(dwarf, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
- return dwarf->GetDIE(DIERef(form_value));
- }
- return DWARFDIE();
+DWARFDIE::GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const {
+ if (IsValid()) {
+ DWARFCompileUnit *cu = GetCU();
+ SymbolFileDWARF *dwarf = cu->GetSymbolFileDWARF();
+ const bool check_specification_or_abstract_origin = true;
+ DWARFFormValue form_value;
+ if (m_die->GetAttributeValue(dwarf, cu, attr, form_value, nullptr,
+ check_specification_or_abstract_origin))
+ return dwarf->GetDIE(DIERef(form_value));
+ }
+ return DWARFDIE();
+}
+
+uint64_t DWARFDIE::GetAttributeValueAsReference(const dw_attr_t attr,
+ uint64_t fail_value) const {
+ if (IsValid())
+ return m_die->GetAttributeValueAsReference(GetDWARF(), GetCU(), attr,
+ fail_value);
+ else
+ return fail_value;
+}
+
+uint64_t DWARFDIE::GetAttributeValueAsAddress(const dw_attr_t attr,
+ uint64_t fail_value) const {
+ if (IsValid())
+ return m_die->GetAttributeValueAsAddress(GetDWARF(), GetCU(), attr,
+ fail_value);
+ else
+ return fail_value;
}
-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;
-}
-
-uint64_t
-DWARFDIE::GetAttributeValueAsAddress (const dw_attr_t attr, uint64_t fail_value) const
-{
- if (IsValid())
- return m_die->GetAttributeValueAsAddress(GetDWARF(), GetCU(), attr, fail_value);
- else
- return fail_value;
-}
-
-
DWARFDIE
-DWARFDIE::LookupDeepestBlock (lldb::addr_t file_addr) const
-{
- 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()->GetCompileUnit(DIERef(cu->GetOffset(), block_die->GetOffset())), block_die);
- }
- }
+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()->GetCompileUnit(
+ DIERef(cu->GetOffset(), block_die->GetOffset())),
+ block_die);
+ }
}
- return DWARFDIE();
-}
-
-lldb::user_id_t
-DWARFDIE::GetID () const
-{
- return GetDIERef().GetUID(GetDWARF());
+ }
+ return DWARFDIE();
}
-const char *
-DWARFDIE::GetName () const
-{
- if (IsValid())
- return m_die->GetName (GetDWARF(), m_cu);
- else
- return nullptr;
+lldb::user_id_t DWARFDIE::GetID() const {
+ return GetDIERef().GetUID(GetDWARF());
}
-const char *
-DWARFDIE::GetMangledName () const
-{
- if (IsValid())
- return m_die->GetMangledName (GetDWARF(), m_cu);
- else
- return nullptr;
+const char *DWARFDIE::GetName() const {
+ if (IsValid())
+ return m_die->GetName(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::GetMangledName() const {
+ if (IsValid())
+ return m_die->GetMangledName(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;
+const char *DWARFDIE::GetPubname() const {
+ if (IsValid())
+ return m_die->GetPubname(GetDWARF(), m_cu);
+ else
+ return nullptr;
}
-lldb::LanguageType
-DWARFDIE::GetLanguage () const
-{
- if (IsValid())
- return m_cu->GetLanguageType();
- else
- return lldb::eLanguageTypeUnknown;
+const char *DWARFDIE::GetQualifiedName(std::string &storage) const {
+ if (IsValid())
+ return m_die->GetQualifiedName(GetDWARF(), m_cu, storage);
+ else
+ return nullptr;
}
-
-lldb::ModuleSP
-DWARFDIE::GetModule () const
-{
- SymbolFileDWARF *dwarf = GetDWARF();
- if (dwarf)
- return dwarf->GetObjectFile()->GetModule();
- else
- return lldb::ModuleSP();
+lldb::LanguageType DWARFDIE::GetLanguage() const {
+ if (IsValid())
+ return m_cu->GetLanguageType();
+ else
+ return lldb::eLanguageTypeUnknown;
}
-lldb_private::CompileUnit *
-DWARFDIE::GetLLDBCompileUnit () const
-{
- if (IsValid())
- return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU());
- else
- return nullptr;
+lldb::ModuleSP DWARFDIE::GetModule() const {
+ SymbolFileDWARF *dwarf = GetDWARF();
+ if (dwarf)
+ return dwarf->GetObjectFile()->GetModule();
+ else
+ return lldb::ModuleSP();
}
-lldb_private::Type *
-DWARFDIE::ResolveType () const
-{
- if (IsValid())
- return GetDWARF()->ResolveType(*this, true);
- else
- return nullptr;
+lldb_private::CompileUnit *DWARFDIE::GetLLDBCompileUnit() const {
+ if (IsValid())
+ return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU());
+ else
+ return nullptr;
}
-lldb_private::Type *
-DWARFDIE::ResolveTypeUID (const DIERef &die_ref) const
-{
- SymbolFileDWARF *dwarf = GetDWARF();
- if (dwarf)
- return dwarf->ResolveTypeUID(dwarf->GetDIE(die_ref), true);
- 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);
- }
- }
+lldb_private::Type *DWARFDIE::ResolveType() const {
+ if (IsValid())
+ return GetDWARF()->ResolveType(*this, true);
+ else
+ return nullptr;
}
-void
-DWARFDIE::GetDWARFDeclContext (DWARFDeclContext &dwarf_decl_ctx) const
-{
- if (IsValid())
- {
- dwarf_decl_ctx.SetLanguage(GetLanguage());
- m_die->GetDWARFDeclContext (GetDWARF(), GetCU(), dwarf_decl_ctx);
- }
- else
- {
- dwarf_decl_ctx.Clear();
- }
+lldb_private::Type *DWARFDIE::ResolveTypeUID(const DIERef &die_ref) const {
+ SymbolFileDWARF *dwarf = GetDWARF();
+ if (dwarf)
+ return dwarf->ResolveTypeUID(dwarf->GetDIE(die_ref), true);
+ else
+ return nullptr;
}
-void
-DWARFDIE::GetDWOContext (std::vector<CompilerContext> &context) const
-{
- const dw_tag_t tag = Tag();
- if (tag == DW_TAG_compile_unit)
- return;
- DWARFDIE parent = GetParent();
- if (parent)
- parent.GetDWOContext(context);
- switch (tag)
- {
- case DW_TAG_module:
- context.push_back(CompilerContext(CompilerContextKind::Module, ConstString(GetName())));
- break;
- case DW_TAG_namespace:
- context.push_back(CompilerContext(CompilerContextKind::Namespace, ConstString(GetName())));
- break;
- case DW_TAG_structure_type:
- context.push_back(CompilerContext(CompilerContextKind::Structure, ConstString(GetName())));
- break;
- case DW_TAG_union_type:
- context.push_back(CompilerContext(CompilerContextKind::Union, ConstString(GetName())));
- break;
- case DW_TAG_class_type:
- context.push_back(CompilerContext(CompilerContextKind::Class, ConstString(GetName())));
- break;
- case DW_TAG_enumeration_type:
- context.push_back(CompilerContext(CompilerContextKind::Enumeration, ConstString(GetName())));
- break;
- case DW_TAG_subprogram:
- context.push_back(CompilerContext(CompilerContextKind::Function, ConstString(GetPubname())));
- break;
- case DW_TAG_variable:
- context.push_back(CompilerContext(CompilerContextKind::Variable, ConstString(GetPubname())));
- break;
- case DW_TAG_typedef:
- context.push_back(CompilerContext(CompilerContextKind::Typedef, ConstString(GetName())));
- break;
- default:
- break;
+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()) {
+ dwarf_decl_ctx.SetLanguage(GetLanguage());
+ m_die->GetDWARFDeclContext(GetDWARF(), GetCU(), dwarf_decl_ctx);
+ } else {
+ dwarf_decl_ctx.Clear();
+ }
+}
+
+void DWARFDIE::GetDWOContext(std::vector<CompilerContext> &context) const {
+ const dw_tag_t tag = Tag();
+ if (tag == DW_TAG_compile_unit)
+ return;
+ DWARFDIE parent = GetParent();
+ if (parent)
+ parent.GetDWOContext(context);
+ switch (tag) {
+ case DW_TAG_module:
+ context.push_back(
+ CompilerContext(CompilerContextKind::Module, ConstString(GetName())));
+ break;
+ case DW_TAG_namespace:
+ context.push_back(CompilerContext(CompilerContextKind::Namespace,
+ ConstString(GetName())));
+ break;
+ case DW_TAG_structure_type:
+ context.push_back(CompilerContext(CompilerContextKind::Structure,
+ ConstString(GetName())));
+ break;
+ case DW_TAG_union_type:
+ context.push_back(
+ CompilerContext(CompilerContextKind::Union, ConstString(GetName())));
+ break;
+ case DW_TAG_class_type:
+ context.push_back(
+ CompilerContext(CompilerContextKind::Class, ConstString(GetName())));
+ break;
+ case DW_TAG_enumeration_type:
+ context.push_back(CompilerContext(CompilerContextKind::Enumeration,
+ ConstString(GetName())));
+ break;
+ case DW_TAG_subprogram:
+ context.push_back(CompilerContext(CompilerContextKind::Function,
+ ConstString(GetPubname())));
+ break;
+ case DW_TAG_variable:
+ context.push_back(CompilerContext(CompilerContextKind::Variable,
+ ConstString(GetPubname())));
+ break;
+ case DW_TAG_typedef:
+ context.push_back(
+ CompilerContext(CompilerContextKind::Typedef, ConstString(GetName())));
+ break;
+ default:
+ break;
+ }
}
-
-
DWARFDIE
-DWARFDIE::GetParentDeclContextDIE () const
-{
- if (IsValid())
- return m_die->GetParentDeclContextDIE(GetDWARF(), m_cu);
- else
- return 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::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;
+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;
+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;
+lldb_private::TypeSystem *DWARFDIE::GetTypeSystem() const {
+ if (m_cu)
+ return m_cu->GetTypeSystem();
+ else
+ return nullptr;
}
-DWARFASTParser *
-DWARFDIE::GetDWARFParser () const
-{
- lldb_private::TypeSystem *type_system = GetTypeSystem ();
- if (type_system)
- return type_system->GetDWARFParser();
- else
- return nullptr;
+DWARFASTParser *DWARFDIE::GetDWARFParser() const {
+ lldb_private::TypeSystem *type_system = GetTypeSystem();
+ if (type_system)
+ return type_system->GetDWARFParser();
+ 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::IsStructOrClass() const {
+ const dw_tag_t tag = Tag();
+ return tag == DW_TAG_class_type || tag == DW_TAG_structure_type;
}
-
DWARFDIE
-DWARFDIE::GetContainingDWOModuleDIE () const
-{
- if (IsValid())
- {
- DWARFDIE top_module_die;
- // Now make sure this DIE is scoped in a DW_TAG_module tag and return true if so
- for (DWARFDIE parent = GetParent(); parent.IsValid(); parent = parent.GetParent())
- {
- const dw_tag_t tag = parent.Tag();
- if (tag == DW_TAG_module)
- top_module_die = parent;
- else if (tag == DW_TAG_compile_unit)
- break;
- }
-
- return top_module_die;
+DWARFDIE::GetContainingDWOModuleDIE() const {
+ if (IsValid()) {
+ DWARFDIE top_module_die;
+ // Now make sure this DIE is scoped in a DW_TAG_module tag and return true
+ // if so
+ for (DWARFDIE parent = GetParent(); parent.IsValid();
+ parent = parent.GetParent()) {
+ const dw_tag_t tag = parent.Tag();
+ if (tag == DW_TAG_module)
+ top_module_die = parent;
+ else if (tag == DW_TAG_compile_unit)
+ break;
}
- return DWARFDIE();
+
+ return top_module_die;
+ }
+ return DWARFDIE();
}
-lldb::ModuleSP
-DWARFDIE::GetContainingDWOModule () const
-{
- if (IsValid())
- {
- DWARFDIE dwo_module_die = GetContainingDWOModuleDIE();
+lldb::ModuleSP DWARFDIE::GetContainingDWOModule() const {
+ if (IsValid()) {
+ DWARFDIE dwo_module_die = GetContainingDWOModuleDIE();
- if (dwo_module_die)
- {
- const char *module_name = dwo_module_die.GetName();
- if (module_name)
- return GetDWARF()->GetDWOModule (lldb_private::ConstString(module_name));
- }
+ if (dwo_module_die) {
+ const char *module_name = dwo_module_die.GetName();
+ if (module_name)
+ return GetDWARF()->GetDWOModule(lldb_private::ConstString(module_name));
}
- return lldb::ModuleSP();
+ }
+ return lldb::ModuleSP();
}
-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::HasChildren() const {
+ if (m_die)
+ return m_die->HasChildren();
+ else
+ return false;
}
-
-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;
+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;
}
-void
-DWARFDIE::Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const
-{
- if (s && IsValid())
- m_die->Dump (GetDWARF(), GetCU(), *s, recurse_depth);
+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;
}
-
-CompilerDecl
-DWARFDIE::GetDecl () const
-{
- DWARFASTParser *dwarf_ast = GetDWARFParser();
- if (dwarf_ast)
- return dwarf_ast->GetDeclForUIDFromDWARF(*this);
- else
- return CompilerDecl();
+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;
}
-CompilerDeclContext
-DWARFDIE::GetDeclContext () const
-{
- DWARFASTParser *dwarf_ast = GetDWARFParser();
- if (dwarf_ast)
- return dwarf_ast->GetDeclContextForUIDFromDWARF(*this);
- else
- return CompilerDeclContext();
+void DWARFDIE::Dump(lldb_private::Stream *s,
+ const uint32_t recurse_depth) const {
+ if (s && IsValid())
+ m_die->Dump(GetDWARF(), GetCU(), *s, recurse_depth);
}
-CompilerDeclContext
-DWARFDIE::GetContainingDeclContext () const
-{
- DWARFASTParser *dwarf_ast = GetDWARFParser();
- if (dwarf_ast)
- return dwarf_ast->GetDeclContextContainingUIDFromDWARF(*this);
- else
- return CompilerDeclContext();
+CompilerDecl DWARFDIE::GetDecl() const {
+ DWARFASTParser *dwarf_ast = GetDWARFParser();
+ if (dwarf_ast)
+ return dwarf_ast->GetDeclForUIDFromDWARF(*this);
+ else
+ return CompilerDecl();
}
-bool operator == (const DWARFDIE &lhs, const DWARFDIE &rhs)
-{
- return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU();
+CompilerDeclContext DWARFDIE::GetDeclContext() const {
+ DWARFASTParser *dwarf_ast = GetDWARFParser();
+ if (dwarf_ast)
+ return dwarf_ast->GetDeclContextForUIDFromDWARF(*this);
+ else
+ return CompilerDeclContext();
}
-bool operator != (const DWARFDIE &lhs, const DWARFDIE &rhs)
-{
- return lhs.GetDIE() != rhs.GetDIE() || lhs.GetCU() != rhs.GetCU();
+CompilerDeclContext DWARFDIE::GetContainingDeclContext() const {
+ DWARFASTParser *dwarf_ast = GetDWARFParser();
+ if (dwarf_ast)
+ return dwarf_ast->GetDeclContextContainingUIDFromDWARF(*this);
+ else
+ return CompilerDeclContext();
}
+bool operator==(const DWARFDIE &lhs, const DWARFDIE &rhs) {
+ return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU();
+}
+bool operator!=(const DWARFDIE &lhs, const DWARFDIE &rhs) {
+ return lhs.GetDIE() != rhs.GetDIE() || lhs.GetCU() != rhs.GetCU();
+}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
index 2dcd1d7dc43..8af3015b9d7 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
@@ -10,8 +10,8 @@
#ifndef SymbolFileDWARF_DWARFDIE_h_
#define SymbolFileDWARF_DWARFDIE_h_
-#include "lldb/lldb-types.h"
#include "lldb/Core/dwarf.h"
+#include "lldb/lldb-types.h"
struct DIERef;
class DWARFASTParser;
@@ -22,274 +22,200 @@ class DWARFDeclContext;
class DWARFDIECollection;
class SymbolFileDWARF;
-class DWARFDIE
-{
+class DWARFDIE {
public:
- DWARFDIE () :
- m_cu (nullptr),
- m_die (nullptr)
- {
- }
+ DWARFDIE() : m_cu(nullptr), m_die(nullptr) {}
- DWARFDIE (DWARFCompileUnit *cu, DWARFDebugInfoEntry *die) :
- m_cu (cu),
- m_die (die)
- {
- }
+ 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(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(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))
- {
- }
+ DWARFDIE(const DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
+ : m_cu(const_cast<DWARFCompileUnit *>(cu)),
+ m_die(const_cast<DWARFDebugInfoEntry *>(die)) {}
- //----------------------------------------------------------------------
- // Tests
- //----------------------------------------------------------------------
- explicit operator bool () const
- {
- return IsValid();
- }
+ //----------------------------------------------------------------------
+ // Tests
+ //----------------------------------------------------------------------
+ explicit operator bool() const { return IsValid(); }
- bool
- IsValid() const
- {
- return m_cu && m_die;
- }
+ bool IsValid() const { return m_cu && m_die; }
- bool
- IsStructOrClass () const;
+ bool IsStructOrClass() const;
- bool
- HasChildren () const;
+ bool HasChildren() const;
- bool
- Supports_DW_AT_APPLE_objc_complete_type () const;
+ bool Supports_DW_AT_APPLE_objc_complete_type() const;
- //----------------------------------------------------------------------
- // Accessors
- //----------------------------------------------------------------------
- SymbolFileDWARF *
- GetDWARF () const;
+ //----------------------------------------------------------------------
+ // Accessors
+ //----------------------------------------------------------------------
+ SymbolFileDWARF *GetDWARF() const;
- DWARFCompileUnit *
- GetCU() const
- {
- return m_cu;
- }
+ DWARFCompileUnit *GetCU() const { return m_cu; }
- DWARFDebugInfoEntry *
- GetDIE() const
- {
- return m_die;
- }
+ DWARFDebugInfoEntry *GetDIE() const { return m_die; }
- DIERef
- GetDIERef() const;
-
- lldb_private::TypeSystem *
- GetTypeSystem () const;
-
- DWARFASTParser *
- GetDWARFParser () const;
-
- void
- Set (DWARFCompileUnit *cu, DWARFDebugInfoEntry *die)
- {
- if (cu && die)
- {
- m_cu = cu;
- m_die = die;
- }
- else
- {
- Clear();
- }
- }
+ DIERef GetDIERef() const;
- void
- Clear ()
- {
- m_cu = nullptr;
- m_die = nullptr;
+ lldb_private::TypeSystem *GetTypeSystem() const;
+
+ DWARFASTParser *GetDWARFParser() 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;
+ }
+
+ lldb::ModuleSP GetContainingDWOModule() const;
- lldb::ModuleSP
- GetContainingDWOModule () const;
+ DWARFDIE
+ GetContainingDWOModuleDIE() const;
- DWARFDIE
- GetContainingDWOModuleDIE () const;
+ //----------------------------------------------------------------------
+ // Accessing information about a DIE
+ //----------------------------------------------------------------------
+ dw_tag_t Tag() const;
- //----------------------------------------------------------------------
- // Accessing information about a DIE
- //----------------------------------------------------------------------
- dw_tag_t
- Tag() const;
+ const char *GetTagAsCString() const;
- const char *
- GetTagAsCString () const;
+ dw_offset_t GetOffset() const;
- dw_offset_t
- GetOffset () const;
+ dw_offset_t GetCompileUnitRelativeOffset() 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;
- //----------------------------------------------------------------------
- // 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 *
- GetName () const;
+ const char *GetMangledName() const;
- const char *
- GetMangledName () const;
+ const char *GetPubname() const;
- const char *
- GetPubname () const;
+ const char *GetQualifiedName(std::string &storage) const;
- const char *
- GetQualifiedName (std::string &storage) const;
+ lldb::LanguageType GetLanguage() const;
- lldb::LanguageType
- GetLanguage () const;
+ lldb::ModuleSP GetModule() const;
- lldb::ModuleSP
- GetModule () const;
+ lldb_private::CompileUnit *GetLLDBCompileUnit() const;
- lldb_private::CompileUnit *
- GetLLDBCompileUnit () const;
+ lldb_private::Type *ResolveType() const;
- lldb_private::Type *
- ResolveType () const;
+ //----------------------------------------------------------------------
+ // Resolve a type by UID using this DIE's DWARF file
+ //----------------------------------------------------------------------
+ lldb_private::Type *ResolveTypeUID(const DIERef &die_ref) const;
- //----------------------------------------------------------------------
- // Resolve a type by UID using this DIE's DWARF file
- //----------------------------------------------------------------------
- lldb_private::Type *
- ResolveTypeUID (const DIERef &die_ref) const;
+ //----------------------------------------------------------------------
+ // Functions for obtaining DIE relations and references
+ //----------------------------------------------------------------------
- //----------------------------------------------------------------------
- // Functions for obtaining DIE relations and references
- //----------------------------------------------------------------------
+ DWARFDIE
+ GetParent() const;
- DWARFDIE
- GetParent () const;
+ DWARFDIE
+ GetFirstChild() const;
- DWARFDIE
- GetFirstChild () const;
+ DWARFDIE
+ GetSibling() const;
- DWARFDIE
- GetSibling () const;
+ DWARFDIE
+ GetReferencedDIE(const dw_attr_t attr) 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;
- //----------------------------------------------------------------------
- // 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
- LookupDeepestBlock (lldb::addr_t file_addr) const;
+ DWARFDIE
+ GetParentDeclContextDIE() const;
- DWARFDIE
- GetParentDeclContextDIE () const;
+ //----------------------------------------------------------------------
+ // DeclContext related functions
+ //----------------------------------------------------------------------
+ void GetDeclContextDIEs(DWARFDIECollection &decl_context_dies) const;
- //----------------------------------------------------------------------
- // DeclContext related functions
- //----------------------------------------------------------------------
- void
- GetDeclContextDIEs (DWARFDIECollection &decl_context_dies) const;
+ void GetDWARFDeclContext(DWARFDeclContext &dwarf_decl_ctx) const;
- void
- GetDWARFDeclContext (DWARFDeclContext &dwarf_decl_ctx) const;
+ void GetDWOContext(std::vector<lldb_private::CompilerContext> &context) const;
- void
- GetDWOContext (std::vector<lldb_private::CompilerContext> &context) 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;
- //----------------------------------------------------------------------
- // 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;
- 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;
- 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;
- uint64_t
- GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const;
+ DWARFDIE
+ GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const;
- DWARFDIE
- GetAttributeValueAsReferenceDIE (const dw_attr_t attr) const;
+ uint64_t GetAttributeValueAsAddress(const dw_attr_t attr,
+ uint64_t fail_value) const;
- uint64_t
- GetAttributeValueAsAddress (const dw_attr_t attr, uint64_t fail_value) const;
+ size_t GetAttributes(DWARFAttributes &attributes, uint32_t depth = 0) const;
- 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;
- 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
+ //----------------------------------------------------------------------
- //----------------------------------------------------------------------
- // Pretty printing
- //----------------------------------------------------------------------
+ void Dump(lldb_private::Stream *s, const uint32_t recurse_depth) const;
- void
- Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const;
+ lldb_private::CompilerDecl GetDecl() const;
- lldb_private::CompilerDecl
- GetDecl () const;
+ lldb_private::CompilerDeclContext GetDeclContext() const;
- lldb_private::CompilerDeclContext
- GetDeclContext() const;
-
- lldb_private::CompilerDeclContext
- GetContainingDeclContext() const;
+ lldb_private::CompilerDeclContext GetContainingDeclContext() const;
protected:
- DWARFCompileUnit *m_cu;
- DWARFDebugInfoEntry *m_die;
+ DWARFCompileUnit *m_cu;
+ DWARFDebugInfoEntry *m_die;
};
-bool operator == (const DWARFDIE &lhs, const DWARFDIE &rhs);
-bool operator != (const DWARFDIE &lhs, const DWARFDIE &rhs);
+bool operator==(const DWARFDIE &lhs, const DWARFDIE &rhs);
+bool operator!=(const DWARFDIE &lhs, const DWARFDIE &rhs);
-#endif // SymbolFileDWARF_DWARFDIE_h_
+#endif // SymbolFileDWARF_DWARFDIE_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp
index e9f09fd8776..5fb63589591 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp
@@ -16,32 +16,20 @@
using namespace lldb_private;
using namespace std;
-void
-DWARFDIECollection::Append (const DWARFDIE &die)
-{
- m_dies.push_back (die);
-}
+void DWARFDIECollection::Append(const DWARFDIE &die) { m_dies.push_back(die); }
DWARFDIE
-DWARFDIECollection::GetDIEAtIndex(uint32_t idx) const
-{
- if (idx < m_dies.size())
- return m_dies[idx];
- return DWARFDIE();
+DWARFDIECollection::GetDIEAtIndex(uint32_t idx) const {
+ if (idx < m_dies.size())
+ return m_dies[idx];
+ return DWARFDIE();
}
+size_t DWARFDIECollection::Size() const { return m_dies.size(); }
-size_t
-DWARFDIECollection::Size() const
-{
- return m_dies.size();
-}
-
-void
-DWARFDIECollection::Dump(Stream *s, const char* title) const
-{
- if (title && title[0] != '\0')
- s->Printf( "%s\n", title);
- for (const auto &die : m_dies)
- s->Printf( "0x%8.8x\n", die.GetOffset());
+void DWARFDIECollection::Dump(Stream *s, const char *title) const {
+ if (title && title[0] != '\0')
+ s->Printf("%s\n", title);
+ for (const auto &die : m_dies)
+ s->Printf("0x%8.8x\n", die.GetOffset());
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h
index 83d58ec4930..e1e73e71ae7 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h
@@ -13,36 +13,26 @@
#include "DWARFDIE.h"
#include <vector>
-class DWARFDIECollection
-{
+class DWARFDIECollection {
public:
- DWARFDIECollection() :
- m_dies()
- {
- }
- ~DWARFDIECollection()
- {
- }
+ DWARFDIECollection() : m_dies() {}
+ ~DWARFDIECollection() {}
- void
- Append (const DWARFDIE &die);
+ void Append(const DWARFDIE &die);
- void
- Dump(lldb_private::Stream *s, const char* title) const;
+ void Dump(lldb_private::Stream *s, const char *title) const;
- DWARFDIE
- GetDIEAtIndex (uint32_t idx) const;
+ DWARFDIE
+ GetDIEAtIndex(uint32_t idx) const;
- size_t
- Size() const;
+ size_t Size() const;
protected:
- typedef std::vector<DWARFDIE> collection;
- typedef collection::iterator iterator;
- typedef collection::const_iterator const_iterator;
+ typedef std::vector<DWARFDIE> collection;
+ typedef collection::iterator iterator;
+ typedef collection::const_iterator const_iterator;
- collection m_dies; // Ordered list of die offsets
+ collection m_dies; // Ordered list of die offsets
};
-
-#endif // SymbolFileDWARF_DWARFDIECollection_h_
+#endif // SymbolFileDWARF_DWARFDIECollection_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp
index 9bf47cd7a9a..0c807d7d604 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp
@@ -12,19 +12,16 @@
namespace lldb_private {
uint64_t
-DWARFDataExtractor::GetDWARFInitialLength(lldb::offset_t *offset_ptr) const
-{
- uint64_t length = GetU32(offset_ptr);
- m_is_dwarf64 = (length == UINT32_MAX);
- if (m_is_dwarf64)
- length = GetU64(offset_ptr);
- return length;
+DWARFDataExtractor::GetDWARFInitialLength(lldb::offset_t *offset_ptr) const {
+ uint64_t length = GetU32(offset_ptr);
+ m_is_dwarf64 = (length == UINT32_MAX);
+ if (m_is_dwarf64)
+ length = GetU64(offset_ptr);
+ return length;
}
dw_offset_t
-DWARFDataExtractor::GetDWARFOffset(lldb::offset_t *offset_ptr) const
-{
- return GetMaxU64(offset_ptr, m_is_dwarf64 ? 8 : 4);
+DWARFDataExtractor::GetDWARFOffset(lldb::offset_t *offset_ptr) const {
+ return GetMaxU64(offset_ptr, m_is_dwarf64 ? 8 : 4);
}
-
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h
index 0281b5ad5c8..62ddbe8ecd5 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h
@@ -7,8 +7,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef liblldb_DWARFDataExtractor_h_
-#define liblldb_DWARFDataExtractor_h_
+#ifndef liblldb_DWARFDataExtractor_h_
+#define liblldb_DWARFDataExtractor_h_
// Other libraries and framework includes.
#include "lldb/Core/DataExtractor.h"
@@ -16,30 +16,25 @@
namespace lldb_private {
-class DWARFDataExtractor : public lldb_private::DataExtractor
-{
+class DWARFDataExtractor : public lldb_private::DataExtractor {
public:
- DWARFDataExtractor() : DataExtractor(), m_is_dwarf64(false) { }
+ DWARFDataExtractor() : DataExtractor(), m_is_dwarf64(false) {}
- DWARFDataExtractor (const DWARFDataExtractor& data, lldb::offset_t offset, lldb::offset_t length) :
- DataExtractor(data, offset, length), m_is_dwarf64(false) { }
+ DWARFDataExtractor(const DWARFDataExtractor &data, lldb::offset_t offset,
+ lldb::offset_t length)
+ : DataExtractor(data, offset, length), m_is_dwarf64(false) {}
- uint64_t
- GetDWARFInitialLength(lldb::offset_t *offset_ptr) const;
+ uint64_t GetDWARFInitialLength(lldb::offset_t *offset_ptr) const;
- dw_offset_t
- GetDWARFOffset(lldb::offset_t *offset_ptr) const;
+ dw_offset_t GetDWARFOffset(lldb::offset_t *offset_ptr) const;
- size_t
- GetDWARFSizeofInitialLength() const { return m_is_dwarf64 ? 12 : 4; }
+ size_t GetDWARFSizeofInitialLength() const { return m_is_dwarf64 ? 12 : 4; }
- bool
- IsDWARF64() const { return m_is_dwarf64; }
+ bool IsDWARF64() const { return m_is_dwarf64; }
protected:
- mutable bool m_is_dwarf64;
+ mutable bool m_is_dwarf64;
};
-
}
-#endif // liblldb_DWARFDataExtractor_h_
+#endif // liblldb_DWARFDataExtractor_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp
index 6773d0762a2..fe6df913b76 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp
@@ -18,74 +18,63 @@ using namespace std;
//----------------------------------------------------------------------
// DWARFAbbreviationDeclarationSet::Clear()
//----------------------------------------------------------------------
-void
-DWARFAbbreviationDeclarationSet::Clear()
-{
- m_idx_offset = 0;
- m_decls.clear();
+void DWARFAbbreviationDeclarationSet::Clear() {
+ m_idx_offset = 0;
+ m_decls.clear();
}
-
//----------------------------------------------------------------------
// DWARFAbbreviationDeclarationSet::Extract()
//----------------------------------------------------------------------
-bool
-DWARFAbbreviationDeclarationSet::Extract(const DWARFDataExtractor& data, lldb::offset_t *offset_ptr)
-{
- const lldb::offset_t begin_offset = *offset_ptr;
- m_offset = begin_offset;
- Clear();
- DWARFAbbreviationDeclaration abbrevDeclaration;
- dw_uleb128_t prev_abbr_code = 0;
- while (abbrevDeclaration.Extract(data, offset_ptr))
- {
- m_decls.push_back(abbrevDeclaration);
- if (m_idx_offset == 0)
- m_idx_offset = abbrevDeclaration.Code();
- else
- {
- if (prev_abbr_code + 1 != abbrevDeclaration.Code())
- m_idx_offset = UINT32_MAX; // Out of order indexes, we can't do O(1) lookups...
- }
- prev_abbr_code = abbrevDeclaration.Code();
+bool DWARFAbbreviationDeclarationSet::Extract(const DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr) {
+ const lldb::offset_t begin_offset = *offset_ptr;
+ m_offset = begin_offset;
+ Clear();
+ DWARFAbbreviationDeclaration abbrevDeclaration;
+ dw_uleb128_t prev_abbr_code = 0;
+ while (abbrevDeclaration.Extract(data, offset_ptr)) {
+ m_decls.push_back(abbrevDeclaration);
+ if (m_idx_offset == 0)
+ m_idx_offset = abbrevDeclaration.Code();
+ else {
+ if (prev_abbr_code + 1 != abbrevDeclaration.Code())
+ m_idx_offset =
+ UINT32_MAX; // Out of order indexes, we can't do O(1) lookups...
}
- return begin_offset != *offset_ptr;
+ prev_abbr_code = abbrevDeclaration.Code();
+ }
+ return begin_offset != *offset_ptr;
}
-
//----------------------------------------------------------------------
// DWARFAbbreviationDeclarationSet::Dump()
//----------------------------------------------------------------------
-void
-DWARFAbbreviationDeclarationSet::Dump(Stream *s) const
-{
- std::for_each (m_decls.begin(), m_decls.end(), bind2nd(std::mem_fun_ref(&DWARFAbbreviationDeclaration::Dump),s));
+void DWARFAbbreviationDeclarationSet::Dump(Stream *s) const {
+ std::for_each(
+ m_decls.begin(), m_decls.end(),
+ bind2nd(std::mem_fun_ref(&DWARFAbbreviationDeclaration::Dump), s));
}
-
//----------------------------------------------------------------------
// DWARFAbbreviationDeclarationSet::GetAbbreviationDeclaration()
//----------------------------------------------------------------------
-const DWARFAbbreviationDeclaration*
-DWARFAbbreviationDeclarationSet::GetAbbreviationDeclaration(dw_uleb128_t abbrCode) const
-{
- if (m_idx_offset == UINT32_MAX)
- {
- DWARFAbbreviationDeclarationCollConstIter pos;
- DWARFAbbreviationDeclarationCollConstIter end = m_decls.end();
- for (pos = m_decls.begin(); pos != end; ++pos)
- {
- if (pos->Code() == abbrCode)
- return &(*pos);
- }
- }
- else
- {
- uint32_t idx = abbrCode - m_idx_offset;
- if (idx < m_decls.size())
- return &m_decls[idx];
+const DWARFAbbreviationDeclaration *
+DWARFAbbreviationDeclarationSet::GetAbbreviationDeclaration(
+ dw_uleb128_t abbrCode) const {
+ if (m_idx_offset == UINT32_MAX) {
+ DWARFAbbreviationDeclarationCollConstIter pos;
+ DWARFAbbreviationDeclarationCollConstIter end = m_decls.end();
+ for (pos = m_decls.begin(); pos != end; ++pos) {
+ if (pos->Code() == abbrCode)
+ return &(*pos);
}
- return NULL;
+ } else {
+ uint32_t idx = abbrCode - m_idx_offset;
+ if (idx < m_decls.size())
+ return &m_decls[idx];
+ }
+ return NULL;
}
//----------------------------------------------------------------------
@@ -94,22 +83,20 @@ DWARFAbbreviationDeclarationSet::GetAbbreviationDeclaration(dw_uleb128_t abbrCod
// Append an abbreviation declaration with a sequential code for O(n)
// lookups. Handy when creating an DWARFAbbreviationDeclarationSet.
//----------------------------------------------------------------------
-dw_uleb128_t
-DWARFAbbreviationDeclarationSet::AppendAbbrevDeclSequential(const DWARFAbbreviationDeclaration& abbrevDecl)
-{
- // Get the next abbreviation code based on our current array size
- dw_uleb128_t code = m_decls.size()+1;
+dw_uleb128_t DWARFAbbreviationDeclarationSet::AppendAbbrevDeclSequential(
+ const DWARFAbbreviationDeclaration &abbrevDecl) {
+ // Get the next abbreviation code based on our current array size
+ dw_uleb128_t code = m_decls.size() + 1;
- // Push the new declaration on the back
- m_decls.push_back(abbrevDecl);
+ // Push the new declaration on the back
+ m_decls.push_back(abbrevDecl);
- // Update the code for this new declaration
- m_decls.back().SetCode(code);
+ // Update the code for this new declaration
+ m_decls.back().SetCode(code);
- return code; // return the new abbreviation code!
+ return code; // return the new abbreviation code!
}
-
//----------------------------------------------------------------------
// Encode
//
@@ -117,8 +104,9 @@ DWARFAbbreviationDeclarationSet::AppendAbbrevDeclSequential(const DWARFAbbreviat
// into a byte representation as would be found in a ".debug_abbrev"
// debug information section.
//----------------------------------------------------------------------
-//void
-//DWARFAbbreviationDeclarationSet::Encode(BinaryStreamBuf& debug_abbrev_buf) const
+// void
+// DWARFAbbreviationDeclarationSet::Encode(BinaryStreamBuf& debug_abbrev_buf)
+// const
//{
// DWARFAbbreviationDeclarationCollConstIter pos;
// DWARFAbbreviationDeclarationCollConstIter end = m_decls.end();
@@ -127,76 +115,63 @@ DWARFAbbreviationDeclarationSet::AppendAbbrevDeclSequential(const DWARFAbbreviat
// debug_abbrev_buf.Append8(0);
//}
-
//----------------------------------------------------------------------
// DWARFDebugAbbrev constructor
//----------------------------------------------------------------------
-DWARFDebugAbbrev::DWARFDebugAbbrev() :
- m_abbrevCollMap(),
- m_prev_abbr_offset_pos(m_abbrevCollMap.end())
-{
-}
-
+DWARFDebugAbbrev::DWARFDebugAbbrev()
+ : m_abbrevCollMap(), m_prev_abbr_offset_pos(m_abbrevCollMap.end()) {}
//----------------------------------------------------------------------
// DWARFDebugAbbrev::Parse()
//----------------------------------------------------------------------
-void
-DWARFDebugAbbrev::Parse(const DWARFDataExtractor& data)
-{
- lldb::offset_t offset = 0;
+void DWARFDebugAbbrev::Parse(const DWARFDataExtractor &data) {
+ lldb::offset_t offset = 0;
- while (data.ValidOffset(offset))
- {
- uint32_t initial_cu_offset = offset;
- DWARFAbbreviationDeclarationSet abbrevDeclSet;
+ while (data.ValidOffset(offset)) {
+ uint32_t initial_cu_offset = offset;
+ DWARFAbbreviationDeclarationSet abbrevDeclSet;
- if (abbrevDeclSet.Extract(data, &offset))
- m_abbrevCollMap[initial_cu_offset] = abbrevDeclSet;
- else
- break;
- }
- m_prev_abbr_offset_pos = m_abbrevCollMap.end();
+ if (abbrevDeclSet.Extract(data, &offset))
+ m_abbrevCollMap[initial_cu_offset] = abbrevDeclSet;
+ else
+ break;
+ }
+ m_prev_abbr_offset_pos = m_abbrevCollMap.end();
}
//----------------------------------------------------------------------
// DWARFDebugAbbrev::Dump()
//----------------------------------------------------------------------
-void
-DWARFDebugAbbrev::Dump(Stream *s) const
-{
- if (m_abbrevCollMap.empty())
- {
- s->PutCString("< EMPTY >\n");
- return;
- }
-
- DWARFAbbreviationDeclarationCollMapConstIter pos;
- for (pos = m_abbrevCollMap.begin(); pos != m_abbrevCollMap.end(); ++pos)
- {
- s->Printf("Abbrev table for offset: 0x%8.8x\n", pos->first);
- pos->second.Dump(s);
- }
+void DWARFDebugAbbrev::Dump(Stream *s) const {
+ if (m_abbrevCollMap.empty()) {
+ s->PutCString("< EMPTY >\n");
+ return;
+ }
+
+ DWARFAbbreviationDeclarationCollMapConstIter pos;
+ for (pos = m_abbrevCollMap.begin(); pos != m_abbrevCollMap.end(); ++pos) {
+ s->Printf("Abbrev table for offset: 0x%8.8x\n", pos->first);
+ pos->second.Dump(s);
+ }
}
-
//----------------------------------------------------------------------
// DWARFDebugAbbrev::GetAbbreviationDeclarationSet()
//----------------------------------------------------------------------
-const DWARFAbbreviationDeclarationSet*
-DWARFDebugAbbrev::GetAbbreviationDeclarationSet(dw_offset_t cu_abbr_offset) const
-{
- DWARFAbbreviationDeclarationCollMapConstIter end = m_abbrevCollMap.end();
- DWARFAbbreviationDeclarationCollMapConstIter pos;
- if (m_prev_abbr_offset_pos != end && m_prev_abbr_offset_pos->first == cu_abbr_offset)
- return &(m_prev_abbr_offset_pos->second);
- else
- {
- pos = m_abbrevCollMap.find(cu_abbr_offset);
- m_prev_abbr_offset_pos = pos;
- }
-
- if (pos != m_abbrevCollMap.end())
- return &(pos->second);
- return NULL;
+const DWARFAbbreviationDeclarationSet *
+DWARFDebugAbbrev::GetAbbreviationDeclarationSet(
+ dw_offset_t cu_abbr_offset) const {
+ DWARFAbbreviationDeclarationCollMapConstIter end = m_abbrevCollMap.end();
+ DWARFAbbreviationDeclarationCollMapConstIter pos;
+ if (m_prev_abbr_offset_pos != end &&
+ m_prev_abbr_offset_pos->first == cu_abbr_offset)
+ return &(m_prev_abbr_offset_pos->second);
+ else {
+ pos = m_abbrevCollMap.find(cu_abbr_offset);
+ m_prev_abbr_offset_pos = pos;
+ }
+
+ if (pos != m_abbrevCollMap.end())
+ return &(pos->second);
+ return NULL;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.h
index 8ec2c4ba8e2..137c8178051 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.h
@@ -15,60 +15,60 @@
#include "lldb/lldb-private.h"
-#include "DWARFDefines.h"
#include "DWARFAbbreviationDeclaration.h"
+#include "DWARFDefines.h"
-typedef std::vector<DWARFAbbreviationDeclaration> DWARFAbbreviationDeclarationColl;
-typedef DWARFAbbreviationDeclarationColl::iterator DWARFAbbreviationDeclarationCollIter;
-typedef DWARFAbbreviationDeclarationColl::const_iterator DWARFAbbreviationDeclarationCollConstIter;
-
+typedef std::vector<DWARFAbbreviationDeclaration>
+ DWARFAbbreviationDeclarationColl;
+typedef DWARFAbbreviationDeclarationColl::iterator
+ DWARFAbbreviationDeclarationCollIter;
+typedef DWARFAbbreviationDeclarationColl::const_iterator
+ DWARFAbbreviationDeclarationCollConstIter;
-class DWARFAbbreviationDeclarationSet
-{
+class DWARFAbbreviationDeclarationSet {
public:
- DWARFAbbreviationDeclarationSet() :
- m_offset(DW_INVALID_OFFSET),
- m_idx_offset(0),
- m_decls()
- {
- }
+ DWARFAbbreviationDeclarationSet()
+ : m_offset(DW_INVALID_OFFSET), m_idx_offset(0), m_decls() {}
- DWARFAbbreviationDeclarationSet(dw_offset_t offset, uint32_t idx_offset) :
- m_offset(offset),
- m_idx_offset(idx_offset),
- m_decls()
- {
- }
+ DWARFAbbreviationDeclarationSet(dw_offset_t offset, uint32_t idx_offset)
+ : m_offset(offset), m_idx_offset(idx_offset), m_decls() {}
- void Clear();
- dw_offset_t GetOffset() const { return m_offset; }
- void Dump(lldb_private::Stream *s) const;
- bool Extract(const lldb_private::DWARFDataExtractor& data, lldb::offset_t *offset_ptr);
- //void Encode(BinaryStreamBuf& debug_abbrev_buf) const;
- dw_uleb128_t AppendAbbrevDeclSequential(const DWARFAbbreviationDeclaration& abbrevDecl);
+ void Clear();
+ dw_offset_t GetOffset() const { return m_offset; }
+ void Dump(lldb_private::Stream *s) const;
+ bool Extract(const lldb_private::DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr);
+ // void Encode(BinaryStreamBuf& debug_abbrev_buf) const;
+ dw_uleb128_t
+ AppendAbbrevDeclSequential(const DWARFAbbreviationDeclaration &abbrevDecl);
+
+ const DWARFAbbreviationDeclaration *
+ GetAbbreviationDeclaration(dw_uleb128_t abbrCode) const;
- const DWARFAbbreviationDeclaration* GetAbbreviationDeclaration(dw_uleb128_t abbrCode) const;
private:
- dw_offset_t m_offset;
- uint32_t m_idx_offset;
- std::vector<DWARFAbbreviationDeclaration> m_decls;
+ dw_offset_t m_offset;
+ uint32_t m_idx_offset;
+ std::vector<DWARFAbbreviationDeclaration> m_decls;
};
-typedef std::map<dw_offset_t, DWARFAbbreviationDeclarationSet> DWARFAbbreviationDeclarationCollMap;
-typedef DWARFAbbreviationDeclarationCollMap::iterator DWARFAbbreviationDeclarationCollMapIter;
-typedef DWARFAbbreviationDeclarationCollMap::const_iterator DWARFAbbreviationDeclarationCollMapConstIter;
-
+typedef std::map<dw_offset_t, DWARFAbbreviationDeclarationSet>
+ DWARFAbbreviationDeclarationCollMap;
+typedef DWARFAbbreviationDeclarationCollMap::iterator
+ DWARFAbbreviationDeclarationCollMapIter;
+typedef DWARFAbbreviationDeclarationCollMap::const_iterator
+ DWARFAbbreviationDeclarationCollMapConstIter;
-class DWARFDebugAbbrev
-{
+class DWARFDebugAbbrev {
public:
- DWARFDebugAbbrev();
- const DWARFAbbreviationDeclarationSet* GetAbbreviationDeclarationSet(dw_offset_t cu_abbr_offset) const;
- void Dump(lldb_private::Stream *s) const;
- void Parse(const lldb_private::DWARFDataExtractor& data);
+ DWARFDebugAbbrev();
+ const DWARFAbbreviationDeclarationSet *
+ GetAbbreviationDeclarationSet(dw_offset_t cu_abbr_offset) const;
+ void Dump(lldb_private::Stream *s) const;
+ void Parse(const lldb_private::DWARFDataExtractor &data);
+
protected:
- DWARFAbbreviationDeclarationCollMap m_abbrevCollMap;
- mutable DWARFAbbreviationDeclarationCollMapConstIter m_prev_abbr_offset_pos;
+ DWARFAbbreviationDeclarationCollMap m_abbrevCollMap;
+ mutable DWARFAbbreviationDeclarationCollMapConstIter m_prev_abbr_offset_pos;
};
-#endif // SymbolFileDWARF_DWARFDebugAbbrev_h_
+#endif // SymbolFileDWARF_DWARFDebugAbbrev_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp
index b0b71368b80..06b46f0569e 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp
@@ -9,302 +9,262 @@
#include "DWARFDebugArangeSet.h"
-#include <assert.h>
-#include "lldb/Core/Stream.h"
#include "SymbolFileDWARF.h"
+#include "lldb/Core/Stream.h"
+#include <assert.h>
using namespace lldb_private;
-DWARFDebugArangeSet::DWARFDebugArangeSet() :
- m_offset(DW_INVALID_OFFSET),
- m_header(),
- m_arange_descriptors()
-{
- m_header.length = 0;
- m_header.version = 0;
- m_header.cu_offset = 0;
- m_header.addr_size = 0;
- m_header.seg_size = 0;
+DWARFDebugArangeSet::DWARFDebugArangeSet()
+ : m_offset(DW_INVALID_OFFSET), m_header(), m_arange_descriptors() {
+ m_header.length = 0;
+ m_header.version = 0;
+ m_header.cu_offset = 0;
+ m_header.addr_size = 0;
+ m_header.seg_size = 0;
}
-void
-DWARFDebugArangeSet::Clear()
-{
- m_offset = DW_INVALID_OFFSET;
- m_header.length = 0;
- m_header.version = 0;
- m_header.cu_offset = 0;
- m_header.addr_size = 0;
- m_header.seg_size = 0;
- m_arange_descriptors.clear();
+void DWARFDebugArangeSet::Clear() {
+ m_offset = DW_INVALID_OFFSET;
+ m_header.length = 0;
+ m_header.version = 0;
+ m_header.cu_offset = 0;
+ m_header.addr_size = 0;
+ m_header.seg_size = 0;
+ m_arange_descriptors.clear();
}
-void
-DWARFDebugArangeSet::SetHeader
-(
- uint16_t version,
- uint32_t cu_offset,
- uint8_t addr_size,
- uint8_t seg_size
-)
-{
- m_header.version = version;
- m_header.cu_offset = cu_offset;
- m_header.addr_size = addr_size;
- m_header.seg_size = seg_size;
+void DWARFDebugArangeSet::SetHeader(uint16_t version, uint32_t cu_offset,
+ uint8_t addr_size, uint8_t seg_size) {
+ m_header.version = version;
+ m_header.cu_offset = cu_offset;
+ m_header.addr_size = addr_size;
+ m_header.seg_size = seg_size;
}
-void
-DWARFDebugArangeSet::Compact()
-{
- if (m_arange_descriptors.empty())
- return;
+void DWARFDebugArangeSet::Compact() {
+ if (m_arange_descriptors.empty())
+ return;
- // Iterate through all arange descriptors and combine any ranges that
- // overlap or have matching boundaries. The m_arange_descriptors are assumed
- // to be in ascending order after being built by adding descriptors
- // using the AddDescriptor method.
- uint32_t i = 0;
- while (i + 1 < m_arange_descriptors.size())
- {
- if (m_arange_descriptors[i].end_address() >= m_arange_descriptors[i+1].address)
- {
- // The current range ends at or exceeds the start of the next address range.
- // Compute the max end address between the two and use that to make the new
- // length.
- const dw_addr_t max_end_addr = std::max(m_arange_descriptors[i].end_address(), m_arange_descriptors[i+1].end_address());
- m_arange_descriptors[i].length = max_end_addr - m_arange_descriptors[i].address;
- // Now remove the next entry as it was just combined with the previous one.
- m_arange_descriptors.erase(m_arange_descriptors.begin()+i+1);
- }
- else
- {
- // Discontiguous address range, just proceed to the next one.
- ++i;
- }
+ // Iterate through all arange descriptors and combine any ranges that
+ // overlap or have matching boundaries. The m_arange_descriptors are assumed
+ // to be in ascending order after being built by adding descriptors
+ // using the AddDescriptor method.
+ uint32_t i = 0;
+ while (i + 1 < m_arange_descriptors.size()) {
+ if (m_arange_descriptors[i].end_address() >=
+ m_arange_descriptors[i + 1].address) {
+ // The current range ends at or exceeds the start of the next address
+ // range.
+ // Compute the max end address between the two and use that to make the
+ // new
+ // length.
+ const dw_addr_t max_end_addr =
+ std::max(m_arange_descriptors[i].end_address(),
+ m_arange_descriptors[i + 1].end_address());
+ m_arange_descriptors[i].length =
+ max_end_addr - m_arange_descriptors[i].address;
+ // Now remove the next entry as it was just combined with the previous
+ // one.
+ m_arange_descriptors.erase(m_arange_descriptors.begin() + i + 1);
+ } else {
+ // Discontiguous address range, just proceed to the next one.
+ ++i;
}
+ }
}
//----------------------------------------------------------------------
// Compare function DWARFDebugArangeSet::Descriptor structures
//----------------------------------------------------------------------
-static bool DescriptorLessThan (const DWARFDebugArangeSet::Descriptor& range1, const DWARFDebugArangeSet::Descriptor& range2)
-{
- return range1.address < range2.address;
+static bool DescriptorLessThan(const DWARFDebugArangeSet::Descriptor &range1,
+ const DWARFDebugArangeSet::Descriptor &range2) {
+ return range1.address < range2.address;
}
//----------------------------------------------------------------------
// Add a range descriptor and keep things sorted so we can easily
// compact the ranges before being saved or used.
//----------------------------------------------------------------------
-void
-DWARFDebugArangeSet::AddDescriptor(const DWARFDebugArangeSet::Descriptor& range)
-{
- if (m_arange_descriptors.empty())
- {
- m_arange_descriptors.push_back(range);
- return;
- }
+void DWARFDebugArangeSet::AddDescriptor(
+ const DWARFDebugArangeSet::Descriptor &range) {
+ if (m_arange_descriptors.empty()) {
+ m_arange_descriptors.push_back(range);
+ return;
+ }
- DescriptorIter end = m_arange_descriptors.end();
- DescriptorIter pos = lower_bound(m_arange_descriptors.begin(), end, range, DescriptorLessThan);
- const dw_addr_t range_end_addr = range.end_address();
- if (pos != end)
- {
- const dw_addr_t found_end_addr = pos->end_address();
- if (range.address < pos->address)
- {
- if (range_end_addr < pos->address)
- {
- // Non-contiguous entries, add this one before the found entry
- m_arange_descriptors.insert(pos, range);
- }
- else if (range_end_addr == pos->address)
- {
- // The top end of 'range' is the lower end of the entry
- // pointed to by 'pos'. We can combine range with the
- // entry we found by setting the starting address and
- // increasing the length since they don't overlap.
- pos->address = range.address;
- pos->length += range.length;
- }
- else
- {
- // We can combine these two and make sure the largest end
- // address is used to make end address.
- pos->address = range.address;
- pos->length = std::max(found_end_addr, range_end_addr) - pos->address;
- }
- }
- else if (range.address == pos->address)
- {
- pos->length = std::max(pos->length, range.length);
- }
+ DescriptorIter end = m_arange_descriptors.end();
+ DescriptorIter pos =
+ lower_bound(m_arange_descriptors.begin(), end, range, DescriptorLessThan);
+ const dw_addr_t range_end_addr = range.end_address();
+ if (pos != end) {
+ const dw_addr_t found_end_addr = pos->end_address();
+ if (range.address < pos->address) {
+ if (range_end_addr < pos->address) {
+ // Non-contiguous entries, add this one before the found entry
+ m_arange_descriptors.insert(pos, range);
+ } else if (range_end_addr == pos->address) {
+ // The top end of 'range' is the lower end of the entry
+ // pointed to by 'pos'. We can combine range with the
+ // entry we found by setting the starting address and
+ // increasing the length since they don't overlap.
+ pos->address = range.address;
+ pos->length += range.length;
+ } else {
+ // We can combine these two and make sure the largest end
+ // address is used to make end address.
+ pos->address = range.address;
+ pos->length = std::max(found_end_addr, range_end_addr) - pos->address;
+ }
+ } else if (range.address == pos->address) {
+ pos->length = std::max(pos->length, range.length);
}
- else
- {
- // NOTE: 'pos' points to entry past the end which is ok for insert,
- // don't use otherwise!!!
- const dw_addr_t max_addr = m_arange_descriptors.back().end_address();
- if (max_addr < range.address)
- {
- // Non-contiguous entries, add this one before the found entry
- m_arange_descriptors.insert(pos, range);
- }
- else if (max_addr == range.address)
- {
- m_arange_descriptors.back().length += range.length;
- }
- else
- {
- m_arange_descriptors.back().length = std::max(max_addr, range_end_addr) - m_arange_descriptors.back().address;
- }
+ } else {
+ // NOTE: 'pos' points to entry past the end which is ok for insert,
+ // don't use otherwise!!!
+ const dw_addr_t max_addr = m_arange_descriptors.back().end_address();
+ if (max_addr < range.address) {
+ // Non-contiguous entries, add this one before the found entry
+ m_arange_descriptors.insert(pos, range);
+ } else if (max_addr == range.address) {
+ m_arange_descriptors.back().length += range.length;
+ } else {
+ m_arange_descriptors.back().length = std::max(max_addr, range_end_addr) -
+ m_arange_descriptors.back().address;
}
+ }
}
-bool
-DWARFDebugArangeSet::Extract(const DWARFDataExtractor &data, lldb::offset_t *offset_ptr)
-{
- if (data.ValidOffset(*offset_ptr))
- {
- m_arange_descriptors.clear();
- m_offset = *offset_ptr;
+bool DWARFDebugArangeSet::Extract(const DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr) {
+ if (data.ValidOffset(*offset_ptr)) {
+ m_arange_descriptors.clear();
+ m_offset = *offset_ptr;
- // 7.20 Address Range Table
- //
- // Each set of entries in the table of address ranges contained in
- // the .debug_aranges section begins with a header consisting of: a
- // 4-byte length containing the length of the set of entries for this
- // compilation unit, not including the length field itself; a 2-byte
- // version identifier containing the value 2 for DWARF Version 2; a
- // 4-byte offset into the.debug_infosection; a 1-byte unsigned integer
- // containing the size in bytes of an address (or the offset portion of
- // an address for segmented addressing) on the target system; and a
- // 1-byte unsigned integer containing the size in bytes of a segment
- // descriptor on the target system. This header is followed by a series
- // of tuples. Each tuple consists of an address and a length, each in
- // the size appropriate for an address on the target architecture.
- m_header.length = data.GetDWARFInitialLength(offset_ptr);
- m_header.version = data.GetU16(offset_ptr);
- m_header.cu_offset = data.GetDWARFOffset(offset_ptr);
- m_header.addr_size = data.GetU8(offset_ptr);
- m_header.seg_size = data.GetU8(offset_ptr);
-
- // Try to avoid reading invalid arange sets by making sure:
- // 1 - the version looks good
- // 2 - the address byte size looks plausible
- // 3 - the length seems to make sense
- // size looks plausible
- if ((m_header.version >= 2 && m_header.version <= 5) &&
- (m_header.addr_size == 4 || m_header.addr_size == 8) &&
- (m_header.length > 0))
- {
- if (data.ValidOffset(m_offset + sizeof(m_header.length) + m_header.length - 1))
- {
- // The first tuple following the header in each set begins at an offset
- // that is a multiple of the size of a single tuple (that is, twice the
- // size of an address). The header is padded, if necessary, to the
- // appropriate boundary.
- const uint32_t header_size = *offset_ptr - m_offset;
- const uint32_t tuple_size = m_header.addr_size << 1;
- uint32_t first_tuple_offset = 0;
- while (first_tuple_offset < header_size)
- first_tuple_offset += tuple_size;
-
- *offset_ptr = m_offset + first_tuple_offset;
-
- Descriptor arangeDescriptor;
-
- static_assert(sizeof(arangeDescriptor.address) == sizeof(arangeDescriptor.length),
- "DWARFDebugArangeSet::Descriptor.address and DWARFDebugArangeSet::Descriptor.length must have same size");
-
- while (data.ValidOffset(*offset_ptr))
- {
- arangeDescriptor.address = data.GetMaxU64(offset_ptr, m_header.addr_size);
- arangeDescriptor.length = data.GetMaxU64(offset_ptr, m_header.addr_size);
-
- // Each set of tuples is terminated by a 0 for the address and 0
- // for the length.
- if (arangeDescriptor.address || arangeDescriptor.length)
- m_arange_descriptors.push_back(arangeDescriptor);
- else
- break; // We are done if we get a zero address and length
- }
- }
-#if defined (LLDB_CONFIGURATION_DEBUG)
- else
- {
- printf ("warning: .debug_arange set length is too large arange data at 0x%8.8x: length=0x%8.8x, version=0x%4.4x, cu_offset=0x%8.8x, addr_size=%u, seg_size=%u\n",
- m_offset,
- m_header.length,
- m_header.version,
- m_header.cu_offset,
- m_header.addr_size,
- m_header.seg_size);
- }
-#endif
- }
-#if defined (LLDB_CONFIGURATION_DEBUG)
- else
- {
- printf ("warning: .debug_arange set has bad header at 0x%8.8x: length=0x%8.8x, version=0x%4.4x, cu_offset=0x%8.8x, addr_size=%u, seg_size=%u\n",
- m_offset,
- m_header.length,
- m_header.version,
- m_header.cu_offset,
- m_header.addr_size,
- m_header.seg_size);
+ // 7.20 Address Range Table
+ //
+ // Each set of entries in the table of address ranges contained in
+ // the .debug_aranges section begins with a header consisting of: a
+ // 4-byte length containing the length of the set of entries for this
+ // compilation unit, not including the length field itself; a 2-byte
+ // version identifier containing the value 2 for DWARF Version 2; a
+ // 4-byte offset into the.debug_infosection; a 1-byte unsigned integer
+ // containing the size in bytes of an address (or the offset portion of
+ // an address for segmented addressing) on the target system; and a
+ // 1-byte unsigned integer containing the size in bytes of a segment
+ // descriptor on the target system. This header is followed by a series
+ // of tuples. Each tuple consists of an address and a length, each in
+ // the size appropriate for an address on the target architecture.
+ m_header.length = data.GetDWARFInitialLength(offset_ptr);
+ m_header.version = data.GetU16(offset_ptr);
+ m_header.cu_offset = data.GetDWARFOffset(offset_ptr);
+ m_header.addr_size = data.GetU8(offset_ptr);
+ m_header.seg_size = data.GetU8(offset_ptr);
+
+ // Try to avoid reading invalid arange sets by making sure:
+ // 1 - the version looks good
+ // 2 - the address byte size looks plausible
+ // 3 - the length seems to make sense
+ // size looks plausible
+ if ((m_header.version >= 2 && m_header.version <= 5) &&
+ (m_header.addr_size == 4 || m_header.addr_size == 8) &&
+ (m_header.length > 0)) {
+ if (data.ValidOffset(m_offset + sizeof(m_header.length) +
+ m_header.length - 1)) {
+ // The first tuple following the header in each set begins at an offset
+ // that is a multiple of the size of a single tuple (that is, twice the
+ // size of an address). The header is padded, if necessary, to the
+ // appropriate boundary.
+ const uint32_t header_size = *offset_ptr - m_offset;
+ const uint32_t tuple_size = m_header.addr_size << 1;
+ uint32_t first_tuple_offset = 0;
+ while (first_tuple_offset < header_size)
+ first_tuple_offset += tuple_size;
+
+ *offset_ptr = m_offset + first_tuple_offset;
+
+ Descriptor arangeDescriptor;
+
+ static_assert(
+ sizeof(arangeDescriptor.address) == sizeof(arangeDescriptor.length),
+ "DWARFDebugArangeSet::Descriptor.address and "
+ "DWARFDebugArangeSet::Descriptor.length must have same size");
+
+ while (data.ValidOffset(*offset_ptr)) {
+ arangeDescriptor.address =
+ data.GetMaxU64(offset_ptr, m_header.addr_size);
+ arangeDescriptor.length =
+ data.GetMaxU64(offset_ptr, m_header.addr_size);
+
+ // Each set of tuples is terminated by a 0 for the address and 0
+ // for the length.
+ if (arangeDescriptor.address || arangeDescriptor.length)
+ m_arange_descriptors.push_back(arangeDescriptor);
+ else
+ break; // We are done if we get a zero address and length
}
+ }
+#if defined(LLDB_CONFIGURATION_DEBUG)
+ else {
+ printf("warning: .debug_arange set length is too large arange data at "
+ "0x%8.8x: length=0x%8.8x, version=0x%4.4x, cu_offset=0x%8.8x, "
+ "addr_size=%u, seg_size=%u\n",
+ m_offset, m_header.length, m_header.version, m_header.cu_offset,
+ m_header.addr_size, m_header.seg_size);
+ }
#endif
-
- return !m_arange_descriptors.empty();
}
- return false;
-}
-
+#if defined(LLDB_CONFIGURATION_DEBUG)
+ else {
+ printf("warning: .debug_arange set has bad header at 0x%8.8x: "
+ "length=0x%8.8x, version=0x%4.4x, cu_offset=0x%8.8x, "
+ "addr_size=%u, seg_size=%u\n",
+ m_offset, m_header.length, m_header.version, m_header.cu_offset,
+ m_header.addr_size, m_header.seg_size);
+ }
+#endif
-dw_offset_t
-DWARFDebugArangeSet::GetOffsetOfNextEntry() const
-{
- return m_offset + m_header.length + 4;
+ return !m_arange_descriptors.empty();
+ }
+ return false;
}
+dw_offset_t DWARFDebugArangeSet::GetOffsetOfNextEntry() const {
+ return m_offset + m_header.length + 4;
+}
-void
-DWARFDebugArangeSet::Dump(Stream *s) const
-{
- s->Printf("Address Range Header: length = 0x%8.8x, version = 0x%4.4x, cu_offset = 0x%8.8x, addr_size = 0x%2.2x, seg_size = 0x%2.2x\n",
- m_header.length ,m_header.version, m_header.cu_offset, m_header.addr_size, m_header.seg_size);
+void DWARFDebugArangeSet::Dump(Stream *s) const {
+ s->Printf("Address Range Header: length = 0x%8.8x, version = 0x%4.4x, "
+ "cu_offset = 0x%8.8x, addr_size = 0x%2.2x, seg_size = 0x%2.2x\n",
+ m_header.length, m_header.version, m_header.cu_offset,
+ m_header.addr_size, m_header.seg_size);
- const uint32_t hex_width = m_header.addr_size * 2;
- DescriptorConstIter pos;
- DescriptorConstIter end = m_arange_descriptors.end();
- for (pos = m_arange_descriptors.begin(); pos != end; ++pos)
- s->Printf("[0x%*.*" PRIx64 " - 0x%*.*" PRIx64 ")\n",
- hex_width, hex_width, pos->address,
- hex_width, hex_width, pos->end_address());
+ const uint32_t hex_width = m_header.addr_size * 2;
+ DescriptorConstIter pos;
+ DescriptorConstIter end = m_arange_descriptors.end();
+ for (pos = m_arange_descriptors.begin(); pos != end; ++pos)
+ s->Printf("[0x%*.*" PRIx64 " - 0x%*.*" PRIx64 ")\n", hex_width, hex_width,
+ pos->address, hex_width, hex_width, pos->end_address());
}
-
-class DescriptorContainsAddress
-{
+class DescriptorContainsAddress {
public:
- DescriptorContainsAddress (dw_addr_t address) : m_address(address) {}
- bool operator() (const DWARFDebugArangeSet::Descriptor& desc) const
- {
- return (m_address >= desc.address) && (m_address < (desc.address + desc.length));
- }
- private:
- const dw_addr_t m_address;
+ DescriptorContainsAddress(dw_addr_t address) : m_address(address) {}
+ bool operator()(const DWARFDebugArangeSet::Descriptor &desc) const {
+ return (m_address >= desc.address) &&
+ (m_address < (desc.address + desc.length));
+ }
+
+private:
+ const dw_addr_t m_address;
};
-dw_offset_t
-DWARFDebugArangeSet::FindAddress(dw_addr_t address) const
-{
- DescriptorConstIter end = m_arange_descriptors.end();
- DescriptorConstIter pos = std::find_if( m_arange_descriptors.begin(), end, // Range
- DescriptorContainsAddress(address));// Predicate
- if (pos != end)
- return m_header.cu_offset;
+dw_offset_t DWARFDebugArangeSet::FindAddress(dw_addr_t address) const {
+ DescriptorConstIter end = m_arange_descriptors.end();
+ DescriptorConstIter pos =
+ std::find_if(m_arange_descriptors.begin(), end, // Range
+ DescriptorContainsAddress(address)); // Predicate
+ if (pos != end)
+ return m_header.cu_offset;
- return DW_INVALID_OFFSET;
+ return DW_INVALID_OFFSET;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.h
index fde36b7e0ad..ae6319a13d0 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.h
@@ -15,62 +15,62 @@
class SymbolFileDWARF;
-class DWARFDebugArangeSet
-{
+class DWARFDebugArangeSet {
public:
- struct Header
- {
- uint32_t length; // The total length of the entries for that set, not including the length field itself.
- uint16_t version; // The DWARF version number
- uint32_t cu_offset; // The offset from the beginning of the .debug_info section of the compilation unit entry referenced by the table.
- uint8_t addr_size; // The size in bytes of an address on the target architecture. For segmented addressing, this is the size of the offset portion of the address
- uint8_t seg_size; // The size in bytes of a segment descriptor on the target architecture. If the target system uses a flat address space, this value is 0.
- };
+ struct Header {
+ uint32_t length; // The total length of the entries for that set, not
+ // including the length field itself.
+ uint16_t version; // The DWARF version number
+ uint32_t cu_offset; // The offset from the beginning of the .debug_info
+ // section of the compilation unit entry referenced by
+ // the table.
+ uint8_t addr_size; // The size in bytes of an address on the target
+ // architecture. For segmented addressing, this is the
+ // size of the offset portion of the address
+ uint8_t seg_size; // The size in bytes of a segment descriptor on the target
+ // architecture. If the target system uses a flat address
+ // space, this value is 0.
+ };
- struct Descriptor
- {
- dw_addr_t address;
- dw_addr_t length;
- dw_addr_t end_address() const { return address + length; }
- };
+ struct Descriptor {
+ dw_addr_t address;
+ dw_addr_t length;
+ dw_addr_t end_address() const { return address + length; }
+ };
+ DWARFDebugArangeSet();
+ void Clear();
+ void SetOffset(uint32_t offset) { m_offset = offset; }
+ void SetHeader(uint16_t version, uint32_t cu_offset, uint8_t addr_size,
+ uint8_t seg_size);
+ void AddDescriptor(const DWARFDebugArangeSet::Descriptor &range);
+ void Compact();
+ bool Extract(const lldb_private::DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr);
+ void Dump(lldb_private::Stream *s) const;
+ dw_offset_t GetCompileUnitDIEOffset() const { return m_header.cu_offset; }
+ dw_offset_t GetOffsetOfNextEntry() const;
+ dw_offset_t FindAddress(dw_addr_t address) const;
+ size_t NumDescriptors() const { return m_arange_descriptors.size(); }
+ const Header &GetHeader() const { return m_header; }
+ const Descriptor *GetDescriptor(uint32_t i) const {
+ if (i < m_arange_descriptors.size())
+ return &m_arange_descriptors[i];
+ return NULL;
+ }
- DWARFDebugArangeSet();
- void Clear();
- void SetOffset(uint32_t offset) { m_offset = offset; }
- void SetHeader(uint16_t version, uint32_t cu_offset, uint8_t addr_size, uint8_t seg_size);
- void AddDescriptor(const DWARFDebugArangeSet::Descriptor& range);
- void Compact();
- bool Extract(const lldb_private::DWARFDataExtractor &data, lldb::offset_t *offset_ptr);
- void Dump(lldb_private::Stream *s) const;
- dw_offset_t GetCompileUnitDIEOffset() const { return m_header.cu_offset; }
- dw_offset_t GetOffsetOfNextEntry() const;
- dw_offset_t FindAddress(dw_addr_t address) const;
- size_t NumDescriptors() const { return m_arange_descriptors.size(); }
- const Header& GetHeader() const { return m_header; }
- const Descriptor* GetDescriptor(uint32_t i) const
- {
- if (i < m_arange_descriptors.size())
- return &m_arange_descriptors[i];
- return NULL;
- }
-
- const Descriptor &
- GetDescriptorRef (uint32_t i) const
- {
- return m_arange_descriptors[i];
- }
-
+ const Descriptor &GetDescriptorRef(uint32_t i) const {
+ return m_arange_descriptors[i];
+ }
protected:
- typedef std::vector<Descriptor> DescriptorColl;
- typedef DescriptorColl::iterator DescriptorIter;
- typedef DescriptorColl::const_iterator DescriptorConstIter;
-
+ typedef std::vector<Descriptor> DescriptorColl;
+ typedef DescriptorColl::iterator DescriptorIter;
+ typedef DescriptorColl::const_iterator DescriptorConstIter;
- uint32_t m_offset;
- Header m_header;
- DescriptorColl m_arange_descriptors;
+ uint32_t m_offset;
+ Header m_header;
+ DescriptorColl m_arange_descriptors;
};
-#endif // SymbolFileDWARF_DWARFDebugArangeSet_h_
+#endif // SymbolFileDWARF_DWARFDebugArangeSet_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
index 51eac8bd075..5e71e9dfcbb 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
@@ -18,10 +18,10 @@
#include "lldb/Core/Stream.h"
#include "lldb/Core/Timer.h"
+#include "DWARFCompileUnit.h"
+#include "DWARFDebugInfo.h"
#include "LogChannelDWARF.h"
#include "SymbolFileDWARF.h"
-#include "DWARFDebugInfo.h"
-#include "DWARFCompileUnit.h"
using namespace lldb;
using namespace lldb_private;
@@ -29,148 +29,122 @@ using namespace lldb_private;
//----------------------------------------------------------------------
// Constructor
//----------------------------------------------------------------------
-DWARFDebugAranges::DWARFDebugAranges() :
- m_aranges()
-{
-}
+DWARFDebugAranges::DWARFDebugAranges() : m_aranges() {}
//----------------------------------------------------------------------
// CountArangeDescriptors
//----------------------------------------------------------------------
-class CountArangeDescriptors
-{
+class CountArangeDescriptors {
public:
- CountArangeDescriptors (uint32_t& count_ref) : count(count_ref)
- {
-// printf("constructor CountArangeDescriptors()\n");
- }
- void operator() (const DWARFDebugArangeSet& set)
- {
- count += set.NumDescriptors();
- }
- uint32_t& count;
+ CountArangeDescriptors(uint32_t &count_ref) : count(count_ref) {
+ // printf("constructor CountArangeDescriptors()\n");
+ }
+ void operator()(const DWARFDebugArangeSet &set) {
+ count += set.NumDescriptors();
+ }
+ uint32_t &count;
};
-
//----------------------------------------------------------------------
// Extract
//----------------------------------------------------------------------
-bool
-DWARFDebugAranges::Extract(const DWARFDataExtractor &debug_aranges_data)
-{
- if (debug_aranges_data.ValidOffset(0))
- {
- lldb::offset_t offset = 0;
-
- DWARFDebugArangeSet set;
- Range range;
- while (set.Extract(debug_aranges_data, &offset))
- {
- const uint32_t num_descriptors = set.NumDescriptors();
- if (num_descriptors > 0)
- {
- const dw_offset_t cu_offset = set.GetCompileUnitDIEOffset();
-
- for (uint32_t i=0; i<num_descriptors; ++i)
- {
- const DWARFDebugArangeSet::Descriptor &descriptor = set.GetDescriptorRef(i);
- m_aranges.Append(RangeToDIE::Entry (descriptor.address, descriptor.length, cu_offset));
- }
- }
- set.Clear();
+bool DWARFDebugAranges::Extract(const DWARFDataExtractor &debug_aranges_data) {
+ if (debug_aranges_data.ValidOffset(0)) {
+ lldb::offset_t offset = 0;
+
+ DWARFDebugArangeSet set;
+ Range range;
+ while (set.Extract(debug_aranges_data, &offset)) {
+ const uint32_t num_descriptors = set.NumDescriptors();
+ if (num_descriptors > 0) {
+ const dw_offset_t cu_offset = set.GetCompileUnitDIEOffset();
+
+ for (uint32_t i = 0; i < num_descriptors; ++i) {
+ const DWARFDebugArangeSet::Descriptor &descriptor =
+ set.GetDescriptorRef(i);
+ m_aranges.Append(RangeToDIE::Entry(descriptor.address,
+ descriptor.length, cu_offset));
}
+ }
+ set.Clear();
}
- return false;
+ }
+ return false;
}
//----------------------------------------------------------------------
// Generate
//----------------------------------------------------------------------
-bool
-DWARFDebugAranges::Generate(SymbolFileDWARF* dwarf2Data)
-{
- Clear();
- DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo();
- if (debug_info)
- {
- uint32_t cu_idx = 0;
- const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
- for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- {
- DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx);
- if (cu)
- cu->BuildAddressRangeTable(dwarf2Data, this);
- }
+bool DWARFDebugAranges::Generate(SymbolFileDWARF *dwarf2Data) {
+ Clear();
+ DWARFDebugInfo *debug_info = dwarf2Data->DebugInfo();
+ if (debug_info) {
+ uint32_t cu_idx = 0;
+ const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
+ for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
+ DWARFCompileUnit *cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+ if (cu)
+ cu->BuildAddressRangeTable(dwarf2Data, this);
}
- return !IsEmpty();
+ }
+ return !IsEmpty();
}
+void DWARFDebugAranges::Dump(Log *log) const {
+ if (log == NULL)
+ return;
-void
-DWARFDebugAranges::Dump (Log *log) const
-{
- if (log == NULL)
- return;
-
- const size_t num_entries = m_aranges.GetSize();
- for (size_t i=0; i<num_entries; ++i)
- {
- const RangeToDIE::Entry *entry = m_aranges.GetEntryAtIndex(i);
- if (entry)
- log->Printf ("0x%8.8x: [0x%" PRIx64 " - 0x%" PRIx64 ")",
- entry->data,
- entry->GetRangeBase(),
- entry->GetRangeEnd());
- }
+ const size_t num_entries = m_aranges.GetSize();
+ for (size_t i = 0; i < num_entries; ++i) {
+ const RangeToDIE::Entry *entry = m_aranges.GetEntryAtIndex(i);
+ if (entry)
+ log->Printf("0x%8.8x: [0x%" PRIx64 " - 0x%" PRIx64 ")", entry->data,
+ entry->GetRangeBase(), entry->GetRangeEnd());
+ }
}
-void
-DWARFDebugAranges::AppendRange (dw_offset_t offset, dw_addr_t low_pc, dw_addr_t high_pc)
-{
- if (high_pc > low_pc)
- m_aranges.Append(RangeToDIE::Entry (low_pc, high_pc - low_pc, offset));
+void DWARFDebugAranges::AppendRange(dw_offset_t offset, dw_addr_t low_pc,
+ dw_addr_t high_pc) {
+ if (high_pc > low_pc)
+ m_aranges.Append(RangeToDIE::Entry(low_pc, high_pc - low_pc, offset));
}
-void
-DWARFDebugAranges::Sort (bool minimize)
-{
- Timer scoped_timer(LLVM_PRETTY_FUNCTION, "%s this = %p",
- LLVM_PRETTY_FUNCTION, static_cast<void*>(this));
-
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES));
- size_t orig_arange_size = 0;
- if (log)
- {
- orig_arange_size = m_aranges.GetSize();
- log->Printf ("DWARFDebugAranges::Sort(minimize = %u) with %" PRIu64 " entries", minimize, (uint64_t)orig_arange_size);
- }
-
- m_aranges.Sort();
- m_aranges.CombineConsecutiveEntriesWithEqualData();
-
- if (log)
- {
- if (minimize)
- {
- const size_t new_arange_size = m_aranges.GetSize();
- const size_t delta = orig_arange_size - new_arange_size;
- log->Printf ("DWARFDebugAranges::Sort() %" PRIu64 " entries after minimizing (%" PRIu64 " entries combined for %" PRIu64 " bytes saved)",
- (uint64_t)new_arange_size,
- (uint64_t)delta,
- (uint64_t)delta * sizeof(Range));
- }
- Dump (log);
+void DWARFDebugAranges::Sort(bool minimize) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION, "%s this = %p", LLVM_PRETTY_FUNCTION,
+ static_cast<void *>(this));
+
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES));
+ size_t orig_arange_size = 0;
+ if (log) {
+ orig_arange_size = m_aranges.GetSize();
+ log->Printf("DWARFDebugAranges::Sort(minimize = %u) with %" PRIu64
+ " entries",
+ minimize, (uint64_t)orig_arange_size);
+ }
+
+ m_aranges.Sort();
+ m_aranges.CombineConsecutiveEntriesWithEqualData();
+
+ if (log) {
+ if (minimize) {
+ const size_t new_arange_size = m_aranges.GetSize();
+ const size_t delta = orig_arange_size - new_arange_size;
+ log->Printf("DWARFDebugAranges::Sort() %" PRIu64
+ " entries after minimizing (%" PRIu64
+ " entries combined for %" PRIu64 " bytes saved)",
+ (uint64_t)new_arange_size, (uint64_t)delta,
+ (uint64_t)delta * sizeof(Range));
}
+ Dump(log);
+ }
}
//----------------------------------------------------------------------
// FindAddress
//----------------------------------------------------------------------
-dw_offset_t
-DWARFDebugAranges::FindAddress(dw_addr_t address) const
-{
- const RangeToDIE::Entry *entry = m_aranges.FindEntryThatContains(address);
- if (entry)
- return entry->data;
- return DW_INVALID_OFFSET;
+dw_offset_t DWARFDebugAranges::FindAddress(dw_addr_t address) const {
+ const RangeToDIE::Entry *entry = m_aranges.FindEntryThatContains(address);
+ if (entry)
+ return entry->data;
+ return DW_INVALID_OFFSET;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
index 206aa3a60f4..6524cb3ce48 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
@@ -17,78 +17,50 @@
class SymbolFileDWARF;
-class DWARFDebugAranges
-{
+class DWARFDebugAranges {
protected:
- typedef lldb_private::RangeDataArray<dw_addr_t, uint32_t, dw_offset_t, 1> RangeToDIE;
+ typedef lldb_private::RangeDataArray<dw_addr_t, uint32_t, dw_offset_t, 1>
+ RangeToDIE;
public:
- typedef RangeToDIE::Entry Range;
- typedef std::vector<RangeToDIE::Entry> RangeColl;
-
- DWARFDebugAranges();
-
- void
- Clear()
- {
- m_aranges.Clear();
- }
-
- bool
- Extract(const lldb_private::DWARFDataExtractor &debug_aranges_data);
-
- bool
- Generate(SymbolFileDWARF* dwarf2Data);
-
- // Use append range multiple times and then call sort
- void
- AppendRange (dw_offset_t cu_offset,
- dw_addr_t low_pc,
- dw_addr_t high_pc);
-
- void
- Sort (bool minimize);
-
- const Range*
- RangeAtIndex(uint32_t idx) const
- {
- return m_aranges.GetEntryAtIndex (idx);
- }
-
- void
- Dump (lldb_private::Log *log) const;
-
- dw_offset_t
- FindAddress(dw_addr_t address) const;
-
- bool
- IsEmpty() const
- {
- return m_aranges.IsEmpty();
- }
- size_t
- GetNumRanges() const
- {
- return m_aranges.GetSize();
- }
-
- dw_offset_t
- OffsetAtIndex(uint32_t idx) const
- {
- const Range *range = m_aranges.GetEntryAtIndex (idx);
- if (range)
- return range->data;
- return DW_INVALID_OFFSET;
- }
-
- static void
- Dump(SymbolFileDWARF* dwarf2Data, lldb_private::Stream *s);
-
-protected:
+ typedef RangeToDIE::Entry Range;
+ typedef std::vector<RangeToDIE::Entry> RangeColl;
+ DWARFDebugAranges();
- RangeToDIE m_aranges;
-};
+ void Clear() { m_aranges.Clear(); }
+
+ bool Extract(const lldb_private::DWARFDataExtractor &debug_aranges_data);
+
+ bool Generate(SymbolFileDWARF *dwarf2Data);
+
+ // Use append range multiple times and then call sort
+ void AppendRange(dw_offset_t cu_offset, dw_addr_t low_pc, dw_addr_t high_pc);
+
+ void Sort(bool minimize);
+
+ const Range *RangeAtIndex(uint32_t idx) const {
+ return m_aranges.GetEntryAtIndex(idx);
+ }
+ void Dump(lldb_private::Log *log) const;
+
+ dw_offset_t FindAddress(dw_addr_t address) const;
+
+ bool IsEmpty() const { return m_aranges.IsEmpty(); }
+ size_t GetNumRanges() const { return m_aranges.GetSize(); }
+
+ dw_offset_t OffsetAtIndex(uint32_t idx) const {
+ const Range *range = m_aranges.GetEntryAtIndex(idx);
+ if (range)
+ return range->data;
+ return DW_INVALID_OFFSET;
+ }
+
+ static void Dump(SymbolFileDWARF *dwarf2Data, lldb_private::Stream *s);
+
+protected:
+ RangeToDIE m_aranges;
+};
-#endif // SymbolFileDWARF_DWARFDebugAranges_h_
+#endif // SymbolFileDWARF_DWARFDebugAranges_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
index 36e3ebc8770..e06c1b8e3b8 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
@@ -17,10 +17,10 @@
#include "lldb/Host/PosixApi.h"
#include "lldb/Symbol/ObjectFile.h"
-#include "DWARFDebugAranges.h"
-#include "DWARFDebugInfo.h"
#include "DWARFCompileUnit.h"
#include "DWARFDebugAranges.h"
+#include "DWARFDebugAranges.h"
+#include "DWARFDebugInfo.h"
#include "DWARFDebugInfoEntry.h"
#include "DWARFFormValue.h"
#include "LogChannelDWARF.h"
@@ -32,229 +32,192 @@ using namespace std;
//----------------------------------------------------------------------
// Constructor
//----------------------------------------------------------------------
-DWARFDebugInfo::DWARFDebugInfo() :
- m_dwarf2Data(NULL),
- m_compile_units(),
- m_cu_aranges_ap ()
-{
-}
+DWARFDebugInfo::DWARFDebugInfo()
+ : m_dwarf2Data(NULL), m_compile_units(), m_cu_aranges_ap() {}
//----------------------------------------------------------------------
// SetDwarfData
//----------------------------------------------------------------------
-void
-DWARFDebugInfo::SetDwarfData(SymbolFileDWARF* dwarf2Data)
-{
- m_dwarf2Data = dwarf2Data;
- m_compile_units.clear();
+void DWARFDebugInfo::SetDwarfData(SymbolFileDWARF *dwarf2Data) {
+ m_dwarf2Data = dwarf2Data;
+ m_compile_units.clear();
}
+DWARFDebugAranges &DWARFDebugInfo::GetCompileUnitAranges() {
+ if (m_cu_aranges_ap.get() == NULL && m_dwarf2Data) {
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES));
+
+ m_cu_aranges_ap.reset(new DWARFDebugAranges());
+ const DWARFDataExtractor &debug_aranges_data =
+ m_dwarf2Data->get_debug_aranges_data();
+ if (debug_aranges_data.GetByteSize() > 0) {
+ if (log)
+ log->Printf(
+ "DWARFDebugInfo::GetCompileUnitAranges() for \"%s\" from "
+ ".debug_aranges",
+ m_dwarf2Data->GetObjectFile()->GetFileSpec().GetPath().c_str());
+ m_cu_aranges_ap->Extract(debug_aranges_data);
+ }
-DWARFDebugAranges &
-DWARFDebugInfo::GetCompileUnitAranges ()
-{
- if (m_cu_aranges_ap.get() == NULL && m_dwarf2Data)
- {
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES));
-
- m_cu_aranges_ap.reset (new DWARFDebugAranges());
- const DWARFDataExtractor &debug_aranges_data = m_dwarf2Data->get_debug_aranges_data();
- if (debug_aranges_data.GetByteSize() > 0)
- {
- if (log)
- log->Printf ("DWARFDebugInfo::GetCompileUnitAranges() for \"%s\" from .debug_aranges",
- m_dwarf2Data->GetObjectFile()->GetFileSpec().GetPath().c_str());
- m_cu_aranges_ap->Extract (debug_aranges_data);
-
- }
-
- // Make a list of all CUs represented by the arange data in the file.
- std::set<dw_offset_t> cus_with_data;
- for (size_t n=0;n<m_cu_aranges_ap.get()->GetNumRanges();n++)
- {
- dw_offset_t offset = m_cu_aranges_ap.get()->OffsetAtIndex(n);
- if (offset != DW_INVALID_OFFSET)
- cus_with_data.insert (offset);
- }
+ // Make a list of all CUs represented by the arange data in the file.
+ std::set<dw_offset_t> cus_with_data;
+ for (size_t n = 0; n < m_cu_aranges_ap.get()->GetNumRanges(); n++) {
+ dw_offset_t offset = m_cu_aranges_ap.get()->OffsetAtIndex(n);
+ if (offset != DW_INVALID_OFFSET)
+ cus_with_data.insert(offset);
+ }
- // Manually build arange data for everything that wasn't in the .debug_aranges table.
- bool printed = false;
- const size_t num_compile_units = GetNumCompileUnits();
- for (size_t idx = 0; idx < num_compile_units; ++idx)
- {
- DWARFCompileUnit* cu = GetCompileUnitAtIndex(idx);
-
- dw_offset_t offset = cu->GetOffset();
- if (cus_with_data.find(offset) == cus_with_data.end())
- {
- if (log)
- {
- if (!printed)
- log->Printf ("DWARFDebugInfo::GetCompileUnitAranges() for \"%s\" by parsing",
- m_dwarf2Data->GetObjectFile()->GetFileSpec().GetPath().c_str());
- printed = true;
- }
- cu->BuildAddressRangeTable (m_dwarf2Data, m_cu_aranges_ap.get());
- }
+ // Manually build arange data for everything that wasn't in the
+ // .debug_aranges table.
+ bool printed = false;
+ const size_t num_compile_units = GetNumCompileUnits();
+ for (size_t idx = 0; idx < num_compile_units; ++idx) {
+ DWARFCompileUnit *cu = GetCompileUnitAtIndex(idx);
+
+ dw_offset_t offset = cu->GetOffset();
+ if (cus_with_data.find(offset) == cus_with_data.end()) {
+ if (log) {
+ if (!printed)
+ log->Printf(
+ "DWARFDebugInfo::GetCompileUnitAranges() for \"%s\" by parsing",
+ m_dwarf2Data->GetObjectFile()->GetFileSpec().GetPath().c_str());
+ printed = true;
}
-
- const bool minimize = true;
- m_cu_aranges_ap->Sort (minimize);
+ cu->BuildAddressRangeTable(m_dwarf2Data, m_cu_aranges_ap.get());
+ }
}
- return *m_cu_aranges_ap.get();
+
+ const bool minimize = true;
+ m_cu_aranges_ap->Sort(minimize);
+ }
+ return *m_cu_aranges_ap.get();
}
-void
-DWARFDebugInfo::ParseCompileUnitHeadersIfNeeded()
-{
- if (m_compile_units.empty())
- {
- if (m_dwarf2Data != NULL)
- {
- lldb::offset_t offset = 0;
- const DWARFDataExtractor &debug_info_data = m_dwarf2Data->get_debug_info_data();
- while (debug_info_data.ValidOffset(offset))
- {
- DWARFCompileUnitSP cu_sp(new DWARFCompileUnit(m_dwarf2Data));
- // Out of memory?
- if (cu_sp.get() == NULL)
- break;
-
- if (cu_sp->Extract(debug_info_data, &offset) == false)
- break;
-
- m_compile_units.push_back(cu_sp);
-
- offset = cu_sp->GetNextCompileUnitOffset();
- }
- }
+void DWARFDebugInfo::ParseCompileUnitHeadersIfNeeded() {
+ if (m_compile_units.empty()) {
+ if (m_dwarf2Data != NULL) {
+ lldb::offset_t offset = 0;
+ const DWARFDataExtractor &debug_info_data =
+ m_dwarf2Data->get_debug_info_data();
+ while (debug_info_data.ValidOffset(offset)) {
+ DWARFCompileUnitSP cu_sp(new DWARFCompileUnit(m_dwarf2Data));
+ // Out of memory?
+ if (cu_sp.get() == NULL)
+ break;
+
+ if (cu_sp->Extract(debug_info_data, &offset) == false)
+ break;
+
+ m_compile_units.push_back(cu_sp);
+
+ offset = cu_sp->GetNextCompileUnitOffset();
+ }
}
+ }
}
-size_t
-DWARFDebugInfo::GetNumCompileUnits()
-{
- ParseCompileUnitHeadersIfNeeded();
- return m_compile_units.size();
+size_t DWARFDebugInfo::GetNumCompileUnits() {
+ ParseCompileUnitHeadersIfNeeded();
+ return m_compile_units.size();
}
-DWARFCompileUnit*
-DWARFDebugInfo::GetCompileUnitAtIndex(uint32_t idx)
-{
- DWARFCompileUnit* cu = NULL;
- if (idx < GetNumCompileUnits())
- cu = m_compile_units[idx].get();
- return cu;
+DWARFCompileUnit *DWARFDebugInfo::GetCompileUnitAtIndex(uint32_t idx) {
+ DWARFCompileUnit *cu = NULL;
+ if (idx < GetNumCompileUnits())
+ cu = m_compile_units[idx].get();
+ return cu;
}
-bool
-DWARFDebugInfo::ContainsCompileUnit (const DWARFCompileUnit *cu) const
-{
- // Not a verify efficient function, but it is handy for use in assertions
- // to make sure that a compile unit comes from a debug information file.
- CompileUnitColl::const_iterator end_pos = m_compile_units.end();
- CompileUnitColl::const_iterator pos;
-
- for (pos = m_compile_units.begin(); pos != end_pos; ++pos)
- {
- if (pos->get() == cu)
- return true;
- }
- return false;
+bool DWARFDebugInfo::ContainsCompileUnit(const DWARFCompileUnit *cu) const {
+ // Not a verify efficient function, but it is handy for use in assertions
+ // to make sure that a compile unit comes from a debug information file.
+ CompileUnitColl::const_iterator end_pos = m_compile_units.end();
+ CompileUnitColl::const_iterator pos;
+
+ for (pos = m_compile_units.begin(); pos != end_pos; ++pos) {
+ if (pos->get() == cu)
+ return true;
+ }
+ return false;
}
-bool
-DWARFDebugInfo::OffsetLessThanCompileUnitOffset (dw_offset_t offset, const DWARFCompileUnitSP& cu_sp)
-{
- return offset < cu_sp->GetOffset();
+bool DWARFDebugInfo::OffsetLessThanCompileUnitOffset(
+ dw_offset_t offset, const DWARFCompileUnitSP &cu_sp) {
+ return offset < cu_sp->GetOffset();
}
-DWARFCompileUnit *
-DWARFDebugInfo::GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr)
-{
- DWARFCompileUnitSP cu_sp;
- uint32_t cu_idx = DW_INVALID_INDEX;
- if (cu_offset != DW_INVALID_OFFSET)
- {
- ParseCompileUnitHeadersIfNeeded();
-
- // Watch out for single compile unit executable as they are pretty common
- const size_t num_cus = m_compile_units.size();
- if (num_cus == 1)
- {
- if (m_compile_units[0]->GetOffset() == cu_offset)
- {
- cu_sp = m_compile_units[0];
- cu_idx = 0;
- }
- }
- else if (num_cus)
- {
- CompileUnitColl::const_iterator end_pos = m_compile_units.end();
- CompileUnitColl::const_iterator begin_pos = m_compile_units.begin();
- CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, cu_offset, OffsetLessThanCompileUnitOffset);
- if (pos != begin_pos)
- {
- --pos;
- if ((*pos)->GetOffset() == cu_offset)
- {
- cu_sp = *pos;
- cu_idx = std::distance(begin_pos, pos);
- }
- }
+DWARFCompileUnit *DWARFDebugInfo::GetCompileUnit(dw_offset_t cu_offset,
+ uint32_t *idx_ptr) {
+ DWARFCompileUnitSP cu_sp;
+ uint32_t cu_idx = DW_INVALID_INDEX;
+ if (cu_offset != DW_INVALID_OFFSET) {
+ ParseCompileUnitHeadersIfNeeded();
+
+ // Watch out for single compile unit executable as they are pretty common
+ const size_t num_cus = m_compile_units.size();
+ if (num_cus == 1) {
+ if (m_compile_units[0]->GetOffset() == cu_offset) {
+ cu_sp = m_compile_units[0];
+ cu_idx = 0;
+ }
+ } else if (num_cus) {
+ CompileUnitColl::const_iterator end_pos = m_compile_units.end();
+ CompileUnitColl::const_iterator begin_pos = m_compile_units.begin();
+ CompileUnitColl::const_iterator pos = std::upper_bound(
+ begin_pos, end_pos, cu_offset, OffsetLessThanCompileUnitOffset);
+ if (pos != begin_pos) {
+ --pos;
+ if ((*pos)->GetOffset() == cu_offset) {
+ cu_sp = *pos;
+ cu_idx = std::distance(begin_pos, pos);
}
+ }
}
- if (idx_ptr)
- *idx_ptr = cu_idx;
- return cu_sp.get();
+ }
+ if (idx_ptr)
+ *idx_ptr = cu_idx;
+ return cu_sp.get();
}
-DWARFCompileUnit *
-DWARFDebugInfo::GetCompileUnit (const DIERef& die_ref)
-{
- if (die_ref.cu_offset == DW_INVALID_OFFSET)
- return GetCompileUnitContainingDIEOffset(die_ref.die_offset);
- else
- return GetCompileUnit(die_ref.cu_offset);
+DWARFCompileUnit *DWARFDebugInfo::GetCompileUnit(const DIERef &die_ref) {
+ if (die_ref.cu_offset == DW_INVALID_OFFSET)
+ return GetCompileUnitContainingDIEOffset(die_ref.die_offset);
+ else
+ return GetCompileUnit(die_ref.cu_offset);
}
-DWARFCompileUnit*
-DWARFDebugInfo::GetCompileUnitContainingDIEOffset(dw_offset_t die_offset)
-{
- ParseCompileUnitHeadersIfNeeded();
+DWARFCompileUnit *
+DWARFDebugInfo::GetCompileUnitContainingDIEOffset(dw_offset_t die_offset) {
+ ParseCompileUnitHeadersIfNeeded();
- DWARFCompileUnitSP cu_sp;
+ DWARFCompileUnitSP cu_sp;
- // Watch out for single compile unit executable as they are pretty common
- const size_t num_cus = m_compile_units.size();
- if (num_cus == 1)
- {
- if (m_compile_units[0]->ContainsDIEOffset(die_offset))
- return m_compile_units[0].get();
- }
- else if (num_cus)
- {
- CompileUnitColl::const_iterator end_pos = m_compile_units.end();
- CompileUnitColl::const_iterator begin_pos = m_compile_units.begin();
- CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, die_offset, OffsetLessThanCompileUnitOffset);
- if (pos != begin_pos)
- {
- --pos;
- if ((*pos)->ContainsDIEOffset(die_offset))
- return (*pos).get();
- }
+ // Watch out for single compile unit executable as they are pretty common
+ const size_t num_cus = m_compile_units.size();
+ if (num_cus == 1) {
+ if (m_compile_units[0]->ContainsDIEOffset(die_offset))
+ return m_compile_units[0].get();
+ } else if (num_cus) {
+ CompileUnitColl::const_iterator end_pos = m_compile_units.end();
+ CompileUnitColl::const_iterator begin_pos = m_compile_units.begin();
+ CompileUnitColl::const_iterator pos = std::upper_bound(
+ begin_pos, end_pos, die_offset, OffsetLessThanCompileUnitOffset);
+ if (pos != begin_pos) {
+ --pos;
+ if ((*pos)->ContainsDIEOffset(die_offset))
+ return (*pos).get();
}
+ }
- return nullptr;
+ return nullptr;
}
DWARFDIE
-DWARFDebugInfo::GetDIEForDIEOffset(dw_offset_t die_offset)
-{
- DWARFCompileUnit* cu = GetCompileUnitContainingDIEOffset(die_offset);
- if (cu)
- return cu->GetDIE(die_offset);
- return DWARFDIE();
+DWARFDebugInfo::GetDIEForDIEOffset(dw_offset_t die_offset) {
+ DWARFCompileUnit *cu = GetCompileUnitContainingDIEOffset(die_offset);
+ if (cu)
+ return cu->GetDIE(die_offset);
+ return DWARFDIE();
}
//----------------------------------------------------------------------
@@ -263,12 +226,11 @@ DWARFDebugInfo::GetDIEForDIEOffset(dw_offset_t die_offset)
// Get the DIE (Debug Information Entry) with the specified offset.
//----------------------------------------------------------------------
DWARFDIE
-DWARFDebugInfo::GetDIE(const DIERef& die_ref)
-{
- DWARFCompileUnit *cu = GetCompileUnit(die_ref);
- if (cu)
- return cu->GetDIE (die_ref.die_offset);
- return DWARFDIE(); // Not found
+DWARFDebugInfo::GetDIE(const DIERef &die_ref) {
+ DWARFCompileUnit *cu = GetCompileUnit(die_ref);
+ if (cu)
+ return cu->GetDIE(die_ref.die_offset);
+ return DWARFDIE(); // Not found
}
//----------------------------------------------------------------------
@@ -281,88 +243,75 @@ DWARFDebugInfo::GetDIE(const DIERef& die_ref)
// for different tasks such as parsing the file contents into a
// structured data, dumping, verifying and much more.
//----------------------------------------------------------------------
-void
-DWARFDebugInfo::Parse(SymbolFileDWARF* dwarf2Data, Callback callback, void* userData)
-{
- if (dwarf2Data)
- {
- lldb::offset_t offset = 0;
- uint32_t depth = 0;
- DWARFCompileUnitSP cu(new DWARFCompileUnit(dwarf2Data));
- if (cu.get() == NULL)
- return;
- DWARFDebugInfoEntry die;
-
- while (cu->Extract(dwarf2Data->get_debug_info_data(), &offset))
- {
- const dw_offset_t next_cu_offset = cu->GetNextCompileUnitOffset();
-
- 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.get(), NULL, offset, depth, userData);
-
- // Make sure we are within our compile unit
- if (offset < next_cu_offset)
- {
- // We are in our compile unit, parse starting at the offset
- // we were told to parse
- bool done = false;
- 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.get(), &die, offset, depth, userData);
-
- if (die.IsNULL())
- {
- if (depth)
- --depth;
- else
- done = true; // We are done with this compile unit!
- }
- else if (die.HasChildren())
- ++depth;
- }
- }
-
- // Make sure the offset returned is valid, and if not stop parsing.
- // Returning DW_INVALID_OFFSET from this callback is a good way to end
- // all parsing
- if (!dwarf2Data->get_debug_info_data().ValidOffset(offset))
- break;
-
- // See if during the callback anyone retained a copy of the compile
- // unit other than ourselves and if so, let whomever did own the object
- // and create a new one for our own use!
- if (!cu.unique())
- cu.reset(new DWARFCompileUnit(dwarf2Data));
-
-
- // Make sure we start on a proper
- offset = next_cu_offset;
+void DWARFDebugInfo::Parse(SymbolFileDWARF *dwarf2Data, Callback callback,
+ void *userData) {
+ if (dwarf2Data) {
+ lldb::offset_t offset = 0;
+ uint32_t depth = 0;
+ DWARFCompileUnitSP cu(new DWARFCompileUnit(dwarf2Data));
+ if (cu.get() == NULL)
+ return;
+ DWARFDebugInfoEntry die;
+
+ while (cu->Extract(dwarf2Data->get_debug_info_data(), &offset)) {
+ const dw_offset_t next_cu_offset = cu->GetNextCompileUnitOffset();
+
+ 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.get(), NULL, offset, depth, userData);
+
+ // Make sure we are within our compile unit
+ if (offset < next_cu_offset) {
+ // We are in our compile unit, parse starting at the offset
+ // we were told to parse
+ bool done = false;
+ 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.get(), &die, offset, depth, userData);
+
+ if (die.IsNULL()) {
+ if (depth)
+ --depth;
+ else
+ done = true; // We are done with this compile unit!
+ } else if (die.HasChildren())
+ ++depth;
}
+ }
+
+ // Make sure the offset returned is valid, and if not stop parsing.
+ // Returning DW_INVALID_OFFSET from this callback is a good way to end
+ // all parsing
+ if (!dwarf2Data->get_debug_info_data().ValidOffset(offset))
+ break;
+
+ // See if during the callback anyone retained a copy of the compile
+ // unit other than ourselves and if so, let whomever did own the object
+ // and create a new one for our own use!
+ if (!cu.unique())
+ cu.reset(new DWARFCompileUnit(dwarf2Data));
+
+ // Make sure we start on a proper
+ offset = next_cu_offset;
}
+ }
}
-typedef struct DumpInfo
-{
- DumpInfo(Stream* init_strm, uint32_t off, uint32_t depth) :
- strm(init_strm),
- die_offset(off),
- recurse_depth(depth),
- found_depth(UINT32_MAX),
- found_die(false),
- ancestors()
- {
- }
- Stream* strm;
- const uint32_t die_offset;
- const uint32_t recurse_depth;
- uint32_t found_depth;
- bool found_die;
- std::vector<DWARFDebugInfoEntry> ancestors;
-
- DISALLOW_COPY_AND_ASSIGN(DumpInfo);
+typedef struct DumpInfo {
+ DumpInfo(Stream *init_strm, uint32_t off, uint32_t depth)
+ : strm(init_strm), die_offset(off), recurse_depth(depth),
+ found_depth(UINT32_MAX), found_die(false), ancestors() {}
+ Stream *strm;
+ const uint32_t die_offset;
+ const uint32_t recurse_depth;
+ uint32_t found_depth;
+ bool found_die;
+ std::vector<DWARFDebugInfoEntry> ancestors;
+
+ DISALLOW_COPY_AND_ASSIGN(DumpInfo);
} DumpInfo;
//----------------------------------------------------------------------
@@ -375,168 +324,134 @@ typedef struct DumpInfo
// This function dump DWARF information and obey recurse depth and
// whether a single DIE is to be dumped (or all of the data).
//----------------------------------------------------------------------
-static dw_offset_t DumpCallback
-(
- SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- DWARFDebugInfoEntry* die,
- const dw_offset_t next_offset,
- const uint32_t curr_depth,
- void* userData
-)
-{
- DumpInfo* dumpInfo = (DumpInfo*)userData;
- Stream *s = dumpInfo->strm;
- bool show_parents = s->GetFlags().Test(DWARFDebugInfo::eDumpFlag_ShowAncestors);
-
- if (die)
- {
- // Are we dumping everything?
- if (dumpInfo->die_offset == DW_INVALID_OFFSET)
- {
- // Yes we are dumping everything. Obey our recurse level though
- if (curr_depth < dumpInfo->recurse_depth)
- die->Dump(dwarf2Data, cu, *s, 0);
- }
- else
- {
- // We are dumping a specific DIE entry by offset
- if (dumpInfo->die_offset == die->GetOffset())
- {
- // We found the DIE we were looking for, dump it!
- if (show_parents)
- {
- s->SetIndentLevel(0);
- const uint32_t num_ancestors = dumpInfo->ancestors.size();
- if (num_ancestors > 0)
- {
- for (uint32_t i=0; i<num_ancestors-1; ++i)
- {
- dumpInfo->ancestors[i].Dump(dwarf2Data, cu, *s, 0);
- s->IndentMore();
- }
- }
- }
-
- dumpInfo->found_depth = curr_depth;
-
- die->Dump(dwarf2Data, cu, *s, 0);
-
- // Note that we found the DIE we were looking for
- dumpInfo->found_die = true;
-
- // Since we are dumping a single DIE, if there are no children we are done!
- if (!die->HasChildren() || dumpInfo->recurse_depth == 0)
- return DW_INVALID_OFFSET; // Return an invalid address to end parsing
- }
- else if (dumpInfo->found_die)
- {
- // Are we done with all the children?
- if (curr_depth <= dumpInfo->found_depth)
- return DW_INVALID_OFFSET;
-
- // We have already found our DIE and are printing it's children. Obey
- // our recurse depth and return an invalid offset if we get done
- // dumping all of the children
- if (dumpInfo->recurse_depth == UINT32_MAX || curr_depth <= dumpInfo->found_depth + dumpInfo->recurse_depth)
- die->Dump(dwarf2Data, cu, *s, 0);
- }
- else if (dumpInfo->die_offset > die->GetOffset())
- {
- if (show_parents)
- dumpInfo->ancestors.back() = *die;
+static dw_offset_t DumpCallback(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu, DWARFDebugInfoEntry *die,
+ const dw_offset_t next_offset,
+ const uint32_t curr_depth, void *userData) {
+ DumpInfo *dumpInfo = (DumpInfo *)userData;
+ Stream *s = dumpInfo->strm;
+ bool show_parents =
+ s->GetFlags().Test(DWARFDebugInfo::eDumpFlag_ShowAncestors);
+
+ if (die) {
+ // Are we dumping everything?
+ if (dumpInfo->die_offset == DW_INVALID_OFFSET) {
+ // Yes we are dumping everything. Obey our recurse level though
+ if (curr_depth < dumpInfo->recurse_depth)
+ die->Dump(dwarf2Data, cu, *s, 0);
+ } else {
+ // We are dumping a specific DIE entry by offset
+ if (dumpInfo->die_offset == die->GetOffset()) {
+ // We found the DIE we were looking for, dump it!
+ if (show_parents) {
+ s->SetIndentLevel(0);
+ const uint32_t num_ancestors = dumpInfo->ancestors.size();
+ if (num_ancestors > 0) {
+ for (uint32_t i = 0; i < num_ancestors - 1; ++i) {
+ dumpInfo->ancestors[i].Dump(dwarf2Data, cu, *s, 0);
+ s->IndentMore();
}
+ }
}
- // Keep up with our indent level
- if (die->IsNULL())
- {
- if (show_parents)
- dumpInfo->ancestors.pop_back();
-
- if (curr_depth <= 1)
- return cu->GetNextCompileUnitOffset();
- else
- s->IndentLess();
- }
- else if (die->HasChildren())
- {
- if (show_parents)
- {
- DWARFDebugInfoEntry null_die;
- dumpInfo->ancestors.push_back(null_die);
- }
- s->IndentMore();
- }
+ dumpInfo->found_depth = curr_depth;
+
+ die->Dump(dwarf2Data, cu, *s, 0);
+
+ // Note that we found the DIE we were looking for
+ dumpInfo->found_die = true;
+
+ // Since we are dumping a single DIE, if there are no children we are
+ // done!
+ if (!die->HasChildren() || dumpInfo->recurse_depth == 0)
+ return DW_INVALID_OFFSET; // Return an invalid address to end parsing
+ } else if (dumpInfo->found_die) {
+ // Are we done with all the children?
+ if (curr_depth <= dumpInfo->found_depth)
+ return DW_INVALID_OFFSET;
+
+ // We have already found our DIE and are printing it's children. Obey
+ // our recurse depth and return an invalid offset if we get done
+ // dumping all of the children
+ if (dumpInfo->recurse_depth == UINT32_MAX ||
+ curr_depth <= dumpInfo->found_depth + dumpInfo->recurse_depth)
+ die->Dump(dwarf2Data, cu, *s, 0);
+ } else if (dumpInfo->die_offset > die->GetOffset()) {
+ if (show_parents)
+ dumpInfo->ancestors.back() = *die;
+ }
}
- else
- {
- if (cu == NULL)
- s->PutCString("NULL - cu");
- // We have a compile unit, reset our indent level to zero just in case
- s->SetIndentLevel(0);
-
- // See if we are dumping everything?
- if (dumpInfo->die_offset == DW_INVALID_OFFSET)
- {
- // We are dumping everything
- if (cu)
- {
- cu->Dump(s);
- return cu->GetFirstDIEOffset(); // Return true to parse all DIEs in this Compile Unit
- }
- else
- {
- return DW_INVALID_OFFSET;
- }
- }
- else
- {
- if (show_parents)
- {
- dumpInfo->ancestors.clear();
- dumpInfo->ancestors.resize(1);
- }
- // We are dumping only a single DIE possibly with it's children and
- // we must find it's compile unit before we can dump it properly
- if (cu && dumpInfo->die_offset < cu->GetFirstDIEOffset())
- {
- // Not found, maybe the DIE offset provided wasn't correct?
- // *ostrm_ptr << "DIE at offset " << HEX32 << dumpInfo->die_offset << " was not found." << endl;
- return DW_INVALID_OFFSET;
- }
- else
- {
- // See if the DIE is in this compile unit?
- if (cu && dumpInfo->die_offset < cu->GetNextCompileUnitOffset())
- {
- // This DIE is in this compile unit!
- if (s->GetVerbose())
- cu->Dump(s); // Dump the compile unit for the DIE in verbose mode
-
- return next_offset;
- // // We found our compile unit that contains our DIE, just skip to dumping the requested DIE...
- // return dumpInfo->die_offset;
- }
- else
- {
- // Skip to the next compile unit as the DIE isn't in the current one!
- if (cu)
- {
- return cu->GetNextCompileUnitOffset();
- }
- else
- {
- return DW_INVALID_OFFSET;
- }
- }
- }
+ // Keep up with our indent level
+ if (die->IsNULL()) {
+ if (show_parents)
+ dumpInfo->ancestors.pop_back();
+
+ if (curr_depth <= 1)
+ return cu->GetNextCompileUnitOffset();
+ else
+ s->IndentLess();
+ } else if (die->HasChildren()) {
+ if (show_parents) {
+ DWARFDebugInfoEntry null_die;
+ dumpInfo->ancestors.push_back(null_die);
+ }
+ s->IndentMore();
+ }
+ } else {
+ if (cu == NULL)
+ s->PutCString("NULL - cu");
+ // We have a compile unit, reset our indent level to zero just in case
+ s->SetIndentLevel(0);
+
+ // See if we are dumping everything?
+ if (dumpInfo->die_offset == DW_INVALID_OFFSET) {
+ // We are dumping everything
+ if (cu) {
+ cu->Dump(s);
+ return cu->GetFirstDIEOffset(); // Return true to parse all DIEs in this
+ // Compile Unit
+ } else {
+ return DW_INVALID_OFFSET;
+ }
+ } else {
+ if (show_parents) {
+ dumpInfo->ancestors.clear();
+ dumpInfo->ancestors.resize(1);
+ }
+
+ // We are dumping only a single DIE possibly with it's children and
+ // we must find it's compile unit before we can dump it properly
+ if (cu && dumpInfo->die_offset < cu->GetFirstDIEOffset()) {
+ // Not found, maybe the DIE offset provided wasn't correct?
+ // *ostrm_ptr << "DIE at offset " << HEX32 << dumpInfo->die_offset << "
+ // was not found." << endl;
+ return DW_INVALID_OFFSET;
+ } else {
+ // See if the DIE is in this compile unit?
+ if (cu && dumpInfo->die_offset < cu->GetNextCompileUnitOffset()) {
+ // This DIE is in this compile unit!
+ if (s->GetVerbose())
+ cu->Dump(s); // Dump the compile unit for the DIE in verbose mode
+
+ return next_offset;
+ // // We found our compile unit that contains our DIE, just skip to
+ // dumping the requested DIE...
+ // return dumpInfo->die_offset;
+ } else {
+ // Skip to the next compile unit as the DIE isn't in the current one!
+ if (cu) {
+ return cu->GetNextCompileUnitOffset();
+ } else {
+ return DW_INVALID_OFFSET;
+ }
}
+ }
}
+ }
- // Just return the current offset to parse the next CU or DIE entry
- return next_offset;
+ // Just return the current offset to parse the next CU or DIE entry
+ return next_offset;
}
//----------------------------------------------------------------------
@@ -551,65 +466,51 @@ static dw_offset_t DumpCallback
// headers and the DW_TAG_compile unit tags. A depth of 2 will also
// dump all types and functions.
//----------------------------------------------------------------------
-void
-DWARFDebugInfo::Dump
-(
- Stream *s,
- SymbolFileDWARF* dwarf2Data,
- const uint32_t die_offset,
- const uint32_t recurse_depth
-)
-{
- DumpInfo dumpInfo(s, die_offset, recurse_depth);
- s->PutCString(".debug_info contents");
- if (dwarf2Data->get_debug_info_data().GetByteSize() > 0)
- {
- if (die_offset == DW_INVALID_OFFSET)
- s->PutCString(":\n");
- else
- {
- s->Printf(" for DIE entry at .debug_info[0x%8.8x]", die_offset);
- if (recurse_depth != UINT32_MAX)
- s->Printf(" recursing %u levels deep.", recurse_depth);
- s->EOL();
- }
+void DWARFDebugInfo::Dump(Stream *s, SymbolFileDWARF *dwarf2Data,
+ const uint32_t die_offset,
+ const uint32_t recurse_depth) {
+ DumpInfo dumpInfo(s, die_offset, recurse_depth);
+ s->PutCString(".debug_info contents");
+ if (dwarf2Data->get_debug_info_data().GetByteSize() > 0) {
+ if (die_offset == DW_INVALID_OFFSET)
+ s->PutCString(":\n");
+ else {
+ s->Printf(" for DIE entry at .debug_info[0x%8.8x]", die_offset);
+ if (recurse_depth != UINT32_MAX)
+ s->Printf(" recursing %u levels deep.", recurse_depth);
+ s->EOL();
}
- else
- {
- s->PutCString(": < EMPTY >\n");
- return;
- }
- DWARFDebugInfo::Parse(dwarf2Data, DumpCallback, &dumpInfo);
+ } else {
+ s->PutCString(": < EMPTY >\n");
+ return;
+ }
+ DWARFDebugInfo::Parse(dwarf2Data, DumpCallback, &dumpInfo);
}
-
//----------------------------------------------------------------------
// Dump
//
// Dump the contents of this DWARFDebugInfo object as has been parsed
// and/or modified after it has been parsed.
//----------------------------------------------------------------------
-void
-DWARFDebugInfo::Dump (Stream *s, const uint32_t die_offset, const uint32_t recurse_depth)
-{
- DumpInfo dumpInfo(s, die_offset, recurse_depth);
+void DWARFDebugInfo::Dump(Stream *s, const uint32_t die_offset,
+ const uint32_t recurse_depth) {
+ DumpInfo dumpInfo(s, die_offset, recurse_depth);
- s->PutCString("Dumping .debug_info section from internal representation\n");
+ s->PutCString("Dumping .debug_info section from internal representation\n");
- CompileUnitColl::const_iterator pos;
- uint32_t curr_depth = 0;
- ParseCompileUnitHeadersIfNeeded();
- for (pos = m_compile_units.begin(); pos != m_compile_units.end(); ++pos)
- {
- DWARFCompileUnit *cu = pos->get();
- DumpCallback(m_dwarf2Data, cu, NULL, 0, curr_depth, &dumpInfo);
-
- const DWARFDIE die = cu->DIE();
- if (die)
- die.Dump(s, recurse_depth);
- }
-}
+ CompileUnitColl::const_iterator pos;
+ uint32_t curr_depth = 0;
+ ParseCompileUnitHeadersIfNeeded();
+ for (pos = m_compile_units.begin(); pos != m_compile_units.end(); ++pos) {
+ DWARFCompileUnit *cu = pos->get();
+ DumpCallback(m_dwarf2Data, cu, NULL, 0, curr_depth, &dumpInfo);
+ const DWARFDIE die = cu->DIE();
+ if (die)
+ die.Dump(s, recurse_depth);
+ }
+}
//----------------------------------------------------------------------
// FindCallbackString
@@ -621,46 +522,35 @@ DWARFDebugInfo::Dump (Stream *s, const uint32_t die_offset, const uint32_t recur
// This function will find the die_offset of any items whose DW_AT_name
// matches the given string
//----------------------------------------------------------------------
-typedef struct FindCallbackStringInfoTag
-{
- const char* name;
- bool ignore_case;
- RegularExpression* regex;
- vector<dw_offset_t>& die_offsets;
+typedef struct FindCallbackStringInfoTag {
+ const char *name;
+ bool ignore_case;
+ RegularExpression *regex;
+ vector<dw_offset_t> &die_offsets;
} FindCallbackStringInfo;
-static dw_offset_t FindCallbackString
-(
- SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- DWARFDebugInfoEntry* die,
- const dw_offset_t next_offset,
- const uint32_t curr_depth,
- void* userData
-)
-{
- FindCallbackStringInfo* info = (FindCallbackStringInfo*)userData;
-
- if (die)
- {
- const char* die_name = die->GetName(dwarf2Data, cu);
- if (die_name)
- {
- if (info->regex)
- {
- if (info->regex->Execute(die_name))
- info->die_offsets.push_back(die->GetOffset());
- }
- else
- {
- if ((info->ignore_case ? strcasecmp(die_name, info->name) : strcmp(die_name, info->name)) == 0)
- info->die_offsets.push_back(die->GetOffset());
- }
- }
+static dw_offset_t
+FindCallbackString(SymbolFileDWARF *dwarf2Data, DWARFCompileUnit *cu,
+ DWARFDebugInfoEntry *die, const dw_offset_t next_offset,
+ const uint32_t curr_depth, void *userData) {
+ FindCallbackStringInfo *info = (FindCallbackStringInfo *)userData;
+
+ if (die) {
+ const char *die_name = die->GetName(dwarf2Data, cu);
+ if (die_name) {
+ if (info->regex) {
+ if (info->regex->Execute(die_name))
+ info->die_offsets.push_back(die->GetOffset());
+ } else {
+ if ((info->ignore_case ? strcasecmp(die_name, info->name)
+ : strcmp(die_name, info->name)) == 0)
+ info->die_offsets.push_back(die->GetOffset());
+ }
}
+ }
- // Just return the current offset to parse the next CU or DIE entry
- return next_offset;
+ // Just return the current offset to parse the next CU or DIE entry
+ return next_offset;
}
//----------------------------------------------------------------------
@@ -671,16 +561,14 @@ static dw_offset_t FindCallbackString
// .debug_pubnames section). The string must match the entire name
// and case sensitive searches are an option.
//----------------------------------------------------------------------
-bool
-DWARFDebugInfo::Find(const char* name, bool ignore_case, vector<dw_offset_t>& die_offsets) const
-{
- die_offsets.clear();
- if (name && name[0])
- {
- FindCallbackStringInfo info = { name, ignore_case, NULL, die_offsets };
- DWARFDebugInfo::Parse(m_dwarf2Data, FindCallbackString, &info);
- }
- return !die_offsets.empty();
+bool DWARFDebugInfo::Find(const char *name, bool ignore_case,
+ vector<dw_offset_t> &die_offsets) const {
+ die_offsets.clear();
+ if (name && name[0]) {
+ FindCallbackStringInfo info = {name, ignore_case, NULL, die_offsets};
+ DWARFDebugInfo::Parse(m_dwarf2Data, FindCallbackString, &info);
+ }
+ return !die_offsets.empty();
}
//----------------------------------------------------------------------
@@ -691,11 +579,10 @@ DWARFDebugInfo::Find(const char* name, bool ignore_case, vector<dw_offset_t>& di
// .debug_pubnames section). The string must match the supplied regular
// expression.
//----------------------------------------------------------------------
-bool
-DWARFDebugInfo::Find(RegularExpression& re, vector<dw_offset_t>& die_offsets) const
-{
- die_offsets.clear();
- FindCallbackStringInfo info = { NULL, false, &re, die_offsets };
- DWARFDebugInfo::Parse(m_dwarf2Data, FindCallbackString, &info);
- return !die_offsets.empty();
+bool DWARFDebugInfo::Find(RegularExpression &re,
+ vector<dw_offset_t> &die_offsets) const {
+ die_offsets.clear();
+ FindCallbackStringInfo info = {NULL, false, &re, die_offsets};
+ DWARFDebugInfo::Parse(m_dwarf2Data, FindCallbackString, &info);
+ return !die_offsets.empty();
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
index 7783135bdb9..a05a8886bb4 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
@@ -10,78 +10,82 @@
#ifndef SymbolFileDWARF_DWARFDebugInfo_h_
#define SymbolFileDWARF_DWARFDebugInfo_h_
-#include <vector>
#include <map>
+#include <vector>
+#include "DWARFDIE.h"
+#include "SymbolFileDWARF.h"
#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 std::multimap<const char *, dw_offset_t, CStringCompareFunctionObject>
+ CStringToDIEMap;
typedef CStringToDIEMap::iterator CStringToDIEMapIter;
typedef CStringToDIEMap::const_iterator CStringToDIEMapConstIter;
-class DWARFDebugInfo
-{
+class DWARFDebugInfo {
public:
- typedef dw_offset_t (*Callback)(
- SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- DWARFDebugInfoEntry* die,
- const dw_offset_t next_offset,
- const uint32_t depth,
- void* userData);
-
- DWARFDebugInfo();
- void SetDwarfData(SymbolFileDWARF* dwarf2Data);
-
- size_t GetNumCompileUnits();
- bool ContainsCompileUnit (const DWARFCompileUnit *cu) const;
- DWARFCompileUnit* GetCompileUnitAtIndex (uint32_t idx);
- DWARFCompileUnit* GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr = NULL);
- DWARFCompileUnit* GetCompileUnitContainingDIEOffset (dw_offset_t die_offset);
- DWARFCompileUnit* GetCompileUnit(const DIERef& die_ref);
- DWARFDIE GetDIEForDIEOffset(dw_offset_t die_offset);
- DWARFDIE GetDIE (const DIERef& die_ref);
-
- void Dump(lldb_private::Stream *s, const uint32_t die_offset, const uint32_t recurse_depth);
- static void Parse(SymbolFileDWARF* parser, Callback callback, void* userData);
- static void Verify(lldb_private::Stream *s, SymbolFileDWARF* dwarf2Data);
- static void Dump(lldb_private::Stream *s, SymbolFileDWARF* dwarf2Data, const uint32_t die_offset, const uint32_t recurse_depth);
- bool Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offsets) const;
- bool Find(lldb_private::RegularExpression& re, std::vector<dw_offset_t>& die_offsets) const;
-
- enum
- {
- eDumpFlag_Verbose = (1<<0), // Verbose dumping
- eDumpFlag_ShowForm = (1<<1), // Show the DW_form type
- eDumpFlag_ShowAncestors = (1<<2) // Show all parent DIEs when dumping single DIEs
- };
-
- DWARFDebugAranges &
- GetCompileUnitAranges ();
+ typedef dw_offset_t (*Callback)(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu,
+ DWARFDebugInfoEntry *die,
+ const dw_offset_t next_offset,
+ const uint32_t depth, void *userData);
+
+ DWARFDebugInfo();
+ void SetDwarfData(SymbolFileDWARF *dwarf2Data);
+
+ size_t GetNumCompileUnits();
+ bool ContainsCompileUnit(const DWARFCompileUnit *cu) const;
+ DWARFCompileUnit *GetCompileUnitAtIndex(uint32_t idx);
+ DWARFCompileUnit *GetCompileUnit(dw_offset_t cu_offset,
+ uint32_t *idx_ptr = NULL);
+ DWARFCompileUnit *GetCompileUnitContainingDIEOffset(dw_offset_t die_offset);
+ DWARFCompileUnit *GetCompileUnit(const DIERef &die_ref);
+ DWARFDIE GetDIEForDIEOffset(dw_offset_t die_offset);
+ DWARFDIE GetDIE(const DIERef &die_ref);
+
+ void Dump(lldb_private::Stream *s, const uint32_t die_offset,
+ const uint32_t recurse_depth);
+ static void Parse(SymbolFileDWARF *parser, Callback callback, void *userData);
+ static void Verify(lldb_private::Stream *s, SymbolFileDWARF *dwarf2Data);
+ static void Dump(lldb_private::Stream *s, SymbolFileDWARF *dwarf2Data,
+ const uint32_t die_offset, const uint32_t recurse_depth);
+ bool Find(const char *name, bool ignore_case,
+ std::vector<dw_offset_t> &die_offsets) const;
+ bool Find(lldb_private::RegularExpression &re,
+ std::vector<dw_offset_t> &die_offsets) const;
+
+ enum {
+ eDumpFlag_Verbose = (1 << 0), // Verbose dumping
+ eDumpFlag_ShowForm = (1 << 1), // Show the DW_form type
+ eDumpFlag_ShowAncestors =
+ (1 << 2) // Show all parent DIEs when dumping single DIEs
+ };
+
+ DWARFDebugAranges &GetCompileUnitAranges();
protected:
- typedef std::shared_ptr<DWARFCompileUnit> DWARFCompileUnitSP;
+ typedef std::shared_ptr<DWARFCompileUnit> DWARFCompileUnitSP;
- static bool
- OffsetLessThanCompileUnitOffset (dw_offset_t offset, const DWARFCompileUnitSP& cu_sp);
+ static bool OffsetLessThanCompileUnitOffset(dw_offset_t offset,
+ const DWARFCompileUnitSP &cu_sp);
- typedef std::vector<DWARFCompileUnitSP> CompileUnitColl;
+ typedef std::vector<DWARFCompileUnitSP> CompileUnitColl;
- //----------------------------------------------------------------------
- // Member variables
- //----------------------------------------------------------------------
- SymbolFileDWARF* m_dwarf2Data;
- CompileUnitColl m_compile_units;
- std::unique_ptr<DWARFDebugAranges> m_cu_aranges_ap; // A quick address to compile unit table
+ //----------------------------------------------------------------------
+ // Member variables
+ //----------------------------------------------------------------------
+ SymbolFileDWARF *m_dwarf2Data;
+ CompileUnitColl m_compile_units;
+ std::unique_ptr<DWARFDebugAranges>
+ m_cu_aranges_ap; // A quick address to compile unit table
private:
- // All parsing needs to be done partially any managed by this class as accessors are called.
- void ParseCompileUnitHeadersIfNeeded();
+ // All parsing needs to be done partially any managed by this class as
+ // accessors are called.
+ void ParseCompileUnitHeadersIfNeeded();
- DISALLOW_COPY_AND_ASSIGN (DWARFDebugInfo);
+ DISALLOW_COPY_AND_ASSIGN(DWARFDebugInfo);
};
-#endif // SymbolFileDWARF_DWARFDebugInfo_h_
+#endif // SymbolFileDWARF_DWARFDebugInfo_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
index f48d8fc9eeb..ac088c460c6 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
@@ -19,13 +19,13 @@
#include "lldb/Symbol/ObjectFile.h"
#include "DWARFCompileUnit.h"
+#include "DWARFDIECollection.h"
#include "DWARFDebugAbbrev.h"
#include "DWARFDebugAranges.h"
#include "DWARFDebugInfo.h"
+#include "DWARFDebugRanges.h"
#include "DWARFDeclContext.h"
-#include "DWARFDIECollection.h"
#include "DWARFFormValue.h"
-#include "DWARFDebugRanges.h"
#include "SymbolFileDWARF.h"
#include "SymbolFileDWARFDwo.h"
@@ -33,159 +33,157 @@ using namespace lldb_private;
using namespace std;
extern int g_verbose;
-bool
-DWARFDebugInfoEntry::FastExtract
-(
- const DWARFDataExtractor& debug_info_data,
- const DWARFCompileUnit* cu,
- const DWARFFormValue::FixedFormSizes& fixed_form_sizes,
- lldb::offset_t *offset_ptr
-)
-{
- m_offset = *offset_ptr;
- m_parent_idx = 0;
- m_sibling_idx = 0;
- m_empty_children = false;
- const uint64_t abbr_idx = debug_info_data.GetULEB128 (offset_ptr);
- assert (abbr_idx < (1 << DIE_ABBR_IDX_BITSIZE));
- m_abbr_idx = abbr_idx;
-
- //assert (fixed_form_sizes); // For best performance this should be specified!
-
- if (m_abbr_idx)
- {
- lldb::offset_t offset = *offset_ptr;
-
- const DWARFAbbreviationDeclaration *abbrevDecl = cu->GetAbbreviations()->GetAbbreviationDeclaration(m_abbr_idx);
-
- if (abbrevDecl == NULL)
- {
- cu->GetSymbolFileDWARF()->GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: invalid abbreviation code %u, please file a bug and attach the file at the start of this error message",
- m_offset,
- (unsigned)abbr_idx);
- // WE can't parse anymore if the DWARF is borked...
- *offset_ptr = UINT32_MAX;
- return false;
- }
- m_tag = abbrevDecl->Tag();
- m_has_children = abbrevDecl->HasChildren();
- // Skip all data in the .debug_info for the attributes
- const uint32_t numAttributes = abbrevDecl->NumAttributes();
- uint32_t i;
- dw_form_t form;
- for (i=0; i<numAttributes; ++i)
- {
- form = abbrevDecl->GetFormByIndexUnchecked(i);
+bool DWARFDebugInfoEntry::FastExtract(
+ const DWARFDataExtractor &debug_info_data, const DWARFCompileUnit *cu,
+ const DWARFFormValue::FixedFormSizes &fixed_form_sizes,
+ lldb::offset_t *offset_ptr) {
+ m_offset = *offset_ptr;
+ m_parent_idx = 0;
+ m_sibling_idx = 0;
+ m_empty_children = false;
+ const uint64_t abbr_idx = debug_info_data.GetULEB128(offset_ptr);
+ assert(abbr_idx < (1 << DIE_ABBR_IDX_BITSIZE));
+ m_abbr_idx = abbr_idx;
+
+ // assert (fixed_form_sizes); // For best performance this should be
+ // specified!
+
+ if (m_abbr_idx) {
+ lldb::offset_t offset = *offset_ptr;
- const uint8_t fixed_skip_size = fixed_form_sizes.GetSize(form);
- if (fixed_skip_size)
- offset += fixed_skip_size;
- else
- {
- bool form_is_indirect = false;
- do
- {
- form_is_indirect = false;
- uint32_t form_size = 0;
- switch (form)
- {
- // Blocks if inlined data that have a length field and the data bytes
- // inlined in the .debug_info
- case DW_FORM_exprloc :
- case DW_FORM_block : form_size = debug_info_data.GetULEB128 (&offset); break;
- case DW_FORM_block1 : form_size = debug_info_data.GetU8_unchecked (&offset); break;
- case DW_FORM_block2 : form_size = debug_info_data.GetU16_unchecked (&offset);break;
- case DW_FORM_block4 : form_size = debug_info_data.GetU32_unchecked (&offset);break;
-
- // Inlined NULL terminated C-strings
- case DW_FORM_string :
- debug_info_data.GetCStr (&offset);
- break;
-
- // Compile unit address sized values
- case DW_FORM_addr :
- form_size = cu->GetAddressByteSize();
- break;
- case DW_FORM_ref_addr :
- if (cu->GetVersion() <= 2)
- form_size = cu->GetAddressByteSize();
- else
- form_size = cu->IsDWARF64() ? 8 : 4;
- break;
-
- // 0 sized form
- case DW_FORM_flag_present:
- form_size = 0;
- break;
-
- // 1 byte values
- case DW_FORM_data1 :
- case DW_FORM_flag :
- case DW_FORM_ref1 :
- form_size = 1;
- break;
-
- // 2 byte values
- case DW_FORM_data2 :
- case DW_FORM_ref2 :
- form_size = 2;
- break;
-
- // 4 byte values
- case DW_FORM_data4 :
- case DW_FORM_ref4 :
- form_size = 4;
- break;
-
- // 8 byte values
- case DW_FORM_data8 :
- case DW_FORM_ref8 :
- case DW_FORM_ref_sig8 :
- form_size = 8;
- break;
-
- // signed or unsigned LEB 128 values
- case DW_FORM_sdata :
- case DW_FORM_udata :
- case DW_FORM_ref_udata :
- case DW_FORM_GNU_addr_index:
- case DW_FORM_GNU_str_index :
- debug_info_data.Skip_LEB128 (&offset);
- break;
-
- case DW_FORM_indirect :
- form_is_indirect = true;
- form = debug_info_data.GetULEB128 (&offset);
- break;
-
- case DW_FORM_strp :
- case DW_FORM_sec_offset :
- if (cu->IsDWARF64 ())
- debug_info_data.GetU64 (offset_ptr);
- else
- debug_info_data.GetU32 (offset_ptr);
- break;
-
- default:
- *offset_ptr = m_offset;
- return false;
- }
- offset += form_size;
-
- } while (form_is_indirect);
- }
- }
- *offset_ptr = offset;
- return true;
- }
- else
- {
- m_tag = 0;
- m_has_children = false;
- return true; // NULL debug tag entry
+ const DWARFAbbreviationDeclaration *abbrevDecl =
+ cu->GetAbbreviations()->GetAbbreviationDeclaration(m_abbr_idx);
+
+ if (abbrevDecl == NULL) {
+ cu->GetSymbolFileDWARF()->GetObjectFile()->GetModule()->ReportError(
+ "{0x%8.8x}: invalid abbreviation code %u, please file a bug and "
+ "attach the file at the start of this error message",
+ m_offset, (unsigned)abbr_idx);
+ // WE can't parse anymore if the DWARF is borked...
+ *offset_ptr = UINT32_MAX;
+ return false;
}
+ m_tag = abbrevDecl->Tag();
+ m_has_children = abbrevDecl->HasChildren();
+ // Skip all data in the .debug_info for the attributes
+ const uint32_t numAttributes = abbrevDecl->NumAttributes();
+ uint32_t i;
+ dw_form_t form;
+ for (i = 0; i < numAttributes; ++i) {
+ form = abbrevDecl->GetFormByIndexUnchecked(i);
+
+ const uint8_t fixed_skip_size = fixed_form_sizes.GetSize(form);
+ if (fixed_skip_size)
+ offset += fixed_skip_size;
+ else {
+ bool form_is_indirect = false;
+ do {
+ form_is_indirect = false;
+ uint32_t form_size = 0;
+ switch (form) {
+ // Blocks if inlined data that have a length field and the data bytes
+ // inlined in the .debug_info
+ case DW_FORM_exprloc:
+ case DW_FORM_block:
+ form_size = debug_info_data.GetULEB128(&offset);
+ break;
+ case DW_FORM_block1:
+ form_size = debug_info_data.GetU8_unchecked(&offset);
+ break;
+ case DW_FORM_block2:
+ form_size = debug_info_data.GetU16_unchecked(&offset);
+ break;
+ case DW_FORM_block4:
+ form_size = debug_info_data.GetU32_unchecked(&offset);
+ break;
+
+ // Inlined NULL terminated C-strings
+ case DW_FORM_string:
+ debug_info_data.GetCStr(&offset);
+ break;
+
+ // Compile unit address sized values
+ case DW_FORM_addr:
+ form_size = cu->GetAddressByteSize();
+ break;
+ case DW_FORM_ref_addr:
+ if (cu->GetVersion() <= 2)
+ form_size = cu->GetAddressByteSize();
+ else
+ form_size = cu->IsDWARF64() ? 8 : 4;
+ break;
+
+ // 0 sized form
+ case DW_FORM_flag_present:
+ form_size = 0;
+ break;
+
+ // 1 byte values
+ case DW_FORM_data1:
+ case DW_FORM_flag:
+ case DW_FORM_ref1:
+ form_size = 1;
+ break;
+
+ // 2 byte values
+ case DW_FORM_data2:
+ case DW_FORM_ref2:
+ form_size = 2;
+ break;
+
+ // 4 byte values
+ case DW_FORM_data4:
+ case DW_FORM_ref4:
+ form_size = 4;
+ break;
+
+ // 8 byte values
+ case DW_FORM_data8:
+ case DW_FORM_ref8:
+ case DW_FORM_ref_sig8:
+ form_size = 8;
+ break;
+
+ // signed or unsigned LEB 128 values
+ case DW_FORM_sdata:
+ case DW_FORM_udata:
+ case DW_FORM_ref_udata:
+ case DW_FORM_GNU_addr_index:
+ case DW_FORM_GNU_str_index:
+ debug_info_data.Skip_LEB128(&offset);
+ break;
+
+ case DW_FORM_indirect:
+ form_is_indirect = true;
+ form = debug_info_data.GetULEB128(&offset);
+ break;
+
+ case DW_FORM_strp:
+ case DW_FORM_sec_offset:
+ if (cu->IsDWARF64())
+ debug_info_data.GetU64(offset_ptr);
+ else
+ debug_info_data.GetU32(offset_ptr);
+ break;
- return false;
+ default:
+ *offset_ptr = m_offset;
+ return false;
+ }
+ offset += form_size;
+
+ } while (form_is_indirect);
+ }
+ }
+ *offset_ptr = offset;
+ return true;
+ } else {
+ m_tag = 0;
+ m_has_children = false;
+ return true; // NULL debug tag entry
+ }
+
+ return false;
}
//----------------------------------------------------------------------
@@ -195,165 +193,164 @@ DWARFDebugInfoEntry::FastExtract
// .debug_info and .debug_abbrev data within the SymbolFileDWARF class
// starting at the given offset
//----------------------------------------------------------------------
-bool
-DWARFDebugInfoEntry::Extract
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- lldb::offset_t *offset_ptr
-)
-{
- const DWARFDataExtractor& debug_info_data = dwarf2Data->get_debug_info_data();
-// const DWARFDataExtractor& debug_str_data = dwarf2Data->get_debug_str_data();
- const uint32_t cu_end_offset = cu->GetNextCompileUnitOffset();
- lldb::offset_t offset = *offset_ptr;
-// if (offset >= cu_end_offset)
-// Log::Error("DIE at offset 0x%8.8x is beyond the end of the current compile unit (0x%8.8x)", m_offset, cu_end_offset);
- if ((offset < cu_end_offset) && debug_info_data.ValidOffset(offset))
- {
- m_offset = offset;
-
- const uint64_t abbr_idx = debug_info_data.GetULEB128(&offset);
- assert (abbr_idx < (1 << DIE_ABBR_IDX_BITSIZE));
- m_abbr_idx = abbr_idx;
- if (abbr_idx)
- {
- const DWARFAbbreviationDeclaration *abbrevDecl = cu->GetAbbreviations()->GetAbbreviationDeclaration(abbr_idx);
-
- if (abbrevDecl)
- {
- m_tag = abbrevDecl->Tag();
- m_has_children = abbrevDecl->HasChildren();
-
- bool isCompileUnitTag = m_tag == DW_TAG_compile_unit;
- if (cu && isCompileUnitTag)
- const_cast<DWARFCompileUnit *>(cu)->SetBaseAddress(0);
-
- // Skip all data in the .debug_info for the attributes
- const uint32_t numAttributes = abbrevDecl->NumAttributes();
- uint32_t i;
- dw_attr_t attr;
- dw_form_t form;
- for (i=0; i<numAttributes; ++i)
- {
- abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
-
- if (isCompileUnitTag && ((attr == DW_AT_entry_pc) || (attr == DW_AT_low_pc)))
- {
- DWARFFormValue form_value(cu, form);
- if (form_value.ExtractValue(debug_info_data, &offset))
- {
- if (attr == DW_AT_low_pc || attr == DW_AT_entry_pc)
- const_cast<DWARFCompileUnit*>(cu)->SetBaseAddress(form_value.Address());
- }
- }
- else
- {
- bool form_is_indirect = false;
- do
- {
- form_is_indirect = false;
- uint32_t form_size = 0;
- switch (form)
- {
- // Blocks if inlined data that have a length field and the data bytes
- // inlined in the .debug_info
- case DW_FORM_exprloc :
- case DW_FORM_block : form_size = debug_info_data.GetULEB128(&offset); break;
- case DW_FORM_block1 : form_size = debug_info_data.GetU8(&offset); break;
- case DW_FORM_block2 : form_size = debug_info_data.GetU16(&offset); break;
- case DW_FORM_block4 : form_size = debug_info_data.GetU32(&offset); break;
-
- // Inlined NULL terminated C-strings
- case DW_FORM_string : debug_info_data.GetCStr(&offset); break;
-
- // Compile unit address sized values
- case DW_FORM_addr :
- form_size = cu->GetAddressByteSize();
- break;
- case DW_FORM_ref_addr :
- if (cu->GetVersion() <= 2)
- form_size = cu->GetAddressByteSize();
- else
- form_size = cu->IsDWARF64() ? 8 : 4;
- break;
-
- // 0 sized form
- case DW_FORM_flag_present:
- form_size = 0;
- break;
-
- // 1 byte values
- case DW_FORM_data1 :
- case DW_FORM_flag :
- case DW_FORM_ref1 :
- form_size = 1;
- break;
-
- // 2 byte values
- case DW_FORM_data2 :
- case DW_FORM_ref2 :
- form_size = 2;
- break;
-
- // 4 byte values
- case DW_FORM_data4 :
- case DW_FORM_ref4 :
- form_size = 4;
- break;
-
- // 8 byte values
- case DW_FORM_data8 :
- case DW_FORM_ref8 :
- case DW_FORM_ref_sig8 :
- form_size = 8;
- break;
-
- // signed or unsigned LEB 128 values
- case DW_FORM_sdata :
- case DW_FORM_udata :
- case DW_FORM_ref_udata :
- case DW_FORM_GNU_addr_index:
- case DW_FORM_GNU_str_index :
- debug_info_data.Skip_LEB128(&offset);
- break;
-
- case DW_FORM_indirect :
- form = debug_info_data.GetULEB128(&offset);
- form_is_indirect = true;
- break;
-
- case DW_FORM_strp :
- case DW_FORM_sec_offset :
- if (cu->IsDWARF64 ())
- debug_info_data.GetU64 (offset_ptr);
- else
- debug_info_data.GetU32 (offset_ptr);
- break;
-
- default:
- *offset_ptr = offset;
- return false;
- }
-
- offset += form_size;
- } while (form_is_indirect);
- }
- }
- *offset_ptr = offset;
- return true;
+bool DWARFDebugInfoEntry::Extract(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ lldb::offset_t *offset_ptr) {
+ const DWARFDataExtractor &debug_info_data = dwarf2Data->get_debug_info_data();
+ // const DWARFDataExtractor& debug_str_data =
+ // dwarf2Data->get_debug_str_data();
+ const uint32_t cu_end_offset = cu->GetNextCompileUnitOffset();
+ lldb::offset_t offset = *offset_ptr;
+ // if (offset >= cu_end_offset)
+ // Log::Error("DIE at offset 0x%8.8x is beyond the end of the current
+ // compile unit (0x%8.8x)", m_offset, cu_end_offset);
+ if ((offset < cu_end_offset) && debug_info_data.ValidOffset(offset)) {
+ m_offset = offset;
+
+ const uint64_t abbr_idx = debug_info_data.GetULEB128(&offset);
+ assert(abbr_idx < (1 << DIE_ABBR_IDX_BITSIZE));
+ m_abbr_idx = abbr_idx;
+ if (abbr_idx) {
+ const DWARFAbbreviationDeclaration *abbrevDecl =
+ cu->GetAbbreviations()->GetAbbreviationDeclaration(abbr_idx);
+
+ if (abbrevDecl) {
+ m_tag = abbrevDecl->Tag();
+ m_has_children = abbrevDecl->HasChildren();
+
+ bool isCompileUnitTag = m_tag == DW_TAG_compile_unit;
+ if (cu && isCompileUnitTag)
+ const_cast<DWARFCompileUnit *>(cu)->SetBaseAddress(0);
+
+ // Skip all data in the .debug_info for the attributes
+ const uint32_t numAttributes = abbrevDecl->NumAttributes();
+ uint32_t i;
+ dw_attr_t attr;
+ dw_form_t form;
+ for (i = 0; i < numAttributes; ++i) {
+ abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
+
+ if (isCompileUnitTag &&
+ ((attr == DW_AT_entry_pc) || (attr == DW_AT_low_pc))) {
+ DWARFFormValue form_value(cu, form);
+ if (form_value.ExtractValue(debug_info_data, &offset)) {
+ if (attr == DW_AT_low_pc || attr == DW_AT_entry_pc)
+ const_cast<DWARFCompileUnit *>(cu)->SetBaseAddress(
+ form_value.Address());
}
+ } else {
+ bool form_is_indirect = false;
+ do {
+ form_is_indirect = false;
+ uint32_t form_size = 0;
+ switch (form) {
+ // Blocks if inlined data that have a length field and the data
+ // bytes
+ // inlined in the .debug_info
+ case DW_FORM_exprloc:
+ case DW_FORM_block:
+ form_size = debug_info_data.GetULEB128(&offset);
+ break;
+ case DW_FORM_block1:
+ form_size = debug_info_data.GetU8(&offset);
+ break;
+ case DW_FORM_block2:
+ form_size = debug_info_data.GetU16(&offset);
+ break;
+ case DW_FORM_block4:
+ form_size = debug_info_data.GetU32(&offset);
+ break;
+
+ // Inlined NULL terminated C-strings
+ case DW_FORM_string:
+ debug_info_data.GetCStr(&offset);
+ break;
+
+ // Compile unit address sized values
+ case DW_FORM_addr:
+ form_size = cu->GetAddressByteSize();
+ break;
+ case DW_FORM_ref_addr:
+ if (cu->GetVersion() <= 2)
+ form_size = cu->GetAddressByteSize();
+ else
+ form_size = cu->IsDWARF64() ? 8 : 4;
+ break;
+
+ // 0 sized form
+ case DW_FORM_flag_present:
+ form_size = 0;
+ break;
+
+ // 1 byte values
+ case DW_FORM_data1:
+ case DW_FORM_flag:
+ case DW_FORM_ref1:
+ form_size = 1;
+ break;
+
+ // 2 byte values
+ case DW_FORM_data2:
+ case DW_FORM_ref2:
+ form_size = 2;
+ break;
+
+ // 4 byte values
+ case DW_FORM_data4:
+ case DW_FORM_ref4:
+ form_size = 4;
+ break;
+
+ // 8 byte values
+ case DW_FORM_data8:
+ case DW_FORM_ref8:
+ case DW_FORM_ref_sig8:
+ form_size = 8;
+ break;
+
+ // signed or unsigned LEB 128 values
+ case DW_FORM_sdata:
+ case DW_FORM_udata:
+ case DW_FORM_ref_udata:
+ case DW_FORM_GNU_addr_index:
+ case DW_FORM_GNU_str_index:
+ debug_info_data.Skip_LEB128(&offset);
+ break;
+
+ case DW_FORM_indirect:
+ form = debug_info_data.GetULEB128(&offset);
+ form_is_indirect = true;
+ break;
+
+ case DW_FORM_strp:
+ case DW_FORM_sec_offset:
+ if (cu->IsDWARF64())
+ debug_info_data.GetU64(offset_ptr);
+ else
+ debug_info_data.GetU32(offset_ptr);
+ break;
+
+ default:
+ *offset_ptr = offset;
+ return false;
+ }
+
+ offset += form_size;
+ } while (form_is_indirect);
+ }
}
- else
- {
- m_tag = 0;
- m_has_children = false;
- *offset_ptr = offset;
- return true; // NULL debug tag entry
- }
+ *offset_ptr = offset;
+ return true;
+ }
+ } else {
+ m_tag = 0;
+ m_has_children = false;
+ *offset_ptr = offset;
+ return true; // NULL debug tag entry
}
+ }
- return false;
+ return false;
}
//----------------------------------------------------------------------
@@ -362,20 +359,15 @@ DWARFDebugInfoEntry::Extract
// Dumps all of a debug information entries parents up until oldest and
// all of it's attributes to the specified stream.
//----------------------------------------------------------------------
-void
-DWARFDebugInfoEntry::DumpAncestry
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const DWARFDebugInfoEntry* oldest,
- Stream &s,
- uint32_t recurse_depth
-) const
-{
- const DWARFDebugInfoEntry* parent = GetParent();
- if (parent && parent != oldest)
- parent->DumpAncestry(dwarf2Data, cu, oldest, s, 0);
- Dump(dwarf2Data, cu, s, recurse_depth);
+void DWARFDebugInfoEntry::DumpAncestry(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ const DWARFDebugInfoEntry *oldest,
+ Stream &s,
+ uint32_t recurse_depth) const {
+ const DWARFDebugInfoEntry *parent = GetParent();
+ if (parent && parent != oldest)
+ parent->DumpAncestry(dwarf2Data, cu, oldest, s, 0);
+ Dump(dwarf2Data, cu, s, recurse_depth);
}
//----------------------------------------------------------------------
@@ -385,238 +377,206 @@ DWARFDebugInfoEntry::DumpAncestry
// DW_AT_low_pc/DW_AT_high_pc pair, DW_AT_entry_pc, or DW_AT_ranges
// attributes.
//----------------------------------------------------------------------
-bool
-DWARFDebugInfoEntry::GetDIENamesAndRanges
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- 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,
- DWARFExpression *frame_base
-) const
-{
- if (dwarf2Data == nullptr)
- return false;
-
- SymbolFileDWARFDwo* dwo_symbol_file = cu->GetDwoSymbolFile();
- if (dwo_symbol_file)
- return GetDIENamesAndRanges(dwo_symbol_file,
- dwo_symbol_file->GetCompileUnit(),
- name,
- mangled,
- ranges,
- decl_file,
- decl_line,
- decl_column,
- call_file,
- call_line,
- call_column,
- frame_base);
-
- dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
- dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
- std::vector<DIERef> die_refs;
- bool set_frame_base_loclist_addr = false;
-
- lldb::offset_t offset;
- const DWARFAbbreviationDeclaration* abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
-
- lldb::ModuleSP module = dwarf2Data->GetObjectFile()->GetModule();
-
- if (abbrevDecl)
- {
- const DWARFDataExtractor& debug_info_data = dwarf2Data->get_debug_info_data();
-
- if (!debug_info_data.ValidOffset(offset))
- return false;
-
- const uint32_t numAttributes = abbrevDecl->NumAttributes();
- uint32_t i;
- dw_attr_t attr;
- dw_form_t form;
- bool do_offset = false;
+bool DWARFDebugInfoEntry::GetDIENamesAndRanges(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu, 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, DWARFExpression *frame_base) const {
+ if (dwarf2Data == nullptr)
+ return false;
- for (i=0; i<numAttributes; ++i)
- {
- abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
- DWARFFormValue form_value(cu, form);
- if (form_value.ExtractValue(debug_info_data, &offset))
- {
- switch (attr)
- {
- case DW_AT_low_pc:
- lo_pc = form_value.Address();
-
- if (do_offset)
- hi_pc += lo_pc;
- do_offset = false;
- break;
-
- case DW_AT_entry_pc:
- lo_pc = form_value.Address();
- break;
-
- case DW_AT_high_pc:
- if (form_value.Form() == DW_FORM_addr ||
- form_value.Form() == DW_FORM_GNU_addr_index)
- {
- hi_pc = form_value.Address();
- }
- else
- {
- hi_pc = form_value.Unsigned();
- if (lo_pc == LLDB_INVALID_ADDRESS)
- do_offset = hi_pc != LLDB_INVALID_ADDRESS;
- else
- hi_pc += lo_pc; // DWARF 4 introduces <offset-from-lo-pc> to save on relocations
- }
- break;
-
- case DW_AT_ranges:
- {
- const DWARFDebugRanges* debug_ranges = dwarf2Data->DebugRanges();
- if (debug_ranges)
- {
- debug_ranges->FindRanges(form_value.Unsigned(), ranges);
- // All DW_AT_ranges are relative to the base address of the
- // compile unit. We add the compile unit base address to make
- // sure all the addresses are properly fixed up.
- ranges.Slide(cu->GetBaseAddress());
- }
- else
- {
- cu->GetSymbolFileDWARF()->GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: DIE has DW_AT_ranges(0x%" PRIx64 ") attribute yet DWARF has no .debug_ranges, please file a bug and attach the file at the start of this error message",
- m_offset, form_value.Unsigned());
- }
- }
- break;
-
- case DW_AT_name:
- if (name == NULL)
- name = form_value.AsCString();
- break;
-
- case DW_AT_MIPS_linkage_name:
- case DW_AT_linkage_name:
- if (mangled == NULL)
- mangled = form_value.AsCString();
- break;
-
- case DW_AT_abstract_origin:
- die_refs.emplace_back(form_value);
- break;
-
- case DW_AT_specification:
- die_refs.emplace_back(form_value);
- break;
-
- case DW_AT_decl_file:
- if (decl_file == 0)
- decl_file = form_value.Unsigned();
- break;
-
- case DW_AT_decl_line:
- if (decl_line == 0)
- decl_line = form_value.Unsigned();
- break;
-
- case DW_AT_decl_column:
- if (decl_column == 0)
- decl_column = form_value.Unsigned();
- break;
-
- case DW_AT_call_file:
- if (call_file == 0)
- call_file = form_value.Unsigned();
- break;
-
- case DW_AT_call_line:
- if (call_line == 0)
- call_line = form_value.Unsigned();
- break;
-
- case DW_AT_call_column:
- if (call_column == 0)
- call_column = form_value.Unsigned();
- break;
-
- case DW_AT_frame_base:
- if (frame_base)
- {
- if (form_value.BlockData())
- {
- uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
- uint32_t block_length = form_value.Unsigned();
- frame_base->SetOpcodeData(module, debug_info_data, block_offset, block_length);
- }
- else
- {
- const DWARFDataExtractor &debug_loc_data = dwarf2Data->get_debug_loc_data();
- const dw_offset_t debug_loc_offset = form_value.Unsigned();
-
- size_t loc_list_length = DWARFExpression::LocationListSize(cu, debug_loc_data, debug_loc_offset);
- if (loc_list_length > 0)
- {
- frame_base->SetOpcodeData(module, debug_loc_data, debug_loc_offset, loc_list_length);
- if (lo_pc != LLDB_INVALID_ADDRESS)
- {
- assert (lo_pc >= cu->GetBaseAddress());
- frame_base->SetLocationListSlide(lo_pc - cu->GetBaseAddress());
- }
- else
- {
- set_frame_base_loclist_addr = true;
- }
- }
- }
- }
- break;
-
- default:
- break;
+ SymbolFileDWARFDwo *dwo_symbol_file = cu->GetDwoSymbolFile();
+ if (dwo_symbol_file)
+ return GetDIENamesAndRanges(
+ dwo_symbol_file, dwo_symbol_file->GetCompileUnit(), name, mangled,
+ ranges, decl_file, decl_line, decl_column, call_file, call_line,
+ call_column, frame_base);
+
+ dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
+ dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
+ std::vector<DIERef> die_refs;
+ bool set_frame_base_loclist_addr = false;
+
+ lldb::offset_t offset;
+ const DWARFAbbreviationDeclaration *abbrevDecl =
+ GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
+
+ lldb::ModuleSP module = dwarf2Data->GetObjectFile()->GetModule();
+
+ if (abbrevDecl) {
+ const DWARFDataExtractor &debug_info_data =
+ dwarf2Data->get_debug_info_data();
+
+ if (!debug_info_data.ValidOffset(offset))
+ return false;
+
+ const uint32_t numAttributes = abbrevDecl->NumAttributes();
+ uint32_t i;
+ dw_attr_t attr;
+ dw_form_t form;
+ bool do_offset = false;
+
+ for (i = 0; i < numAttributes; ++i) {
+ abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
+ DWARFFormValue form_value(cu, form);
+ if (form_value.ExtractValue(debug_info_data, &offset)) {
+ switch (attr) {
+ case DW_AT_low_pc:
+ lo_pc = form_value.Address();
+
+ if (do_offset)
+ hi_pc += lo_pc;
+ do_offset = false;
+ break;
+
+ case DW_AT_entry_pc:
+ lo_pc = form_value.Address();
+ break;
+
+ case DW_AT_high_pc:
+ if (form_value.Form() == DW_FORM_addr ||
+ form_value.Form() == DW_FORM_GNU_addr_index) {
+ hi_pc = form_value.Address();
+ } else {
+ hi_pc = form_value.Unsigned();
+ if (lo_pc == LLDB_INVALID_ADDRESS)
+ do_offset = hi_pc != LLDB_INVALID_ADDRESS;
+ else
+ hi_pc += lo_pc; // DWARF 4 introduces <offset-from-lo-pc> to save
+ // on relocations
+ }
+ break;
+
+ case DW_AT_ranges: {
+ const DWARFDebugRanges *debug_ranges = dwarf2Data->DebugRanges();
+ if (debug_ranges) {
+ debug_ranges->FindRanges(form_value.Unsigned(), ranges);
+ // All DW_AT_ranges are relative to the base address of the
+ // compile unit. We add the compile unit base address to make
+ // sure all the addresses are properly fixed up.
+ ranges.Slide(cu->GetBaseAddress());
+ } else {
+ cu->GetSymbolFileDWARF()->GetObjectFile()->GetModule()->ReportError(
+ "{0x%8.8x}: DIE has DW_AT_ranges(0x%" PRIx64
+ ") attribute yet DWARF has no .debug_ranges, please file a bug "
+ "and attach the file at the start of this error message",
+ m_offset, form_value.Unsigned());
+ }
+ } break;
+
+ case DW_AT_name:
+ if (name == NULL)
+ name = form_value.AsCString();
+ break;
+
+ case DW_AT_MIPS_linkage_name:
+ case DW_AT_linkage_name:
+ if (mangled == NULL)
+ mangled = form_value.AsCString();
+ break;
+
+ case DW_AT_abstract_origin:
+ die_refs.emplace_back(form_value);
+ break;
+
+ case DW_AT_specification:
+ die_refs.emplace_back(form_value);
+ break;
+
+ case DW_AT_decl_file:
+ if (decl_file == 0)
+ decl_file = form_value.Unsigned();
+ break;
+
+ case DW_AT_decl_line:
+ if (decl_line == 0)
+ decl_line = form_value.Unsigned();
+ break;
+
+ case DW_AT_decl_column:
+ if (decl_column == 0)
+ decl_column = form_value.Unsigned();
+ break;
+
+ case DW_AT_call_file:
+ if (call_file == 0)
+ call_file = form_value.Unsigned();
+ break;
+
+ case DW_AT_call_line:
+ if (call_line == 0)
+ call_line = form_value.Unsigned();
+ break;
+
+ case DW_AT_call_column:
+ if (call_column == 0)
+ call_column = form_value.Unsigned();
+ break;
+
+ case DW_AT_frame_base:
+ if (frame_base) {
+ if (form_value.BlockData()) {
+ uint32_t block_offset =
+ form_value.BlockData() - debug_info_data.GetDataStart();
+ uint32_t block_length = form_value.Unsigned();
+ frame_base->SetOpcodeData(module, debug_info_data, block_offset,
+ block_length);
+ } else {
+ const DWARFDataExtractor &debug_loc_data =
+ dwarf2Data->get_debug_loc_data();
+ const dw_offset_t debug_loc_offset = form_value.Unsigned();
+
+ size_t loc_list_length = DWARFExpression::LocationListSize(
+ cu, debug_loc_data, debug_loc_offset);
+ if (loc_list_length > 0) {
+ frame_base->SetOpcodeData(module, debug_loc_data,
+ debug_loc_offset, loc_list_length);
+ if (lo_pc != LLDB_INVALID_ADDRESS) {
+ assert(lo_pc >= cu->GetBaseAddress());
+ frame_base->SetLocationListSlide(lo_pc -
+ cu->GetBaseAddress());
+ } else {
+ set_frame_base_loclist_addr = true;
}
+ }
}
- }
- }
+ }
+ break;
- if (ranges.IsEmpty())
- {
- if (lo_pc != LLDB_INVALID_ADDRESS)
- {
- if (hi_pc != LLDB_INVALID_ADDRESS && hi_pc > lo_pc)
- ranges.Append(DWARFRangeList::Entry (lo_pc, hi_pc - lo_pc));
- else
- ranges.Append(DWARFRangeList::Entry (lo_pc, 0));
+ default:
+ break;
}
+ }
}
-
- if (set_frame_base_loclist_addr)
- {
- dw_addr_t lowest_range_pc = ranges.GetMinRangeBase(0);
- assert (lowest_range_pc >= cu->GetBaseAddress());
- frame_base->SetLocationListSlide (lowest_range_pc - cu->GetBaseAddress());
+ }
+
+ if (ranges.IsEmpty()) {
+ if (lo_pc != LLDB_INVALID_ADDRESS) {
+ if (hi_pc != LLDB_INVALID_ADDRESS && hi_pc > lo_pc)
+ ranges.Append(DWARFRangeList::Entry(lo_pc, hi_pc - lo_pc));
+ else
+ ranges.Append(DWARFRangeList::Entry(lo_pc, 0));
}
-
- if (ranges.IsEmpty() || name == NULL || mangled == NULL)
- {
- for (const DIERef& die_ref : die_refs)
- {
- if (die_ref.die_offset != DW_INVALID_OFFSET)
- {
- DWARFDIE die = dwarf2Data->GetDIE(die_ref);
- if (die)
- die.GetDIE()->GetDIENamesAndRanges(die.GetDWARF(), die.GetCU(), name, mangled, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column);
- }
- }
+ }
+
+ if (set_frame_base_loclist_addr) {
+ dw_addr_t lowest_range_pc = ranges.GetMinRangeBase(0);
+ assert(lowest_range_pc >= cu->GetBaseAddress());
+ frame_base->SetLocationListSlide(lowest_range_pc - cu->GetBaseAddress());
+ }
+
+ if (ranges.IsEmpty() || name == NULL || mangled == NULL) {
+ for (const DIERef &die_ref : die_refs) {
+ if (die_ref.die_offset != DW_INVALID_OFFSET) {
+ DWARFDIE die = dwarf2Data->GetDIE(die_ref);
+ if (die)
+ die.GetDIE()->GetDIENamesAndRanges(
+ die.GetDWARF(), die.GetCU(), name, mangled, ranges, decl_file,
+ decl_line, decl_column, call_file, call_line, call_column);
+ }
}
- return !ranges.IsEmpty();
+ }
+ return !ranges.IsEmpty();
}
//----------------------------------------------------------------------
@@ -625,95 +585,74 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
// Dumps a debug information entry and all of it's attributes to the
// specified stream.
//----------------------------------------------------------------------
-void
-DWARFDebugInfoEntry::Dump
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- Stream &s,
- uint32_t recurse_depth
-) const
-{
- const DWARFDataExtractor& debug_info_data = dwarf2Data->get_debug_info_data();
- lldb::offset_t offset = m_offset;
-
- if (debug_info_data.ValidOffset(offset))
- {
- dw_uleb128_t abbrCode = debug_info_data.GetULEB128(&offset);
-
- s.Printf("\n0x%8.8x: ", m_offset);
- s.Indent();
- if (abbrCode != m_abbr_idx)
- {
- s.Printf( "error: DWARF has been modified\n");
- }
- else if (abbrCode)
- {
- const DWARFAbbreviationDeclaration* abbrevDecl = cu->GetAbbreviations()->GetAbbreviationDeclaration (abbrCode);
-
- if (abbrevDecl)
- {
- s.PutCString(DW_TAG_value_to_name(abbrevDecl->Tag()));
- s.Printf( " [%u] %c\n", abbrCode, abbrevDecl->HasChildren() ? '*':' ');
-
- // Dump all data in the .debug_info for the attributes
- const uint32_t numAttributes = abbrevDecl->NumAttributes();
- uint32_t i;
- dw_attr_t attr;
- dw_form_t form;
- for (i=0; i<numAttributes; ++i)
- {
- abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
-
- DumpAttribute(dwarf2Data, cu, debug_info_data, &offset, s, attr, form);
- }
+void DWARFDebugInfoEntry::Dump(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu, Stream &s,
+ uint32_t recurse_depth) const {
+ const DWARFDataExtractor &debug_info_data = dwarf2Data->get_debug_info_data();
+ lldb::offset_t offset = m_offset;
+
+ if (debug_info_data.ValidOffset(offset)) {
+ dw_uleb128_t abbrCode = debug_info_data.GetULEB128(&offset);
+
+ s.Printf("\n0x%8.8x: ", m_offset);
+ s.Indent();
+ if (abbrCode != m_abbr_idx) {
+ s.Printf("error: DWARF has been modified\n");
+ } else if (abbrCode) {
+ const DWARFAbbreviationDeclaration *abbrevDecl =
+ cu->GetAbbreviations()->GetAbbreviationDeclaration(abbrCode);
+
+ if (abbrevDecl) {
+ s.PutCString(DW_TAG_value_to_name(abbrevDecl->Tag()));
+ s.Printf(" [%u] %c\n", abbrCode, abbrevDecl->HasChildren() ? '*' : ' ');
+
+ // Dump all data in the .debug_info for the attributes
+ const uint32_t numAttributes = abbrevDecl->NumAttributes();
+ uint32_t i;
+ dw_attr_t attr;
+ dw_form_t form;
+ for (i = 0; i < numAttributes; ++i) {
+ abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
- const DWARFDebugInfoEntry* child = GetFirstChild();
- if (recurse_depth > 0 && child)
- {
- s.IndentMore();
-
- while (child)
- {
- child->Dump(dwarf2Data, cu, s, recurse_depth-1);
- child = child->GetSibling();
- }
- s.IndentLess();
- }
- }
- else
- s.Printf( "Abbreviation code note found in 'debug_abbrev' class for code: %u\n", abbrCode);
+ DumpAttribute(dwarf2Data, cu, debug_info_data, &offset, s, attr,
+ form);
}
- else
- {
- s.Printf( "NULL\n");
+
+ const DWARFDebugInfoEntry *child = GetFirstChild();
+ if (recurse_depth > 0 && child) {
+ s.IndentMore();
+
+ while (child) {
+ child->Dump(dwarf2Data, cu, s, recurse_depth - 1);
+ child = child->GetSibling();
+ }
+ s.IndentLess();
}
+ } else
+ s.Printf("Abbreviation code note found in 'debug_abbrev' class for "
+ "code: %u\n",
+ abbrCode);
+ } else {
+ s.Printf("NULL\n");
}
+ }
}
-void
-DWARFDebugInfoEntry::DumpLocation
-(
- SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- Stream &s
-) const
-{
- const DWARFDIE cu_die = cu->GetCompileUnitDIEOnly();
- const char *cu_name = NULL;
- if (cu_die)
- cu_name = cu_die.GetName ();
- const char *obj_file_name = NULL;
- ObjectFile *obj_file = dwarf2Data->GetObjectFile();
- if (obj_file)
- obj_file_name = obj_file->GetFileSpec().GetFilename().AsCString("<Unknown>");
- const char *die_name = GetName (dwarf2Data, cu);
- s.Printf ("0x%8.8x/0x%8.8x: %-30s (from %s in %s)",
- cu->GetOffset(),
- GetOffset(),
- die_name ? die_name : "",
- cu_name ? cu_name : "<NULL>",
- obj_file_name ? obj_file_name : "<NULL>");
+void DWARFDebugInfoEntry::DumpLocation(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu, Stream &s) const {
+ const DWARFDIE cu_die = cu->GetCompileUnitDIEOnly();
+ const char *cu_name = NULL;
+ if (cu_die)
+ cu_name = cu_die.GetName();
+ const char *obj_file_name = NULL;
+ ObjectFile *obj_file = dwarf2Data->GetObjectFile();
+ if (obj_file)
+ obj_file_name =
+ obj_file->GetFileSpec().GetFilename().AsCString("<Unknown>");
+ const char *die_name = GetName(dwarf2Data, cu);
+ s.Printf("0x%8.8x/0x%8.8x: %-30s (from %s in %s)", cu->GetOffset(),
+ GetOffset(), die_name ? die_name : "", cu_name ? cu_name : "<NULL>",
+ obj_file_name ? obj_file_name : "<NULL>");
}
//----------------------------------------------------------------------
@@ -723,162 +662,142 @@ DWARFDebugInfoEntry::DumpLocation
// special display of attributes is done (disassemble location lists,
// show enumeration values for attributes, etc).
//----------------------------------------------------------------------
-void
-DWARFDebugInfoEntry::DumpAttribute
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const DWARFDataExtractor& debug_info_data,
- lldb::offset_t *offset_ptr,
- Stream &s,
- dw_attr_t attr,
- dw_form_t form
-)
-{
- bool verbose = s.GetVerbose();
- bool show_form = s.GetFlags().Test(DWARFDebugInfo::eDumpFlag_ShowForm);
-
- if (verbose)
- s.Offset (*offset_ptr);
- else
- s.Printf (" ");
- s.Indent(DW_AT_value_to_name(attr));
-
- if (show_form)
- {
- s.Printf( "[%s", DW_FORM_value_to_name(form));
+void DWARFDebugInfoEntry::DumpAttribute(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const DWARFDataExtractor &debug_info_data, lldb::offset_t *offset_ptr,
+ Stream &s, dw_attr_t attr, dw_form_t form) {
+ bool verbose = s.GetVerbose();
+ bool show_form = s.GetFlags().Test(DWARFDebugInfo::eDumpFlag_ShowForm);
+
+ if (verbose)
+ s.Offset(*offset_ptr);
+ else
+ s.Printf(" ");
+ s.Indent(DW_AT_value_to_name(attr));
+
+ if (show_form) {
+ s.Printf("[%s", DW_FORM_value_to_name(form));
+ }
+
+ DWARFFormValue form_value(cu, form);
+
+ if (!form_value.ExtractValue(debug_info_data, offset_ptr))
+ return;
+
+ if (show_form) {
+ if (form == DW_FORM_indirect) {
+ s.Printf(" [%s]", DW_FORM_value_to_name(form_value.Form()));
}
- DWARFFormValue form_value(cu, form);
+ s.PutCString("] ");
+ }
- if (!form_value.ExtractValue(debug_info_data, offset_ptr))
- return;
+ s.PutCString("( ");
- if (show_form)
- {
- if (form == DW_FORM_indirect)
- {
- s.Printf( " [%s]", DW_FORM_value_to_name(form_value.Form()));
- }
+ // Always dump form value if verbose is enabled
+ if (verbose) {
+ form_value.Dump(s);
+ }
- s.PutCString("] ");
- }
+ // Check to see if we have any special attribute formatters
+ switch (attr) {
+ case DW_AT_stmt_list:
+ if (verbose)
+ s.PutCString(" ( ");
+ s.Printf("0x%8.8" PRIx64, form_value.Unsigned());
+ if (verbose)
+ s.PutCString(" )");
+ break;
- s.PutCString("( ");
+ case DW_AT_language:
+ if (verbose)
+ s.PutCString(" ( ");
+ s.PutCString(DW_LANG_value_to_name(form_value.Unsigned()));
+ if (verbose)
+ s.PutCString(" )");
+ break;
- // Always dump form value if verbose is enabled
+ case DW_AT_encoding:
+ if (verbose)
+ s.PutCString(" ( ");
+ s.PutCString(DW_ATE_value_to_name(form_value.Unsigned()));
if (verbose)
- {
+ s.PutCString(" )");
+ break;
+
+ case DW_AT_frame_base:
+ case DW_AT_location:
+ case DW_AT_data_member_location: {
+ const uint8_t *blockData = form_value.BlockData();
+ if (blockData) {
+ if (!verbose)
form_value.Dump(s);
- }
-
-
- // Check to see if we have any special attribute formatters
- switch (attr)
- {
- case DW_AT_stmt_list:
- if ( verbose ) s.PutCString(" ( ");
- s.Printf( "0x%8.8" PRIx64, form_value.Unsigned());
- if ( verbose ) s.PutCString(" )");
- break;
-
- case DW_AT_language:
- if ( verbose ) s.PutCString(" ( ");
- s.PutCString(DW_LANG_value_to_name(form_value.Unsigned()));
- if ( verbose ) s.PutCString(" )");
- break;
-
- case DW_AT_encoding:
- if ( verbose ) s.PutCString(" ( ");
- s.PutCString(DW_ATE_value_to_name(form_value.Unsigned()));
- if ( verbose ) s.PutCString(" )");
- break;
-
- case DW_AT_frame_base:
- case DW_AT_location:
- case DW_AT_data_member_location:
- {
- const uint8_t* blockData = form_value.BlockData();
- if (blockData)
- {
- if (!verbose)
- 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());
- if ( verbose ) s.PutCString(" ( ");
- DWARFExpression::PrintDWARFExpression(s,
- locationData,
- DWARFCompileUnit::GetAddressByteSize(cu),
- 4,
- false);
- if ( verbose ) s.PutCString(" )");
- }
- else
- {
- // We have a location list offset as the value that is
- // the offset into the .debug_loc section that describes
- // the value over it's lifetime
- uint64_t debug_loc_offset = form_value.Unsigned();
- if (dwarf2Data)
- {
- if ( !verbose )
- form_value.Dump(s);
- DWARFExpression::PrintDWARFLocationList(s,
- cu,
- dwarf2Data->get_debug_loc_data(),
- debug_loc_offset);
- }
- else
- {
- if ( !verbose )
- form_value.Dump(s);
- }
- }
- }
- break;
-
- case DW_AT_abstract_origin:
- case DW_AT_specification:
- {
- uint64_t abstract_die_offset = form_value.Reference();
- form_value.Dump(s);
- // *ostrm_ptr << HEX32 << abstract_die_offset << " ( ";
- if ( verbose ) s.PutCString(" ( ");
- GetName(dwarf2Data, cu, abstract_die_offset, s);
- if ( verbose ) s.PutCString(" )");
- }
- break;
- case DW_AT_type:
- {
- uint64_t type_die_offset = form_value.Reference();
- if (!verbose)
- form_value.Dump(s);
- s.PutCString(" ( ");
- AppendTypeName(dwarf2Data, cu, type_die_offset, s);
- s.PutCString(" )");
- }
- break;
+ // Location description is inlined in data in the form value
+ DWARFDataExtractor locationData(debug_info_data,
+ (*offset_ptr) - form_value.Unsigned(),
+ form_value.Unsigned());
+ if (verbose)
+ s.PutCString(" ( ");
+ DWARFExpression::PrintDWARFExpression(
+ s, locationData, DWARFCompileUnit::GetAddressByteSize(cu), 4, false);
+ if (verbose)
+ s.PutCString(" )");
+ } else {
+ // We have a location list offset as the value that is
+ // the offset into the .debug_loc section that describes
+ // the value over it's lifetime
+ uint64_t debug_loc_offset = form_value.Unsigned();
+ if (dwarf2Data) {
+ if (!verbose)
+ form_value.Dump(s);
+ DWARFExpression::PrintDWARFLocationList(
+ s, cu, dwarf2Data->get_debug_loc_data(), debug_loc_offset);
+ } else {
+ if (!verbose)
+ form_value.Dump(s);
+ }
+ }
+ } break;
- case DW_AT_ranges:
- {
- if ( !verbose )
- form_value.Dump(s);
- lldb::offset_t ranges_offset = form_value.Unsigned();
- dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0;
- if (dwarf2Data)
- DWARFDebugRanges::Dump(s, dwarf2Data->get_debug_ranges_data(), &ranges_offset, base_addr);
- }
- break;
+ case DW_AT_abstract_origin:
+ case DW_AT_specification: {
+ uint64_t abstract_die_offset = form_value.Reference();
+ form_value.Dump(s);
+ // *ostrm_ptr << HEX32 << abstract_die_offset << " ( ";
+ if (verbose)
+ s.PutCString(" ( ");
+ GetName(dwarf2Data, cu, abstract_die_offset, s);
+ if (verbose)
+ s.PutCString(" )");
+ } break;
+
+ case DW_AT_type: {
+ uint64_t type_die_offset = form_value.Reference();
+ if (!verbose)
+ form_value.Dump(s);
+ s.PutCString(" ( ");
+ AppendTypeName(dwarf2Data, cu, type_die_offset, s);
+ s.PutCString(" )");
+ } break;
+
+ case DW_AT_ranges: {
+ if (!verbose)
+ form_value.Dump(s);
+ lldb::offset_t ranges_offset = form_value.Unsigned();
+ dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0;
+ if (dwarf2Data)
+ DWARFDebugRanges::Dump(s, dwarf2Data->get_debug_ranges_data(),
+ &ranges_offset, base_addr);
+ } break;
- default:
- if ( !verbose )
- form_value.Dump(s);
- break;
- }
+ default:
+ if (!verbose)
+ form_value.Dump(s);
+ break;
+ }
- s.PutCString(" )\n");
+ s.PutCString(" )\n");
}
//----------------------------------------------------------------------
@@ -887,94 +806,78 @@ DWARFDebugInfoEntry::DumpAttribute
// the results. Any duplicate attributes will have the first instance
// take precedence (this can happen for declaration attributes).
//----------------------------------------------------------------------
-size_t
-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)
- {
- if (m_tag != DW_TAG_compile_unit)
- {
- SymbolFileDWARFDwo* dwo_symbol_file = cu->GetDwoSymbolFile();
- if (dwo_symbol_file)
- return GetAttributes(dwo_symbol_file->GetCompileUnit(),
- fixed_form_sizes,
- attributes,
- curr_depth);
- }
-
- dwarf2Data = cu->GetSymbolFileDWARF();
- abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
+size_t 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) {
+ if (m_tag != DW_TAG_compile_unit) {
+ SymbolFileDWARFDwo *dwo_symbol_file = cu->GetDwoSymbolFile();
+ if (dwo_symbol_file)
+ return GetAttributes(dwo_symbol_file->GetCompileUnit(),
+ fixed_form_sizes, attributes, curr_depth);
}
- if (abbrevDecl)
- {
- const DWARFDataExtractor& debug_info_data = dwarf2Data->get_debug_info_data();
-
- if (fixed_form_sizes.Empty())
- fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize(
- cu->GetAddressByteSize(), cu->IsDWARF64());
-
- const uint32_t num_attributes = abbrevDecl->NumAttributes();
- uint32_t i;
- dw_attr_t attr;
- dw_form_t form;
- for (i=0; i<num_attributes; ++i)
- {
- abbrevDecl->GetAttrAndFormByIndexUnchecked (i, attr, form);
-
- // If we are tracking down DW_AT_specification or DW_AT_abstract_origin
- // attributes, the depth will be non-zero. We need to omit certain
- // attributes that don't make sense.
- switch (attr)
- {
- case DW_AT_sibling:
- case DW_AT_declaration:
- if (curr_depth > 0)
- {
- // This attribute doesn't make sense when combined with
- // the DIE that references this DIE. We know a DIE is
- // referencing this DIE because curr_depth is not zero
- break;
- }
- LLVM_FALLTHROUGH;
- default:
- attributes.Append(cu, offset, attr, form);
- break;
- }
-
- if ((attr == DW_AT_specification) || (attr == DW_AT_abstract_origin))
- {
- DWARFFormValue form_value (cu, form);
- if (form_value.ExtractValue(debug_info_data, &offset))
- {
- dw_offset_t die_offset = form_value.Reference();
- DWARFDIE spec_die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(die_offset);
- if (spec_die)
- spec_die.GetAttributes(attributes, curr_depth + 1);
- }
- }
- else
- {
- const uint8_t fixed_skip_size = fixed_form_sizes.GetSize(form);
- if (fixed_skip_size)
- offset += fixed_skip_size;
- else
- DWARFFormValue::SkipValue(form, debug_info_data, &offset, cu);
- }
+ dwarf2Data = cu->GetSymbolFileDWARF();
+ abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
+ }
+
+ if (abbrevDecl) {
+ const DWARFDataExtractor &debug_info_data =
+ dwarf2Data->get_debug_info_data();
+
+ if (fixed_form_sizes.Empty())
+ fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize(
+ cu->GetAddressByteSize(), cu->IsDWARF64());
+
+ const uint32_t num_attributes = abbrevDecl->NumAttributes();
+ uint32_t i;
+ dw_attr_t attr;
+ dw_form_t form;
+ for (i = 0; i < num_attributes; ++i) {
+ abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
+
+ // If we are tracking down DW_AT_specification or DW_AT_abstract_origin
+ // attributes, the depth will be non-zero. We need to omit certain
+ // attributes that don't make sense.
+ switch (attr) {
+ case DW_AT_sibling:
+ case DW_AT_declaration:
+ if (curr_depth > 0) {
+ // This attribute doesn't make sense when combined with
+ // the DIE that references this DIE. We know a DIE is
+ // referencing this DIE because curr_depth is not zero
+ break;
}
+ LLVM_FALLTHROUGH;
+ default:
+ attributes.Append(cu, offset, attr, form);
+ break;
+ }
+
+ if ((attr == DW_AT_specification) || (attr == DW_AT_abstract_origin)) {
+ DWARFFormValue form_value(cu, form);
+ if (form_value.ExtractValue(debug_info_data, &offset)) {
+ dw_offset_t die_offset = form_value.Reference();
+ DWARFDIE spec_die =
+ const_cast<DWARFCompileUnit *>(cu)->GetDIE(die_offset);
+ if (spec_die)
+ spec_die.GetAttributes(attributes, curr_depth + 1);
+ }
+ } else {
+ const uint8_t fixed_skip_size = fixed_form_sizes.GetSize(form);
+ if (fixed_skip_size)
+ offset += fixed_skip_size;
+ else
+ DWARFFormValue::SkipValue(form, debug_info_data, &offset, cu);
+ }
}
- else
- {
- attributes.Clear();
- }
- return attributes.Size();
-
+ } else {
+ attributes.Clear();
+ }
+ return attributes.Size();
}
//----------------------------------------------------------------------
@@ -985,105 +888,84 @@ DWARFDebugInfoEntry::GetAttributes (const DWARFCompileUnit* cu,
// if we fail since an offset of zero is invalid for an attribute (it
// would be a compile unit header).
//----------------------------------------------------------------------
-dw_offset_t
-DWARFDebugInfoEntry::GetAttributeValue
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- DWARFFormValue& form_value,
- dw_offset_t* end_attr_offset_ptr,
- bool check_specification_or_abstract_origin
-) const
-{
- SymbolFileDWARFDwo* dwo_symbol_file = cu->GetDwoSymbolFile();
- if (dwo_symbol_file && m_tag != DW_TAG_compile_unit)
- return GetAttributeValue(dwo_symbol_file,
- dwo_symbol_file->GetCompileUnit(),
- attr,
- form_value,
- end_attr_offset_ptr,
- check_specification_or_abstract_origin);
-
- lldb::offset_t offset;
- const DWARFAbbreviationDeclaration* abbrevDecl = GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
-
- if (abbrevDecl)
- {
- uint32_t attr_idx = abbrevDecl->FindAttributeIndex(attr);
-
- if (attr_idx != DW_INVALID_INDEX)
- {
- const DWARFDataExtractor& debug_info_data = dwarf2Data->get_debug_info_data();
-
- uint32_t idx=0;
- while (idx<attr_idx)
- DWARFFormValue::SkipValue(abbrevDecl->GetFormByIndex(idx++), debug_info_data, &offset, cu);
-
- const dw_offset_t attr_offset = offset;
- form_value.SetCompileUnit(cu);
- form_value.SetForm(abbrevDecl->GetFormByIndex(idx));
- if (form_value.ExtractValue(debug_info_data, &offset))
- {
- if (end_attr_offset_ptr)
- *end_attr_offset_ptr = offset;
- return attr_offset;
- }
- }
+dw_offset_t DWARFDebugInfoEntry::GetAttributeValue(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, DWARFFormValue &form_value,
+ dw_offset_t *end_attr_offset_ptr,
+ bool check_specification_or_abstract_origin) const {
+ SymbolFileDWARFDwo *dwo_symbol_file = cu->GetDwoSymbolFile();
+ if (dwo_symbol_file && m_tag != DW_TAG_compile_unit)
+ return GetAttributeValue(dwo_symbol_file, dwo_symbol_file->GetCompileUnit(),
+ attr, form_value, end_attr_offset_ptr,
+ check_specification_or_abstract_origin);
+
+ lldb::offset_t offset;
+ const DWARFAbbreviationDeclaration *abbrevDecl =
+ GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
+
+ if (abbrevDecl) {
+ uint32_t attr_idx = abbrevDecl->FindAttributeIndex(attr);
+
+ if (attr_idx != DW_INVALID_INDEX) {
+ const DWARFDataExtractor &debug_info_data =
+ dwarf2Data->get_debug_info_data();
+
+ uint32_t idx = 0;
+ while (idx < attr_idx)
+ DWARFFormValue::SkipValue(abbrevDecl->GetFormByIndex(idx++),
+ debug_info_data, &offset, cu);
+
+ const dw_offset_t attr_offset = offset;
+ form_value.SetCompileUnit(cu);
+ form_value.SetForm(abbrevDecl->GetFormByIndex(idx));
+ if (form_value.ExtractValue(debug_info_data, &offset)) {
+ if (end_attr_offset_ptr)
+ *end_attr_offset_ptr = offset;
+ return attr_offset;
+ }
+ }
+ }
+
+ if (check_specification_or_abstract_origin) {
+ if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value)) {
+ DWARFDIE die =
+ const_cast<DWARFCompileUnit *>(cu)->GetDIE(form_value.Reference());
+ if (die) {
+ dw_offset_t die_offset = die.GetDIE()->GetAttributeValue(
+ die.GetDWARF(), die.GetCU(), attr, form_value, end_attr_offset_ptr,
+ false);
+ if (die_offset)
+ return die_offset;
+ }
}
- if (check_specification_or_abstract_origin)
- {
- if (GetAttributeValue(dwarf2Data, cu, DW_AT_specification, form_value))
- {
- DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
- if (die)
- {
- dw_offset_t die_offset = die.GetDIE()->GetAttributeValue(die.GetDWARF(),
- die.GetCU(),
- attr,
- form_value,
- end_attr_offset_ptr,
- false);
- if (die_offset)
- return die_offset;
- }
- }
-
- if (GetAttributeValue(dwarf2Data, cu, DW_AT_abstract_origin, form_value))
- {
- DWARFDIE die = const_cast<DWARFCompileUnit*>(cu)->GetDIE(form_value.Reference());
- if (die)
- {
- dw_offset_t die_offset = die.GetDIE()->GetAttributeValue(die.GetDWARF(),
- die.GetCU(),
- attr,
- form_value,
- end_attr_offset_ptr,
- false);
- if (die_offset)
- return die_offset;
- }
- }
+ if (GetAttributeValue(dwarf2Data, cu, DW_AT_abstract_origin, form_value)) {
+ DWARFDIE die =
+ const_cast<DWARFCompileUnit *>(cu)->GetDIE(form_value.Reference());
+ if (die) {
+ dw_offset_t die_offset = die.GetDIE()->GetAttributeValue(
+ die.GetDWARF(), die.GetCU(), attr, form_value, end_attr_offset_ptr,
+ false);
+ if (die_offset)
+ return die_offset;
+ }
}
+ }
- if (!dwo_symbol_file)
- return 0;
+ if (!dwo_symbol_file)
+ return 0;
- DWARFCompileUnit* dwo_cu = dwo_symbol_file->GetCompileUnit();
- if (!dwo_cu)
- return 0;
+ DWARFCompileUnit *dwo_cu = dwo_symbol_file->GetCompileUnit();
+ if (!dwo_cu)
+ return 0;
- DWARFDIE dwo_cu_die = dwo_cu->GetCompileUnitDIEOnly();
- if (!dwo_cu_die.IsValid())
- return 0;
+ DWARFDIE dwo_cu_die = dwo_cu->GetCompileUnitDIEOnly();
+ if (!dwo_cu_die.IsValid())
+ return 0;
- return dwo_cu_die.GetDIE()->GetAttributeValue(dwo_symbol_file,
- dwo_cu,
- attr,
- form_value,
- end_attr_offset_ptr,
- check_specification_or_abstract_origin);
+ return dwo_cu_die.GetDIE()->GetAttributeValue(
+ dwo_symbol_file, dwo_cu, attr, form_value, end_attr_offset_ptr,
+ check_specification_or_abstract_origin);
}
//----------------------------------------------------------------------
@@ -1094,19 +976,15 @@ DWARFDebugInfoEntry::GetAttributeValue
// and will only be available as long as the SymbolFileDWARF is still around
// and it's content doesn't change.
//----------------------------------------------------------------------
-const char*
-DWARFDebugInfoEntry::GetAttributeValueAsString
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- const char* fail_value,
- bool check_specification_or_abstract_origin) const
-{
- DWARFFormValue form_value;
- if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
- return form_value.AsCString();
- return fail_value;
+const char *DWARFDebugInfoEntry::GetAttributeValueAsString(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, const char *fail_value,
+ bool check_specification_or_abstract_origin) const {
+ DWARFFormValue form_value;
+ if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr,
+ check_specification_or_abstract_origin))
+ return form_value.AsCString();
+ return fail_value;
}
//----------------------------------------------------------------------
@@ -1114,20 +992,15 @@ DWARFDebugInfoEntry::GetAttributeValueAsString
//
// Get the value of an attribute as unsigned and return it.
//----------------------------------------------------------------------
-uint64_t
-DWARFDebugInfoEntry::GetAttributeValueAsUnsigned
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin
-) const
-{
- DWARFFormValue form_value;
- if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
- return form_value.Unsigned();
- return fail_value;
+uint64_t DWARFDebugInfoEntry::GetAttributeValueAsUnsigned(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, uint64_t fail_value,
+ bool check_specification_or_abstract_origin) const {
+ DWARFFormValue form_value;
+ if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr,
+ check_specification_or_abstract_origin))
+ return form_value.Unsigned();
+ return fail_value;
}
//----------------------------------------------------------------------
@@ -1135,20 +1008,15 @@ DWARFDebugInfoEntry::GetAttributeValueAsUnsigned
//
// Get the value of an attribute a signed value and return it.
//----------------------------------------------------------------------
-int64_t
-DWARFDebugInfoEntry::GetAttributeValueAsSigned
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- int64_t fail_value,
- bool check_specification_or_abstract_origin
-) const
-{
- DWARFFormValue form_value;
- if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
- return form_value.Signed();
- return fail_value;
+int64_t DWARFDebugInfoEntry::GetAttributeValueAsSigned(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, int64_t fail_value,
+ bool check_specification_or_abstract_origin) const {
+ DWARFFormValue form_value;
+ if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr,
+ check_specification_or_abstract_origin))
+ return form_value.Signed();
+ return fail_value;
}
//----------------------------------------------------------------------
@@ -1157,36 +1025,26 @@ DWARFDebugInfoEntry::GetAttributeValueAsSigned
// Get the value of an attribute as reference and fix up and compile
// unit relative offsets as needed.
//----------------------------------------------------------------------
-uint64_t
-DWARFDebugInfoEntry::GetAttributeValueAsReference
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin
-) const
-{
- DWARFFormValue form_value;
- if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
- return form_value.Reference();
- return fail_value;
+uint64_t DWARFDebugInfoEntry::GetAttributeValueAsReference(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, uint64_t fail_value,
+ bool check_specification_or_abstract_origin) const {
+ DWARFFormValue form_value;
+ if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr,
+ check_specification_or_abstract_origin))
+ return form_value.Reference();
+ return fail_value;
}
-uint64_t
-DWARFDebugInfoEntry::GetAttributeValueAsAddress
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin
-) const
-{
- DWARFFormValue form_value;
- if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr, check_specification_or_abstract_origin))
- return form_value.Address();
- return fail_value;
+uint64_t DWARFDebugInfoEntry::GetAttributeValueAsAddress(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, uint64_t fail_value,
+ bool check_specification_or_abstract_origin) const {
+ DWARFFormValue form_value;
+ if (GetAttributeValue(dwarf2Data, cu, attr, form_value, nullptr,
+ check_specification_or_abstract_origin))
+ return form_value.Address();
+ return fail_value;
}
//----------------------------------------------------------------------
@@ -1197,27 +1055,20 @@ DWARFDebugInfoEntry::GetAttributeValueAsAddress
//
// Returns the hi_pc or fail_value.
//----------------------------------------------------------------------
-dw_addr_t
-DWARFDebugInfoEntry::GetAttributeHighPC
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- dw_addr_t lo_pc,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin
-) const
-{
- DWARFFormValue form_value;
- if (GetAttributeValue(dwarf2Data, cu, DW_AT_high_pc, form_value, nullptr, check_specification_or_abstract_origin))
- {
- dw_form_t form = form_value.Form();
- if (form == DW_FORM_addr || form == DW_FORM_GNU_addr_index)
- return form_value.Address();
-
- // DWARF4 can specify the hi_pc as an <offset-from-lowpc>
- return lo_pc + form_value.Unsigned();
- }
- return fail_value;
+dw_addr_t DWARFDebugInfoEntry::GetAttributeHighPC(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu, dw_addr_t lo_pc,
+ uint64_t fail_value, bool check_specification_or_abstract_origin) const {
+ DWARFFormValue form_value;
+ if (GetAttributeValue(dwarf2Data, cu, DW_AT_high_pc, form_value, nullptr,
+ check_specification_or_abstract_origin)) {
+ dw_form_t form = form_value.Form();
+ if (form == DW_FORM_addr || form == DW_FORM_GNU_addr_index)
+ return form_value.Address();
+
+ // DWARF4 can specify the hi_pc as an <offset-from-lowpc>
+ return lo_pc + form_value.Unsigned();
+ }
+ return fail_value;
}
//----------------------------------------------------------------------
@@ -1228,61 +1079,48 @@ DWARFDebugInfoEntry::GetAttributeHighPC
//
// Returns true or sets lo_pc and hi_pc to fail_value.
//----------------------------------------------------------------------
-bool
-DWARFDebugInfoEntry::GetAttributeAddressRange
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- dw_addr_t& lo_pc,
- dw_addr_t& hi_pc,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin
-) const
-{
- lo_pc = GetAttributeValueAsAddress(dwarf2Data, cu, DW_AT_low_pc, fail_value, check_specification_or_abstract_origin);
- if (lo_pc != fail_value)
- {
- hi_pc = GetAttributeHighPC(dwarf2Data, cu, lo_pc, fail_value, check_specification_or_abstract_origin);
- if (hi_pc != fail_value)
- return true;
- }
- lo_pc = fail_value;
- hi_pc = fail_value;
- return false;
+bool DWARFDebugInfoEntry::GetAttributeAddressRange(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu, dw_addr_t &lo_pc,
+ dw_addr_t &hi_pc, uint64_t fail_value,
+ bool check_specification_or_abstract_origin) const {
+ lo_pc = GetAttributeValueAsAddress(dwarf2Data, cu, DW_AT_low_pc, fail_value,
+ check_specification_or_abstract_origin);
+ if (lo_pc != fail_value) {
+ hi_pc = GetAttributeHighPC(dwarf2Data, cu, lo_pc, fail_value,
+ check_specification_or_abstract_origin);
+ if (hi_pc != fail_value)
+ return true;
+ }
+ lo_pc = fail_value;
+ hi_pc = fail_value;
+ return false;
}
-size_t
-DWARFDebugInfoEntry::GetAttributeAddressRanges (SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFRangeList &ranges,
- bool check_hi_lo_pc,
- bool check_specification_or_abstract_origin) const
-{
- ranges.Clear();
-
- dw_offset_t debug_ranges_offset = GetAttributeValueAsUnsigned(dwarf2Data,
- cu,
- DW_AT_ranges,
- DW_INVALID_OFFSET,
- check_specification_or_abstract_origin);
- if (debug_ranges_offset != DW_INVALID_OFFSET)
- {
- DWARFDebugRanges* debug_ranges = dwarf2Data->DebugRanges();
-
- debug_ranges->FindRanges(debug_ranges_offset, ranges);
- ranges.Slide (cu->GetBaseAddress());
- }
- else if (check_hi_lo_pc)
- {
- dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
- dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
- if (GetAttributeAddressRange (dwarf2Data, cu, lo_pc, hi_pc, LLDB_INVALID_ADDRESS, check_specification_or_abstract_origin))
- {
- if (lo_pc < hi_pc)
- ranges.Append(DWARFRangeList::Entry(lo_pc, hi_pc - lo_pc));
- }
+size_t DWARFDebugInfoEntry::GetAttributeAddressRanges(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ DWARFRangeList &ranges, bool check_hi_lo_pc,
+ bool check_specification_or_abstract_origin) const {
+ ranges.Clear();
+
+ dw_offset_t debug_ranges_offset = GetAttributeValueAsUnsigned(
+ dwarf2Data, cu, DW_AT_ranges, DW_INVALID_OFFSET,
+ check_specification_or_abstract_origin);
+ if (debug_ranges_offset != DW_INVALID_OFFSET) {
+ DWARFDebugRanges *debug_ranges = dwarf2Data->DebugRanges();
+
+ debug_ranges->FindRanges(debug_ranges_offset, ranges);
+ ranges.Slide(cu->GetBaseAddress());
+ } else if (check_hi_lo_pc) {
+ dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
+ dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
+ if (GetAttributeAddressRange(dwarf2Data, cu, lo_pc, hi_pc,
+ LLDB_INVALID_ADDRESS,
+ check_specification_or_abstract_origin)) {
+ if (lo_pc < hi_pc)
+ ranges.Append(DWARFRangeList::Entry(lo_pc, hi_pc - lo_pc));
}
- return ranges.GetSize();
+ }
+ return ranges.GetSize();
}
//----------------------------------------------------------------------
@@ -1291,14 +1129,9 @@ DWARFDebugInfoEntry::GetAttributeAddressRanges (SymbolFileDWARF* dwarf2Data,
// Get value of the DW_AT_name attribute and return it if one exists,
// else return NULL.
//----------------------------------------------------------------------
-const char*
-DWARFDebugInfoEntry::GetName
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu
-) const
-{
- return GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
+const char *DWARFDebugInfoEntry::GetName(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu) const {
+ return GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
}
//----------------------------------------------------------------------
@@ -1307,31 +1140,28 @@ DWARFDebugInfoEntry::GetName
// Get value of the DW_AT_MIPS_linkage_name attribute and return it if
// one exists, else return the value of the DW_AT_name attribute
//----------------------------------------------------------------------
-const char*
-DWARFDebugInfoEntry::GetMangledName
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- bool substitute_name_allowed
-) const
-{
- const char* name = nullptr;
-
- name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_MIPS_linkage_name, nullptr, true);
- if (name)
- return name;
-
- name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_linkage_name, nullptr, true);
- if (name)
- return name;
-
- if (!substitute_name_allowed)
- return nullptr;
-
- name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
+const char *
+DWARFDebugInfoEntry::GetMangledName(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ bool substitute_name_allowed) const {
+ const char *name = nullptr;
+
+ name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_MIPS_linkage_name,
+ nullptr, true);
+ if (name)
return name;
-}
+ name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_linkage_name, nullptr,
+ true);
+ if (name)
+ return name;
+
+ if (!substitute_name_allowed)
+ return nullptr;
+
+ name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
+ return name;
+}
//----------------------------------------------------------------------
// GetPubname
@@ -1339,29 +1169,25 @@ DWARFDebugInfoEntry::GetMangledName
// Get value the name for a DIE as it should appear for a
// .debug_pubnames or .debug_pubtypes section.
//----------------------------------------------------------------------
-const char*
-DWARFDebugInfoEntry::GetPubname
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu
-) const
-{
- const char* name = nullptr;
- if (!dwarf2Data)
- return name;
-
- name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_MIPS_linkage_name, nullptr, true);
- if (name)
- return name;
-
- name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_linkage_name, nullptr, true);
- if (name)
- return name;
-
- name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
+const char *DWARFDebugInfoEntry::GetPubname(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu) const {
+ const char *name = nullptr;
+ if (!dwarf2Data)
return name;
-}
+ name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_MIPS_linkage_name,
+ nullptr, true);
+ if (name)
+ return name;
+
+ name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_linkage_name, nullptr,
+ true);
+ if (name)
+ return name;
+
+ name = GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
+ return name;
+}
//----------------------------------------------------------------------
// GetName
@@ -1372,41 +1198,30 @@ DWARFDebugInfoEntry::GetPubname
// into the stream, and if no DW_AT_name attribute exists for the DIE
// then nothing is printed.
//----------------------------------------------------------------------
-bool
-DWARFDebugInfoEntry::GetName
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_offset_t die_offset,
- Stream &s
-)
-{
- if (dwarf2Data == NULL)
- {
- s.PutCString("NULL");
- return false;
- }
-
- DWARFDebugInfoEntry die;
- lldb::offset_t offset = die_offset;
- if (die.Extract(dwarf2Data, cu, &offset))
- {
- if (die.IsNULL())
- {
- s.PutCString("NULL");
- return true;
- }
- else
- {
- const char* name = die.GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, nullptr, true);
- if (name)
- {
- s.PutCString(name);
- return true;
- }
- }
- }
+bool DWARFDebugInfoEntry::GetName(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ const dw_offset_t die_offset, Stream &s) {
+ if (dwarf2Data == NULL) {
+ s.PutCString("NULL");
return false;
+ }
+
+ DWARFDebugInfoEntry die;
+ lldb::offset_t offset = die_offset;
+ if (die.Extract(dwarf2Data, cu, &offset)) {
+ if (die.IsNULL()) {
+ s.PutCString("NULL");
+ return true;
+ } else {
+ const char *name = die.GetAttributeValueAsString(
+ dwarf2Data, cu, DW_AT_name, nullptr, true);
+ if (name) {
+ s.PutCString(name);
+ return true;
+ }
+ }
+ }
+ return false;
}
//----------------------------------------------------------------------
@@ -1417,144 +1232,168 @@ DWARFDebugInfoEntry::GetName
// the supplied stream. This is used to show the name of types given
// a type identifier.
//----------------------------------------------------------------------
-bool
-DWARFDebugInfoEntry::AppendTypeName
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_offset_t die_offset,
- Stream &s
-)
-{
- if (dwarf2Data == NULL)
- {
- s.PutCString("NULL");
- return false;
- }
-
- DWARFDebugInfoEntry die;
- lldb::offset_t offset = die_offset;
- if (die.Extract(dwarf2Data, cu, &offset))
- {
- if (die.IsNULL())
- {
- s.PutCString("NULL");
- return true;
+bool DWARFDebugInfoEntry::AppendTypeName(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ const dw_offset_t die_offset,
+ Stream &s) {
+ if (dwarf2Data == NULL) {
+ s.PutCString("NULL");
+ return false;
+ }
+
+ DWARFDebugInfoEntry die;
+ lldb::offset_t offset = die_offset;
+ if (die.Extract(dwarf2Data, cu, &offset)) {
+ if (die.IsNULL()) {
+ s.PutCString("NULL");
+ return true;
+ } else {
+ const char *name = die.GetPubname(dwarf2Data, cu);
+ if (name)
+ s.PutCString(name);
+ else {
+ bool result = true;
+ const DWARFAbbreviationDeclaration *abbrevDecl =
+ die.GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
+
+ if (abbrevDecl == NULL)
+ return false;
+
+ switch (abbrevDecl->Tag()) {
+ case DW_TAG_array_type:
+ break; // print out a "[]" after printing the full type of the element
+ // below
+ case DW_TAG_base_type:
+ s.PutCString("base ");
+ break;
+ case DW_TAG_class_type:
+ s.PutCString("class ");
+ break;
+ case DW_TAG_const_type:
+ s.PutCString("const ");
+ break;
+ case DW_TAG_enumeration_type:
+ s.PutCString("enum ");
+ break;
+ case DW_TAG_file_type:
+ s.PutCString("file ");
+ break;
+ case DW_TAG_interface_type:
+ s.PutCString("interface ");
+ break;
+ case DW_TAG_packed_type:
+ s.PutCString("packed ");
+ break;
+ case DW_TAG_pointer_type:
+ break; // print out a '*' after printing the full type below
+ case DW_TAG_ptr_to_member_type:
+ break; // print out a '*' after printing the full type below
+ case DW_TAG_reference_type:
+ break; // print out a '&' after printing the full type below
+ case DW_TAG_restrict_type:
+ s.PutCString("restrict ");
+ break;
+ case DW_TAG_set_type:
+ s.PutCString("set ");
+ break;
+ case DW_TAG_shared_type:
+ s.PutCString("shared ");
+ break;
+ case DW_TAG_string_type:
+ s.PutCString("string ");
+ break;
+ case DW_TAG_structure_type:
+ s.PutCString("struct ");
+ break;
+ case DW_TAG_subrange_type:
+ s.PutCString("subrange ");
+ break;
+ case DW_TAG_subroutine_type:
+ s.PutCString("function ");
+ break;
+ case DW_TAG_thrown_type:
+ s.PutCString("thrown ");
+ break;
+ case DW_TAG_union_type:
+ s.PutCString("union ");
+ break;
+ case DW_TAG_unspecified_type:
+ s.PutCString("unspecified ");
+ break;
+ case DW_TAG_volatile_type:
+ s.PutCString("volatile ");
+ break;
+ default:
+ return false;
}
- else
- {
- const char* name = die.GetPubname(dwarf2Data, cu);
- if (name)
- s.PutCString(name);
- else
- {
- bool result = true;
- const DWARFAbbreviationDeclaration* abbrevDecl = die.GetAbbreviationDeclarationPtr(dwarf2Data, cu, offset);
-
- if (abbrevDecl == NULL)
- return false;
-
- switch (abbrevDecl->Tag())
- {
- case DW_TAG_array_type: break; // print out a "[]" after printing the full type of the element below
- case DW_TAG_base_type: s.PutCString("base "); break;
- case DW_TAG_class_type: s.PutCString("class "); break;
- case DW_TAG_const_type: s.PutCString("const "); break;
- case DW_TAG_enumeration_type: s.PutCString("enum "); break;
- case DW_TAG_file_type: s.PutCString("file "); break;
- case DW_TAG_interface_type: s.PutCString("interface "); break;
- case DW_TAG_packed_type: s.PutCString("packed "); break;
- case DW_TAG_pointer_type: break; // print out a '*' after printing the full type below
- case DW_TAG_ptr_to_member_type: break; // print out a '*' after printing the full type below
- case DW_TAG_reference_type: break; // print out a '&' after printing the full type below
- case DW_TAG_restrict_type: s.PutCString("restrict "); break;
- case DW_TAG_set_type: s.PutCString("set "); break;
- case DW_TAG_shared_type: s.PutCString("shared "); break;
- case DW_TAG_string_type: s.PutCString("string "); break;
- case DW_TAG_structure_type: s.PutCString("struct "); break;
- case DW_TAG_subrange_type: s.PutCString("subrange "); break;
- case DW_TAG_subroutine_type: s.PutCString("function "); break;
- case DW_TAG_thrown_type: s.PutCString("thrown "); break;
- case DW_TAG_union_type: s.PutCString("union "); break;
- case DW_TAG_unspecified_type: s.PutCString("unspecified "); break;
- case DW_TAG_volatile_type: s.PutCString("volatile "); break;
- default:
- return false;
- }
- // Follow the DW_AT_type if possible
- DWARFFormValue form_value;
- if (die.GetAttributeValue(dwarf2Data, cu, DW_AT_type, form_value))
- {
- uint64_t next_die_offset = form_value.Reference();
- result = AppendTypeName(dwarf2Data, cu, next_die_offset, s);
- }
+ // Follow the DW_AT_type if possible
+ DWARFFormValue form_value;
+ if (die.GetAttributeValue(dwarf2Data, cu, DW_AT_type, form_value)) {
+ uint64_t next_die_offset = form_value.Reference();
+ result = AppendTypeName(dwarf2Data, cu, next_die_offset, s);
+ }
- switch (abbrevDecl->Tag())
- {
- case DW_TAG_array_type: s.PutCString("[]"); break;
- case DW_TAG_pointer_type: s.PutChar('*'); break;
- case DW_TAG_ptr_to_member_type: s.PutChar('*'); break;
- case DW_TAG_reference_type: s.PutChar('&'); break;
- default:
- break;
- }
- return result;
- }
+ switch (abbrevDecl->Tag()) {
+ case DW_TAG_array_type:
+ s.PutCString("[]");
+ break;
+ case DW_TAG_pointer_type:
+ s.PutChar('*');
+ break;
+ case DW_TAG_ptr_to_member_type:
+ s.PutChar('*');
+ break;
+ case DW_TAG_reference_type:
+ s.PutChar('&');
+ break;
+ default:
+ break;
}
+ return result;
+ }
}
- return false;
+ }
+ return false;
}
-bool
-DWARFDebugInfoEntry::Contains (const DWARFDebugInfoEntry *die) const
-{
- if (die)
- {
- const dw_offset_t die_offset = die->GetOffset();
- if (die_offset > GetOffset())
- {
- const DWARFDebugInfoEntry *sibling = GetSibling();
- assert (sibling); // TODO: take this out
- if (sibling)
- return die_offset < sibling->GetOffset();
- }
+bool DWARFDebugInfoEntry::Contains(const DWARFDebugInfoEntry *die) const {
+ if (die) {
+ const dw_offset_t die_offset = die->GetOffset();
+ if (die_offset > GetOffset()) {
+ const DWARFDebugInfoEntry *sibling = GetSibling();
+ assert(sibling); // TODO: take this out
+ if (sibling)
+ return die_offset < sibling->GetOffset();
}
- return false;
+ }
+ return false;
}
//----------------------------------------------------------------------
// BuildAddressRangeTable
//----------------------------------------------------------------------
-void
-DWARFDebugInfoEntry::BuildAddressRangeTable
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFDebugAranges* debug_aranges
-) const
-{
- if (m_tag)
- {
- if (m_tag == DW_TAG_subprogram)
- {
- dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
- dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
- if (GetAttributeAddressRange(dwarf2Data, cu, lo_pc, hi_pc, LLDB_INVALID_ADDRESS))
- {
- /// printf("BuildAddressRangeTable() 0x%8.8x: %30s: [0x%8.8x - 0x%8.8x)\n", m_offset, DW_TAG_value_to_name(tag), lo_pc, hi_pc);
- debug_aranges->AppendRange (cu->GetOffset(), lo_pc, hi_pc);
- }
- }
-
+void DWARFDebugInfoEntry::BuildAddressRangeTable(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ DWARFDebugAranges *debug_aranges) const {
+ if (m_tag) {
+ if (m_tag == DW_TAG_subprogram) {
+ dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
+ dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
+ if (GetAttributeAddressRange(dwarf2Data, cu, lo_pc, hi_pc,
+ LLDB_INVALID_ADDRESS)) {
+ /// printf("BuildAddressRangeTable() 0x%8.8x: %30s: [0x%8.8x -
+ /// 0x%8.8x)\n", m_offset, DW_TAG_value_to_name(tag), lo_pc, hi_pc);
+ debug_aranges->AppendRange(cu->GetOffset(), lo_pc, hi_pc);
+ }
+ }
- const DWARFDebugInfoEntry* child = GetFirstChild();
- while (child)
- {
- child->BuildAddressRangeTable(dwarf2Data, cu, debug_aranges);
- child = child->GetSibling();
- }
+ const DWARFDebugInfoEntry *child = GetFirstChild();
+ while (child) {
+ child->BuildAddressRangeTable(dwarf2Data, cu, debug_aranges);
+ child = child->GetSibling();
}
+ }
}
//----------------------------------------------------------------------
@@ -1565,477 +1404,478 @@ DWARFDebugInfoEntry::BuildAddressRangeTable
// table instead of the compile unit offset (which is the way the
// standard .debug_aranges section does it).
//----------------------------------------------------------------------
-void
-DWARFDebugInfoEntry::BuildFunctionAddressRangeTable
-(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFDebugAranges* debug_aranges
-) const
-{
- if (m_tag)
- {
- if (m_tag == DW_TAG_subprogram)
- {
- dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
- dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
- if (GetAttributeAddressRange(dwarf2Data, cu, lo_pc, hi_pc, LLDB_INVALID_ADDRESS))
- {
- // printf("BuildAddressRangeTable() 0x%8.8x: [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n", m_offset, lo_pc, hi_pc); // DEBUG ONLY
- debug_aranges->AppendRange (GetOffset(), lo_pc, hi_pc);
- }
- }
+void DWARFDebugInfoEntry::BuildFunctionAddressRangeTable(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ DWARFDebugAranges *debug_aranges) const {
+ if (m_tag) {
+ if (m_tag == DW_TAG_subprogram) {
+ dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
+ dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
+ if (GetAttributeAddressRange(dwarf2Data, cu, lo_pc, hi_pc,
+ LLDB_INVALID_ADDRESS)) {
+ // printf("BuildAddressRangeTable() 0x%8.8x: [0x%16.16" PRIx64 " -
+ // 0x%16.16" PRIx64 ")\n", m_offset, lo_pc, hi_pc); // DEBUG ONLY
+ debug_aranges->AppendRange(GetOffset(), lo_pc, hi_pc);
+ }
+ }
- const DWARFDebugInfoEntry* child = GetFirstChild();
- while (child)
- {
- child->BuildFunctionAddressRangeTable(dwarf2Data, cu, debug_aranges);
- child = child->GetSibling();
- }
+ const DWARFDebugInfoEntry *child = GetFirstChild();
+ while (child) {
+ child->BuildFunctionAddressRangeTable(dwarf2Data, cu, debug_aranges);
+ child = child->GetSibling();
}
+ }
}
-void
-DWARFDebugInfoEntry::GetDeclContextDIEs (DWARFCompileUnit* cu,
- DWARFDIECollection &decl_context_dies) const
-{
+void DWARFDebugInfoEntry::GetDeclContextDIEs(
+ DWARFCompileUnit *cu, DWARFDIECollection &decl_context_dies) const {
- DWARFDIE die (cu, const_cast<DWARFDebugInfoEntry *>(this));
- die.GetDeclContextDIEs(decl_context_dies);
+ DWARFDIE die(cu, const_cast<DWARFDebugInfoEntry *>(this));
+ die.GetDeclContextDIEs(decl_context_dies);
}
-void
-DWARFDebugInfoEntry::GetDWARFDeclContext (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- DWARFDeclContext &dwarf_decl_ctx) const
-{
- const dw_tag_t tag = Tag();
- if (tag != DW_TAG_compile_unit)
- {
- dwarf_decl_ctx.AppendDeclContext(tag, GetName(dwarf2Data, cu));
- 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.GetDIE()->GetDWARFDeclContext (parent_decl_ctx_die.GetDWARF(), parent_decl_ctx_die.GetCU(), dwarf_decl_ctx);
- }
+void DWARFDebugInfoEntry::GetDWARFDeclContext(
+ SymbolFileDWARF *dwarf2Data, DWARFCompileUnit *cu,
+ DWARFDeclContext &dwarf_decl_ctx) const {
+ const dw_tag_t tag = Tag();
+ if (tag != DW_TAG_compile_unit) {
+ dwarf_decl_ctx.AppendDeclContext(tag, GetName(dwarf2Data, cu));
+ 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.GetDIE()->GetDWARFDeclContext(
+ parent_decl_ctx_die.GetDWARF(), parent_decl_ctx_die.GetCU(),
+ dwarf_decl_ctx);
}
+ }
}
+bool DWARFDebugInfoEntry::MatchesDWARFDeclContext(
+ SymbolFileDWARF *dwarf2Data, DWARFCompileUnit *cu,
+ const DWARFDeclContext &dwarf_decl_ctx) const {
-bool
-DWARFDebugInfoEntry::MatchesDWARFDeclContext (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- const DWARFDeclContext &dwarf_decl_ctx) const
-{
-
- DWARFDeclContext this_dwarf_decl_ctx;
- GetDWARFDeclContext (dwarf2Data, cu, this_dwarf_decl_ctx);
- return this_dwarf_decl_ctx == dwarf_decl_ctx;
+ DWARFDeclContext this_dwarf_decl_ctx;
+ GetDWARFDeclContext(dwarf2Data, cu, this_dwarf_decl_ctx);
+ return this_dwarf_decl_ctx == dwarf_decl_ctx;
}
DWARFDIE
-DWARFDebugInfoEntry::GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu) const
-{
- DWARFAttributes attributes;
- GetAttributes(cu, DWARFFormValue::FixedFormSizes(), attributes);
- return GetParentDeclContextDIE (dwarf2Data, cu, attributes);
+DWARFDebugInfoEntry::GetParentDeclContextDIE(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu) const {
+ DWARFAttributes attributes;
+ GetAttributes(cu, DWARFFormValue::FixedFormSizes(), attributes);
+ return GetParentDeclContextDIE(dwarf2Data, cu, attributes);
}
DWARFDIE
-DWARFDebugInfoEntry::GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- const DWARFAttributes& attributes) const
-{
- 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.GetDIE() != this)
- {
- switch (die.Tag())
- {
- case DW_TAG_compile_unit:
- case DW_TAG_namespace:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_class_type:
- return die;
-
- default:
- break;
- }
- }
-
- dw_offset_t die_offset;
-
- die_offset = attributes.FormValueAsUnsigned(DW_AT_specification, DW_INVALID_OFFSET);
- if (die_offset != DW_INVALID_OFFSET)
- {
- DWARFDIE spec_die = cu->GetDIE (die_offset);
- if (spec_die)
- {
- DWARFDIE decl_ctx_die = spec_die.GetParentDeclContextDIE();
- if (decl_ctx_die)
- return decl_ctx_die;
- }
- }
-
- die_offset = attributes.FormValueAsUnsigned(DW_AT_abstract_origin, DW_INVALID_OFFSET);
- if (die_offset != DW_INVALID_OFFSET)
- {
- DWARFDIE abs_die = cu->GetDIE (die_offset);
- if (abs_die)
- {
- DWARFDIE decl_ctx_die = abs_die.GetParentDeclContextDIE();
- if (decl_ctx_die)
- return decl_ctx_die;
- }
- }
-
- die = die.GetParent();
- }
- return DWARFDIE();
-}
+DWARFDebugInfoEntry::GetParentDeclContextDIE(
+ SymbolFileDWARF *dwarf2Data, DWARFCompileUnit *cu,
+ const DWARFAttributes &attributes) const {
+ 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.GetDIE() != this) {
+ switch (die.Tag()) {
+ case DW_TAG_compile_unit:
+ case DW_TAG_namespace:
+ case DW_TAG_structure_type:
+ case DW_TAG_union_type:
+ case DW_TAG_class_type:
+ return die;
+
+ default:
+ break;
+ }
+ }
+
+ dw_offset_t die_offset;
+
+ die_offset =
+ attributes.FormValueAsUnsigned(DW_AT_specification, DW_INVALID_OFFSET);
+ if (die_offset != DW_INVALID_OFFSET) {
+ DWARFDIE spec_die = cu->GetDIE(die_offset);
+ if (spec_die) {
+ DWARFDIE decl_ctx_die = spec_die.GetParentDeclContextDIE();
+ if (decl_ctx_die)
+ return decl_ctx_die;
+ }
+ }
+ die_offset = attributes.FormValueAsUnsigned(DW_AT_abstract_origin,
+ DW_INVALID_OFFSET);
+ if (die_offset != DW_INVALID_OFFSET) {
+ DWARFDIE abs_die = cu->GetDIE(die_offset);
+ if (abs_die) {
+ DWARFDIE decl_ctx_die = abs_die.GetParentDeclContextDIE();
+ if (decl_ctx_die)
+ return decl_ctx_die;
+ }
+ }
-const char *
-DWARFDebugInfoEntry::GetQualifiedName (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- std::string &storage) const
-{
- DWARFAttributes attributes;
- GetAttributes(cu, DWARFFormValue::FixedFormSizes(), attributes);
- return GetQualifiedName (dwarf2Data, cu, attributes, storage);
+ die = die.GetParent();
+ }
+ return DWARFDIE();
}
-const char*
-DWARFDebugInfoEntry::GetQualifiedName (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- const DWARFAttributes& attributes,
- std::string &storage) const
-{
-
- const char *name = GetName (dwarf2Data, cu);
-
- if (name)
- {
- 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();
- switch (parent_tag)
- {
- case DW_TAG_namespace:
- {
- 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 ();
-
- 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.Clear();
- break;
- }
- }
-
- if (storage.empty())
- storage.append ("::");
-
- storage.append (name);
- }
- if (storage.empty())
- return NULL;
- return storage.c_str();
+const char *DWARFDebugInfoEntry::GetQualifiedName(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu,
+ std::string &storage) const {
+ DWARFAttributes attributes;
+ GetAttributes(cu, DWARFFormValue::FixedFormSizes(), attributes);
+ return GetQualifiedName(dwarf2Data, cu, attributes, storage);
}
+const char *DWARFDebugInfoEntry::GetQualifiedName(
+ SymbolFileDWARF *dwarf2Data, DWARFCompileUnit *cu,
+ const DWARFAttributes &attributes, std::string &storage) const {
+
+ const char *name = GetName(dwarf2Data, cu);
+
+ if (name) {
+ 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();
+ switch (parent_tag) {
+ case DW_TAG_namespace: {
+ 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();
+
+ 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.Clear();
+ break;
+ }
+ }
+
+ if (storage.empty())
+ storage.append("::");
+
+ storage.append(name);
+ }
+ if (storage.empty())
+ return NULL;
+ return storage.c_str();
+}
//----------------------------------------------------------------------
// LookupAddress
//----------------------------------------------------------------------
-bool
-DWARFDebugInfoEntry::LookupAddress
-(
- const dw_addr_t address,
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFDebugInfoEntry** function_die,
- DWARFDebugInfoEntry** block_die
-)
-{
- bool found_address = false;
- if (m_tag)
- {
- bool check_children = false;
- bool match_addr_range = false;
- // printf("0x%8.8x: %30s: address = 0x%8.8x - ", m_offset, DW_TAG_value_to_name(tag), address);
- switch (m_tag)
- {
- case DW_TAG_array_type : break;
- case DW_TAG_class_type : check_children = true; break;
- case DW_TAG_entry_point : break;
- case DW_TAG_enumeration_type : break;
- case DW_TAG_formal_parameter : break;
- case DW_TAG_imported_declaration : break;
- case DW_TAG_label : break;
- case DW_TAG_lexical_block : check_children = true; match_addr_range = true; break;
- case DW_TAG_member : break;
- case DW_TAG_pointer_type : break;
- case DW_TAG_reference_type : break;
- case DW_TAG_compile_unit : match_addr_range = true; break;
- case DW_TAG_string_type : break;
- case DW_TAG_structure_type : check_children = true; break;
- case DW_TAG_subroutine_type : break;
- case DW_TAG_typedef : break;
- case DW_TAG_union_type : break;
- case DW_TAG_unspecified_parameters : break;
- case DW_TAG_variant : break;
- case DW_TAG_common_block : check_children = true; break;
- case DW_TAG_common_inclusion : break;
- case DW_TAG_inheritance : break;
- case DW_TAG_inlined_subroutine : check_children = true; match_addr_range = true; break;
- case DW_TAG_module : match_addr_range = true; break;
- case DW_TAG_ptr_to_member_type : break;
- case DW_TAG_set_type : break;
- case DW_TAG_subrange_type : break;
- case DW_TAG_with_stmt : break;
- case DW_TAG_access_declaration : break;
- case DW_TAG_base_type : break;
- case DW_TAG_catch_block : match_addr_range = true; break;
- case DW_TAG_const_type : break;
- case DW_TAG_constant : break;
- case DW_TAG_enumerator : break;
- case DW_TAG_file_type : break;
- case DW_TAG_friend : break;
- case DW_TAG_namelist : break;
- case DW_TAG_namelist_item : break;
- case DW_TAG_packed_type : break;
- case DW_TAG_subprogram : match_addr_range = true; break;
- case DW_TAG_template_type_parameter : break;
- case DW_TAG_template_value_parameter : break;
- case DW_TAG_thrown_type : break;
- case DW_TAG_try_block : match_addr_range = true; break;
- case DW_TAG_variant_part : break;
- case DW_TAG_variable : break;
- case DW_TAG_volatile_type : break;
- case DW_TAG_dwarf_procedure : break;
- case DW_TAG_restrict_type : break;
- case DW_TAG_interface_type : break;
- case DW_TAG_namespace : check_children = true; break;
- case DW_TAG_imported_module : break;
- case DW_TAG_unspecified_type : break;
- case DW_TAG_partial_unit : break;
- case DW_TAG_imported_unit : break;
- case DW_TAG_shared_type : break;
- default: break;
- }
-
- if (match_addr_range)
- {
- dw_addr_t lo_pc = GetAttributeValueAsAddress(dwarf2Data, cu, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
- if (lo_pc != LLDB_INVALID_ADDRESS)
- {
- dw_addr_t hi_pc = GetAttributeHighPC(dwarf2Data, cu, lo_pc, LLDB_INVALID_ADDRESS);
- if (hi_pc != LLDB_INVALID_ADDRESS)
- {
- // printf("\n0x%8.8x: %30s: address = 0x%8.8x [0x%8.8x - 0x%8.8x) ", m_offset, DW_TAG_value_to_name(tag), address, lo_pc, hi_pc);
- if ((lo_pc <= address) && (address < hi_pc))
- {
- found_address = true;
- // puts("***MATCH***");
- switch (m_tag)
- {
- case DW_TAG_compile_unit: // File
- check_children = ((function_die != NULL) || (block_die != NULL));
- break;
-
- case DW_TAG_subprogram: // Function
- if (function_die)
- *function_die = this;
- check_children = (block_die != NULL);
- break;
-
- case DW_TAG_inlined_subroutine: // Inlined Function
- case DW_TAG_lexical_block: // Block { } in code
- if (block_die)
- {
- *block_die = this;
- check_children = true;
- }
- break;
-
- default:
- check_children = true;
- break;
- }
- }
- }
- else
- { // compile units may not have a valid high/low pc when there
- // are address gaps in subroutines so we must always search
- // if there is no valid high and low PC
- check_children = (m_tag == DW_TAG_compile_unit) && ((function_die != NULL) || (block_die != NULL));
- }
- }
- else
- {
- dw_offset_t debug_ranges_offset = GetAttributeValueAsUnsigned(dwarf2Data, cu, DW_AT_ranges, DW_INVALID_OFFSET);
- if (debug_ranges_offset != DW_INVALID_OFFSET)
- {
- 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
- // compile unit. We add the compile unit base address to make
- // sure all the addresses are properly fixed up.
- ranges.Slide (cu->GetBaseAddress());
- if (ranges.FindEntryThatContains(address))
- {
- found_address = true;
- // puts("***MATCH***");
- switch (m_tag)
- {
- case DW_TAG_compile_unit: // File
- check_children = ((function_die != NULL) || (block_die != NULL));
- break;
-
- case DW_TAG_subprogram: // Function
- if (function_die)
- *function_die = this;
- check_children = (block_die != NULL);
- break;
-
- case DW_TAG_inlined_subroutine: // Inlined Function
- case DW_TAG_lexical_block: // Block { } in code
- if (block_die)
- {
- *block_die = this;
- check_children = true;
- }
- break;
-
- default:
- check_children = true;
- break;
- }
- }
- else
- {
- check_children = false;
- }
- }
- }
- }
+bool DWARFDebugInfoEntry::LookupAddress(const dw_addr_t address,
+ SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ DWARFDebugInfoEntry **function_die,
+ DWARFDebugInfoEntry **block_die) {
+ bool found_address = false;
+ if (m_tag) {
+ bool check_children = false;
+ bool match_addr_range = false;
+ // printf("0x%8.8x: %30s: address = 0x%8.8x - ", m_offset,
+ // DW_TAG_value_to_name(tag), address);
+ switch (m_tag) {
+ case DW_TAG_array_type:
+ break;
+ case DW_TAG_class_type:
+ check_children = true;
+ break;
+ case DW_TAG_entry_point:
+ break;
+ case DW_TAG_enumeration_type:
+ break;
+ case DW_TAG_formal_parameter:
+ break;
+ case DW_TAG_imported_declaration:
+ break;
+ case DW_TAG_label:
+ break;
+ case DW_TAG_lexical_block:
+ check_children = true;
+ match_addr_range = true;
+ break;
+ case DW_TAG_member:
+ break;
+ case DW_TAG_pointer_type:
+ break;
+ case DW_TAG_reference_type:
+ break;
+ case DW_TAG_compile_unit:
+ match_addr_range = true;
+ break;
+ case DW_TAG_string_type:
+ break;
+ case DW_TAG_structure_type:
+ check_children = true;
+ break;
+ case DW_TAG_subroutine_type:
+ break;
+ case DW_TAG_typedef:
+ break;
+ case DW_TAG_union_type:
+ break;
+ case DW_TAG_unspecified_parameters:
+ break;
+ case DW_TAG_variant:
+ break;
+ case DW_TAG_common_block:
+ check_children = true;
+ break;
+ case DW_TAG_common_inclusion:
+ break;
+ case DW_TAG_inheritance:
+ break;
+ case DW_TAG_inlined_subroutine:
+ check_children = true;
+ match_addr_range = true;
+ break;
+ case DW_TAG_module:
+ match_addr_range = true;
+ break;
+ case DW_TAG_ptr_to_member_type:
+ break;
+ case DW_TAG_set_type:
+ break;
+ case DW_TAG_subrange_type:
+ break;
+ case DW_TAG_with_stmt:
+ break;
+ case DW_TAG_access_declaration:
+ break;
+ case DW_TAG_base_type:
+ break;
+ case DW_TAG_catch_block:
+ match_addr_range = true;
+ break;
+ case DW_TAG_const_type:
+ break;
+ case DW_TAG_constant:
+ break;
+ case DW_TAG_enumerator:
+ break;
+ case DW_TAG_file_type:
+ break;
+ case DW_TAG_friend:
+ break;
+ case DW_TAG_namelist:
+ break;
+ case DW_TAG_namelist_item:
+ break;
+ case DW_TAG_packed_type:
+ break;
+ case DW_TAG_subprogram:
+ match_addr_range = true;
+ break;
+ case DW_TAG_template_type_parameter:
+ break;
+ case DW_TAG_template_value_parameter:
+ break;
+ case DW_TAG_thrown_type:
+ break;
+ case DW_TAG_try_block:
+ match_addr_range = true;
+ break;
+ case DW_TAG_variant_part:
+ break;
+ case DW_TAG_variable:
+ break;
+ case DW_TAG_volatile_type:
+ break;
+ case DW_TAG_dwarf_procedure:
+ break;
+ case DW_TAG_restrict_type:
+ break;
+ case DW_TAG_interface_type:
+ break;
+ case DW_TAG_namespace:
+ check_children = true;
+ break;
+ case DW_TAG_imported_module:
+ break;
+ case DW_TAG_unspecified_type:
+ break;
+ case DW_TAG_partial_unit:
+ break;
+ case DW_TAG_imported_unit:
+ break;
+ case DW_TAG_shared_type:
+ break;
+ default:
+ break;
+ }
+ if (match_addr_range) {
+ dw_addr_t lo_pc = GetAttributeValueAsAddress(dwarf2Data, cu, DW_AT_low_pc,
+ LLDB_INVALID_ADDRESS);
+ if (lo_pc != LLDB_INVALID_ADDRESS) {
+ dw_addr_t hi_pc =
+ GetAttributeHighPC(dwarf2Data, cu, lo_pc, LLDB_INVALID_ADDRESS);
+ if (hi_pc != LLDB_INVALID_ADDRESS) {
+ // printf("\n0x%8.8x: %30s: address = 0x%8.8x [0x%8.8x - 0x%8.8x) ",
+ // m_offset, DW_TAG_value_to_name(tag), address, lo_pc, hi_pc);
+ if ((lo_pc <= address) && (address < hi_pc)) {
+ found_address = true;
+ // puts("***MATCH***");
+ switch (m_tag) {
+ case DW_TAG_compile_unit: // File
+ check_children = ((function_die != NULL) || (block_die != NULL));
+ break;
+
+ case DW_TAG_subprogram: // Function
+ if (function_die)
+ *function_die = this;
+ check_children = (block_die != NULL);
+ break;
+
+ case DW_TAG_inlined_subroutine: // Inlined Function
+ case DW_TAG_lexical_block: // Block { } in code
+ if (block_die) {
+ *block_die = this;
+ check_children = true;
+ }
+ break;
- if (check_children)
- {
- // printf("checking children\n");
- DWARFDebugInfoEntry* child = GetFirstChild();
- while (child)
- {
- if (child->LookupAddress(address, dwarf2Data, cu, function_die, block_die))
- return true;
- child = child->GetSibling();
+ default:
+ check_children = true;
+ break;
}
+ }
+ } else { // compile units may not have a valid high/low pc when there
+ // are address gaps in subroutines so we must always search
+ // if there is no valid high and low PC
+ check_children = (m_tag == DW_TAG_compile_unit) &&
+ ((function_die != NULL) || (block_die != NULL));
}
- }
- return found_address;
-}
+ } else {
+ dw_offset_t debug_ranges_offset = GetAttributeValueAsUnsigned(
+ dwarf2Data, cu, DW_AT_ranges, DW_INVALID_OFFSET);
+ if (debug_ranges_offset != DW_INVALID_OFFSET) {
+ 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
+ // compile unit. We add the compile unit base address to make
+ // sure all the addresses are properly fixed up.
+ ranges.Slide(cu->GetBaseAddress());
+ if (ranges.FindEntryThatContains(address)) {
+ found_address = true;
+ // puts("***MATCH***");
+ switch (m_tag) {
+ case DW_TAG_compile_unit: // File
+ check_children = ((function_die != NULL) || (block_die != NULL));
+ break;
+
+ case DW_TAG_subprogram: // Function
+ if (function_die)
+ *function_die = this;
+ check_children = (block_die != NULL);
+ break;
+
+ case DW_TAG_inlined_subroutine: // Inlined Function
+ case DW_TAG_lexical_block: // Block { } in code
+ if (block_die) {
+ *block_die = this;
+ check_children = true;
+ }
+ break;
-const DWARFAbbreviationDeclaration*
-DWARFDebugInfoEntry::GetAbbreviationDeclarationPtr (SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit *cu,
- lldb::offset_t &offset) const
-{
- if (dwarf2Data)
- {
- offset = GetOffset();
-
- const DWARFAbbreviationDeclarationSet *abbrev_set = cu->GetAbbreviations();
- if (abbrev_set)
- {
- const DWARFAbbreviationDeclaration* abbrev_decl = abbrev_set->GetAbbreviationDeclaration (m_abbr_idx);
- if (abbrev_decl)
- {
- // Make sure the abbreviation code still matches. If it doesn't and
- // the DWARF data was mmap'ed, the backing file might have been modified
- // which is bad news.
- const uint64_t abbrev_code = dwarf2Data->get_debug_info_data().GetULEB128 (&offset);
-
- if (abbrev_decl->Code() == abbrev_code)
- return abbrev_decl;
-
- dwarf2Data->GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("0x%8.8x: the DWARF debug information has been modified (abbrev code was %u, and is now %u)",
- GetOffset(),
- (uint32_t)abbrev_decl->Code(),
- (uint32_t)abbrev_code);
+ default:
+ check_children = true;
+ break;
}
+ } else {
+ check_children = false;
+ }
}
+ }
}
- offset = DW_INVALID_OFFSET;
- return NULL;
-}
-
-bool
-DWARFDebugInfoEntry::OffsetLessThan (const DWARFDebugInfoEntry& a, const DWARFDebugInfoEntry& b)
-{
- return a.GetOffset() < b.GetOffset();
+ if (check_children) {
+ // printf("checking children\n");
+ DWARFDebugInfoEntry *child = GetFirstChild();
+ while (child) {
+ if (child->LookupAddress(address, dwarf2Data, cu, function_die,
+ block_die))
+ return true;
+ child = child->GetSibling();
+ }
+ }
+ }
+ return found_address;
}
-void
-DWARFDebugInfoEntry::DumpDIECollection (Stream &strm, DWARFDebugInfoEntry::collection &die_collection)
-{
- DWARFDebugInfoEntry::const_iterator pos;
- DWARFDebugInfoEntry::const_iterator end = die_collection.end();
- strm.PutCString("\noffset parent sibling child\n");
- strm.PutCString("-------- -------- -------- --------\n");
- for (pos = die_collection.begin(); pos != end; ++pos)
- {
- const DWARFDebugInfoEntry& die_ref = *pos;
- const DWARFDebugInfoEntry* p = die_ref.GetParent();
- const DWARFDebugInfoEntry* s = die_ref.GetSibling();
- const DWARFDebugInfoEntry* c = die_ref.GetFirstChild();
- strm.Printf("%.8x: %.8x %.8x %.8x 0x%4.4x %s%s\n",
- die_ref.GetOffset(),
- p ? p->GetOffset() : 0,
- s ? s->GetOffset() : 0,
- c ? c->GetOffset() : 0,
- die_ref.Tag(),
- DW_TAG_value_to_name(die_ref.Tag()),
- die_ref.HasChildren() ? " *" : "");
+const DWARFAbbreviationDeclaration *
+DWARFDebugInfoEntry::GetAbbreviationDeclarationPtr(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ lldb::offset_t &offset) const {
+ if (dwarf2Data) {
+ offset = GetOffset();
+
+ const DWARFAbbreviationDeclarationSet *abbrev_set = cu->GetAbbreviations();
+ if (abbrev_set) {
+ const DWARFAbbreviationDeclaration *abbrev_decl =
+ abbrev_set->GetAbbreviationDeclaration(m_abbr_idx);
+ if (abbrev_decl) {
+ // Make sure the abbreviation code still matches. If it doesn't and
+ // the DWARF data was mmap'ed, the backing file might have been modified
+ // which is bad news.
+ const uint64_t abbrev_code =
+ dwarf2Data->get_debug_info_data().GetULEB128(&offset);
+
+ if (abbrev_decl->Code() == abbrev_code)
+ return abbrev_decl;
+
+ dwarf2Data->GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "0x%8.8x: the DWARF debug information has been modified (abbrev "
+ "code was %u, and is now %u)",
+ GetOffset(), (uint32_t)abbrev_decl->Code(), (uint32_t)abbrev_code);
+ }
}
+ }
+ offset = DW_INVALID_OFFSET;
+ return NULL;
}
+bool DWARFDebugInfoEntry::OffsetLessThan(const DWARFDebugInfoEntry &a,
+ const DWARFDebugInfoEntry &b) {
+ return a.GetOffset() < b.GetOffset();
+}
+void DWARFDebugInfoEntry::DumpDIECollection(
+ Stream &strm, DWARFDebugInfoEntry::collection &die_collection) {
+ DWARFDebugInfoEntry::const_iterator pos;
+ DWARFDebugInfoEntry::const_iterator end = die_collection.end();
+ strm.PutCString("\noffset parent sibling child\n");
+ strm.PutCString("-------- -------- -------- --------\n");
+ for (pos = die_collection.begin(); pos != end; ++pos) {
+ const DWARFDebugInfoEntry &die_ref = *pos;
+ const DWARFDebugInfoEntry *p = die_ref.GetParent();
+ const DWARFDebugInfoEntry *s = die_ref.GetSibling();
+ const DWARFDebugInfoEntry *c = die_ref.GetFirstChild();
+ strm.Printf("%.8x: %.8x %.8x %.8x 0x%4.4x %s%s\n", die_ref.GetOffset(),
+ p ? p->GetOffset() : 0, s ? s->GetOffset() : 0,
+ c ? c->GetOffset() : 0, die_ref.Tag(),
+ DW_TAG_value_to_name(die_ref.Tag()),
+ die_ref.HasChildren() ? " *" : "");
+ }
+}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
index 27b4fe93bc3..15abac77a47 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
@@ -13,390 +13,295 @@
#include "SymbolFileDWARF.h"
#include "llvm/ADT/SmallVector.h"
-#include "DWARFDebugAbbrev.h"
#include "DWARFAbbreviationDeclaration.h"
+#include "DWARFDebugAbbrev.h"
#include "DWARFDebugRanges.h"
-#include <vector>
#include <map>
#include <set>
+#include <vector>
-typedef std::map<const DWARFDebugInfoEntry*, dw_addr_t> DIEToAddressMap;
-typedef DIEToAddressMap::iterator DIEToAddressMapIter;
-typedef DIEToAddressMap::const_iterator DIEToAddressMapConstIter;
-
-typedef std::map<dw_addr_t, const DWARFDebugInfoEntry*> AddressToDIEMap;
-typedef AddressToDIEMap::iterator AddressToDIEMapIter;
-typedef AddressToDIEMap::const_iterator AddressToDIEMapConstIter;
+typedef std::map<const DWARFDebugInfoEntry *, dw_addr_t> DIEToAddressMap;
+typedef DIEToAddressMap::iterator DIEToAddressMapIter;
+typedef DIEToAddressMap::const_iterator DIEToAddressMapConstIter;
+typedef std::map<dw_addr_t, const DWARFDebugInfoEntry *> AddressToDIEMap;
+typedef AddressToDIEMap::iterator AddressToDIEMapIter;
+typedef AddressToDIEMap::const_iterator AddressToDIEMapConstIter;
-typedef std::map<dw_offset_t, dw_offset_t> DIEToDIEMap;
-typedef DIEToDIEMap::iterator DIEToDIEMapIter;
-typedef DIEToDIEMap::const_iterator DIEToDIEMapConstIter;
+typedef std::map<dw_offset_t, dw_offset_t> DIEToDIEMap;
+typedef DIEToDIEMap::iterator DIEToDIEMapIter;
+typedef DIEToDIEMap::const_iterator DIEToDIEMapConstIter;
-typedef std::map<uint32_t, const DWARFDebugInfoEntry*> UInt32ToDIEMap;
-typedef UInt32ToDIEMap::iterator UInt32ToDIEMapIter;
-typedef UInt32ToDIEMap::const_iterator UInt32ToDIEMapConstIter;
+typedef std::map<uint32_t, const DWARFDebugInfoEntry *> UInt32ToDIEMap;
+typedef UInt32ToDIEMap::iterator UInt32ToDIEMapIter;
+typedef UInt32ToDIEMap::const_iterator UInt32ToDIEMapConstIter;
-typedef std::multimap<uint32_t, const DWARFDebugInfoEntry*> UInt32ToDIEMMap;
-typedef UInt32ToDIEMMap::iterator UInt32ToDIEMMapIter;
-typedef UInt32ToDIEMMap::const_iterator UInt32ToDIEMMapConstIter;
+typedef std::multimap<uint32_t, const DWARFDebugInfoEntry *> UInt32ToDIEMMap;
+typedef UInt32ToDIEMMap::iterator UInt32ToDIEMMapIter;
+typedef UInt32ToDIEMMap::const_iterator UInt32ToDIEMMapConstIter;
class DWARFDeclContext;
#define DIE_SIBLING_IDX_BITSIZE 31
#define DIE_ABBR_IDX_BITSIZE 15
-class DWARFDebugInfoEntry
-{
+class DWARFDebugInfoEntry {
public:
- typedef std::vector<DWARFDebugInfoEntry> collection;
- typedef collection::iterator iterator;
- typedef collection::const_iterator const_iterator;
-
- typedef std::vector<dw_offset_t> offset_collection;
- typedef offset_collection::iterator offset_collection_iterator;
- typedef offset_collection::const_iterator offset_collection_const_iterator;
-
- DWARFDebugInfoEntry():
- m_offset (DW_INVALID_OFFSET),
- m_parent_idx (0),
- m_sibling_idx (0),
- m_empty_children(false),
- m_abbr_idx (0),
- m_has_children (false),
- m_tag (0)
- {
- }
-
- void Clear ()
- {
- m_offset = DW_INVALID_OFFSET;
- m_parent_idx = 0;
- m_sibling_idx = 0;
- m_empty_children = false;
- m_abbr_idx = 0;
- m_has_children = false;
- m_tag = 0;
- }
-
- bool Contains (const DWARFDebugInfoEntry *die) const;
-
- void BuildAddressRangeTable(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFDebugAranges* debug_aranges) const;
-
- void BuildFunctionAddressRangeTable(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFDebugAranges* debug_aranges) const;
-
- bool FastExtract(
- const lldb_private::DWARFDataExtractor& debug_info_data,
- const DWARFCompileUnit* cu,
- const DWARFFormValue::FixedFormSizes& fixed_form_sizes,
- lldb::offset_t* offset_ptr);
-
- bool Extract(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- lldb::offset_t* offset_ptr);
-
- bool LookupAddress(
- const dw_addr_t address,
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFDebugInfoEntry** function_die,
- DWARFDebugInfoEntry** block_die);
-
- size_t GetAttributes(
- const DWARFCompileUnit* cu,
- DWARFFormValue::FixedFormSizes fixed_form_sizes,
- DWARFAttributes& attrs,
- uint32_t curr_depth = 0) const; // "curr_depth" for internal use only, don't set this yourself!!!
-
- dw_offset_t GetAttributeValue(SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- DWARFFormValue& formValue,
- dw_offset_t* end_attr_offset_ptr = nullptr,
- bool check_specification_or_abstract_origin = false) const;
-
- const char* GetAttributeValueAsString(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- const char* fail_value,
- bool check_specification_or_abstract_origin = false) const;
-
- uint64_t GetAttributeValueAsUnsigned(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin = false) const;
-
- uint64_t GetAttributeValueAsReference(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin = false) const;
-
- int64_t GetAttributeValueAsSigned(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- int64_t fail_value,
+ typedef std::vector<DWARFDebugInfoEntry> collection;
+ typedef collection::iterator iterator;
+ typedef collection::const_iterator const_iterator;
+
+ typedef std::vector<dw_offset_t> offset_collection;
+ typedef offset_collection::iterator offset_collection_iterator;
+ typedef offset_collection::const_iterator offset_collection_const_iterator;
+
+ DWARFDebugInfoEntry()
+ : m_offset(DW_INVALID_OFFSET), m_parent_idx(0), m_sibling_idx(0),
+ m_empty_children(false), m_abbr_idx(0), m_has_children(false),
+ m_tag(0) {}
+
+ void Clear() {
+ m_offset = DW_INVALID_OFFSET;
+ m_parent_idx = 0;
+ m_sibling_idx = 0;
+ m_empty_children = false;
+ m_abbr_idx = 0;
+ m_has_children = false;
+ m_tag = 0;
+ }
+
+ bool Contains(const DWARFDebugInfoEntry *die) const;
+
+ void BuildAddressRangeTable(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ DWARFDebugAranges *debug_aranges) const;
+
+ void BuildFunctionAddressRangeTable(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ DWARFDebugAranges *debug_aranges) const;
+
+ bool FastExtract(const lldb_private::DWARFDataExtractor &debug_info_data,
+ const DWARFCompileUnit *cu,
+ const DWARFFormValue::FixedFormSizes &fixed_form_sizes,
+ lldb::offset_t *offset_ptr);
+
+ bool Extract(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ lldb::offset_t *offset_ptr);
+
+ bool LookupAddress(const dw_addr_t address, SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ DWARFDebugInfoEntry **function_die,
+ DWARFDebugInfoEntry **block_die);
+
+ size_t GetAttributes(const DWARFCompileUnit *cu,
+ DWARFFormValue::FixedFormSizes fixed_form_sizes,
+ DWARFAttributes &attrs,
+ uint32_t curr_depth = 0)
+ const; // "curr_depth" for internal use only, don't set this yourself!!!
+
+ dw_offset_t
+ GetAttributeValue(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, DWARFFormValue &formValue,
+ dw_offset_t *end_attr_offset_ptr = nullptr,
bool check_specification_or_abstract_origin = false) const;
- uint64_t GetAttributeValueAsAddress(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_attr_t attr,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin = false) const;
-
- dw_addr_t GetAttributeHighPC(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- dw_addr_t lo_pc,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin = false) const;
-
- bool GetAttributeAddressRange(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- dw_addr_t& lo_pc,
- dw_addr_t& hi_pc,
- uint64_t fail_value,
- bool check_specification_or_abstract_origin = false) const;
-
- size_t GetAttributeAddressRanges (
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- DWARFRangeList &ranges,
- bool check_hi_lo_pc,
- bool check_specification_or_abstract_origin = false) const;
-
- const char* GetName(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu) const;
-
- const char* GetMangledName(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- bool substitute_name_allowed = true) const;
-
- const char* GetPubname(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu) const;
-
- static bool GetName(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_offset_t die_offset,
- lldb_private::Stream &s);
-
- static bool AppendTypeName(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const dw_offset_t die_offset,
- lldb_private::Stream &s);
-
- const char * GetQualifiedName (
- SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- std::string &storage) const;
-
- const char * GetQualifiedName (
- SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- const DWARFAttributes& attributes,
- std::string &storage) const;
-
- static bool OffsetLessThan (
- const DWARFDebugInfoEntry& a,
- const DWARFDebugInfoEntry& b);
-
- void Dump(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- lldb_private::Stream &s,
- uint32_t recurse_depth) const;
-
- void DumpAncestry(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const DWARFDebugInfoEntry* oldest,
- lldb_private::Stream &s,
+ const char *GetAttributeValueAsString(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, const char *fail_value,
+ bool check_specification_or_abstract_origin = false) const;
+
+ uint64_t GetAttributeValueAsUnsigned(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, uint64_t fail_value,
+ bool check_specification_or_abstract_origin = false) const;
+
+ uint64_t GetAttributeValueAsReference(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, uint64_t fail_value,
+ bool check_specification_or_abstract_origin = false) const;
+
+ int64_t GetAttributeValueAsSigned(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, int64_t fail_value,
+ bool check_specification_or_abstract_origin = false) const;
+
+ uint64_t GetAttributeValueAsAddress(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_attr_t attr, uint64_t fail_value,
+ bool check_specification_or_abstract_origin = false) const;
+
+ dw_addr_t
+ GetAttributeHighPC(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ dw_addr_t lo_pc, uint64_t fail_value,
+ bool check_specification_or_abstract_origin = false) const;
+
+ bool GetAttributeAddressRange(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu, dw_addr_t &lo_pc,
+ dw_addr_t &hi_pc, uint64_t fail_value,
+ bool check_specification_or_abstract_origin = false) const;
+
+ size_t GetAttributeAddressRanges(
+ SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ DWARFRangeList &ranges, bool check_hi_lo_pc,
+ bool check_specification_or_abstract_origin = false) const;
+
+ const char *GetName(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu) const;
+
+ const char *GetMangledName(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ bool substitute_name_allowed = true) const;
+
+ const char *GetPubname(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu) const;
+
+ static bool GetName(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const dw_offset_t die_offset, lldb_private::Stream &s);
+
+ static bool AppendTypeName(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ const dw_offset_t die_offset,
+ lldb_private::Stream &s);
+
+ const char *GetQualifiedName(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu,
+ std::string &storage) const;
+
+ const char *GetQualifiedName(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu,
+ const DWARFAttributes &attributes,
+ std::string &storage) const;
+
+ static bool OffsetLessThan(const DWARFDebugInfoEntry &a,
+ const DWARFDebugInfoEntry &b);
+
+ void Dump(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ lldb_private::Stream &s, uint32_t recurse_depth) const;
+
+ void DumpAncestry(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const DWARFDebugInfoEntry *oldest, lldb_private::Stream &s,
uint32_t recurse_depth) const;
- static void DumpAttribute(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const lldb_private::DWARFDataExtractor& debug_info_data,
- lldb::offset_t *offset_ptr,
- lldb_private::Stream &s,
- dw_attr_t attr,
- dw_form_t form);
- // This one dumps the comp unit name, objfile name and die offset for this die so the stream S.
- void DumpLocation(
- SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
+ static void
+ DumpAttribute(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const lldb_private::DWARFDataExtractor &debug_info_data,
+ lldb::offset_t *offset_ptr, lldb_private::Stream &s,
+ dw_attr_t attr, dw_form_t form);
+ // This one dumps the comp unit name, objfile name and die offset for this die
+ // so the stream S.
+ void DumpLocation(SymbolFileDWARF *dwarf2Data, DWARFCompileUnit *cu,
lldb_private::Stream &s) const;
-
- bool GetDIENamesAndRanges(
- SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit* cu,
- const char * &name,
- const char * &mangled,
- DWARFRangeList& rangeList,
- int& decl_file,
- int& decl_line,
- int& decl_column,
- int& call_file,
- int& call_line,
- int& call_column,
- lldb_private::DWARFExpression *frame_base = NULL) const;
-
- const DWARFAbbreviationDeclaration*
- GetAbbreviationDeclarationPtr (SymbolFileDWARF* dwarf2Data,
- const DWARFCompileUnit *cu,
- lldb::offset_t &offset) const;
-
- dw_tag_t
- Tag () const
- {
- return m_tag;
- }
-
- bool
- IsNULL() const
- {
- return m_abbr_idx == 0;
- }
-
- dw_offset_t
- GetOffset () const
- {
- return m_offset;
- }
-
- void
- SetOffset (dw_offset_t offset)
- {
- m_offset = offset;
- }
-
- bool
- HasChildren () const
- {
- return m_has_children;
- }
-
- void
- SetHasChildren (bool b)
- {
- m_has_children = b;
- }
-
- // We know we are kept in a vector of contiguous entries, so we know
- // our parent will be some index behind "this".
- DWARFDebugInfoEntry* GetParent() { return m_parent_idx > 0 ? this - m_parent_idx : NULL; }
- const DWARFDebugInfoEntry* GetParent() const { return m_parent_idx > 0 ? this - m_parent_idx : NULL; }
- // We know we are kept in a vector of contiguous entries, so we know
- // our sibling will be some index after "this".
- DWARFDebugInfoEntry* GetSibling() { return m_sibling_idx > 0 ? this + m_sibling_idx : NULL; }
- const DWARFDebugInfoEntry* GetSibling() const { return m_sibling_idx > 0 ? this + m_sibling_idx : NULL; }
- // We know we are kept in a vector of contiguous entries, so we know
- // we don't need to store our child pointer, if we have a child it will
- // be the next entry in the list...
- DWARFDebugInfoEntry* GetFirstChild() { return (HasChildren() && !m_empty_children) ? this + 1 : NULL; }
- const DWARFDebugInfoEntry* GetFirstChild() const { return (HasChildren() && !m_empty_children) ? this + 1 : NULL; }
-
-
- void GetDeclContextDIEs (DWARFCompileUnit* cu,
- DWARFDIECollection &decl_context_dies) const;
-
- void GetDWARFDeclContext (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- DWARFDeclContext &dwarf_decl_ctx) const;
-
-
- bool MatchesDWARFDeclContext(SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- const DWARFDeclContext &dwarf_decl_ctx) const;
-
- DWARFDIE GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu) const;
- DWARFDIE GetParentDeclContextDIE (SymbolFileDWARF* dwarf2Data,
- DWARFCompileUnit* cu,
- const DWARFAttributes& attributes) const;
-
- void
- SetParent (DWARFDebugInfoEntry* parent)
- {
- if (parent)
- {
- // We know we are kept in a vector of contiguous entries, so we know
- // our parent will be some index behind "this".
- m_parent_idx = this - parent;
- }
- else
- m_parent_idx = 0;
- }
- void
- SetSibling (DWARFDebugInfoEntry* sibling)
- {
- if (sibling)
- {
- // We know we are kept in a vector of contiguous entries, so we know
- // our sibling will be some index after "this".
- m_sibling_idx = sibling - this;
- sibling->SetParent(GetParent());
- }
- else
- m_sibling_idx = 0;
- }
-
- void
- SetSiblingIndex (uint32_t idx)
- {
- m_sibling_idx = idx;
- }
-
- void
- SetParentIndex (uint32_t idx)
- {
- m_parent_idx = idx;
- }
-
- bool
- GetEmptyChildren () const
- {
- return m_empty_children;
- }
-
- void
- SetEmptyChildren (bool b)
- {
- m_empty_children = b;
- }
-
- static void
- DumpDIECollection (lldb_private::Stream &strm,
- DWARFDebugInfoEntry::collection &die_collection);
-protected:
+ bool
+ GetDIENamesAndRanges(SymbolFileDWARF *dwarf2Data, const DWARFCompileUnit *cu,
+ const char *&name, const char *&mangled,
+ DWARFRangeList &rangeList, int &decl_file,
+ int &decl_line, int &decl_column, int &call_file,
+ int &call_line, int &call_column,
+ lldb_private::DWARFExpression *frame_base = NULL) const;
+
+ const DWARFAbbreviationDeclaration *
+ GetAbbreviationDeclarationPtr(SymbolFileDWARF *dwarf2Data,
+ const DWARFCompileUnit *cu,
+ lldb::offset_t &offset) const;
+
+ dw_tag_t Tag() const { return m_tag; }
+
+ bool IsNULL() const { return m_abbr_idx == 0; }
+
+ dw_offset_t GetOffset() const { return m_offset; }
+
+ void SetOffset(dw_offset_t offset) { m_offset = offset; }
+
+ bool HasChildren() const { return m_has_children; }
+
+ void SetHasChildren(bool b) { m_has_children = b; }
+
+ // We know we are kept in a vector of contiguous entries, so we know
+ // our parent will be some index behind "this".
+ DWARFDebugInfoEntry *GetParent() {
+ return m_parent_idx > 0 ? this - m_parent_idx : NULL;
+ }
+ const DWARFDebugInfoEntry *GetParent() const {
+ return m_parent_idx > 0 ? this - m_parent_idx : NULL;
+ }
+ // We know we are kept in a vector of contiguous entries, so we know
+ // our sibling will be some index after "this".
+ DWARFDebugInfoEntry *GetSibling() {
+ return m_sibling_idx > 0 ? this + m_sibling_idx : NULL;
+ }
+ const DWARFDebugInfoEntry *GetSibling() const {
+ return m_sibling_idx > 0 ? this + m_sibling_idx : NULL;
+ }
+ // We know we are kept in a vector of contiguous entries, so we know
+ // we don't need to store our child pointer, if we have a child it will
+ // be the next entry in the list...
+ DWARFDebugInfoEntry *GetFirstChild() {
+ return (HasChildren() && !m_empty_children) ? this + 1 : NULL;
+ }
+ const DWARFDebugInfoEntry *GetFirstChild() const {
+ return (HasChildren() && !m_empty_children) ? this + 1 : NULL;
+ }
+
+ void GetDeclContextDIEs(DWARFCompileUnit *cu,
+ DWARFDIECollection &decl_context_dies) const;
+
+ void GetDWARFDeclContext(SymbolFileDWARF *dwarf2Data, DWARFCompileUnit *cu,
+ DWARFDeclContext &dwarf_decl_ctx) const;
+
+ bool MatchesDWARFDeclContext(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu,
+ const DWARFDeclContext &dwarf_decl_ctx) const;
+
+ DWARFDIE GetParentDeclContextDIE(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu) const;
+ DWARFDIE GetParentDeclContextDIE(SymbolFileDWARF *dwarf2Data,
+ DWARFCompileUnit *cu,
+ const DWARFAttributes &attributes) const;
+
+ void SetParent(DWARFDebugInfoEntry *parent) {
+ if (parent) {
+ // We know we are kept in a vector of contiguous entries, so we know
+ // our parent will be some index behind "this".
+ m_parent_idx = this - parent;
+ } else
+ m_parent_idx = 0;
+ }
+ void SetSibling(DWARFDebugInfoEntry *sibling) {
+ if (sibling) {
+ // We know we are kept in a vector of contiguous entries, so we know
+ // our sibling will be some index after "this".
+ m_sibling_idx = sibling - this;
+ sibling->SetParent(GetParent());
+ } else
+ m_sibling_idx = 0;
+ }
+
+ void SetSiblingIndex(uint32_t idx) { m_sibling_idx = idx; }
+
+ void SetParentIndex(uint32_t idx) { m_parent_idx = idx; }
+
+ bool GetEmptyChildren() const { return m_empty_children; }
+
+ void SetEmptyChildren(bool b) { m_empty_children = b; }
+
+ static void
+ DumpDIECollection(lldb_private::Stream &strm,
+ DWARFDebugInfoEntry::collection &die_collection);
- dw_offset_t m_offset; // Offset within the .debug_info of the start of this entry
- uint32_t m_parent_idx; // How many to subtract from "this" to get the parent. If zero this die has no parent
- uint32_t m_sibling_idx:31, // How many to add to "this" to get the sibling.
- m_empty_children:1; // If a DIE says it had children, yet it just contained a NULL tag, this will be set.
- uint32_t m_abbr_idx:DIE_ABBR_IDX_BITSIZE,
- m_has_children:1, // Set to 1 if this DIE has children
- m_tag:16; // A copy of the DW_TAG value so we don't have to go through the compile unit abbrev table
+protected:
+ dw_offset_t
+ m_offset; // Offset within the .debug_info of the start of this entry
+ uint32_t m_parent_idx; // How many to subtract from "this" to get the parent.
+ // If zero this die has no parent
+ uint32_t m_sibling_idx : 31, // How many to add to "this" to get the sibling.
+ m_empty_children : 1; // If a DIE says it had children, yet it just
+ // contained a NULL tag, this will be set.
+ uint32_t m_abbr_idx : DIE_ABBR_IDX_BITSIZE,
+ m_has_children : 1, // Set to 1 if this DIE has children
+ m_tag : 16; // A copy of the DW_TAG value so we don't
+ // have to go through the compile unit
+ // abbrev table
};
-#endif // SymbolFileDWARF_DWARFDebugInfoEntry_h_
+#endif // SymbolFileDWARF_DWARFDebugInfoEntry_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp
index 180e47df6fd..d3f4d24e4ce 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp
@@ -18,8 +18,8 @@
#include "lldb/Core/Timer.h"
#include "lldb/Host/Host.h"
-#include "SymbolFileDWARF.h"
#include "LogChannelDWARF.h"
+#include "SymbolFileDWARF.h"
using namespace lldb;
using namespace lldb_private;
@@ -31,359 +31,329 @@ using namespace std;
// Parse all information in the debug_line_data into an internal
// representation.
//----------------------------------------------------------------------
-void
-DWARFDebugLine::Parse(const DWARFDataExtractor& debug_line_data)
-{
- m_lineTableMap.clear();
- lldb::offset_t offset = 0;
- LineTable::shared_ptr line_table_sp(new LineTable);
- while (debug_line_data.ValidOffset(offset))
- {
- const lldb::offset_t debug_line_offset = offset;
-
- if (line_table_sp.get() == NULL)
- break;
-
- if (ParseStatementTable(debug_line_data, &offset, line_table_sp.get()))
- {
- // Make sure we don't don't loop infinitely
- if (offset <= debug_line_offset)
- break;
- //DEBUG_PRINTF("m_lineTableMap[0x%8.8x] = line_table_sp\n", debug_line_offset);
- m_lineTableMap[debug_line_offset] = line_table_sp;
- line_table_sp.reset(new LineTable);
- }
- else
- ++offset; // Try next byte in line table
- }
+void DWARFDebugLine::Parse(const DWARFDataExtractor &debug_line_data) {
+ m_lineTableMap.clear();
+ lldb::offset_t offset = 0;
+ LineTable::shared_ptr line_table_sp(new LineTable);
+ while (debug_line_data.ValidOffset(offset)) {
+ const lldb::offset_t debug_line_offset = offset;
+
+ if (line_table_sp.get() == NULL)
+ break;
+
+ if (ParseStatementTable(debug_line_data, &offset, line_table_sp.get())) {
+ // Make sure we don't don't loop infinitely
+ if (offset <= debug_line_offset)
+ break;
+ // DEBUG_PRINTF("m_lineTableMap[0x%8.8x] = line_table_sp\n",
+ // debug_line_offset);
+ m_lineTableMap[debug_line_offset] = line_table_sp;
+ line_table_sp.reset(new LineTable);
+ } else
+ ++offset; // Try next byte in line table
+ }
}
-void
-DWARFDebugLine::ParseIfNeeded(const DWARFDataExtractor& debug_line_data)
-{
- if (m_lineTableMap.empty())
- Parse(debug_line_data);
+void DWARFDebugLine::ParseIfNeeded(const DWARFDataExtractor &debug_line_data) {
+ if (m_lineTableMap.empty())
+ Parse(debug_line_data);
}
-
//----------------------------------------------------------------------
// DWARFDebugLine::GetLineTable
//----------------------------------------------------------------------
DWARFDebugLine::LineTable::shared_ptr
-DWARFDebugLine::GetLineTable(const dw_offset_t offset) const
-{
- DWARFDebugLine::LineTable::shared_ptr line_table_shared_ptr;
- LineTableConstIter pos = m_lineTableMap.find(offset);
- if (pos != m_lineTableMap.end())
- line_table_shared_ptr = pos->second;
- return line_table_shared_ptr;
+DWARFDebugLine::GetLineTable(const dw_offset_t offset) const {
+ DWARFDebugLine::LineTable::shared_ptr line_table_shared_ptr;
+ LineTableConstIter pos = m_lineTableMap.find(offset);
+ if (pos != m_lineTableMap.end())
+ line_table_shared_ptr = pos->second;
+ return line_table_shared_ptr;
}
-
//----------------------------------------------------------------------
// DumpStateToFile
//----------------------------------------------------------------------
-static void
-DumpStateToFile (dw_offset_t offset, const DWARFDebugLine::State& state, void* userData)
-{
- Log *log = (Log *)userData;
- if (state.row == DWARFDebugLine::State::StartParsingLineTable)
- {
- // If the row is zero we are being called with the prologue only
- state.prologue->Dump (log);
- log->PutCString ("Address Line Column File");
- log->PutCString ("------------------ ------ ------ ------");
- }
- else if (state.row == DWARFDebugLine::State::DoneParsingLineTable)
- {
- // Done parsing line table
- }
- else
- {
- log->Printf( "0x%16.16" PRIx64 " %6u %6u %6u%s\n", state.address, state.line, state.column, state.file, state.end_sequence ? " END" : "");
- }
+static void DumpStateToFile(dw_offset_t offset,
+ const DWARFDebugLine::State &state,
+ void *userData) {
+ Log *log = (Log *)userData;
+ if (state.row == DWARFDebugLine::State::StartParsingLineTable) {
+ // If the row is zero we are being called with the prologue only
+ state.prologue->Dump(log);
+ log->PutCString("Address Line Column File");
+ log->PutCString("------------------ ------ ------ ------");
+ } else if (state.row == DWARFDebugLine::State::DoneParsingLineTable) {
+ // Done parsing line table
+ } else {
+ log->Printf("0x%16.16" PRIx64 " %6u %6u %6u%s\n", state.address, state.line,
+ state.column, state.file, state.end_sequence ? " END" : "");
+ }
}
//----------------------------------------------------------------------
// DWARFDebugLine::DumpLineTableRows
//----------------------------------------------------------------------
-bool
-DWARFDebugLine::DumpLineTableRows(Log *log, SymbolFileDWARF* dwarf2Data, dw_offset_t debug_line_offset)
-{
- const DWARFDataExtractor& debug_line_data = dwarf2Data->get_debug_line_data();
-
- if (debug_line_offset == DW_INVALID_OFFSET)
- {
- // Dump line table to a single file only
- debug_line_offset = 0;
- while (debug_line_data.ValidOffset(debug_line_offset))
- debug_line_offset = DumpStatementTable (log, debug_line_data, debug_line_offset);
- }
- else
- {
- // Dump line table to a single file only
- DumpStatementTable (log, debug_line_data, debug_line_offset);
- }
- return false;
+bool DWARFDebugLine::DumpLineTableRows(Log *log, SymbolFileDWARF *dwarf2Data,
+ dw_offset_t debug_line_offset) {
+ const DWARFDataExtractor &debug_line_data = dwarf2Data->get_debug_line_data();
+
+ if (debug_line_offset == DW_INVALID_OFFSET) {
+ // Dump line table to a single file only
+ debug_line_offset = 0;
+ while (debug_line_data.ValidOffset(debug_line_offset))
+ debug_line_offset =
+ DumpStatementTable(log, debug_line_data, debug_line_offset);
+ } else {
+ // Dump line table to a single file only
+ DumpStatementTable(log, debug_line_data, debug_line_offset);
+ }
+ return false;
}
//----------------------------------------------------------------------
// DWARFDebugLine::DumpStatementTable
//----------------------------------------------------------------------
dw_offset_t
-DWARFDebugLine::DumpStatementTable(Log *log, const DWARFDataExtractor& debug_line_data, const dw_offset_t debug_line_offset)
-{
- if (debug_line_data.ValidOffset(debug_line_offset))
- {
- lldb::offset_t offset = debug_line_offset;
- log->Printf( "----------------------------------------------------------------------\n"
- "debug_line[0x%8.8x]\n"
- "----------------------------------------------------------------------\n", debug_line_offset);
-
- if (ParseStatementTable(debug_line_data, &offset, DumpStateToFile, log))
- return offset;
- else
- return debug_line_offset + 1; // Skip to next byte in .debug_line section
- }
+DWARFDebugLine::DumpStatementTable(Log *log,
+ const DWARFDataExtractor &debug_line_data,
+ const dw_offset_t debug_line_offset) {
+ if (debug_line_data.ValidOffset(debug_line_offset)) {
+ lldb::offset_t offset = debug_line_offset;
+ log->Printf("--------------------------------------------------------------"
+ "--------\n"
+ "debug_line[0x%8.8x]\n"
+ "--------------------------------------------------------------"
+ "--------\n",
+ debug_line_offset);
+
+ if (ParseStatementTable(debug_line_data, &offset, DumpStateToFile, log))
+ return offset;
+ else
+ return debug_line_offset + 1; // Skip to next byte in .debug_line section
+ }
- return DW_INVALID_OFFSET;
+ return DW_INVALID_OFFSET;
}
-
//----------------------------------------------------------------------
// DumpOpcodes
//----------------------------------------------------------------------
-bool
-DWARFDebugLine::DumpOpcodes(Log *log, SymbolFileDWARF* dwarf2Data, dw_offset_t debug_line_offset, uint32_t dump_flags)
-{
- const DWARFDataExtractor& debug_line_data = dwarf2Data->get_debug_line_data();
-
- if (debug_line_data.GetByteSize() == 0)
- {
- log->Printf( "< EMPTY >\n");
- return false;
- }
+bool DWARFDebugLine::DumpOpcodes(Log *log, SymbolFileDWARF *dwarf2Data,
+ dw_offset_t debug_line_offset,
+ uint32_t dump_flags) {
+ const DWARFDataExtractor &debug_line_data = dwarf2Data->get_debug_line_data();
- if (debug_line_offset == DW_INVALID_OFFSET)
- {
- // Dump line table to a single file only
- debug_line_offset = 0;
- while (debug_line_data.ValidOffset(debug_line_offset))
- debug_line_offset = DumpStatementOpcodes (log, debug_line_data, debug_line_offset, dump_flags);
- }
- else
- {
- // Dump line table to a single file only
- DumpStatementOpcodes (log, debug_line_data, debug_line_offset, dump_flags);
- }
+ if (debug_line_data.GetByteSize() == 0) {
+ log->Printf("< EMPTY >\n");
return false;
+ }
+
+ if (debug_line_offset == DW_INVALID_OFFSET) {
+ // Dump line table to a single file only
+ debug_line_offset = 0;
+ while (debug_line_data.ValidOffset(debug_line_offset))
+ debug_line_offset = DumpStatementOpcodes(log, debug_line_data,
+ debug_line_offset, dump_flags);
+ } else {
+ // Dump line table to a single file only
+ DumpStatementOpcodes(log, debug_line_data, debug_line_offset, dump_flags);
+ }
+ return false;
}
//----------------------------------------------------------------------
// DumpStatementOpcodes
//----------------------------------------------------------------------
-dw_offset_t
-DWARFDebugLine::DumpStatementOpcodes(Log *log, const DWARFDataExtractor& debug_line_data, const dw_offset_t debug_line_offset, uint32_t flags)
-{
- lldb::offset_t offset = debug_line_offset;
- if (debug_line_data.ValidOffset(offset))
- {
- Prologue prologue;
-
- if (ParsePrologue(debug_line_data, &offset, &prologue))
- {
- log->PutCString ("----------------------------------------------------------------------");
- log->Printf ("debug_line[0x%8.8x]", debug_line_offset);
- log->PutCString ("----------------------------------------------------------------------\n");
- prologue.Dump (log);
- }
- else
- {
- offset = debug_line_offset;
- log->Printf( "0x%8.8" PRIx64 ": skipping pad byte %2.2x", offset, debug_line_data.GetU8(&offset));
- return offset;
- }
-
- Row row(prologue.default_is_stmt);
- const dw_offset_t end_offset = debug_line_offset + prologue.total_length + sizeof(prologue.total_length);
+dw_offset_t DWARFDebugLine::DumpStatementOpcodes(
+ Log *log, const DWARFDataExtractor &debug_line_data,
+ const dw_offset_t debug_line_offset, uint32_t flags) {
+ lldb::offset_t offset = debug_line_offset;
+ if (debug_line_data.ValidOffset(offset)) {
+ Prologue prologue;
- assert(debug_line_data.ValidOffset(end_offset-1));
+ if (ParsePrologue(debug_line_data, &offset, &prologue)) {
+ log->PutCString("--------------------------------------------------------"
+ "--------------");
+ log->Printf("debug_line[0x%8.8x]", debug_line_offset);
+ log->PutCString("--------------------------------------------------------"
+ "--------------\n");
+ prologue.Dump(log);
+ } else {
+ offset = debug_line_offset;
+ log->Printf("0x%8.8" PRIx64 ": skipping pad byte %2.2x", offset,
+ debug_line_data.GetU8(&offset));
+ return offset;
+ }
- while (offset < end_offset)
- {
- const uint32_t op_offset = offset;
- uint8_t opcode = debug_line_data.GetU8(&offset);
- switch (opcode)
- {
- case 0: // Extended Opcodes always start with a zero opcode followed by
- { // a uleb128 length so you can skip ones you don't know about
-
- dw_offset_t ext_offset = offset;
- dw_uleb128_t len = debug_line_data.GetULEB128(&offset);
- dw_offset_t arg_size = len - (offset - ext_offset);
- uint8_t sub_opcode = debug_line_data.GetU8(&offset);
-// if (verbose)
-// log->Printf( "Extended: <%u> %2.2x ", len, sub_opcode);
-
- switch (sub_opcode)
- {
- case DW_LNE_end_sequence :
- log->Printf( "0x%8.8x: DW_LNE_end_sequence", op_offset);
- row.Dump(log);
- row.Reset(prologue.default_is_stmt);
- break;
-
- case DW_LNE_set_address :
- {
- row.address = debug_line_data.GetMaxU64(&offset, arg_size);
- log->Printf( "0x%8.8x: DW_LNE_set_address (0x%" PRIx64 ")", op_offset, row.address);
- }
- break;
-
- case DW_LNE_define_file:
- {
- FileNameEntry fileEntry;
- fileEntry.name = debug_line_data.GetCStr(&offset);
- fileEntry.dir_idx = debug_line_data.GetULEB128(&offset);
- fileEntry.mod_time = debug_line_data.GetULEB128(&offset);
- fileEntry.length = debug_line_data.GetULEB128(&offset);
- log->Printf( "0x%8.8x: DW_LNE_define_file('%s', dir=%i, mod_time=0x%8.8x, length=%i )",
- op_offset,
- fileEntry.name,
- fileEntry.dir_idx,
- fileEntry.mod_time,
- fileEntry.length);
- prologue.file_names.push_back(fileEntry);
- }
- break;
-
- case DW_LNE_set_discriminator:
- {
- uint64_t discriminator = debug_line_data.GetULEB128(&offset);
- log->Printf( "0x%8.8x: DW_LNE_set_discriminator (0x%" PRIx64 ")", op_offset, discriminator);
- }
- break;
- default:
- log->Printf( "0x%8.8x: DW_LNE_??? (%2.2x) - Skipping unknown upcode", op_offset, opcode);
- // Length doesn't include the zero opcode byte or the length itself, but
- // it does include the sub_opcode, so we have to adjust for that below
- offset += arg_size;
- break;
- }
- }
- break;
-
- // Standard Opcodes
- case DW_LNS_copy:
- log->Printf( "0x%8.8x: DW_LNS_copy", op_offset);
- row.Dump (log);
- break;
-
- case DW_LNS_advance_pc:
- {
- dw_uleb128_t addr_offset_n = debug_line_data.GetULEB128(&offset);
- dw_uleb128_t addr_offset = addr_offset_n * prologue.min_inst_length;
- log->Printf( "0x%8.8x: DW_LNS_advance_pc (0x%x)", op_offset, addr_offset);
- row.address += addr_offset;
- }
- break;
-
- case DW_LNS_advance_line:
- {
- dw_sleb128_t line_offset = debug_line_data.GetSLEB128(&offset);
- log->Printf( "0x%8.8x: DW_LNS_advance_line (%i)", op_offset, line_offset);
- row.line += line_offset;
- }
- break;
-
- case DW_LNS_set_file:
- row.file = debug_line_data.GetULEB128(&offset);
- log->Printf( "0x%8.8x: DW_LNS_set_file (%u)", op_offset, row.file);
- break;
-
- case DW_LNS_set_column:
- row.column = debug_line_data.GetULEB128(&offset);
- log->Printf( "0x%8.8x: DW_LNS_set_column (%u)", op_offset, row.column);
- break;
-
- case DW_LNS_negate_stmt:
- row.is_stmt = !row.is_stmt;
- log->Printf( "0x%8.8x: DW_LNS_negate_stmt", op_offset);
- break;
-
- case DW_LNS_set_basic_block:
- row.basic_block = true;
- log->Printf( "0x%8.8x: DW_LNS_set_basic_block", op_offset);
- break;
-
- case DW_LNS_const_add_pc:
- {
- uint8_t adjust_opcode = 255 - prologue.opcode_base;
- dw_addr_t addr_offset = (adjust_opcode / prologue.line_range) * prologue.min_inst_length;
- log->Printf( "0x%8.8x: DW_LNS_const_add_pc (0x%8.8" PRIx64 ")", op_offset, addr_offset);
- row.address += addr_offset;
- }
- break;
-
- case DW_LNS_fixed_advance_pc:
- {
- uint16_t pc_offset = debug_line_data.GetU16(&offset);
- log->Printf( "0x%8.8x: DW_LNS_fixed_advance_pc (0x%4.4x)", op_offset, pc_offset);
- row.address += pc_offset;
- }
- break;
-
- case DW_LNS_set_prologue_end:
- row.prologue_end = true;
- log->Printf( "0x%8.8x: DW_LNS_set_prologue_end", op_offset);
- break;
-
- case DW_LNS_set_epilogue_begin:
- row.epilogue_begin = true;
- log->Printf( "0x%8.8x: DW_LNS_set_epilogue_begin", op_offset);
- break;
-
- case DW_LNS_set_isa:
- row.isa = debug_line_data.GetULEB128(&offset);
- log->Printf( "0x%8.8x: DW_LNS_set_isa (%u)", op_offset, row.isa);
- break;
-
- // Special Opcodes
- default:
- if (opcode < prologue.opcode_base)
- {
- // We have an opcode that this parser doesn't know about, skip
- // the number of ULEB128 numbers that is says to skip in the
- // prologue's standard_opcode_lengths array
- uint8_t n = prologue.standard_opcode_lengths[opcode-1];
- log->Printf( "0x%8.8x: Special : Unknown skipping %u ULEB128 values.", op_offset, n);
- while (n > 0)
- {
- debug_line_data.GetULEB128(&offset);
- --n;
- }
- }
- else
- {
- uint8_t adjust_opcode = opcode - prologue.opcode_base;
- dw_addr_t addr_offset = (adjust_opcode / prologue.line_range) * prologue.min_inst_length;
- int32_t line_offset = prologue.line_base + (adjust_opcode % prologue.line_range);
- log->Printf("0x%8.8x: address += 0x%" PRIx64 ", line += %i\n", op_offset, (uint64_t)addr_offset, line_offset);
- row.address += addr_offset;
- row.line += line_offset;
- row.Dump (log);
- }
- break;
- }
+ Row row(prologue.default_is_stmt);
+ const dw_offset_t end_offset = debug_line_offset + prologue.total_length +
+ sizeof(prologue.total_length);
+
+ assert(debug_line_data.ValidOffset(end_offset - 1));
+
+ while (offset < end_offset) {
+ const uint32_t op_offset = offset;
+ uint8_t opcode = debug_line_data.GetU8(&offset);
+ switch (opcode) {
+ case 0: // Extended Opcodes always start with a zero opcode followed by
+ { // a uleb128 length so you can skip ones you don't know about
+
+ dw_offset_t ext_offset = offset;
+ dw_uleb128_t len = debug_line_data.GetULEB128(&offset);
+ dw_offset_t arg_size = len - (offset - ext_offset);
+ uint8_t sub_opcode = debug_line_data.GetU8(&offset);
+ // if (verbose)
+ // log->Printf( "Extended: <%u> %2.2x ", len,
+ // sub_opcode);
+
+ switch (sub_opcode) {
+ case DW_LNE_end_sequence:
+ log->Printf("0x%8.8x: DW_LNE_end_sequence", op_offset);
+ row.Dump(log);
+ row.Reset(prologue.default_is_stmt);
+ break;
+
+ case DW_LNE_set_address: {
+ row.address = debug_line_data.GetMaxU64(&offset, arg_size);
+ log->Printf("0x%8.8x: DW_LNE_set_address (0x%" PRIx64 ")", op_offset,
+ row.address);
+ } break;
+
+ case DW_LNE_define_file: {
+ FileNameEntry fileEntry;
+ fileEntry.name = debug_line_data.GetCStr(&offset);
+ fileEntry.dir_idx = debug_line_data.GetULEB128(&offset);
+ fileEntry.mod_time = debug_line_data.GetULEB128(&offset);
+ fileEntry.length = debug_line_data.GetULEB128(&offset);
+ log->Printf("0x%8.8x: DW_LNE_define_file('%s', dir=%i, "
+ "mod_time=0x%8.8x, length=%i )",
+ op_offset, fileEntry.name, fileEntry.dir_idx,
+ fileEntry.mod_time, fileEntry.length);
+ prologue.file_names.push_back(fileEntry);
+ } break;
+
+ case DW_LNE_set_discriminator: {
+ uint64_t discriminator = debug_line_data.GetULEB128(&offset);
+ log->Printf("0x%8.8x: DW_LNE_set_discriminator (0x%" PRIx64 ")",
+ op_offset, discriminator);
+ } break;
+ default:
+ log->Printf("0x%8.8x: DW_LNE_??? (%2.2x) - Skipping unknown upcode",
+ op_offset, opcode);
+ // Length doesn't include the zero opcode byte or the length itself,
+ // but
+ // it does include the sub_opcode, so we have to adjust for that below
+ offset += arg_size;
+ break;
+ }
+ } break;
+
+ // Standard Opcodes
+ case DW_LNS_copy:
+ log->Printf("0x%8.8x: DW_LNS_copy", op_offset);
+ row.Dump(log);
+ break;
+
+ case DW_LNS_advance_pc: {
+ dw_uleb128_t addr_offset_n = debug_line_data.GetULEB128(&offset);
+ dw_uleb128_t addr_offset = addr_offset_n * prologue.min_inst_length;
+ log->Printf("0x%8.8x: DW_LNS_advance_pc (0x%x)", op_offset,
+ addr_offset);
+ row.address += addr_offset;
+ } break;
+
+ case DW_LNS_advance_line: {
+ dw_sleb128_t line_offset = debug_line_data.GetSLEB128(&offset);
+ log->Printf("0x%8.8x: DW_LNS_advance_line (%i)", op_offset,
+ line_offset);
+ row.line += line_offset;
+ } break;
+
+ case DW_LNS_set_file:
+ row.file = debug_line_data.GetULEB128(&offset);
+ log->Printf("0x%8.8x: DW_LNS_set_file (%u)", op_offset, row.file);
+ break;
+
+ case DW_LNS_set_column:
+ row.column = debug_line_data.GetULEB128(&offset);
+ log->Printf("0x%8.8x: DW_LNS_set_column (%u)", op_offset, row.column);
+ break;
+
+ case DW_LNS_negate_stmt:
+ row.is_stmt = !row.is_stmt;
+ log->Printf("0x%8.8x: DW_LNS_negate_stmt", op_offset);
+ break;
+
+ case DW_LNS_set_basic_block:
+ row.basic_block = true;
+ log->Printf("0x%8.8x: DW_LNS_set_basic_block", op_offset);
+ break;
+
+ case DW_LNS_const_add_pc: {
+ uint8_t adjust_opcode = 255 - prologue.opcode_base;
+ dw_addr_t addr_offset =
+ (adjust_opcode / prologue.line_range) * prologue.min_inst_length;
+ log->Printf("0x%8.8x: DW_LNS_const_add_pc (0x%8.8" PRIx64 ")",
+ op_offset, addr_offset);
+ row.address += addr_offset;
+ } break;
+
+ case DW_LNS_fixed_advance_pc: {
+ uint16_t pc_offset = debug_line_data.GetU16(&offset);
+ log->Printf("0x%8.8x: DW_LNS_fixed_advance_pc (0x%4.4x)", op_offset,
+ pc_offset);
+ row.address += pc_offset;
+ } break;
+
+ case DW_LNS_set_prologue_end:
+ row.prologue_end = true;
+ log->Printf("0x%8.8x: DW_LNS_set_prologue_end", op_offset);
+ break;
+
+ case DW_LNS_set_epilogue_begin:
+ row.epilogue_begin = true;
+ log->Printf("0x%8.8x: DW_LNS_set_epilogue_begin", op_offset);
+ break;
+
+ case DW_LNS_set_isa:
+ row.isa = debug_line_data.GetULEB128(&offset);
+ log->Printf("0x%8.8x: DW_LNS_set_isa (%u)", op_offset, row.isa);
+ break;
+
+ // Special Opcodes
+ default:
+ if (opcode < prologue.opcode_base) {
+ // We have an opcode that this parser doesn't know about, skip
+ // the number of ULEB128 numbers that is says to skip in the
+ // prologue's standard_opcode_lengths array
+ uint8_t n = prologue.standard_opcode_lengths[opcode - 1];
+ log->Printf("0x%8.8x: Special : Unknown skipping %u ULEB128 values.",
+ op_offset, n);
+ while (n > 0) {
+ debug_line_data.GetULEB128(&offset);
+ --n;
+ }
+ } else {
+ uint8_t adjust_opcode = opcode - prologue.opcode_base;
+ dw_addr_t addr_offset =
+ (adjust_opcode / prologue.line_range) * prologue.min_inst_length;
+ int32_t line_offset =
+ prologue.line_base + (adjust_opcode % prologue.line_range);
+ log->Printf("0x%8.8x: address += 0x%" PRIx64 ", line += %i\n",
+ op_offset, (uint64_t)addr_offset, line_offset);
+ row.address += addr_offset;
+ row.line += line_offset;
+ row.Dump(log);
}
- return end_offset;
+ break;
+ }
}
- return DW_INVALID_OFFSET;
+ return end_offset;
+ }
+ return DW_INVALID_OFFSET;
}
-
-
-
//----------------------------------------------------------------------
// Parse
//
@@ -391,120 +361,112 @@ DWARFDebugLine::DumpStatementOpcodes(Log *log, const DWARFDataExtractor& debug_l
// new prologue is parsed and every time a new row is to be added to
// the line table.
//----------------------------------------------------------------------
-void
-DWARFDebugLine::Parse(const DWARFDataExtractor& debug_line_data, DWARFDebugLine::State::Callback callback, void* userData)
-{
- lldb::offset_t offset = 0;
- if (debug_line_data.ValidOffset(offset))
- {
- if (!ParseStatementTable(debug_line_data, &offset, callback, userData))
- ++offset; // Skip to next byte in .debug_line section
- }
+void DWARFDebugLine::Parse(const DWARFDataExtractor &debug_line_data,
+ DWARFDebugLine::State::Callback callback,
+ void *userData) {
+ lldb::offset_t offset = 0;
+ if (debug_line_data.ValidOffset(offset)) {
+ if (!ParseStatementTable(debug_line_data, &offset, callback, userData))
+ ++offset; // Skip to next byte in .debug_line section
+ }
}
-
//----------------------------------------------------------------------
// DWARFDebugLine::ParsePrologue
//----------------------------------------------------------------------
-bool
-DWARFDebugLine::ParsePrologue(const DWARFDataExtractor& debug_line_data, lldb::offset_t* offset_ptr, Prologue* prologue)
-{
- const lldb::offset_t prologue_offset = *offset_ptr;
-
- //DEBUG_PRINTF("0x%8.8x: ParsePrologue()\n", *offset_ptr);
-
- prologue->Clear();
- uint32_t i;
- const char * s;
- prologue->total_length = debug_line_data.GetDWARFInitialLength(offset_ptr);
- prologue->version = debug_line_data.GetU16(offset_ptr);
- if (prologue->version < 2 || prologue->version > 4)
- return false;
-
- prologue->prologue_length = debug_line_data.GetDWARFOffset(offset_ptr);
- const lldb::offset_t end_prologue_offset = prologue->prologue_length + *offset_ptr;
- prologue->min_inst_length = debug_line_data.GetU8(offset_ptr);
- if (prologue->version >= 4)
- prologue->maximum_operations_per_instruction = debug_line_data.GetU8(offset_ptr);
- else
- prologue->maximum_operations_per_instruction = 1;
- prologue->default_is_stmt = debug_line_data.GetU8(offset_ptr);
- prologue->line_base = debug_line_data.GetU8(offset_ptr);
- prologue->line_range = debug_line_data.GetU8(offset_ptr);
- prologue->opcode_base = debug_line_data.GetU8(offset_ptr);
-
- prologue->standard_opcode_lengths.reserve(prologue->opcode_base-1);
-
- for (i=1; i<prologue->opcode_base; ++i)
- {
- uint8_t op_len = debug_line_data.GetU8(offset_ptr);
- prologue->standard_opcode_lengths.push_back(op_len);
- }
-
- while (*offset_ptr < end_prologue_offset)
- {
- s = debug_line_data.GetCStr(offset_ptr);
- if (s && s[0])
- prologue->include_directories.push_back(s);
- else
- break;
- }
-
- while (*offset_ptr < end_prologue_offset)
- {
- const char* name = debug_line_data.GetCStr( offset_ptr );
- if (name && name[0])
- {
- FileNameEntry fileEntry;
- fileEntry.name = name;
- fileEntry.dir_idx = debug_line_data.GetULEB128( offset_ptr );
- fileEntry.mod_time = debug_line_data.GetULEB128( offset_ptr );
- fileEntry.length = debug_line_data.GetULEB128( offset_ptr );
- prologue->file_names.push_back(fileEntry);
- }
- else
- break;
- }
+bool DWARFDebugLine::ParsePrologue(const DWARFDataExtractor &debug_line_data,
+ lldb::offset_t *offset_ptr,
+ Prologue *prologue) {
+ const lldb::offset_t prologue_offset = *offset_ptr;
+
+ // DEBUG_PRINTF("0x%8.8x: ParsePrologue()\n", *offset_ptr);
+
+ prologue->Clear();
+ uint32_t i;
+ const char *s;
+ prologue->total_length = debug_line_data.GetDWARFInitialLength(offset_ptr);
+ prologue->version = debug_line_data.GetU16(offset_ptr);
+ if (prologue->version < 2 || prologue->version > 4)
+ return false;
- // XXX GNU as is broken for 64-Bit DWARF
- if (*offset_ptr != end_prologue_offset)
- {
- Host::SystemLog (Host::eSystemLogWarning,
- "warning: parsing line table prologue at 0x%8.8" PRIx64 " should have ended at 0x%8.8" PRIx64 " but it ended at 0x%8.8" PRIx64 "\n",
- prologue_offset,
- end_prologue_offset,
- *offset_ptr);
- }
- return end_prologue_offset;
+ prologue->prologue_length = debug_line_data.GetDWARFOffset(offset_ptr);
+ const lldb::offset_t end_prologue_offset =
+ prologue->prologue_length + *offset_ptr;
+ prologue->min_inst_length = debug_line_data.GetU8(offset_ptr);
+ if (prologue->version >= 4)
+ prologue->maximum_operations_per_instruction =
+ debug_line_data.GetU8(offset_ptr);
+ else
+ prologue->maximum_operations_per_instruction = 1;
+ prologue->default_is_stmt = debug_line_data.GetU8(offset_ptr);
+ prologue->line_base = debug_line_data.GetU8(offset_ptr);
+ prologue->line_range = debug_line_data.GetU8(offset_ptr);
+ prologue->opcode_base = debug_line_data.GetU8(offset_ptr);
+
+ prologue->standard_opcode_lengths.reserve(prologue->opcode_base - 1);
+
+ for (i = 1; i < prologue->opcode_base; ++i) {
+ uint8_t op_len = debug_line_data.GetU8(offset_ptr);
+ prologue->standard_opcode_lengths.push_back(op_len);
+ }
+
+ while (*offset_ptr < end_prologue_offset) {
+ s = debug_line_data.GetCStr(offset_ptr);
+ if (s && s[0])
+ prologue->include_directories.push_back(s);
+ else
+ break;
+ }
+
+ while (*offset_ptr < end_prologue_offset) {
+ const char *name = debug_line_data.GetCStr(offset_ptr);
+ if (name && name[0]) {
+ FileNameEntry fileEntry;
+ fileEntry.name = name;
+ fileEntry.dir_idx = debug_line_data.GetULEB128(offset_ptr);
+ fileEntry.mod_time = debug_line_data.GetULEB128(offset_ptr);
+ fileEntry.length = debug_line_data.GetULEB128(offset_ptr);
+ prologue->file_names.push_back(fileEntry);
+ } else
+ break;
+ }
+
+ // XXX GNU as is broken for 64-Bit DWARF
+ if (*offset_ptr != end_prologue_offset) {
+ Host::SystemLog(Host::eSystemLogWarning,
+ "warning: parsing line table prologue at 0x%8.8" PRIx64
+ " should have ended at 0x%8.8" PRIx64
+ " but it ended at 0x%8.8" PRIx64 "\n",
+ prologue_offset, end_prologue_offset, *offset_ptr);
+ }
+ return end_prologue_offset;
}
-bool
-DWARFDebugLine::ParseSupportFiles (const lldb::ModuleSP &module_sp,
- const DWARFDataExtractor& debug_line_data,
- const char *cu_comp_dir,
- dw_offset_t stmt_list,
- FileSpecList &support_files)
-{
- lldb::offset_t offset = stmt_list;
-
- Prologue prologue;
- if (!ParsePrologue(debug_line_data, &offset, &prologue))
- {
- Host::SystemLog (Host::eSystemLogError, "error: parsing line table prologue at 0x%8.8x (parsing ended around 0x%8.8" PRIx64 "\n", stmt_list, offset);
- return false;
- }
-
- FileSpec file_spec;
- std::string remapped_file;
-
- for (uint32_t file_idx = 1; prologue.GetFile(file_idx, cu_comp_dir, file_spec); ++file_idx)
- {
- if (module_sp->RemapSourceFile(file_spec.GetCString(), remapped_file))
- file_spec.SetFile(remapped_file, false);
- support_files.Append(file_spec);
-
- }
- return true;
+bool DWARFDebugLine::ParseSupportFiles(
+ const lldb::ModuleSP &module_sp, const DWARFDataExtractor &debug_line_data,
+ const char *cu_comp_dir, dw_offset_t stmt_list,
+ FileSpecList &support_files) {
+ lldb::offset_t offset = stmt_list;
+
+ Prologue prologue;
+ if (!ParsePrologue(debug_line_data, &offset, &prologue)) {
+ Host::SystemLog(Host::eSystemLogError, "error: parsing line table prologue "
+ "at 0x%8.8x (parsing ended around "
+ "0x%8.8" PRIx64 "\n",
+ stmt_list, offset);
+ return false;
+ }
+
+ FileSpec file_spec;
+ std::string remapped_file;
+
+ for (uint32_t file_idx = 1;
+ prologue.GetFile(file_idx, cu_comp_dir, file_spec); ++file_idx) {
+ if (module_sp->RemapSourceFile(file_spec.GetCString(), remapped_file))
+ file_spec.SetFile(remapped_file, false);
+ support_files.Append(file_spec);
+ }
+ return true;
}
//----------------------------------------------------------------------
@@ -514,304 +476,294 @@ DWARFDebugLine::ParseSupportFiles (const lldb::ModuleSP &module_sp,
// callback function once for the prologue (row in state will be zero)
// and each time a row is to be added to the line table.
//----------------------------------------------------------------------
-bool
-DWARFDebugLine::ParseStatementTable
-(
- const DWARFDataExtractor& debug_line_data,
- lldb::offset_t* offset_ptr,
- DWARFDebugLine::State::Callback callback,
- void* userData
-)
-{
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_LINE));
- Prologue::shared_ptr prologue(new Prologue());
-
-
- const dw_offset_t debug_line_offset = *offset_ptr;
-
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "DWARFDebugLine::ParseStatementTable (.debug_line[0x%8.8x])",
- debug_line_offset);
-
- if (!ParsePrologue(debug_line_data, offset_ptr, prologue.get()))
- {
- if (log)
- log->Error ("failed to parse DWARF line table prologue");
- // Restore our offset and return false to indicate failure!
- *offset_ptr = debug_line_offset;
- return false;
- }
+bool DWARFDebugLine::ParseStatementTable(
+ const DWARFDataExtractor &debug_line_data, lldb::offset_t *offset_ptr,
+ DWARFDebugLine::State::Callback callback, void *userData) {
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_LINE));
+ Prologue::shared_ptr prologue(new Prologue());
- if (log)
- prologue->Dump (log);
+ const dw_offset_t debug_line_offset = *offset_ptr;
- const dw_offset_t end_offset = debug_line_offset + prologue->total_length + (debug_line_data.GetDWARFSizeofInitialLength());
+ Timer scoped_timer(
+ LLVM_PRETTY_FUNCTION,
+ "DWARFDebugLine::ParseStatementTable (.debug_line[0x%8.8x])",
+ debug_line_offset);
- State state(prologue, log, callback, userData);
-
- while (*offset_ptr < end_offset)
- {
- //DEBUG_PRINTF("0x%8.8x: ", *offset_ptr);
- uint8_t opcode = debug_line_data.GetU8(offset_ptr);
-
- if (opcode == 0)
+ if (!ParsePrologue(debug_line_data, offset_ptr, prologue.get())) {
+ if (log)
+ log->Error("failed to parse DWARF line table prologue");
+ // Restore our offset and return false to indicate failure!
+ *offset_ptr = debug_line_offset;
+ return false;
+ }
+
+ if (log)
+ prologue->Dump(log);
+
+ const dw_offset_t end_offset =
+ debug_line_offset + prologue->total_length +
+ (debug_line_data.GetDWARFSizeofInitialLength());
+
+ State state(prologue, log, callback, userData);
+
+ while (*offset_ptr < end_offset) {
+ // DEBUG_PRINTF("0x%8.8x: ", *offset_ptr);
+ uint8_t opcode = debug_line_data.GetU8(offset_ptr);
+
+ if (opcode == 0) {
+ // Extended Opcodes always start with a zero opcode followed by
+ // a uleb128 length so you can skip ones you don't know about
+ lldb::offset_t ext_offset = *offset_ptr;
+ dw_uleb128_t len = debug_line_data.GetULEB128(offset_ptr);
+ dw_offset_t arg_size = len - (*offset_ptr - ext_offset);
+
+ // DEBUG_PRINTF("Extended: <%2u> ", len);
+ uint8_t sub_opcode = debug_line_data.GetU8(offset_ptr);
+ switch (sub_opcode) {
+ case DW_LNE_end_sequence:
+ // Set the end_sequence register of the state machine to true and
+ // append a row to the matrix using the current values of the
+ // state-machine registers. Then reset the registers to the initial
+ // values specified above. Every statement program sequence must end
+ // with a DW_LNE_end_sequence instruction which creates a row whose
+ // address is that of the byte after the last target machine instruction
+ // of the sequence.
+ state.end_sequence = true;
+ state.AppendRowToMatrix(*offset_ptr);
+ state.Reset();
+ break;
+
+ case DW_LNE_set_address:
+ // Takes a single relocatable address as an operand. The size of the
+ // operand is the size appropriate to hold an address on the target
+ // machine. Set the address register to the value given by the
+ // relocatable address. All of the other statement program opcodes
+ // that affect the address register add a delta to it. This instruction
+ // stores a relocatable value into it instead.
+ if (arg_size == 4)
+ state.address = debug_line_data.GetU32(offset_ptr);
+ else // arg_size == 8
+ state.address = debug_line_data.GetU64(offset_ptr);
+ break;
+
+ case DW_LNE_define_file:
+ // Takes 4 arguments. The first is a null terminated string containing
+ // a source file name. The second is an unsigned LEB128 number
+ // representing
+ // the directory index of the directory in which the file was found. The
+ // third is an unsigned LEB128 number representing the time of last
+ // modification of the file. The fourth is an unsigned LEB128 number
+ // representing the length in bytes of the file. The time and length
+ // fields may contain LEB128(0) if the information is not available.
+ //
+ // The directory index represents an entry in the include_directories
+ // section of the statement program prologue. The index is LEB128(0)
+ // if the file was found in the current directory of the compilation,
+ // LEB128(1) if it was found in the first directory in the
+ // include_directories section, and so on. The directory index is
+ // ignored for file names that represent full path names.
+ //
+ // The files are numbered, starting at 1, in the order in which they
+ // appear; the names in the prologue come before names defined by
+ // the DW_LNE_define_file instruction. These numbers are used in the
+ // file register of the state machine.
{
- // Extended Opcodes always start with a zero opcode followed by
- // a uleb128 length so you can skip ones you don't know about
- lldb::offset_t ext_offset = *offset_ptr;
- dw_uleb128_t len = debug_line_data.GetULEB128(offset_ptr);
- dw_offset_t arg_size = len - (*offset_ptr - ext_offset);
-
- //DEBUG_PRINTF("Extended: <%2u> ", len);
- uint8_t sub_opcode = debug_line_data.GetU8(offset_ptr);
- switch (sub_opcode)
- {
- case DW_LNE_end_sequence:
- // Set the end_sequence register of the state machine to true and
- // append a row to the matrix using the current values of the
- // state-machine registers. Then reset the registers to the initial
- // values specified above. Every statement program sequence must end
- // with a DW_LNE_end_sequence instruction which creates a row whose
- // address is that of the byte after the last target machine instruction
- // of the sequence.
- state.end_sequence = true;
- state.AppendRowToMatrix(*offset_ptr);
- state.Reset();
- break;
-
- case DW_LNE_set_address:
- // Takes a single relocatable address as an operand. The size of the
- // operand is the size appropriate to hold an address on the target
- // machine. Set the address register to the value given by the
- // relocatable address. All of the other statement program opcodes
- // that affect the address register add a delta to it. This instruction
- // stores a relocatable value into it instead.
- if (arg_size == 4)
- state.address = debug_line_data.GetU32(offset_ptr);
- else // arg_size == 8
- state.address = debug_line_data.GetU64(offset_ptr);
- break;
-
- case DW_LNE_define_file:
- // Takes 4 arguments. The first is a null terminated string containing
- // a source file name. The second is an unsigned LEB128 number representing
- // the directory index of the directory in which the file was found. The
- // third is an unsigned LEB128 number representing the time of last
- // modification of the file. The fourth is an unsigned LEB128 number
- // representing the length in bytes of the file. The time and length
- // fields may contain LEB128(0) if the information is not available.
- //
- // The directory index represents an entry in the include_directories
- // section of the statement program prologue. The index is LEB128(0)
- // if the file was found in the current directory of the compilation,
- // LEB128(1) if it was found in the first directory in the
- // include_directories section, and so on. The directory index is
- // ignored for file names that represent full path names.
- //
- // The files are numbered, starting at 1, in the order in which they
- // appear; the names in the prologue come before names defined by
- // the DW_LNE_define_file instruction. These numbers are used in the
- // file register of the state machine.
- {
- FileNameEntry fileEntry;
- fileEntry.name = debug_line_data.GetCStr(offset_ptr);
- fileEntry.dir_idx = debug_line_data.GetULEB128(offset_ptr);
- fileEntry.mod_time = debug_line_data.GetULEB128(offset_ptr);
- fileEntry.length = debug_line_data.GetULEB128(offset_ptr);
- state.prologue->file_names.push_back(fileEntry);
- }
- break;
-
- default:
- // Length doesn't include the zero opcode byte or the length itself, but
- // it does include the sub_opcode, so we have to adjust for that below
- (*offset_ptr) += arg_size;
- break;
- }
+ FileNameEntry fileEntry;
+ fileEntry.name = debug_line_data.GetCStr(offset_ptr);
+ fileEntry.dir_idx = debug_line_data.GetULEB128(offset_ptr);
+ fileEntry.mod_time = debug_line_data.GetULEB128(offset_ptr);
+ fileEntry.length = debug_line_data.GetULEB128(offset_ptr);
+ state.prologue->file_names.push_back(fileEntry);
}
- else if (opcode < prologue->opcode_base)
+ break;
+
+ default:
+ // Length doesn't include the zero opcode byte or the length itself, but
+ // it does include the sub_opcode, so we have to adjust for that below
+ (*offset_ptr) += arg_size;
+ break;
+ }
+ } else if (opcode < prologue->opcode_base) {
+ switch (opcode) {
+ // Standard Opcodes
+ case DW_LNS_copy:
+ // Takes no arguments. Append a row to the matrix using the
+ // current values of the state-machine registers. Then set
+ // the basic_block register to false.
+ state.AppendRowToMatrix(*offset_ptr);
+ break;
+
+ case DW_LNS_advance_pc:
+ // Takes a single unsigned LEB128 operand, multiplies it by the
+ // min_inst_length field of the prologue, and adds the
+ // result to the address register of the state machine.
+ state.address +=
+ debug_line_data.GetULEB128(offset_ptr) * prologue->min_inst_length;
+ break;
+
+ case DW_LNS_advance_line:
+ // Takes a single signed LEB128 operand and adds that value to
+ // the line register of the state machine.
+ state.line += debug_line_data.GetSLEB128(offset_ptr);
+ break;
+
+ case DW_LNS_set_file:
+ // Takes a single unsigned LEB128 operand and stores it in the file
+ // register of the state machine.
+ state.file = debug_line_data.GetULEB128(offset_ptr);
+ break;
+
+ case DW_LNS_set_column:
+ // Takes a single unsigned LEB128 operand and stores it in the
+ // column register of the state machine.
+ state.column = debug_line_data.GetULEB128(offset_ptr);
+ break;
+
+ case DW_LNS_negate_stmt:
+ // Takes no arguments. Set the is_stmt register of the state
+ // machine to the logical negation of its current value.
+ state.is_stmt = !state.is_stmt;
+ break;
+
+ case DW_LNS_set_basic_block:
+ // Takes no arguments. Set the basic_block register of the
+ // state machine to true
+ state.basic_block = true;
+ break;
+
+ case DW_LNS_const_add_pc:
+ // Takes no arguments. Add to the address register of the state
+ // machine the address increment value corresponding to special
+ // opcode 255. The motivation for DW_LNS_const_add_pc is this:
+ // when the statement program needs to advance the address by a
+ // small amount, it can use a single special opcode, which occupies
+ // a single byte. When it needs to advance the address by up to
+ // twice the range of the last special opcode, it can use
+ // DW_LNS_const_add_pc followed by a special opcode, for a total
+ // of two bytes. Only if it needs to advance the address by more
+ // than twice that range will it need to use both DW_LNS_advance_pc
+ // and a special opcode, requiring three or more bytes.
{
- switch (opcode)
- {
- // Standard Opcodes
- case DW_LNS_copy:
- // Takes no arguments. Append a row to the matrix using the
- // current values of the state-machine registers. Then set
- // the basic_block register to false.
- state.AppendRowToMatrix(*offset_ptr);
- break;
-
- case DW_LNS_advance_pc:
- // Takes a single unsigned LEB128 operand, multiplies it by the
- // min_inst_length field of the prologue, and adds the
- // result to the address register of the state machine.
- state.address += debug_line_data.GetULEB128(offset_ptr) * prologue->min_inst_length;
- break;
-
- case DW_LNS_advance_line:
- // Takes a single signed LEB128 operand and adds that value to
- // the line register of the state machine.
- state.line += debug_line_data.GetSLEB128(offset_ptr);
- break;
-
- case DW_LNS_set_file:
- // Takes a single unsigned LEB128 operand and stores it in the file
- // register of the state machine.
- state.file = debug_line_data.GetULEB128(offset_ptr);
- break;
-
- case DW_LNS_set_column:
- // Takes a single unsigned LEB128 operand and stores it in the
- // column register of the state machine.
- state.column = debug_line_data.GetULEB128(offset_ptr);
- break;
-
- case DW_LNS_negate_stmt:
- // Takes no arguments. Set the is_stmt register of the state
- // machine to the logical negation of its current value.
- state.is_stmt = !state.is_stmt;
- break;
-
- case DW_LNS_set_basic_block:
- // Takes no arguments. Set the basic_block register of the
- // state machine to true
- state.basic_block = true;
- break;
-
- case DW_LNS_const_add_pc:
- // Takes no arguments. Add to the address register of the state
- // machine the address increment value corresponding to special
- // opcode 255. The motivation for DW_LNS_const_add_pc is this:
- // when the statement program needs to advance the address by a
- // small amount, it can use a single special opcode, which occupies
- // a single byte. When it needs to advance the address by up to
- // twice the range of the last special opcode, it can use
- // DW_LNS_const_add_pc followed by a special opcode, for a total
- // of two bytes. Only if it needs to advance the address by more
- // than twice that range will it need to use both DW_LNS_advance_pc
- // and a special opcode, requiring three or more bytes.
- {
- uint8_t adjust_opcode = 255 - prologue->opcode_base;
- dw_addr_t addr_offset = (adjust_opcode / prologue->line_range) * prologue->min_inst_length;
- state.address += addr_offset;
- }
- break;
-
- case DW_LNS_fixed_advance_pc:
- // Takes a single uhalf operand. Add to the address register of
- // the state machine the value of the (unencoded) operand. This
- // is the only extended opcode that takes an argument that is not
- // a variable length number. The motivation for DW_LNS_fixed_advance_pc
- // is this: existing assemblers cannot emit DW_LNS_advance_pc or
- // special opcodes because they cannot encode LEB128 numbers or
- // judge when the computation of a special opcode overflows and
- // requires the use of DW_LNS_advance_pc. Such assemblers, however,
- // can use DW_LNS_fixed_advance_pc instead, sacrificing compression.
- state.address += debug_line_data.GetU16(offset_ptr);
- break;
-
- case DW_LNS_set_prologue_end:
- // Takes no arguments. Set the prologue_end register of the
- // state machine to true
- state.prologue_end = true;
- break;
-
- case DW_LNS_set_epilogue_begin:
- // Takes no arguments. Set the basic_block register of the
- // state machine to true
- state.epilogue_begin = true;
- break;
-
- case DW_LNS_set_isa:
- // Takes a single unsigned LEB128 operand and stores it in the
- // column register of the state machine.
- state.isa = debug_line_data.GetULEB128(offset_ptr);
- break;
-
- default:
- // Handle any unknown standard opcodes here. We know the lengths
- // of such opcodes because they are specified in the prologue
- // as a multiple of LEB128 operands for each opcode.
- {
- uint8_t i;
- assert (static_cast<size_t>(opcode - 1) < prologue->standard_opcode_lengths.size());
- const uint8_t opcode_length = prologue->standard_opcode_lengths[opcode - 1];
- for (i=0; i<opcode_length; ++i)
- debug_line_data.Skip_LEB128(offset_ptr);
- }
- break;
- }
+ uint8_t adjust_opcode = 255 - prologue->opcode_base;
+ dw_addr_t addr_offset = (adjust_opcode / prologue->line_range) *
+ prologue->min_inst_length;
+ state.address += addr_offset;
}
- else
+ break;
+
+ case DW_LNS_fixed_advance_pc:
+ // Takes a single uhalf operand. Add to the address register of
+ // the state machine the value of the (unencoded) operand. This
+ // is the only extended opcode that takes an argument that is not
+ // a variable length number. The motivation for DW_LNS_fixed_advance_pc
+ // is this: existing assemblers cannot emit DW_LNS_advance_pc or
+ // special opcodes because they cannot encode LEB128 numbers or
+ // judge when the computation of a special opcode overflows and
+ // requires the use of DW_LNS_advance_pc. Such assemblers, however,
+ // can use DW_LNS_fixed_advance_pc instead, sacrificing compression.
+ state.address += debug_line_data.GetU16(offset_ptr);
+ break;
+
+ case DW_LNS_set_prologue_end:
+ // Takes no arguments. Set the prologue_end register of the
+ // state machine to true
+ state.prologue_end = true;
+ break;
+
+ case DW_LNS_set_epilogue_begin:
+ // Takes no arguments. Set the basic_block register of the
+ // state machine to true
+ state.epilogue_begin = true;
+ break;
+
+ case DW_LNS_set_isa:
+ // Takes a single unsigned LEB128 operand and stores it in the
+ // column register of the state machine.
+ state.isa = debug_line_data.GetULEB128(offset_ptr);
+ break;
+
+ default:
+ // Handle any unknown standard opcodes here. We know the lengths
+ // of such opcodes because they are specified in the prologue
+ // as a multiple of LEB128 operands for each opcode.
{
- // Special Opcodes
-
- // A special opcode value is chosen based on the amount that needs
- // to be added to the line and address registers. The maximum line
- // increment for a special opcode is the value of the line_base
- // field in the header, plus the value of the line_range field,
- // minus 1 (line base + line range - 1). If the desired line
- // increment is greater than the maximum line increment, a standard
- // opcode must be used instead of a special opcode. The "address
- // advance" is calculated by dividing the desired address increment
- // by the minimum_instruction_length field from the header. The
- // special opcode is then calculated using the following formula:
- //
- // opcode = (desired line increment - line_base) + (line_range * address advance) + opcode_base
- //
- // If the resulting opcode is greater than 255, a standard opcode
- // must be used instead.
- //
- // To decode a special opcode, subtract the opcode_base from the
- // opcode itself to give the adjusted opcode. The amount to
- // increment the address register is the result of the adjusted
- // opcode divided by the line_range multiplied by the
- // minimum_instruction_length field from the header. That is:
- //
- // address increment = (adjusted opcode / line_range) * minimum_instruction_length
- //
- // The amount to increment the line register is the line_base plus
- // the result of the adjusted opcode modulo the line_range. That is:
- //
- // line increment = line_base + (adjusted opcode % line_range)
-
- uint8_t adjust_opcode = opcode - prologue->opcode_base;
- dw_addr_t addr_offset = (adjust_opcode / prologue->line_range) * prologue->min_inst_length;
- int32_t line_offset = prologue->line_base + (adjust_opcode % prologue->line_range);
- state.line += line_offset;
- state.address += addr_offset;
- state.AppendRowToMatrix(*offset_ptr);
+ uint8_t i;
+ assert(static_cast<size_t>(opcode - 1) <
+ prologue->standard_opcode_lengths.size());
+ const uint8_t opcode_length =
+ prologue->standard_opcode_lengths[opcode - 1];
+ for (i = 0; i < opcode_length; ++i)
+ debug_line_data.Skip_LEB128(offset_ptr);
}
+ break;
+ }
+ } else {
+ // Special Opcodes
+
+ // A special opcode value is chosen based on the amount that needs
+ // to be added to the line and address registers. The maximum line
+ // increment for a special opcode is the value of the line_base
+ // field in the header, plus the value of the line_range field,
+ // minus 1 (line base + line range - 1). If the desired line
+ // increment is greater than the maximum line increment, a standard
+ // opcode must be used instead of a special opcode. The "address
+ // advance" is calculated by dividing the desired address increment
+ // by the minimum_instruction_length field from the header. The
+ // special opcode is then calculated using the following formula:
+ //
+ // opcode = (desired line increment - line_base) + (line_range * address
+ // advance) + opcode_base
+ //
+ // If the resulting opcode is greater than 255, a standard opcode
+ // must be used instead.
+ //
+ // To decode a special opcode, subtract the opcode_base from the
+ // opcode itself to give the adjusted opcode. The amount to
+ // increment the address register is the result of the adjusted
+ // opcode divided by the line_range multiplied by the
+ // minimum_instruction_length field from the header. That is:
+ //
+ // address increment = (adjusted opcode / line_range) *
+ // minimum_instruction_length
+ //
+ // The amount to increment the line register is the line_base plus
+ // the result of the adjusted opcode modulo the line_range. That is:
+ //
+ // line increment = line_base + (adjusted opcode % line_range)
+
+ uint8_t adjust_opcode = opcode - prologue->opcode_base;
+ dw_addr_t addr_offset =
+ (adjust_opcode / prologue->line_range) * prologue->min_inst_length;
+ int32_t line_offset =
+ prologue->line_base + (adjust_opcode % prologue->line_range);
+ state.line += line_offset;
+ state.address += addr_offset;
+ state.AppendRowToMatrix(*offset_ptr);
}
+ }
- state.Finalize( *offset_ptr );
+ state.Finalize(*offset_ptr);
- return end_offset;
+ return end_offset;
}
-
//----------------------------------------------------------------------
// ParseStatementTableCallback
//----------------------------------------------------------------------
-static void
-ParseStatementTableCallback(dw_offset_t offset, const DWARFDebugLine::State& state, void* userData)
-{
- DWARFDebugLine::LineTable* line_table = (DWARFDebugLine::LineTable*)userData;
- if (state.row == DWARFDebugLine::State::StartParsingLineTable)
- {
- // Just started parsing the line table, so lets keep a reference to
- // the prologue using the supplied shared pointer
- line_table->prologue = state.prologue;
- }
- else if (state.row == DWARFDebugLine::State::DoneParsingLineTable)
- {
- // Done parsing line table, nothing to do for the cleanup
- }
- else
- {
- // We have a new row, lets append it
- line_table->AppendRow(state);
- }
+static void ParseStatementTableCallback(dw_offset_t offset,
+ const DWARFDebugLine::State &state,
+ void *userData) {
+ DWARFDebugLine::LineTable *line_table = (DWARFDebugLine::LineTable *)userData;
+ if (state.row == DWARFDebugLine::State::StartParsingLineTable) {
+ // Just started parsing the line table, so lets keep a reference to
+ // the prologue using the supplied shared pointer
+ line_table->prologue = state.prologue;
+ } else if (state.row == DWARFDebugLine::State::DoneParsingLineTable) {
+ // Done parsing line table, nothing to do for the cleanup
+ } else {
+ // We have a new row, lets append it
+ line_table->AppendRow(state);
+ }
}
//----------------------------------------------------------------------
@@ -820,75 +772,65 @@ ParseStatementTableCallback(dw_offset_t offset, const DWARFDebugLine::State& sta
// Parse a line table at offset and populate the LineTable class with
// the prologue and all rows.
//----------------------------------------------------------------------
-bool
-DWARFDebugLine::ParseStatementTable(const DWARFDataExtractor& debug_line_data, lldb::offset_t *offset_ptr, LineTable* line_table)
-{
- return ParseStatementTable(debug_line_data, offset_ptr, ParseStatementTableCallback, line_table);
+bool DWARFDebugLine::ParseStatementTable(
+ const DWARFDataExtractor &debug_line_data, lldb::offset_t *offset_ptr,
+ LineTable *line_table) {
+ return ParseStatementTable(debug_line_data, offset_ptr,
+ ParseStatementTableCallback, line_table);
}
-
-inline bool
-DWARFDebugLine::Prologue::IsValid() const
-{
- return SymbolFileDWARF::SupportedVersion(version);
+inline bool DWARFDebugLine::Prologue::IsValid() const {
+ return SymbolFileDWARF::SupportedVersion(version);
}
//----------------------------------------------------------------------
// DWARFDebugLine::Prologue::Dump
//----------------------------------------------------------------------
-void
-DWARFDebugLine::Prologue::Dump(Log *log)
-{
- uint32_t i;
-
- log->Printf( "Line table prologue:");
- log->Printf( " total_length: 0x%8.8x", total_length);
- log->Printf( " version: %u", version);
- log->Printf( "prologue_length: 0x%8.8x", prologue_length);
- log->Printf( "min_inst_length: %u", min_inst_length);
- log->Printf( "default_is_stmt: %u", default_is_stmt);
- log->Printf( " line_base: %i", line_base);
- log->Printf( " line_range: %u", line_range);
- log->Printf( " opcode_base: %u", opcode_base);
-
- for (i=0; i<standard_opcode_lengths.size(); ++i)
- {
- log->Printf( "standard_opcode_lengths[%s] = %u", DW_LNS_value_to_name(i+1), standard_opcode_lengths[i]);
+void DWARFDebugLine::Prologue::Dump(Log *log) {
+ uint32_t i;
+
+ log->Printf("Line table prologue:");
+ log->Printf(" total_length: 0x%8.8x", total_length);
+ log->Printf(" version: %u", version);
+ log->Printf("prologue_length: 0x%8.8x", prologue_length);
+ log->Printf("min_inst_length: %u", min_inst_length);
+ log->Printf("default_is_stmt: %u", default_is_stmt);
+ log->Printf(" line_base: %i", line_base);
+ log->Printf(" line_range: %u", line_range);
+ log->Printf(" opcode_base: %u", opcode_base);
+
+ for (i = 0; i < standard_opcode_lengths.size(); ++i) {
+ log->Printf("standard_opcode_lengths[%s] = %u", DW_LNS_value_to_name(i + 1),
+ standard_opcode_lengths[i]);
+ }
+
+ if (!include_directories.empty()) {
+ for (i = 0; i < include_directories.size(); ++i) {
+ log->Printf("include_directories[%3u] = '%s'", i + 1,
+ include_directories[i]);
}
-
- if (!include_directories.empty())
- {
- for (i=0; i<include_directories.size(); ++i)
- {
- log->Printf( "include_directories[%3u] = '%s'", i+1, include_directories[i]);
- }
- }
-
- if (!file_names.empty())
- {
- log->PutCString (" Dir Mod Time File Len File Name");
- log->PutCString (" ---- ---------- ---------- ---------------------------");
- for (i=0; i<file_names.size(); ++i)
- {
- const FileNameEntry& fileEntry = file_names[i];
- log->Printf ("file_names[%3u] %4u 0x%8.8x 0x%8.8x %s",
- i+1,
- fileEntry.dir_idx,
- fileEntry.mod_time,
- fileEntry.length,
- fileEntry.name);
- }
+ }
+
+ if (!file_names.empty()) {
+ log->PutCString(" Dir Mod Time File Len File Name");
+ log->PutCString(" ---- ---------- ---------- "
+ "---------------------------");
+ for (i = 0; i < file_names.size(); ++i) {
+ const FileNameEntry &fileEntry = file_names[i];
+ log->Printf("file_names[%3u] %4u 0x%8.8x 0x%8.8x %s", i + 1,
+ fileEntry.dir_idx, fileEntry.mod_time, fileEntry.length,
+ fileEntry.name);
}
+ }
}
-
//----------------------------------------------------------------------
// DWARFDebugLine::ParsePrologue::Append
//
// Append the contents of the prologue to the binary stream buffer
//----------------------------------------------------------------------
-//void
-//DWARFDebugLine::Prologue::Append(BinaryStreamBuf& buff) const
+// void
+// DWARFDebugLine::Prologue::Append(BinaryStreamBuf& buff) const
//{
// uint32_t i;
//
@@ -906,7 +848,8 @@ DWARFDebugLine::Prologue::Dump(Log *log)
//
// for (i=0; i<include_directories.size(); ++i)
// buff.AppendCStr(include_directories[i].c_str());
-// buff.Append8(0); // Terminate the include directory section with empty string
+// buff.Append8(0); // Terminate the include directory section with empty
+// string
//
// for (i=0; i<file_names.size(); ++i)
// {
@@ -918,307 +861,242 @@ DWARFDebugLine::Prologue::Dump(Log *log)
// buff.Append8(0); // Terminate the file names section with empty string
//}
-
-bool DWARFDebugLine::Prologue::GetFile(uint32_t file_idx, const char *comp_dir, FileSpec &file) const
-{
- uint32_t idx = file_idx - 1; // File indexes are 1 based...
- if (idx < file_names.size())
- {
- file.SetFile(file_names[idx].name, false);
- if (file.IsRelative())
- {
- if (file_names[idx].dir_idx > 0)
- {
- const uint32_t dir_idx = file_names[idx].dir_idx - 1;
- if (dir_idx < include_directories.size())
- {
- file.PrependPathComponent(include_directories[dir_idx]);
- if (!file.IsRelative())
- return true;
- }
- }
-
- if (comp_dir && comp_dir[0])
- file.PrependPathComponent(comp_dir);
+bool DWARFDebugLine::Prologue::GetFile(uint32_t file_idx, const char *comp_dir,
+ FileSpec &file) const {
+ uint32_t idx = file_idx - 1; // File indexes are 1 based...
+ if (idx < file_names.size()) {
+ file.SetFile(file_names[idx].name, false);
+ if (file.IsRelative()) {
+ if (file_names[idx].dir_idx > 0) {
+ const uint32_t dir_idx = file_names[idx].dir_idx - 1;
+ if (dir_idx < include_directories.size()) {
+ file.PrependPathComponent(include_directories[dir_idx]);
+ if (!file.IsRelative())
+ return true;
}
- return true;
+ }
+
+ if (comp_dir && comp_dir[0])
+ file.PrependPathComponent(comp_dir);
}
- return false;
+ return true;
+ }
+ return false;
}
//----------------------------------------------------------------------
// DWARFDebugLine::LineTable::Dump
//----------------------------------------------------------------------
-void
-DWARFDebugLine::LineTable::Dump(Log *log) const
-{
- if (prologue.get())
- prologue->Dump (log);
-
- if (!rows.empty())
- {
- log->PutCString ("Address Line Column File ISA Flags");
- log->PutCString ("------------------ ------ ------ ------ --- -------------");
- Row::const_iterator pos = rows.begin();
- Row::const_iterator end = rows.end();
- while (pos != end)
- {
- (*pos).Dump (log);
- ++pos;
- }
+void DWARFDebugLine::LineTable::Dump(Log *log) const {
+ if (prologue.get())
+ prologue->Dump(log);
+
+ if (!rows.empty()) {
+ log->PutCString("Address Line Column File ISA Flags");
+ log->PutCString(
+ "------------------ ------ ------ ------ --- -------------");
+ Row::const_iterator pos = rows.begin();
+ Row::const_iterator end = rows.end();
+ while (pos != end) {
+ (*pos).Dump(log);
+ ++pos;
}
+ }
}
-
-void
-DWARFDebugLine::LineTable::AppendRow(const DWARFDebugLine::Row& state)
-{
- rows.push_back(state);
+void DWARFDebugLine::LineTable::AppendRow(const DWARFDebugLine::Row &state) {
+ rows.push_back(state);
}
-
-
//----------------------------------------------------------------------
-// Compare function for the binary search in DWARFDebugLine::LineTable::LookupAddress()
+// Compare function for the binary search in
+// DWARFDebugLine::LineTable::LookupAddress()
//----------------------------------------------------------------------
-static bool FindMatchingAddress (const DWARFDebugLine::Row& row1, const DWARFDebugLine::Row& row2)
-{
- return row1.address < row2.address;
+static bool FindMatchingAddress(const DWARFDebugLine::Row &row1,
+ const DWARFDebugLine::Row &row2) {
+ return row1.address < row2.address;
}
-
//----------------------------------------------------------------------
// DWARFDebugLine::LineTable::LookupAddress
//----------------------------------------------------------------------
-uint32_t
-DWARFDebugLine::LineTable::LookupAddress(dw_addr_t address, dw_addr_t cu_high_pc) const
-{
- uint32_t index = UINT32_MAX;
- if (!rows.empty())
- {
- // Use the lower_bound algorithm to perform a binary search since we know
- // that our line table data is ordered by address.
- DWARFDebugLine::Row row;
- row.address = address;
- Row::const_iterator begin_pos = rows.begin();
- Row::const_iterator end_pos = rows.end();
- Row::const_iterator pos = lower_bound(begin_pos, end_pos, row, FindMatchingAddress);
- if (pos == end_pos)
- {
- if (address < cu_high_pc)
- return rows.size()-1;
- }
+uint32_t DWARFDebugLine::LineTable::LookupAddress(dw_addr_t address,
+ dw_addr_t cu_high_pc) const {
+ uint32_t index = UINT32_MAX;
+ if (!rows.empty()) {
+ // Use the lower_bound algorithm to perform a binary search since we know
+ // that our line table data is ordered by address.
+ DWARFDebugLine::Row row;
+ row.address = address;
+ Row::const_iterator begin_pos = rows.begin();
+ Row::const_iterator end_pos = rows.end();
+ Row::const_iterator pos =
+ lower_bound(begin_pos, end_pos, row, FindMatchingAddress);
+ if (pos == end_pos) {
+ if (address < cu_high_pc)
+ return rows.size() - 1;
+ } else {
+ // Rely on fact that we are using a std::vector and we can do
+ // pointer arithmetic to find the row index (which will be one less
+ // that what we found since it will find the first position after
+ // the current address) since std::vector iterators are just
+ // pointers to the container type.
+ index = pos - begin_pos;
+ if (pos->address > address) {
+ if (index > 0)
+ --index;
else
- {
- // Rely on fact that we are using a std::vector and we can do
- // pointer arithmetic to find the row index (which will be one less
- // that what we found since it will find the first position after
- // the current address) since std::vector iterators are just
- // pointers to the container type.
- index = pos - begin_pos;
- if (pos->address > address)
- {
- if (index > 0)
- --index;
- else
- index = UINT32_MAX;
- }
- }
+ index = UINT32_MAX;
+ }
}
- return index; // Failed to find address
+ }
+ return index; // Failed to find address
}
-
//----------------------------------------------------------------------
// DWARFDebugLine::Row::Row
//----------------------------------------------------------------------
-DWARFDebugLine::Row::Row(bool default_is_stmt) :
- address(0),
- line(1),
- column(0),
- file(1),
- is_stmt(default_is_stmt),
- basic_block(false),
- end_sequence(false),
- prologue_end(false),
- epilogue_begin(false),
- isa(0)
-{
-}
+DWARFDebugLine::Row::Row(bool default_is_stmt)
+ : address(0), line(1), column(0), file(1), is_stmt(default_is_stmt),
+ basic_block(false), end_sequence(false), prologue_end(false),
+ epilogue_begin(false), isa(0) {}
//----------------------------------------------------------------------
// Called after a row is appended to the matrix
//----------------------------------------------------------------------
-void
-DWARFDebugLine::Row::PostAppend()
-{
- basic_block = false;
- prologue_end = false;
- epilogue_begin = false;
+void DWARFDebugLine::Row::PostAppend() {
+ basic_block = false;
+ prologue_end = false;
+ epilogue_begin = false;
}
-
//----------------------------------------------------------------------
// DWARFDebugLine::Row::Reset
//----------------------------------------------------------------------
-void
-DWARFDebugLine::Row::Reset(bool default_is_stmt)
-{
- address = 0;
- line = 1;
- column = 0;
- file = 1;
- is_stmt = default_is_stmt;
- basic_block = false;
- end_sequence = false;
- prologue_end = false;
- epilogue_begin = false;
- isa = 0;
+void DWARFDebugLine::Row::Reset(bool default_is_stmt) {
+ address = 0;
+ line = 1;
+ column = 0;
+ file = 1;
+ is_stmt = default_is_stmt;
+ basic_block = false;
+ end_sequence = false;
+ prologue_end = false;
+ epilogue_begin = false;
+ isa = 0;
}
//----------------------------------------------------------------------
// DWARFDebugLine::Row::Dump
//----------------------------------------------------------------------
-void
-DWARFDebugLine::Row::Dump(Log *log) const
-{
- log->Printf( "0x%16.16" PRIx64 " %6u %6u %6u %3u %s%s%s%s%s",
- address,
- line,
- column,
- file,
- isa,
- is_stmt ? " is_stmt" : "",
- basic_block ? " basic_block" : "",
- prologue_end ? " prologue_end" : "",
- epilogue_begin ? " epilogue_begin" : "",
- end_sequence ? " end_sequence" : "");
+void DWARFDebugLine::Row::Dump(Log *log) const {
+ log->Printf("0x%16.16" PRIx64 " %6u %6u %6u %3u %s%s%s%s%s", address, line,
+ column, file, isa, is_stmt ? " is_stmt" : "",
+ basic_block ? " basic_block" : "",
+ prologue_end ? " prologue_end" : "",
+ epilogue_begin ? " epilogue_begin" : "",
+ end_sequence ? " end_sequence" : "");
}
//----------------------------------------------------------------------
// Compare function LineTable structures
//----------------------------------------------------------------------
-static bool AddressLessThan (const DWARFDebugLine::Row& a, const DWARFDebugLine::Row& b)
-{
- return a.address < b.address;
+static bool AddressLessThan(const DWARFDebugLine::Row &a,
+ const DWARFDebugLine::Row &b) {
+ return a.address < b.address;
}
-
-
// Insert a row at the correct address if the addresses can be out of
// order which can only happen when we are linking a line table that
// may have had it's contents rearranged.
-void
-DWARFDebugLine::Row::Insert(Row::collection& state_coll, const Row& state)
-{
- // If we don't have anything yet, or if the address of the last state in our
- // line table is less than the current one, just append the current state
- if (state_coll.empty() || AddressLessThan(state_coll.back(), state))
- {
- state_coll.push_back(state);
- }
- else
- {
- // Do a binary search for the correct entry
- pair<Row::iterator, Row::iterator> range(equal_range(state_coll.begin(), state_coll.end(), state, AddressLessThan));
-
- // If the addresses are equal, we can safely replace the previous entry
- // with the current one if the one it is replacing is an end_sequence entry.
- // We currently always place an extra end sequence when ever we exit a valid
- // address range for a function in case the functions get rearranged by
- // optimizations or by order specifications. These extra end sequences will
- // disappear by getting replaced with valid consecutive entries within a
- // compile unit if there are no gaps.
- if (range.first == range.second)
- {
- state_coll.insert(range.first, state);
- }
- else
- {
- if ((distance(range.first, range.second) == 1) && range.first->end_sequence == true)
- {
- *range.first = state;
- }
- else
- {
- state_coll.insert(range.second, state);
- }
- }
+void DWARFDebugLine::Row::Insert(Row::collection &state_coll,
+ const Row &state) {
+ // If we don't have anything yet, or if the address of the last state in our
+ // line table is less than the current one, just append the current state
+ if (state_coll.empty() || AddressLessThan(state_coll.back(), state)) {
+ state_coll.push_back(state);
+ } else {
+ // Do a binary search for the correct entry
+ pair<Row::iterator, Row::iterator> range(equal_range(
+ state_coll.begin(), state_coll.end(), state, AddressLessThan));
+
+ // If the addresses are equal, we can safely replace the previous entry
+ // with the current one if the one it is replacing is an end_sequence entry.
+ // We currently always place an extra end sequence when ever we exit a valid
+ // address range for a function in case the functions get rearranged by
+ // optimizations or by order specifications. These extra end sequences will
+ // disappear by getting replaced with valid consecutive entries within a
+ // compile unit if there are no gaps.
+ if (range.first == range.second) {
+ state_coll.insert(range.first, state);
+ } else {
+ if ((distance(range.first, range.second) == 1) &&
+ range.first->end_sequence == true) {
+ *range.first = state;
+ } else {
+ state_coll.insert(range.second, state);
+ }
}
+ }
}
-void
-DWARFDebugLine::Row::Dump(Log *log, const Row::collection& state_coll)
-{
- std::for_each (state_coll.begin(), state_coll.end(), bind2nd(std::mem_fun_ref(&Row::Dump),log));
+void DWARFDebugLine::Row::Dump(Log *log, const Row::collection &state_coll) {
+ std::for_each(state_coll.begin(), state_coll.end(),
+ bind2nd(std::mem_fun_ref(&Row::Dump), log));
}
-
//----------------------------------------------------------------------
// DWARFDebugLine::State::State
//----------------------------------------------------------------------
-DWARFDebugLine::State::State(Prologue::shared_ptr& p, Log *l, DWARFDebugLine::State::Callback cb, void* userData) :
- Row (p->default_is_stmt),
- prologue (p),
- log (l),
- callback (cb),
- callbackUserData (userData),
- row (StartParsingLineTable)
-{
- // Call the callback with the initial row state of zero for the prologue
- if (callback)
- callback(0, *this, callbackUserData);
+DWARFDebugLine::State::State(Prologue::shared_ptr &p, Log *l,
+ DWARFDebugLine::State::Callback cb, void *userData)
+ : Row(p->default_is_stmt), prologue(p), log(l), callback(cb),
+ callbackUserData(userData), row(StartParsingLineTable) {
+ // Call the callback with the initial row state of zero for the prologue
+ if (callback)
+ callback(0, *this, callbackUserData);
}
//----------------------------------------------------------------------
// DWARFDebugLine::State::Reset
//----------------------------------------------------------------------
-void
-DWARFDebugLine::State::Reset()
-{
- Row::Reset(prologue->default_is_stmt);
-}
+void DWARFDebugLine::State::Reset() { Row::Reset(prologue->default_is_stmt); }
//----------------------------------------------------------------------
// DWARFDebugLine::State::AppendRowToMatrix
//----------------------------------------------------------------------
-void
-DWARFDebugLine::State::AppendRowToMatrix(dw_offset_t offset)
-{
- // Each time we are to add an entry into the line table matrix
- // call the callback function so that someone can do something with
- // the current state of the state machine (like build a line table
- // or dump the line table!)
- if (log)
- {
- if (row == 0)
- {
- log->PutCString ("Address Line Column File ISA Flags");
- log->PutCString ("------------------ ------ ------ ------ --- -------------");
- }
- Dump (log);
+void DWARFDebugLine::State::AppendRowToMatrix(dw_offset_t offset) {
+ // Each time we are to add an entry into the line table matrix
+ // call the callback function so that someone can do something with
+ // the current state of the state machine (like build a line table
+ // or dump the line table!)
+ if (log) {
+ if (row == 0) {
+ log->PutCString("Address Line Column File ISA Flags");
+ log->PutCString(
+ "------------------ ------ ------ ------ --- -------------");
}
+ Dump(log);
+ }
- ++row; // Increase the row number before we call our callback for a real row
- if (callback)
- callback(offset, *this, callbackUserData);
- PostAppend();
+ ++row; // Increase the row number before we call our callback for a real row
+ if (callback)
+ callback(offset, *this, callbackUserData);
+ PostAppend();
}
//----------------------------------------------------------------------
// DWARFDebugLine::State::Finalize
//----------------------------------------------------------------------
-void
-DWARFDebugLine::State::Finalize(dw_offset_t offset)
-{
- // Call the callback with a special row state when we are done parsing a
- // line table
- row = DoneParsingLineTable;
- if (callback)
- callback(offset, *this, callbackUserData);
+void DWARFDebugLine::State::Finalize(dw_offset_t offset) {
+ // Call the callback with a special row state when we are done parsing a
+ // line table
+ row = DoneParsingLineTable;
+ if (callback)
+ callback(offset, *this, callbackUserData);
}
-//void
-//DWARFDebugLine::AppendLineTableData
+// void
+// DWARFDebugLine::AppendLineTableData
//(
// const DWARFDebugLine::Prologue* prologue,
// const DWARFDebugLine::Row::collection& state_coll,
@@ -1240,7 +1118,8 @@ DWARFDebugLine::State::Finalize(dw_offset_t offset)
// bool default_is_stmt = prologue->default_is_stmt;
// const DWARFDebugLine::Row reset_state(default_is_stmt);
// const DWARFDebugLine::Row* prev_state = &reset_state;
-// const int32_t max_line_increment_for_special_opcode = prologue->MaxLineIncrementForSpecialOpcode();
+// const int32_t max_line_increment_for_special_opcode =
+// prologue->MaxLineIncrementForSpecialOpcode();
// for (pos = state_coll.begin(); pos != end; ++pos)
// {
// const DWARFDebugLine::Row& curr_state = *pos;
@@ -1257,7 +1136,8 @@ DWARFDebugLine::State::Finalize(dw_offset_t offset)
// if (prev_state == &reset_state)
// {
// debug_line_data.Append8(0); // Extended opcode
-// debug_line_data.Append32_as_ULEB128(addr_size + 1); // Length of opcode bytes
+// debug_line_data.Append32_as_ULEB128(addr_size + 1); // Length of
+// opcode bytes
// debug_line_data.Append8(DW_LNE_set_address);
// debug_line_data.AppendMax64(curr_state.address, addr_size);
// addr_advance = 0;
@@ -1276,7 +1156,8 @@ DWARFDebugLine::State::Finalize(dw_offset_t offset)
// }
//
// // Don't do anything fancy if we are at the end of a sequence
-// // as we don't want to push any extra rows since the DW_LNE_end_sequence
+// // as we don't want to push any extra rows since the
+// DW_LNE_end_sequence
// // will push a row itself!
// if (curr_state.end_sequence)
// {
@@ -1310,26 +1191,38 @@ DWARFDebugLine::State::Finalize(dw_offset_t offset)
// line_increment = 0;
// }
//
-// uint32_t special_opcode = (line_increment >= prologue->line_base) ? ((line_increment - prologue->line_base) + (prologue->line_range * addr_advance) + prologue->opcode_base) : 256;
+// uint32_t special_opcode = (line_increment >=
+// prologue->line_base) ? ((line_increment -
+// prologue->line_base) + (prologue->line_range * addr_advance)
+// + prologue->opcode_base) : 256;
// if (special_opcode > 255)
// {
-// // Both the address and line won't fit in one special opcode
+// // Both the address and line won't fit in one special
+// opcode
// // check to see if just the line advance will?
-// uint32_t special_opcode_line = ((line_increment >= prologue->line_base) && (line_increment != 0)) ?
-// ((line_increment - prologue->line_base) + prologue->opcode_base) : 256;
+// uint32_t special_opcode_line = ((line_increment >=
+// prologue->line_base) && (line_increment != 0)) ?
+// ((line_increment - prologue->line_base) +
+// prologue->opcode_base) : 256;
//
//
// if (special_opcode_line > 255)
// {
-// // Nope, the line advance won't fit by itself, check the address increment by itself
+// // Nope, the line advance won't fit by itself, check
+// the address increment by itself
// uint32_t special_opcode_addr = addr_advance ?
-// ((0 - prologue->line_base) + (prologue->line_range * addr_advance) + prologue->opcode_base) : 256;
+// ((0 - prologue->line_base) +
+// (prologue->line_range * addr_advance) +
+// prologue->opcode_base) : 256;
//
// if (special_opcode_addr > 255)
// {
-// // Neither the address nor the line will fit in a
-// // special opcode, we must manually enter both then
-// // do a DW_LNS_copy to push a row (special opcode
+// // Neither the address nor the line will fit in
+// a
+// // special opcode, we must manually enter both
+// then
+// // do a DW_LNS_copy to push a row (special
+// opcode
// // automatically imply a new row is pushed)
// if (line_increment != 0)
// {
@@ -1349,9 +1242,12 @@ DWARFDebugLine::State::Finalize(dw_offset_t offset)
// }
// else
// {
-// // The address increment alone will fit into a special opcode
-// // so modify our line change, then issue a special opcode
-// // for the address increment and it will push a row into the
+// // The address increment alone will fit into a
+// special opcode
+// // so modify our line change, then issue a
+// special opcode
+// // for the address increment and it will push a
+// row into the
// // line table
// if (line_increment != 0)
// {
@@ -1359,16 +1255,21 @@ DWARFDebugLine::State::Finalize(dw_offset_t offset)
// debug_line_data.Append32_as_SLEB128(line_increment);
// }
//
-// // Advance of line and address will fit into a single byte special opcode
-// // and this will also push a row onto the line table
+// // Advance of line and address will fit into a
+// single byte special opcode
+// // and this will also push a row onto the line
+// table
// debug_line_data.Append8(special_opcode_addr);
// }
// }
// else
// {
-// // The line change alone will fit into a special opcode
-// // so modify our address increment first, then issue a
-// // special opcode for the line change and it will push
+// // The line change alone will fit into a special
+// opcode
+// // so modify our address increment first, then issue
+// a
+// // special opcode for the line change and it will
+// push
// // a row into the line table
// if (addr_advance > 0)
// {
@@ -1376,14 +1277,16 @@ DWARFDebugLine::State::Finalize(dw_offset_t offset)
// debug_line_data.Append32_as_ULEB128(addr_advance);
// }
//
-// // Advance of line and address will fit into a single byte special opcode
+// // Advance of line and address will fit into a
+// single byte special opcode
// // and this will also push a row onto the line table
// debug_line_data.Append8(special_opcode_line);
// }
// }
// else
// {
-// // Advance of line and address will fit into a single byte special opcode
+// // Advance of line and address will fit into a single
+// byte special opcode
// // and this will also push a row onto the line table
// debug_line_data.Append8(special_opcode);
// }
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
index 9f2219b0181..ea02cfed6e0 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
@@ -11,8 +11,8 @@
#define SymbolFileDWARF_DWARFDebugLine_h_
#include <map>
-#include <vector>
#include <string>
+#include <vector>
#include "lldb/lldb-private.h"
@@ -24,199 +24,219 @@ class SymbolFileDWARF;
//----------------------------------------------------------------------
// DWARFDebugLine
//----------------------------------------------------------------------
-class DWARFDebugLine
-{
+class DWARFDebugLine {
public:
- //------------------------------------------------------------------
- // FileNameEntry
- //------------------------------------------------------------------
- struct FileNameEntry
- {
- FileNameEntry() :
- name(nullptr),
- dir_idx(0),
- mod_time(0),
- length(0)
- {
- }
-
- const char* name;
- dw_sleb128_t dir_idx;
- dw_sleb128_t mod_time;
- dw_sleb128_t length;
-
- };
-
- //------------------------------------------------------------------
- // Prologue
- //------------------------------------------------------------------
- struct Prologue
- {
-
- Prologue() :
- total_length(0),
- version(0),
- prologue_length(0),
- min_inst_length(0),
- default_is_stmt(0),
- line_base(0),
- line_range(0),
- opcode_base(0),
- standard_opcode_lengths(),
- include_directories(),
- file_names()
- {
- }
-
- typedef std::shared_ptr<Prologue> shared_ptr;
-
- uint32_t total_length; // The size in bytes of the statement information for this compilation unit (not including the total_length field itself).
- uint16_t version; // Version identifier for the statement information format.
- uint32_t prologue_length;// The number of bytes following the prologue_length field to the beginning of the first byte of the statement program itself.
- uint8_t min_inst_length;// The size in bytes of the smallest target machine instruction. Statement program opcodes that alter the address register first multiply their operands by this value.
- uint8_t maximum_operations_per_instruction; // New in DWARF4. The maximum number of individual operations that may be encoded in an instruction.
- uint8_t default_is_stmt;// The initial value of theis_stmtregister.
- int8_t line_base; // This parameter affects the meaning of the special opcodes. See below.
- uint8_t line_range; // This parameter affects the meaning of the special opcodes. See below.
- uint8_t opcode_base; // The number assigned to the first special opcode.
- std::vector<uint8_t> standard_opcode_lengths;
- std::vector<const char *> include_directories;
- std::vector<FileNameEntry> file_names;
-
- int32_t MaxLineIncrementForSpecialOpcode() const { return line_base + (int8_t)line_range - 1; }
- bool IsValid() const;
-// void Append(BinaryStreamBuf& buff) const;
- void Dump (lldb_private::Log *log);
- void Clear()
- {
- total_length = version = prologue_length = min_inst_length = line_base = line_range = opcode_base = 0;
- line_base = 0;
- standard_opcode_lengths.clear();
- include_directories.clear();
- file_names.clear();
- }
- bool GetFile(uint32_t file_idx, const char *comp_dir, lldb_private::FileSpec &file) const;
-
- };
-
- // Standard .debug_line state machine structure
- struct Row
- {
- typedef std::vector<Row> collection;
- typedef collection::iterator iterator;
- typedef collection::const_iterator const_iterator;
-
- Row(bool default_is_stmt = false);
- virtual ~Row() {}
- void PostAppend ();
- void Reset(bool default_is_stmt);
- void Dump(lldb_private::Log *log) const;
- static void Insert(Row::collection& state_coll, const Row& state);
- static void Dump(lldb_private::Log *log, const Row::collection& state_coll);
-
- dw_addr_t address; // The program-counter value corresponding to a machine instruction generated by the compiler.
- uint32_t line; // An unsigned integer indicating a source line number. Lines are numbered beginning at 1. The compiler may emit the value 0 in cases where an instruction cannot be attributed to any source line.
- uint16_t column; // An unsigned integer indicating a column number within a source line. Columns are numbered beginning at 1. The value 0 is reserved to indicate that a statement begins at the 'left edge' of the line.
- uint16_t file; // An unsigned integer indicating the identity of the source file corresponding to a machine instruction.
- uint8_t is_stmt:1, // A boolean indicating that the current instruction is the beginning of a statement.
- basic_block:1, // A boolean indicating that the current instruction is the beginning of a basic block.
- end_sequence:1, // A boolean indicating that the current address is that of the first byte after the end of a sequence of target machine instructions.
- prologue_end:1, // A boolean indicating that the current address is one (of possibly many) where execution should be suspended for an entry breakpoint of a function.
- epilogue_begin:1;// A boolean indicating that the current address is one (of possibly many) where execution should be suspended for an exit breakpoint of a function.
- uint32_t isa; // An unsigned integer whose value encodes the applicable instruction set architecture for the current instruction.
- };
-
-
- //------------------------------------------------------------------
- // LineTable
- //------------------------------------------------------------------
- struct LineTable
- {
- typedef std::shared_ptr<LineTable> shared_ptr;
-
- LineTable() :
- prologue(),
- rows()
- {
- }
-
- void AppendRow(const DWARFDebugLine::Row& state);
- void Clear()
- {
- prologue.reset();
- rows.clear();
- }
-
- uint32_t LookupAddress(dw_addr_t address, dw_addr_t cu_high_pc) const;
- void Dump(lldb_private::Log *log) const;
-
- Prologue::shared_ptr prologue;
- Row::collection rows;
- };
-
- //------------------------------------------------------------------
- // State
- //------------------------------------------------------------------
- struct State : public Row
- {
- typedef void (*Callback)(dw_offset_t offset, const State& state, void* userData);
-
- // Special row codes used when calling the callback
- enum
- {
- StartParsingLineTable = 0,
- DoneParsingLineTable = -1
- };
-
- State (Prologue::shared_ptr& prologue_sp,
- lldb_private::Log *log,
- Callback callback,
- void* userData);
-
- void
- AppendRowToMatrix (dw_offset_t offset);
-
- void
- Finalize (dw_offset_t offset);
-
- void
- Reset ();
-
- Prologue::shared_ptr prologue;
- lldb_private::Log *log;
- Callback callback; // Callback function that gets called each time an entry is to be added to the matrix
- void* callbackUserData;
- int row; // The row number that starts at zero for the prologue, and increases for each row added to the matrix
- private:
- DISALLOW_COPY_AND_ASSIGN (State);
- };
-
- static bool DumpOpcodes(lldb_private::Log *log, SymbolFileDWARF* dwarf2Data, dw_offset_t line_offset = DW_INVALID_OFFSET, uint32_t dump_flags = 0); // If line_offset is invalid, dump everything
- static bool DumpLineTableRows(lldb_private::Log *log, SymbolFileDWARF* dwarf2Data, dw_offset_t line_offset = DW_INVALID_OFFSET); // If line_offset is invalid, dump everything
- static bool ParseSupportFiles(const lldb::ModuleSP &module_sp, const lldb_private::DWARFDataExtractor& debug_line_data, const char *cu_comp_dir, dw_offset_t stmt_list, lldb_private::FileSpecList &support_files);
- static bool ParsePrologue(const lldb_private::DWARFDataExtractor& debug_line_data, lldb::offset_t* offset_ptr, Prologue* prologue);
- static bool ParseStatementTable(const lldb_private::DWARFDataExtractor& debug_line_data, lldb::offset_t* offset_ptr, State::Callback callback, void* userData);
- static dw_offset_t DumpStatementTable(lldb_private::Log *log, const lldb_private::DWARFDataExtractor& debug_line_data, const dw_offset_t line_offset);
- static dw_offset_t DumpStatementOpcodes(lldb_private::Log *log, const lldb_private::DWARFDataExtractor& debug_line_data, const dw_offset_t line_offset, uint32_t flags);
- static bool ParseStatementTable(const lldb_private::DWARFDataExtractor& debug_line_data, lldb::offset_t *offset_ptr, LineTable* line_table);
- static void Parse(const lldb_private::DWARFDataExtractor& debug_line_data, DWARFDebugLine::State::Callback callback, void* userData);
-// static void AppendLineTableData(const DWARFDebugLine::Prologue* prologue, const DWARFDebugLine::Row::collection& state_coll, const uint32_t addr_size, BinaryStreamBuf &debug_line_data);
-
- DWARFDebugLine() :
- m_lineTableMap()
- {
+ //------------------------------------------------------------------
+ // FileNameEntry
+ //------------------------------------------------------------------
+ struct FileNameEntry {
+ FileNameEntry() : name(nullptr), dir_idx(0), mod_time(0), length(0) {}
+
+ const char *name;
+ dw_sleb128_t dir_idx;
+ dw_sleb128_t mod_time;
+ dw_sleb128_t length;
+ };
+
+ //------------------------------------------------------------------
+ // Prologue
+ //------------------------------------------------------------------
+ struct Prologue {
+
+ Prologue()
+ : total_length(0), version(0), prologue_length(0), min_inst_length(0),
+ default_is_stmt(0), line_base(0), line_range(0), opcode_base(0),
+ standard_opcode_lengths(), include_directories(), file_names() {}
+
+ typedef std::shared_ptr<Prologue> shared_ptr;
+
+ uint32_t total_length; // The size in bytes of the statement information for
+ // this compilation unit (not including the
+ // total_length field itself).
+ uint16_t
+ version; // Version identifier for the statement information format.
+ uint32_t prologue_length; // The number of bytes following the
+ // prologue_length field to the beginning of the
+ // first byte of the statement program itself.
+ uint8_t min_inst_length; // The size in bytes of the smallest target machine
+ // instruction. Statement program opcodes that
+ // alter the address register first multiply their
+ // operands by this value.
+ uint8_t maximum_operations_per_instruction; // New in DWARF4. The maximum
+ // number of individual
+ // operations that may be
+ // encoded in an instruction.
+ uint8_t default_is_stmt; // The initial value of theis_stmtregister.
+ int8_t line_base; // This parameter affects the meaning of the special
+ // opcodes. See below.
+ uint8_t line_range; // This parameter affects the meaning of the special
+ // opcodes. See below.
+ uint8_t opcode_base; // The number assigned to the first special opcode.
+ std::vector<uint8_t> standard_opcode_lengths;
+ std::vector<const char *> include_directories;
+ std::vector<FileNameEntry> file_names;
+
+ int32_t MaxLineIncrementForSpecialOpcode() const {
+ return line_base + (int8_t)line_range - 1;
+ }
+ bool IsValid() const;
+ // void Append(BinaryStreamBuf& buff) const;
+ void Dump(lldb_private::Log *log);
+ void Clear() {
+ total_length = version = prologue_length = min_inst_length = line_base =
+ line_range = opcode_base = 0;
+ line_base = 0;
+ standard_opcode_lengths.clear();
+ include_directories.clear();
+ file_names.clear();
+ }
+ bool GetFile(uint32_t file_idx, const char *comp_dir,
+ lldb_private::FileSpec &file) const;
+ };
+
+ // Standard .debug_line state machine structure
+ struct Row {
+ typedef std::vector<Row> collection;
+ typedef collection::iterator iterator;
+ typedef collection::const_iterator const_iterator;
+
+ Row(bool default_is_stmt = false);
+ virtual ~Row() {}
+ void PostAppend();
+ void Reset(bool default_is_stmt);
+ void Dump(lldb_private::Log *log) const;
+ static void Insert(Row::collection &state_coll, const Row &state);
+ static void Dump(lldb_private::Log *log, const Row::collection &state_coll);
+
+ dw_addr_t address; // The program-counter value corresponding to a machine
+ // instruction generated by the compiler.
+ uint32_t line; // An unsigned integer indicating a source line number. Lines
+ // are numbered beginning at 1. The compiler may emit the
+ // value 0 in cases where an instruction cannot be attributed
+ // to any source line.
+ uint16_t column; // An unsigned integer indicating a column number within a
+ // source line. Columns are numbered beginning at 1. The
+ // value 0 is reserved to indicate that a statement begins
+ // at the 'left edge' of the line.
+ uint16_t file; // An unsigned integer indicating the identity of the source
+ // file corresponding to a machine instruction.
+ uint8_t is_stmt : 1, // A boolean indicating that the current instruction is
+ // the beginning of a statement.
+ basic_block : 1, // A boolean indicating that the current instruction is
+ // the beginning of a basic block.
+ end_sequence : 1, // A boolean indicating that the current address is
+ // that of the first byte after the end of a sequence
+ // of target machine instructions.
+ prologue_end : 1, // A boolean indicating that the current address is
+ // one (of possibly many) where execution should be
+ // suspended for an entry breakpoint of a function.
+ epilogue_begin : 1; // A boolean indicating that the current address is
+ // one (of possibly many) where execution should be
+ // suspended for an exit breakpoint of a function.
+ uint32_t isa; // An unsigned integer whose value encodes the applicable
+ // instruction set architecture for the current instruction.
+ };
+
+ //------------------------------------------------------------------
+ // LineTable
+ //------------------------------------------------------------------
+ struct LineTable {
+ typedef std::shared_ptr<LineTable> shared_ptr;
+
+ LineTable() : prologue(), rows() {}
+
+ void AppendRow(const DWARFDebugLine::Row &state);
+ void Clear() {
+ prologue.reset();
+ rows.clear();
}
- void Parse(const lldb_private::DWARFDataExtractor& debug_line_data);
- void ParseIfNeeded(const lldb_private::DWARFDataExtractor& debug_line_data);
- LineTable::shared_ptr GetLineTable(const dw_offset_t offset) const;
+ uint32_t LookupAddress(dw_addr_t address, dw_addr_t cu_high_pc) const;
+ void Dump(lldb_private::Log *log) const;
+
+ Prologue::shared_ptr prologue;
+ Row::collection rows;
+ };
+
+ //------------------------------------------------------------------
+ // State
+ //------------------------------------------------------------------
+ struct State : public Row {
+ typedef void (*Callback)(dw_offset_t offset, const State &state,
+ void *userData);
+
+ // Special row codes used when calling the callback
+ enum { StartParsingLineTable = 0, DoneParsingLineTable = -1 };
+
+ State(Prologue::shared_ptr &prologue_sp, lldb_private::Log *log,
+ Callback callback, void *userData);
+
+ void AppendRowToMatrix(dw_offset_t offset);
+
+ void Finalize(dw_offset_t offset);
+
+ void Reset();
+
+ Prologue::shared_ptr prologue;
+ lldb_private::Log *log;
+ Callback callback; // Callback function that gets called each time an entry
+ // is to be added to the matrix
+ void *callbackUserData;
+ int row; // The row number that starts at zero for the prologue, and
+ // increases for each row added to the matrix
+ private:
+ DISALLOW_COPY_AND_ASSIGN(State);
+ };
+
+ static bool DumpOpcodes(
+ lldb_private::Log *log, SymbolFileDWARF *dwarf2Data,
+ dw_offset_t line_offset = DW_INVALID_OFFSET,
+ uint32_t dump_flags = 0); // If line_offset is invalid, dump everything
+ static bool DumpLineTableRows(
+ lldb_private::Log *log, SymbolFileDWARF *dwarf2Data,
+ dw_offset_t line_offset =
+ DW_INVALID_OFFSET); // If line_offset is invalid, dump everything
+ static bool
+ ParseSupportFiles(const lldb::ModuleSP &module_sp,
+ const lldb_private::DWARFDataExtractor &debug_line_data,
+ const char *cu_comp_dir, dw_offset_t stmt_list,
+ lldb_private::FileSpecList &support_files);
+ static bool
+ ParsePrologue(const lldb_private::DWARFDataExtractor &debug_line_data,
+ lldb::offset_t *offset_ptr, Prologue *prologue);
+ static bool
+ ParseStatementTable(const lldb_private::DWARFDataExtractor &debug_line_data,
+ lldb::offset_t *offset_ptr, State::Callback callback,
+ void *userData);
+ static dw_offset_t
+ DumpStatementTable(lldb_private::Log *log,
+ const lldb_private::DWARFDataExtractor &debug_line_data,
+ const dw_offset_t line_offset);
+ static dw_offset_t
+ DumpStatementOpcodes(lldb_private::Log *log,
+ const lldb_private::DWARFDataExtractor &debug_line_data,
+ const dw_offset_t line_offset, uint32_t flags);
+ static bool
+ ParseStatementTable(const lldb_private::DWARFDataExtractor &debug_line_data,
+ lldb::offset_t *offset_ptr, LineTable *line_table);
+ static void Parse(const lldb_private::DWARFDataExtractor &debug_line_data,
+ DWARFDebugLine::State::Callback callback, void *userData);
+ // static void AppendLineTableData(const DWARFDebugLine::Prologue* prologue,
+ // const DWARFDebugLine::Row::collection& state_coll, const uint32_t
+ // addr_size, BinaryStreamBuf &debug_line_data);
+
+ DWARFDebugLine() : m_lineTableMap() {}
+
+ void Parse(const lldb_private::DWARFDataExtractor &debug_line_data);
+ void ParseIfNeeded(const lldb_private::DWARFDataExtractor &debug_line_data);
+ LineTable::shared_ptr GetLineTable(const dw_offset_t offset) const;
protected:
- typedef std::map<dw_offset_t, LineTable::shared_ptr> LineTableMap;
- typedef LineTableMap::iterator LineTableIter;
- typedef LineTableMap::const_iterator LineTableConstIter;
+ typedef std::map<dw_offset_t, LineTable::shared_ptr> LineTableMap;
+ typedef LineTableMap::iterator LineTableIter;
+ typedef LineTableMap::const_iterator LineTableConstIter;
- LineTableMap m_lineTableMap;
+ LineTableMap m_lineTableMap;
};
-#endif // SymbolFileDWARF_DWARFDebugLine_h_
+#endif // SymbolFileDWARF_DWARFDebugLine_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.cpp
index 0e2aaa47e8c..d56463039a1 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.cpp
@@ -17,32 +17,23 @@
using namespace lldb_private;
using namespace std;
-DWARFDebugMacinfo::DWARFDebugMacinfo()
-{
-}
+DWARFDebugMacinfo::DWARFDebugMacinfo() {}
-DWARFDebugMacinfo::~DWARFDebugMacinfo()
-{
-}
+DWARFDebugMacinfo::~DWARFDebugMacinfo() {}
-void
-DWARFDebugMacinfo::Dump(Stream *s, const DWARFDataExtractor& macinfo_data, lldb::offset_t offset)
-{
- DWARFDebugMacinfoEntry maninfo_entry;
- if (macinfo_data.GetByteSize() == 0)
- {
- s->PutCString("< EMPTY >\n");
- return;
- }
- if (offset == LLDB_INVALID_OFFSET)
- {
- offset = 0;
- while (maninfo_entry.Extract(macinfo_data, &offset))
- maninfo_entry.Dump(s);
- }
- else
- {
- if (maninfo_entry.Extract(macinfo_data, &offset))
- maninfo_entry.Dump(s);
- }
+void DWARFDebugMacinfo::Dump(Stream *s, const DWARFDataExtractor &macinfo_data,
+ lldb::offset_t offset) {
+ DWARFDebugMacinfoEntry maninfo_entry;
+ if (macinfo_data.GetByteSize() == 0) {
+ s->PutCString("< EMPTY >\n");
+ return;
+ }
+ if (offset == LLDB_INVALID_OFFSET) {
+ offset = 0;
+ while (maninfo_entry.Extract(macinfo_data, &offset))
+ maninfo_entry.Dump(s);
+ } else {
+ if (maninfo_entry.Extract(macinfo_data, &offset))
+ maninfo_entry.Dump(s);
+ }
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.h
index 077718cf7db..ec9dc85669c 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfo.h
@@ -12,18 +12,15 @@
#include "SymbolFileDWARF.h"
-class DWARFDebugMacinfo
-{
+class DWARFDebugMacinfo {
public:
- DWARFDebugMacinfo();
+ DWARFDebugMacinfo();
- ~DWARFDebugMacinfo();
+ ~DWARFDebugMacinfo();
- static void
- Dump (lldb_private::Stream *s,
- const lldb_private::DWARFDataExtractor& macinfo_data,
- lldb::offset_t offset = LLDB_INVALID_OFFSET);
+ static void Dump(lldb_private::Stream *s,
+ const lldb_private::DWARFDataExtractor &macinfo_data,
+ lldb::offset_t offset = LLDB_INVALID_OFFSET);
};
-
-#endif // SymbolFileDWARF_DWARFDebugMacinfo_h_
+#endif // SymbolFileDWARF_DWARFDebugMacinfo_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.cpp
index 4a176bb8aad..45498590236 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.cpp
@@ -14,119 +14,98 @@
using namespace lldb_private;
using namespace std;
-DWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry() :
- m_type_code(0),
- m_line(0),
- m_op2()
-{
- m_op2.cstr = NULL;
+DWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry()
+ : m_type_code(0), m_line(0), m_op2() {
+ m_op2.cstr = NULL;
}
-DWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry()
-{
+DWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry() {}
+
+const char *DWARFDebugMacinfoEntry::GetCString() const {
+ switch (m_type_code) {
+ case 0:
+ case DW_MACINFO_start_file:
+ case DW_MACINFO_end_file:
+ return NULL;
+ default:
+ break;
+ }
+ return m_op2.cstr;
}
-const char*
-DWARFDebugMacinfoEntry::GetCString() const
-{
- switch (m_type_code)
- {
- case 0:
- case DW_MACINFO_start_file:
- case DW_MACINFO_end_file:
- return NULL;
- default:
- break;
- }
- return m_op2.cstr;
-}
+void DWARFDebugMacinfoEntry::Dump(Stream *s) const {
+ if (m_type_code) {
+ s->PutCString(DW_MACINFO_value_to_name(m_type_code));
+ switch (m_type_code) {
+ case DW_MACINFO_define:
+ s->Printf(" line:%u #define %s\n", (uint32_t)m_line, m_op2.cstr);
+ break;
+ case DW_MACINFO_undef:
+ s->Printf(" line:%u #undef %s\n", (uint32_t)m_line, m_op2.cstr);
+ break;
-void
-DWARFDebugMacinfoEntry::Dump(Stream *s) const
-{
- if (m_type_code)
- {
- s->PutCString(DW_MACINFO_value_to_name(m_type_code));
-
- switch (m_type_code)
- {
- case DW_MACINFO_define:
- s->Printf(" line:%u #define %s\n", (uint32_t)m_line, m_op2.cstr);
- break;
-
- case DW_MACINFO_undef:
- s->Printf(" line:%u #undef %s\n", (uint32_t)m_line, m_op2.cstr);
- break;
-
- default:
- s->Printf(" line:%u str: '%s'\n", (uint32_t)m_line, m_op2.cstr);
- break;
+ default:
+ s->Printf(" line:%u str: '%s'\n", (uint32_t)m_line, m_op2.cstr);
+ break;
- case DW_MACINFO_start_file:
- s->Printf(" line:%u file index: '%u'\n", (uint32_t)m_line, (uint32_t)m_op2.file_idx);
- break;
+ case DW_MACINFO_start_file:
+ s->Printf(" line:%u file index: '%u'\n", (uint32_t)m_line,
+ (uint32_t)m_op2.file_idx);
+ break;
- case DW_MACINFO_end_file:
- break;
- }
- }
- else
- {
- s->PutCString(" END\n");
+ case DW_MACINFO_end_file:
+ break;
}
+ } else {
+ s->PutCString(" END\n");
+ }
}
+bool DWARFDebugMacinfoEntry::Extract(const DWARFDataExtractor &mac_info_data,
+ lldb::offset_t *offset_ptr) {
+ if (mac_info_data.ValidOffset(*offset_ptr)) {
+ m_type_code = mac_info_data.GetU8(offset_ptr);
+
+ switch (m_type_code) {
+
+ case DW_MACINFO_define:
+ case DW_MACINFO_undef:
+ // 2 operands:
+ // Arg 1: operand encodes the line number of the source line on which
+ // the relevant defining or undefining pre-processor directives
+ // appeared.
+ m_line = mac_info_data.GetULEB128(offset_ptr);
+ // Arg 2: define string
+ m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
+ break;
-bool
-DWARFDebugMacinfoEntry::Extract(const DWARFDataExtractor& mac_info_data, lldb::offset_t* offset_ptr)
-{
- if (mac_info_data.ValidOffset(*offset_ptr))
- {
- m_type_code = mac_info_data.GetU8(offset_ptr);
-
- switch (m_type_code)
- {
-
- case DW_MACINFO_define:
- case DW_MACINFO_undef:
- // 2 operands:
- // Arg 1: operand encodes the line number of the source line on which
- // the relevant defining or undefining pre-processor directives
- // appeared.
- m_line = mac_info_data.GetULEB128(offset_ptr);
- // Arg 2: define string
- m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
- break;
-
- case DW_MACINFO_start_file:
- // 2 operands:
- // Op 1: line number of the source line on which the inclusion
- // pre-processor directive occurred.
- m_line = mac_info_data.GetULEB128(offset_ptr);
- // Op 2: a source file name index to a file number in the statement
- // information table for the relevant compilation unit.
- m_op2.file_idx = mac_info_data.GetULEB128(offset_ptr);
- break;
-
- case 0: // End of list
- case DW_MACINFO_end_file:
- // No operands
- m_line = DW_INVALID_OFFSET;
- m_op2.cstr = NULL;
- break;
- default:
- // Vendor specific entries always have a ULEB128 and a string
- m_line = mac_info_data.GetULEB128(offset_ptr);
- m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
- break;
- }
- return true;
+ case DW_MACINFO_start_file:
+ // 2 operands:
+ // Op 1: line number of the source line on which the inclusion
+ // pre-processor directive occurred.
+ m_line = mac_info_data.GetULEB128(offset_ptr);
+ // Op 2: a source file name index to a file number in the statement
+ // information table for the relevant compilation unit.
+ m_op2.file_idx = mac_info_data.GetULEB128(offset_ptr);
+ break;
+
+ case 0: // End of list
+ case DW_MACINFO_end_file:
+ // No operands
+ m_line = DW_INVALID_OFFSET;
+ m_op2.cstr = NULL;
+ break;
+ default:
+ // Vendor specific entries always have a ULEB128 and a string
+ m_line = mac_info_data.GetULEB128(offset_ptr);
+ m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
+ break;
}
- else
- m_type_code = 0;
+ return true;
+ } else
+ m_type_code = 0;
- return false;
+ return false;
}
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.h
index 72318d86e1c..96829c2fc09 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.h
@@ -12,46 +12,31 @@
#include "SymbolFileDWARF.h"
-class DWARFDebugMacinfoEntry
-{
+class DWARFDebugMacinfoEntry {
public:
- DWARFDebugMacinfoEntry();
+ DWARFDebugMacinfoEntry();
- ~DWARFDebugMacinfoEntry();
+ ~DWARFDebugMacinfoEntry();
- uint8_t
- TypeCode() const
- {
- return m_type_code;
- }
+ uint8_t TypeCode() const { return m_type_code; }
- uint8_t
- GetLineNumber() const
- {
- return m_line;
- }
+ uint8_t GetLineNumber() const { return m_line; }
- void
- Dump(lldb_private::Stream *s) const;
+ void Dump(lldb_private::Stream *s) const;
- const char*
- GetCString() const;
+ const char *GetCString() const;
- bool
- Extract(const lldb_private::DWARFDataExtractor& mac_info_data,
- lldb::offset_t* offset_ptr);
+ bool Extract(const lldb_private::DWARFDataExtractor &mac_info_data,
+ lldb::offset_t *offset_ptr);
protected:
-
private:
- uint8_t m_type_code;
- dw_uleb128_t m_line;
- union
- {
- dw_uleb128_t file_idx;
- const char* cstr;
- } m_op2;
+ uint8_t m_type_code;
+ dw_uleb128_t m_line;
+ union {
+ dw_uleb128_t file_idx;
+ const char *cstr;
+ } m_op2;
};
-
-#endif // SymbolFileDWARF_DWARFDebugMacinfoEntry_h_
+#endif // SymbolFileDWARF_DWARFDebugMacinfoEntry_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.cpp
index 75c812e6e79..381c68c2d94 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.cpp
@@ -17,112 +17,111 @@
using namespace lldb_private;
DWARFDebugMacroHeader
-DWARFDebugMacroHeader::ParseHeader(const DWARFDataExtractor &debug_macro_data, lldb::offset_t *offset)
-{
- DWARFDebugMacroHeader header;
+DWARFDebugMacroHeader::ParseHeader(const DWARFDataExtractor &debug_macro_data,
+ lldb::offset_t *offset) {
+ DWARFDebugMacroHeader header;
- // Skip over the version field in header.
- header.m_version = debug_macro_data.GetU16(offset);
+ // Skip over the version field in header.
+ header.m_version = debug_macro_data.GetU16(offset);
- uint8_t flags = debug_macro_data.GetU8(offset);
- header.m_offset_is_64_bit = flags & OFFSET_SIZE_MASK ? true : false;
+ uint8_t flags = debug_macro_data.GetU8(offset);
+ header.m_offset_is_64_bit = flags & OFFSET_SIZE_MASK ? true : false;
- if (flags & DEBUG_LINE_OFFSET_MASK)
- {
- if (header.m_offset_is_64_bit)
- header.m_debug_line_offset = debug_macro_data.GetU64(offset);
- else
- header.m_debug_line_offset = debug_macro_data.GetU32(offset);
- }
+ if (flags & DEBUG_LINE_OFFSET_MASK) {
+ if (header.m_offset_is_64_bit)
+ header.m_debug_line_offset = debug_macro_data.GetU64(offset);
+ else
+ header.m_debug_line_offset = debug_macro_data.GetU32(offset);
+ }
- // Skip over the operands table if it is present.
- if (flags & OPCODE_OPERANDS_TABLE_MASK)
- SkipOperandTable(debug_macro_data, offset);
+ // Skip over the operands table if it is present.
+ if (flags & OPCODE_OPERANDS_TABLE_MASK)
+ SkipOperandTable(debug_macro_data, offset);
- return header;
+ return header;
}
-void
-DWARFDebugMacroHeader::SkipOperandTable(const DWARFDataExtractor &debug_macro_data, lldb::offset_t *offset)
-{
- uint8_t entry_count = debug_macro_data.GetU8(offset);
- for (uint8_t i = 0; i < entry_count; i++)
- {
- // Skip over the opcode number.
- debug_macro_data.GetU8(offset);
+void DWARFDebugMacroHeader::SkipOperandTable(
+ const DWARFDataExtractor &debug_macro_data, lldb::offset_t *offset) {
+ uint8_t entry_count = debug_macro_data.GetU8(offset);
+ for (uint8_t i = 0; i < entry_count; i++) {
+ // Skip over the opcode number.
+ debug_macro_data.GetU8(offset);
- uint64_t operand_count = debug_macro_data.GetULEB128(offset);
+ uint64_t operand_count = debug_macro_data.GetULEB128(offset);
- for (uint64_t j = 0; j < operand_count; j++)
- {
- // Skip over the operand form
- debug_macro_data.GetU8(offset);
- }
+ for (uint64_t j = 0; j < operand_count; j++) {
+ // Skip over the operand form
+ debug_macro_data.GetU8(offset);
}
+ }
}
-void
-DWARFDebugMacroEntry::ReadMacroEntries(const DWARFDataExtractor &debug_macro_data,
- const DWARFDataExtractor &debug_str_data,
- const bool offset_is_64_bit,
- lldb::offset_t *offset,
- SymbolFileDWARF *sym_file_dwarf,
- DebugMacrosSP &debug_macros_sp)
-{
- llvm::dwarf::MacroEntryType type = static_cast<llvm::dwarf::MacroEntryType>(debug_macro_data.GetU8(offset));
- while (type != 0)
- {
- lldb::offset_t new_offset = 0, str_offset = 0;
- uint32_t line = 0;
- const char *macro_str = nullptr;
- uint32_t debug_line_file_idx = 0;
+void DWARFDebugMacroEntry::ReadMacroEntries(
+ const DWARFDataExtractor &debug_macro_data,
+ const DWARFDataExtractor &debug_str_data, const bool offset_is_64_bit,
+ lldb::offset_t *offset, SymbolFileDWARF *sym_file_dwarf,
+ DebugMacrosSP &debug_macros_sp) {
+ llvm::dwarf::MacroEntryType type =
+ static_cast<llvm::dwarf::MacroEntryType>(debug_macro_data.GetU8(offset));
+ while (type != 0) {
+ lldb::offset_t new_offset = 0, str_offset = 0;
+ uint32_t line = 0;
+ const char *macro_str = nullptr;
+ uint32_t debug_line_file_idx = 0;
- switch (type)
- {
- case DW_MACRO_define:
- case DW_MACRO_undef:
- line = debug_macro_data.GetULEB128(offset);
- macro_str = debug_macro_data.GetCStr(offset);
- if (type == DW_MACRO_define)
- debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateDefineEntry(line, macro_str));
- else
- debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateUndefEntry(line, macro_str));
- break;
- case DW_MACRO_define_indirect:
- case DW_MACRO_undef_indirect:
- line = debug_macro_data.GetULEB128(offset);
- if (offset_is_64_bit)
- str_offset = debug_macro_data.GetU64(offset);
- else
- str_offset = debug_macro_data.GetU32(offset);
- macro_str = debug_str_data.GetCStr(&str_offset);
- if (type == DW_MACRO_define_indirect)
- debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateDefineEntry(line, macro_str));
- else
- debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateUndefEntry(line, macro_str));
- break;
- case DW_MACRO_start_file:
- line = debug_macro_data.GetULEB128(offset);
- debug_line_file_idx = debug_macro_data.GetULEB128(offset);
- debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateStartFileEntry(line, debug_line_file_idx));
- break;
- case DW_MACRO_end_file:
- // This operation has no operands.
- debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateEndFileEntry());
- break;
- case DW_MACRO_transparent_include:
- if (offset_is_64_bit)
- new_offset = debug_macro_data.GetU64(offset);
- else
- new_offset = debug_macro_data.GetU32(offset);
- debug_macros_sp->AddMacroEntry(
- DebugMacroEntry::CreateIndirectEntry(sym_file_dwarf->ParseDebugMacros(&new_offset)));
- break;
- default:
- // TODO: Add support for other standard operations.
- // TODO: Provide mechanism to hook handling of non-standard/extension operands.
- return;
- }
- type = static_cast<llvm::dwarf::MacroEntryType>(debug_macro_data.GetU8(offset));
+ switch (type) {
+ case DW_MACRO_define:
+ case DW_MACRO_undef:
+ line = debug_macro_data.GetULEB128(offset);
+ macro_str = debug_macro_data.GetCStr(offset);
+ if (type == DW_MACRO_define)
+ debug_macros_sp->AddMacroEntry(
+ DebugMacroEntry::CreateDefineEntry(line, macro_str));
+ else
+ debug_macros_sp->AddMacroEntry(
+ DebugMacroEntry::CreateUndefEntry(line, macro_str));
+ break;
+ case DW_MACRO_define_indirect:
+ case DW_MACRO_undef_indirect:
+ line = debug_macro_data.GetULEB128(offset);
+ if (offset_is_64_bit)
+ str_offset = debug_macro_data.GetU64(offset);
+ else
+ str_offset = debug_macro_data.GetU32(offset);
+ macro_str = debug_str_data.GetCStr(&str_offset);
+ if (type == DW_MACRO_define_indirect)
+ debug_macros_sp->AddMacroEntry(
+ DebugMacroEntry::CreateDefineEntry(line, macro_str));
+ else
+ debug_macros_sp->AddMacroEntry(
+ DebugMacroEntry::CreateUndefEntry(line, macro_str));
+ break;
+ case DW_MACRO_start_file:
+ line = debug_macro_data.GetULEB128(offset);
+ debug_line_file_idx = debug_macro_data.GetULEB128(offset);
+ debug_macros_sp->AddMacroEntry(
+ DebugMacroEntry::CreateStartFileEntry(line, debug_line_file_idx));
+ break;
+ case DW_MACRO_end_file:
+ // This operation has no operands.
+ debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateEndFileEntry());
+ break;
+ case DW_MACRO_transparent_include:
+ if (offset_is_64_bit)
+ new_offset = debug_macro_data.GetU64(offset);
+ else
+ new_offset = debug_macro_data.GetU32(offset);
+ debug_macros_sp->AddMacroEntry(DebugMacroEntry::CreateIndirectEntry(
+ sym_file_dwarf->ParseDebugMacros(&new_offset)));
+ break;
+ default:
+ // TODO: Add support for other standard operations.
+ // TODO: Provide mechanism to hook handling of non-standard/extension
+ // operands.
+ return;
}
+ type = static_cast<llvm::dwarf::MacroEntryType>(
+ debug_macro_data.GetU8(offset));
+ }
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.h
index c60b9749b00..021b434cd45 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacro.h
@@ -1,4 +1,5 @@
-//===-- DWARFDebugMacro.h ----------------------------------------*- C++ -*-===//
+//===-- DWARFDebugMacro.h ----------------------------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -12,12 +13,11 @@
#include <map>
-#include "lldb/lldb-types.h"
#include "lldb/Core/dwarf.h"
#include "lldb/Symbol/DebugMacros.h"
+#include "lldb/lldb-types.h"
-namespace lldb_private
-{
+namespace lldb_private {
class DWARFDataExtractor;
@@ -25,44 +25,38 @@ class DWARFDataExtractor;
class SymbolFileDWARF;
-class DWARFDebugMacroHeader
-{
+class DWARFDebugMacroHeader {
public:
- enum HeaderFlagMask
- {
- OFFSET_SIZE_MASK = 0x1,
- DEBUG_LINE_OFFSET_MASK = 0x2,
- OPCODE_OPERANDS_TABLE_MASK = 0x4
- };
+ enum HeaderFlagMask {
+ OFFSET_SIZE_MASK = 0x1,
+ DEBUG_LINE_OFFSET_MASK = 0x2,
+ OPCODE_OPERANDS_TABLE_MASK = 0x4
+ };
- static DWARFDebugMacroHeader
- ParseHeader(const lldb_private::DWARFDataExtractor &debug_macro_data, lldb::offset_t *offset);
+ static DWARFDebugMacroHeader
+ ParseHeader(const lldb_private::DWARFDataExtractor &debug_macro_data,
+ lldb::offset_t *offset);
- bool
- OffsetIs64Bit() const
- {
- return m_offset_is_64_bit;
- }
+ bool OffsetIs64Bit() const { return m_offset_is_64_bit; }
private:
- static void
- SkipOperandTable(const lldb_private::DWARFDataExtractor &debug_macro_data, lldb::offset_t *offset);
+ static void
+ SkipOperandTable(const lldb_private::DWARFDataExtractor &debug_macro_data,
+ lldb::offset_t *offset);
- uint16_t m_version;
- bool m_offset_is_64_bit;
- uint64_t m_debug_line_offset;
+ uint16_t m_version;
+ bool m_offset_is_64_bit;
+ uint64_t m_debug_line_offset;
};
-class DWARFDebugMacroEntry
-{
+class DWARFDebugMacroEntry {
public:
- static void
- ReadMacroEntries(const lldb_private::DWARFDataExtractor &debug_macro_data,
- const lldb_private::DWARFDataExtractor &debug_str_data,
- const bool offset_is_64_bit,
- lldb::offset_t *sect_offset,
- SymbolFileDWARF *sym_file_dwarf,
- lldb_private::DebugMacrosSP &debug_macros_sp);
+ static void
+ ReadMacroEntries(const lldb_private::DWARFDataExtractor &debug_macro_data,
+ const lldb_private::DWARFDataExtractor &debug_str_data,
+ const bool offset_is_64_bit, lldb::offset_t *sect_offset,
+ SymbolFileDWARF *sym_file_dwarf,
+ lldb_private::DebugMacrosSP &debug_macros_sp);
};
#endif // SymbolFileDWARF_DWARFDebugMacro_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp
index 63fcebef1cf..d4281bac79a 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.cpp
@@ -12,268 +12,242 @@
#include "lldb/Core/Stream.h"
#include "lldb/Core/Timer.h"
-#include "DWARFDebugInfo.h"
+#include "DWARFCompileUnit.h"
#include "DWARFDIECollection.h"
+#include "DWARFDebugInfo.h"
#include "DWARFFormValue.h"
-#include "DWARFCompileUnit.h"
#include "LogChannelDWARF.h"
#include "SymbolFileDWARF.h"
-
using namespace lldb;
using namespace lldb_private;
-DWARFDebugPubnames::DWARFDebugPubnames() :
- m_sets()
-{
-}
-
-bool
-DWARFDebugPubnames::Extract(const DWARFDataExtractor& data)
-{
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")",
- (uint64_t)data.GetByteSize());
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
- if (log)
- log->Printf("DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")", (uint64_t)data.GetByteSize());
-
- if (data.ValidOffset(0))
- {
- lldb::offset_t offset = 0;
-
- DWARFDebugPubnamesSet set;
- while (data.ValidOffset(offset))
- {
- if (set.Extract(data, &offset))
- {
- m_sets.push_back(set);
- offset = set.GetOffsetOfNextEntry();
- }
- else
- break;
- }
- if (log)
- Dump (log);
- return true;
+DWARFDebugPubnames::DWARFDebugPubnames() : m_sets() {}
+
+bool DWARFDebugPubnames::Extract(const DWARFDataExtractor &data) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")",
+ (uint64_t)data.GetByteSize());
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
+ if (log)
+ log->Printf("DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")",
+ (uint64_t)data.GetByteSize());
+
+ if (data.ValidOffset(0)) {
+ lldb::offset_t offset = 0;
+
+ DWARFDebugPubnamesSet set;
+ while (data.ValidOffset(offset)) {
+ if (set.Extract(data, &offset)) {
+ m_sets.push_back(set);
+ offset = set.GetOffsetOfNextEntry();
+ } else
+ break;
}
- return false;
-}
-
-
-bool
-DWARFDebugPubnames::GeneratePubnames(SymbolFileDWARF* dwarf2Data)
-{
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "DWARFDebugPubnames::GeneratePubnames (data = %p)",
- static_cast<void*>(dwarf2Data));
-
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
if (log)
- log->Printf("DWARFDebugPubnames::GeneratePubnames (data = %p)",
- static_cast<void*>(dwarf2Data));
-
- m_sets.clear();
- DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo();
- if (debug_info)
- {
- uint32_t cu_idx = 0;
- const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
- for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- {
-
- DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx);
-
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (cu->GetAddressByteSize(),
- cu->IsDWARF64());
-
- bool clear_dies = cu->ExtractDIEsIfNeeded (false) > 1;
-
- DWARFDIECollection dies;
- const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_subprogram, dies) +
- cu->AppendDIEsWithTag (DW_TAG_variable, dies);
-
- dw_offset_t cu_offset = cu->GetOffset();
- DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset);
-
- size_t die_idx;
- for (die_idx = 0; die_idx < die_count; ++die_idx)
- {
- 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.GetDIE()->GetAttributes(die.GetCU(), fixed_form_sizes, attributes);
- if (num_attributes > 0)
- {
- uint32_t i;
-
- dw_tag_t tag = die.Tag();
-
- for (i=0; i<num_attributes; ++i)
- {
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue form_value;
- switch (attr)
- {
- case DW_AT_name:
- 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(i, form_value))
- mangled = form_value.AsCString();
- break;
-
- case DW_AT_low_pc:
- case DW_AT_ranges:
- case DW_AT_entry_pc:
- if (tag == DW_TAG_subprogram)
- add_die = true;
- break;
-
- case DW_AT_location:
- if (tag == DW_TAG_variable)
- {
- DWARFDIE parent_die = die.GetParent();
- while ( parent_die )
- {
- switch (parent_die.Tag())
- {
- case DW_TAG_subprogram:
- case DW_TAG_lexical_block:
- case DW_TAG_inlined_subroutine:
- // Even if this is a function level static, we don't add it. We could theoretically
- // add these if we wanted to by introspecting into the DW_AT_location and seeing
- // if the location describes a hard coded address, but we don't want the performance
- // penalty of that right now.
- add_die = false;
- parent_die.Clear(); // Terminate the while loop.
- break;
-
- case DW_TAG_compile_unit:
- add_die = true;
- parent_die.Clear(); // Terminate the while loop.
- break;
-
- default:
- parent_die = parent_die.GetParent(); // Keep going in the while loop.
- break;
- }
- }
- }
- break;
- }
- }
- }
+ Dump(log);
+ return true;
+ }
+ return false;
+}
- if (add_die && (name || mangled))
- {
- pubnames_set.AddDescriptor(die.GetCompileUnitRelativeOffset(), mangled ? mangled : name);
+bool DWARFDebugPubnames::GeneratePubnames(SymbolFileDWARF *dwarf2Data) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "DWARFDebugPubnames::GeneratePubnames (data = %p)",
+ static_cast<void *>(dwarf2Data));
+
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
+ if (log)
+ log->Printf("DWARFDebugPubnames::GeneratePubnames (data = %p)",
+ static_cast<void *>(dwarf2Data));
+
+ m_sets.clear();
+ DWARFDebugInfo *debug_info = dwarf2Data->DebugInfo();
+ if (debug_info) {
+ uint32_t cu_idx = 0;
+ const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
+ for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
+
+ DWARFCompileUnit *cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+
+ DWARFFormValue::FixedFormSizes fixed_form_sizes =
+ DWARFFormValue::GetFixedFormSizesForAddressSize(
+ cu->GetAddressByteSize(), cu->IsDWARF64());
+
+ bool clear_dies = cu->ExtractDIEsIfNeeded(false) > 1;
+
+ DWARFDIECollection dies;
+ const size_t die_count = cu->AppendDIEsWithTag(DW_TAG_subprogram, dies) +
+ cu->AppendDIEsWithTag(DW_TAG_variable, dies);
+
+ dw_offset_t cu_offset = cu->GetOffset();
+ DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset,
+ cu->GetNextCompileUnitOffset() -
+ cu_offset);
+
+ size_t die_idx;
+ for (die_idx = 0; die_idx < die_count; ++die_idx) {
+ 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.GetDIE()->GetAttributes(
+ die.GetCU(), fixed_form_sizes, attributes);
+ if (num_attributes > 0) {
+ uint32_t i;
+
+ dw_tag_t tag = die.Tag();
+
+ for (i = 0; i < num_attributes; ++i) {
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue form_value;
+ switch (attr) {
+ case DW_AT_name:
+ 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(i, form_value))
+ mangled = form_value.AsCString();
+ break;
+
+ case DW_AT_low_pc:
+ case DW_AT_ranges:
+ case DW_AT_entry_pc:
+ if (tag == DW_TAG_subprogram)
+ add_die = true;
+ break;
+
+ case DW_AT_location:
+ if (tag == DW_TAG_variable) {
+ DWARFDIE parent_die = die.GetParent();
+ while (parent_die) {
+ switch (parent_die.Tag()) {
+ case DW_TAG_subprogram:
+ case DW_TAG_lexical_block:
+ case DW_TAG_inlined_subroutine:
+ // Even if this is a function level static, we don't add it.
+ // We could theoretically
+ // add these if we wanted to by introspecting into the
+ // DW_AT_location and seeing
+ // if the location describes a hard coded address, but we
+ // don't want the performance
+ // penalty of that right now.
+ add_die = false;
+ parent_die.Clear(); // Terminate the while loop.
+ break;
+
+ case DW_TAG_compile_unit:
+ add_die = true;
+ parent_die.Clear(); // Terminate the while loop.
+ break;
+
+ default:
+ parent_die =
+ parent_die.GetParent(); // Keep going in the while loop.
+ break;
+ }
}
+ }
+ break;
}
+ }
+ }
- if (pubnames_set.NumDescriptors() > 0)
- {
- m_sets.push_back(pubnames_set);
- }
-
- // Keep memory down by clearing DIEs if this generate function
- // caused them to be parsed
- if (clear_dies)
- cu->ClearDIEs (true);
+ if (add_die && (name || mangled)) {
+ pubnames_set.AddDescriptor(die.GetCompileUnitRelativeOffset(),
+ mangled ? mangled : name);
}
- }
- if (m_sets.empty())
- return false;
- if (log)
- Dump (log);
- return true;
-}
+ }
-bool
-DWARFDebugPubnames::GeneratePubBaseTypes(SymbolFileDWARF* dwarf2Data)
-{
- m_sets.clear();
- DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo();
- if (debug_info)
- {
- uint32_t cu_idx = 0;
- const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
- for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- {
- DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx);
- DWARFDIECollection dies;
- const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_base_type, dies);
- dw_offset_t cu_offset = cu->GetOffset();
- DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset);
-
- size_t die_idx;
- for (die_idx = 0; die_idx < die_count; ++die_idx)
- {
- DWARFDIE die = dies.GetDIEAtIndex (die_idx);
- const char *name = die.GetName();
-
- if (name)
- pubnames_set.AddDescriptor(die.GetCompileUnitRelativeOffset(), name);
- }
+ if (pubnames_set.NumDescriptors() > 0) {
+ m_sets.push_back(pubnames_set);
+ }
- if (pubnames_set.NumDescriptors() > 0)
- {
- m_sets.push_back(pubnames_set);
- }
- }
+ // Keep memory down by clearing DIEs if this generate function
+ // caused them to be parsed
+ if (clear_dies)
+ cu->ClearDIEs(true);
}
- return !m_sets.empty();
+ }
+ if (m_sets.empty())
+ return false;
+ if (log)
+ Dump(log);
+ return true;
}
-void
-DWARFDebugPubnames::Dump(Log *s) const
-{
- if (m_sets.empty())
- s->PutCString("< EMPTY >\n");
- else
- {
- const_iterator pos;
- const_iterator end = m_sets.end();
-
- for (pos = m_sets.begin(); pos != end; ++pos)
- (*pos).Dump(s);
+bool DWARFDebugPubnames::GeneratePubBaseTypes(SymbolFileDWARF *dwarf2Data) {
+ m_sets.clear();
+ DWARFDebugInfo *debug_info = dwarf2Data->DebugInfo();
+ if (debug_info) {
+ uint32_t cu_idx = 0;
+ const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
+ for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
+ DWARFCompileUnit *cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+ DWARFDIECollection dies;
+ const size_t die_count = cu->AppendDIEsWithTag(DW_TAG_base_type, dies);
+ dw_offset_t cu_offset = cu->GetOffset();
+ DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset,
+ cu->GetNextCompileUnitOffset() -
+ cu_offset);
+
+ size_t die_idx;
+ for (die_idx = 0; die_idx < die_count; ++die_idx) {
+ DWARFDIE die = dies.GetDIEAtIndex(die_idx);
+ const char *name = die.GetName();
+
+ if (name)
+ pubnames_set.AddDescriptor(die.GetCompileUnitRelativeOffset(), name);
+ }
+
+ if (pubnames_set.NumDescriptors() > 0) {
+ m_sets.push_back(pubnames_set);
+ }
}
+ }
+ return !m_sets.empty();
}
-bool
-DWARFDebugPubnames::Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offsets) const
-{
+void DWARFDebugPubnames::Dump(Log *s) const {
+ if (m_sets.empty())
+ s->PutCString("< EMPTY >\n");
+ else {
const_iterator pos;
const_iterator end = m_sets.end();
- die_offsets.clear();
-
for (pos = m_sets.begin(); pos != end; ++pos)
- {
- (*pos).Find(name, ignore_case, die_offsets);
- }
+ (*pos).Dump(s);
+ }
+}
+
+bool DWARFDebugPubnames::Find(const char *name, bool ignore_case,
+ std::vector<dw_offset_t> &die_offsets) const {
+ const_iterator pos;
+ const_iterator end = m_sets.end();
+
+ die_offsets.clear();
+
+ for (pos = m_sets.begin(); pos != end; ++pos) {
+ (*pos).Find(name, ignore_case, die_offsets);
+ }
- return !die_offsets.empty();
+ return !die_offsets.empty();
}
-bool
-DWARFDebugPubnames::Find(const RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const
-{
- const_iterator pos;
- const_iterator end = m_sets.end();
+bool DWARFDebugPubnames::Find(const RegularExpression &regex,
+ std::vector<dw_offset_t> &die_offsets) const {
+ const_iterator pos;
+ const_iterator end = m_sets.end();
- die_offsets.clear();
+ die_offsets.clear();
- for (pos = m_sets.begin(); pos != end; ++pos)
- {
- (*pos).Find(regex, die_offsets);
- }
+ for (pos = m_sets.begin(); pos != end; ++pos) {
+ (*pos).Find(regex, die_offsets);
+ }
- return !die_offsets.empty();
+ return !die_offsets.empty();
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.h
index cacb1ea109b..57dabade012 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnames.h
@@ -16,23 +16,25 @@
#include "DWARFDebugPubnamesSet.h"
-class DWARFDebugPubnames
-{
+class DWARFDebugPubnames {
public:
- DWARFDebugPubnames();
- bool Extract(const lldb_private::DWARFDataExtractor& data);
- bool GeneratePubnames(SymbolFileDWARF* dwarf2Data);
- bool GeneratePubBaseTypes(SymbolFileDWARF* dwarf2Data);
-
- void Dump(lldb_private::Log *s) const;
- bool Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offset_coll) const;
- bool Find(const lldb_private::RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const;
+ DWARFDebugPubnames();
+ bool Extract(const lldb_private::DWARFDataExtractor &data);
+ bool GeneratePubnames(SymbolFileDWARF *dwarf2Data);
+ bool GeneratePubBaseTypes(SymbolFileDWARF *dwarf2Data);
+
+ void Dump(lldb_private::Log *s) const;
+ bool Find(const char *name, bool ignore_case,
+ std::vector<dw_offset_t> &die_offset_coll) const;
+ bool Find(const lldb_private::RegularExpression &regex,
+ std::vector<dw_offset_t> &die_offsets) const;
+
protected:
- typedef std::list<DWARFDebugPubnamesSet> collection;
- typedef collection::iterator iterator;
- typedef collection::const_iterator const_iterator;
+ typedef std::list<DWARFDebugPubnamesSet> collection;
+ typedef collection::iterator iterator;
+ typedef collection::const_iterator const_iterator;
- collection m_sets;
+ collection m_sets;
};
-#endif // SymbolFileDWARF_DWARFDebugPubnames_h_
+#endif // SymbolFileDWARF_DWARFDebugPubnames_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.cpp
index b7e1b27d150..6b8317c21db 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.cpp
@@ -9,158 +9,138 @@
#include "DWARFDebugPubnamesSet.h"
-#include "lldb/Core/RegularExpression.h"
#include "lldb/Core/Log.h"
+#include "lldb/Core/RegularExpression.h"
#include "SymbolFileDWARF.h"
using namespace lldb_private;
-DWARFDebugPubnamesSet::DWARFDebugPubnamesSet() :
- m_offset(DW_INVALID_OFFSET),
- m_header(),
- m_descriptors(),
- m_name_to_descriptor_index()
-{
+DWARFDebugPubnamesSet::DWARFDebugPubnamesSet()
+ : m_offset(DW_INVALID_OFFSET), m_header(), m_descriptors(),
+ m_name_to_descriptor_index() {}
+
+DWARFDebugPubnamesSet::DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset,
+ dw_offset_t cu_die_offset,
+ dw_offset_t cu_die_length)
+ : m_offset(debug_aranges_offset), m_header(), m_descriptors(),
+ m_name_to_descriptor_index() {
+ m_header.length =
+ 10; // set the length to only include the header right for now
+ m_header.version = 2; // The DWARF version number
+ m_header.die_offset = cu_die_offset; // compile unit .debug_info offset
+ m_header.die_length = cu_die_length; // compile unit .debug_info length
}
-DWARFDebugPubnamesSet::DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset, dw_offset_t cu_die_offset, dw_offset_t cu_die_length) :
- m_offset(debug_aranges_offset),
- m_header(),
- m_descriptors(),
- m_name_to_descriptor_index()
-{
- m_header.length = 10; // set the length to only include the header right for now
- m_header.version = 2; // The DWARF version number
- m_header.die_offset = cu_die_offset;// compile unit .debug_info offset
- m_header.die_length = cu_die_length;// compile unit .debug_info length
-}
-
-void
-DWARFDebugPubnamesSet::AddDescriptor(dw_offset_t cu_rel_offset, const char* name)
-{
- if (name && name[0])
- {
- // Adjust our header length
- m_header.length += strlen(name) + 1 + sizeof(dw_offset_t);
- Descriptor pubnameDesc(cu_rel_offset, name);
- m_descriptors.push_back(pubnameDesc);
- }
+void DWARFDebugPubnamesSet::AddDescriptor(dw_offset_t cu_rel_offset,
+ const char *name) {
+ if (name && name[0]) {
+ // Adjust our header length
+ m_header.length += strlen(name) + 1 + sizeof(dw_offset_t);
+ Descriptor pubnameDesc(cu_rel_offset, name);
+ m_descriptors.push_back(pubnameDesc);
+ }
}
-void
-DWARFDebugPubnamesSet::Clear()
-{
- m_offset = DW_INVALID_OFFSET;
- m_header.length = 10;
- m_header.version = 2;
- m_header.die_offset = DW_INVALID_OFFSET;
- m_header.die_length = 0;
- m_descriptors.clear();
+void DWARFDebugPubnamesSet::Clear() {
+ m_offset = DW_INVALID_OFFSET;
+ m_header.length = 10;
+ m_header.version = 2;
+ m_header.die_offset = DW_INVALID_OFFSET;
+ m_header.die_length = 0;
+ m_descriptors.clear();
}
-
//----------------------------------------------------------------------
// InitNameIndexes
//----------------------------------------------------------------------
-void
-DWARFDebugPubnamesSet::InitNameIndexes() const
-{
- // Create the name index vector to be able to quickly search by name
- const size_t count = m_descriptors.size();
- for (uint32_t idx = 0; idx < count; ++idx)
- {
- const char* name = m_descriptors[idx].name.c_str();
- if (name && name[0])
- m_name_to_descriptor_index.insert(cstr_to_index_mmap::value_type(name, idx));
- }
+void DWARFDebugPubnamesSet::InitNameIndexes() const {
+ // Create the name index vector to be able to quickly search by name
+ const size_t count = m_descriptors.size();
+ for (uint32_t idx = 0; idx < count; ++idx) {
+ const char *name = m_descriptors[idx].name.c_str();
+ if (name && name[0])
+ m_name_to_descriptor_index.insert(
+ cstr_to_index_mmap::value_type(name, idx));
+ }
}
-
-bool
-DWARFDebugPubnamesSet::Extract(const DWARFDataExtractor& data, lldb::offset_t *offset_ptr)
-{
- if (data.ValidOffset(*offset_ptr))
- {
- m_descriptors.clear();
- m_offset = *offset_ptr;
- m_header.length = data.GetDWARFInitialLength(offset_ptr);
- m_header.version = data.GetU16(offset_ptr);
- m_header.die_offset = data.GetDWARFOffset(offset_ptr);
- m_header.die_length = data.GetDWARFOffset(offset_ptr);
-
- Descriptor pubnameDesc;
- while (data.ValidOffset(*offset_ptr))
- {
- pubnameDesc.offset = data.GetDWARFOffset(offset_ptr);
-
- if (pubnameDesc.offset)
- {
- const char* name = data.GetCStr(offset_ptr);
- if (name && name[0])
- {
- pubnameDesc.name = name;
- m_descriptors.push_back(pubnameDesc);
- }
- }
- else
- break; // We are done if we get a zero 4 byte offset
+bool DWARFDebugPubnamesSet::Extract(const DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr) {
+ if (data.ValidOffset(*offset_ptr)) {
+ m_descriptors.clear();
+ m_offset = *offset_ptr;
+ m_header.length = data.GetDWARFInitialLength(offset_ptr);
+ m_header.version = data.GetU16(offset_ptr);
+ m_header.die_offset = data.GetDWARFOffset(offset_ptr);
+ m_header.die_length = data.GetDWARFOffset(offset_ptr);
+
+ Descriptor pubnameDesc;
+ while (data.ValidOffset(*offset_ptr)) {
+ pubnameDesc.offset = data.GetDWARFOffset(offset_ptr);
+
+ if (pubnameDesc.offset) {
+ const char *name = data.GetCStr(offset_ptr);
+ if (name && name[0]) {
+ pubnameDesc.name = name;
+ m_descriptors.push_back(pubnameDesc);
}
-
- return !m_descriptors.empty();
+ } else
+ break; // We are done if we get a zero 4 byte offset
}
- return false;
-}
-dw_offset_t
-DWARFDebugPubnamesSet::GetOffsetOfNextEntry() const
-{
- return m_offset + m_header.length + 4;
+ return !m_descriptors.empty();
+ }
+ return false;
}
-void
-DWARFDebugPubnamesSet::Dump(Log *log) const
-{
- log->Printf("Pubnames Header: length = 0x%8.8x, version = 0x%4.4x, die_offset = 0x%8.8x, die_length = 0x%8.8x",
- m_header.length,
- m_header.version,
- m_header.die_offset,
- m_header.die_length);
-
- bool verbose = log->GetVerbose();
-
- DescriptorConstIter pos;
- DescriptorConstIter end = m_descriptors.end();
- for (pos = m_descriptors.begin(); pos != end; ++pos)
- {
- if (verbose)
- log->Printf("0x%8.8x + 0x%8.8x = 0x%8.8x: %s", pos->offset, m_header.die_offset, pos->offset + m_header.die_offset, pos->name.c_str());
- else
- log->Printf("0x%8.8x: %s", pos->offset + m_header.die_offset, pos->name.c_str());
- }
+dw_offset_t DWARFDebugPubnamesSet::GetOffsetOfNextEntry() const {
+ return m_offset + m_header.length + 4;
}
-
-void
-DWARFDebugPubnamesSet::Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offset_coll) const
-{
- if (!m_descriptors.empty() && m_name_to_descriptor_index.empty())
- InitNameIndexes();
-
- std::pair<cstr_to_index_mmap::const_iterator, cstr_to_index_mmap::const_iterator> range(m_name_to_descriptor_index.equal_range(name));
- for (cstr_to_index_mmap::const_iterator pos = range.first; pos != range.second; ++pos)
- die_offset_coll.push_back(m_header.die_offset + m_descriptors[(*pos).second].offset);
+void DWARFDebugPubnamesSet::Dump(Log *log) const {
+ log->Printf("Pubnames Header: length = 0x%8.8x, version = 0x%4.4x, "
+ "die_offset = 0x%8.8x, die_length = 0x%8.8x",
+ m_header.length, m_header.version, m_header.die_offset,
+ m_header.die_length);
+
+ bool verbose = log->GetVerbose();
+
+ DescriptorConstIter pos;
+ DescriptorConstIter end = m_descriptors.end();
+ for (pos = m_descriptors.begin(); pos != end; ++pos) {
+ if (verbose)
+ log->Printf("0x%8.8x + 0x%8.8x = 0x%8.8x: %s", pos->offset,
+ m_header.die_offset, pos->offset + m_header.die_offset,
+ pos->name.c_str());
+ else
+ log->Printf("0x%8.8x: %s", pos->offset + m_header.die_offset,
+ pos->name.c_str());
+ }
}
-void
-DWARFDebugPubnamesSet::Find(const RegularExpression& regex, std::vector<dw_offset_t>& die_offset_coll) const
-{
- DescriptorConstIter pos;
- DescriptorConstIter end = m_descriptors.end();
- for (pos = m_descriptors.begin(); pos != end; ++pos)
- {
- if ( regex.Execute(pos->name.c_str()) )
- die_offset_coll.push_back(m_header.die_offset + pos->offset);
- }
+void DWARFDebugPubnamesSet::Find(
+ const char *name, bool ignore_case,
+ std::vector<dw_offset_t> &die_offset_coll) const {
+ if (!m_descriptors.empty() && m_name_to_descriptor_index.empty())
+ InitNameIndexes();
+
+ std::pair<cstr_to_index_mmap::const_iterator,
+ cstr_to_index_mmap::const_iterator>
+ range(m_name_to_descriptor_index.equal_range(name));
+ for (cstr_to_index_mmap::const_iterator pos = range.first;
+ pos != range.second; ++pos)
+ die_offset_coll.push_back(m_header.die_offset +
+ m_descriptors[(*pos).second].offset);
}
+void DWARFDebugPubnamesSet::Find(
+ const RegularExpression &regex,
+ std::vector<dw_offset_t> &die_offset_coll) const {
+ DescriptorConstIter pos;
+ DescriptorConstIter end = m_descriptors.end();
+ for (pos = m_descriptors.begin(); pos != end; ++pos) {
+ if (regex.Execute(pos->name.c_str()))
+ die_offset_coll.push_back(m_header.die_offset + pos->offset);
+ }
+}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.h
index 075807b2dcc..9654ee3d6da 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugPubnamesSet.h
@@ -19,81 +19,74 @@
#include <ext/hash_map>
#endif
-class DWARFDebugPubnamesSet
-{
+class DWARFDebugPubnamesSet {
public:
- struct Header
- {
- uint32_t length; // length of the set of entries for this compilation unit, not including the length field itself
- uint16_t version; // The DWARF version number
- uint32_t die_offset; // compile unit .debug_info offset
- uint32_t die_length; // compile unit .debug_info length
- Header() :
- length(10),
- version(2),
- die_offset(DW_INVALID_OFFSET),
- die_length(0)
- {
- }
- };
+ struct Header {
+ uint32_t length; // length of the set of entries for this compilation unit,
+ // not including the length field itself
+ uint16_t version; // The DWARF version number
+ uint32_t die_offset; // compile unit .debug_info offset
+ uint32_t die_length; // compile unit .debug_info length
+ Header()
+ : length(10), version(2), die_offset(DW_INVALID_OFFSET), die_length(0) {
+ }
+ };
- struct Descriptor
- {
- Descriptor() :
- offset(),
- name()
- {
- }
+ struct Descriptor {
+ Descriptor() : offset(), name() {}
- Descriptor(dw_offset_t the_offset, const char *the_name) :
- offset(the_offset),
- name(the_name ? the_name : "")
- {
- }
-
- dw_offset_t offset;
- std::string name;
- };
-
- DWARFDebugPubnamesSet();
- DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset, dw_offset_t cu_die_offset, dw_offset_t die_length);
- dw_offset_t GetOffset() const { return m_offset; }
- void SetOffset(dw_offset_t offset) { m_offset = offset; }
- DWARFDebugPubnamesSet::Header& GetHeader() { return m_header; }
- const DWARFDebugPubnamesSet::Header& GetHeader() const { return m_header; }
- const DWARFDebugPubnamesSet::Descriptor* GetDescriptor(uint32_t i) const
- {
- if (i < m_descriptors.size())
- return &m_descriptors[i];
- return NULL;
- }
- uint32_t NumDescriptors() const { return m_descriptors.size(); }
- void AddDescriptor(dw_offset_t cu_rel_offset, const char* name);
- void Clear();
- bool Extract(const lldb_private::DWARFDataExtractor& debug_pubnames_data, lldb::offset_t *offset_ptr);
- void Dump(lldb_private::Log *s) const;
- void InitNameIndexes() const;
- void Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offset_coll) const;
- void Find(const lldb_private::RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const;
- dw_offset_t GetOffsetOfNextEntry() const;
+ Descriptor(dw_offset_t the_offset, const char *the_name)
+ : offset(the_offset), name(the_name ? the_name : "") {}
+ dw_offset_t offset;
+ std::string name;
+ };
+ DWARFDebugPubnamesSet();
+ DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset,
+ dw_offset_t cu_die_offset, dw_offset_t die_length);
+ dw_offset_t GetOffset() const { return m_offset; }
+ void SetOffset(dw_offset_t offset) { m_offset = offset; }
+ DWARFDebugPubnamesSet::Header &GetHeader() { return m_header; }
+ const DWARFDebugPubnamesSet::Header &GetHeader() const { return m_header; }
+ const DWARFDebugPubnamesSet::Descriptor *GetDescriptor(uint32_t i) const {
+ if (i < m_descriptors.size())
+ return &m_descriptors[i];
+ return NULL;
+ }
+ uint32_t NumDescriptors() const { return m_descriptors.size(); }
+ void AddDescriptor(dw_offset_t cu_rel_offset, const char *name);
+ void Clear();
+ bool Extract(const lldb_private::DWARFDataExtractor &debug_pubnames_data,
+ lldb::offset_t *offset_ptr);
+ void Dump(lldb_private::Log *s) const;
+ void InitNameIndexes() const;
+ void Find(const char *name, bool ignore_case,
+ std::vector<dw_offset_t> &die_offset_coll) const;
+ void Find(const lldb_private::RegularExpression &regex,
+ std::vector<dw_offset_t> &die_offsets) const;
+ dw_offset_t GetOffsetOfNextEntry() const;
protected:
- typedef std::vector<Descriptor> DescriptorColl;
- typedef DescriptorColl::iterator DescriptorIter;
- typedef DescriptorColl::const_iterator DescriptorConstIter;
-
+ typedef std::vector<Descriptor> DescriptorColl;
+ typedef DescriptorColl::iterator DescriptorIter;
+ typedef DescriptorColl::const_iterator DescriptorConstIter;
- dw_offset_t m_offset;
- Header m_header;
+ dw_offset_t m_offset;
+ Header m_header;
#if __cplusplus >= 201103L || defined(_MSC_VER)
- typedef std::unordered_multimap<const char*, uint32_t, std::hash<const char*>, CStringEqualBinaryPredicate> cstr_to_index_mmap;
+ typedef std::unordered_multimap<const char *, uint32_t,
+ std::hash<const char *>,
+ CStringEqualBinaryPredicate>
+ cstr_to_index_mmap;
#else
- typedef __gnu_cxx::hash_multimap<const char*, uint32_t, __gnu_cxx::hash<const char*>, CStringEqualBinaryPredicate> cstr_to_index_mmap;
+ typedef __gnu_cxx::hash_multimap<const char *, uint32_t,
+ __gnu_cxx::hash<const char *>,
+ CStringEqualBinaryPredicate>
+ cstr_to_index_mmap;
#endif
- DescriptorColl m_descriptors;
- mutable cstr_to_index_mmap m_name_to_descriptor_index;
+ DescriptorColl m_descriptors;
+ mutable cstr_to_index_mmap m_name_to_descriptor_index;
};
-#endif // SymbolFileDWARF_DWARFDebugPubnamesSet_h_
+#endif // SymbolFileDWARF_DWARFDebugPubnamesSet_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
index fc2831f2243..01b08708d75 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
@@ -15,135 +15,115 @@
using namespace lldb_private;
using namespace std;
-DWARFDebugRanges::DWARFDebugRanges() :
- m_range_map()
-{
+DWARFDebugRanges::DWARFDebugRanges() : m_range_map() {}
+
+DWARFDebugRanges::~DWARFDebugRanges() {}
+
+void DWARFDebugRanges::Extract(SymbolFileDWARF *dwarf2Data) {
+ DWARFRangeList range_list;
+ lldb::offset_t offset = 0;
+ dw_offset_t debug_ranges_offset = offset;
+ while (Extract(dwarf2Data, &offset, range_list)) {
+ range_list.Sort();
+ m_range_map[debug_ranges_offset] = range_list;
+ debug_ranges_offset = offset;
+ }
}
-DWARFDebugRanges::~DWARFDebugRanges()
-{
-}
-
-void
-DWARFDebugRanges::Extract(SymbolFileDWARF* dwarf2Data)
-{
- DWARFRangeList range_list;
- lldb::offset_t offset = 0;
- dw_offset_t debug_ranges_offset = offset;
- while (Extract(dwarf2Data, &offset, range_list))
- {
- range_list.Sort();
- m_range_map[debug_ranges_offset] = range_list;
- debug_ranges_offset = offset;
+bool DWARFDebugRanges::Extract(SymbolFileDWARF *dwarf2Data,
+ lldb::offset_t *offset_ptr,
+ DWARFRangeList &range_list) {
+ range_list.Clear();
+
+ lldb::offset_t range_offset = *offset_ptr;
+ const DWARFDataExtractor &debug_ranges_data =
+ dwarf2Data->get_debug_ranges_data();
+ uint32_t addr_size = debug_ranges_data.GetAddressByteSize();
+
+ while (
+ debug_ranges_data.ValidOffsetForDataOfSize(*offset_ptr, 2 * addr_size)) {
+ dw_addr_t begin = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
+ dw_addr_t end = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
+ if (!begin && !end) {
+ // End of range list
+ break;
}
-}
-
-bool
-DWARFDebugRanges::Extract(SymbolFileDWARF* dwarf2Data, lldb::offset_t *offset_ptr, DWARFRangeList &range_list)
-{
- range_list.Clear();
-
- lldb::offset_t range_offset = *offset_ptr;
- const DWARFDataExtractor& debug_ranges_data = dwarf2Data->get_debug_ranges_data();
- uint32_t addr_size = debug_ranges_data.GetAddressByteSize();
-
- while (debug_ranges_data.ValidOffsetForDataOfSize(*offset_ptr, 2 * addr_size))
- {
- dw_addr_t begin = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
- dw_addr_t end = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
- if (!begin && !end)
- {
- // End of range list
- break;
- }
- // Extend 4 byte addresses that consists of 32 bits of 1's to be 64 bits
- // of ones
- switch (addr_size)
- {
- case 2:
- if (begin == 0xFFFFull)
- begin = LLDB_INVALID_ADDRESS;
- break;
-
- case 4:
- if (begin == 0xFFFFFFFFull)
- begin = LLDB_INVALID_ADDRESS;
- break;
-
- case 8:
- break;
-
- default:
- assert(!"DWARFRangeList::Extract() unsupported address size.");
- break;
- }
-
- // Filter out empty ranges
- if (begin < end)
- range_list.Append(DWARFRangeList::Entry(begin, end - begin));
+ // Extend 4 byte addresses that consists of 32 bits of 1's to be 64 bits
+ // of ones
+ switch (addr_size) {
+ case 2:
+ if (begin == 0xFFFFull)
+ begin = LLDB_INVALID_ADDRESS;
+ break;
+
+ case 4:
+ if (begin == 0xFFFFFFFFull)
+ begin = LLDB_INVALID_ADDRESS;
+ break;
+
+ case 8:
+ break;
+
+ default:
+ assert(!"DWARFRangeList::Extract() unsupported address size.");
+ break;
}
- // Make sure we consumed at least something
- return range_offset != *offset_ptr;
-}
+ // Filter out empty ranges
+ if (begin < end)
+ range_list.Append(DWARFRangeList::Entry(begin, end - begin));
+ }
+ // Make sure we consumed at least something
+ return range_offset != *offset_ptr;
+}
-void
-DWARFDebugRanges::Dump(Stream &s, const DWARFDataExtractor& debug_ranges_data, lldb::offset_t *offset_ptr, dw_addr_t cu_base_addr)
-{
- uint32_t addr_size = s.GetAddressByteSize();
- bool verbose = s.GetVerbose();
-
- dw_addr_t base_addr = cu_base_addr;
- while (debug_ranges_data.ValidOffsetForDataOfSize(*offset_ptr, 2 * addr_size))
- {
- dw_addr_t begin = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
- dw_addr_t end = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
- // Extend 4 byte addresses that consists of 32 bits of 1's to be 64 bits
- // of ones
- if (begin == 0xFFFFFFFFull && addr_size == 4)
- begin = LLDB_INVALID_ADDRESS;
-
- s.Indent();
- if (verbose)
- {
- s.AddressRange(begin, end, sizeof (dw_addr_t), " offsets = ");
- }
-
-
- if (begin == 0 && end == 0)
- {
- s.PutCString(" End");
- break;
- }
- else if (begin == LLDB_INVALID_ADDRESS)
- {
- // A base address selection entry
- base_addr = end;
- s.Address(base_addr, sizeof (dw_addr_t), " Base address = ");
- }
- else
- {
- // Convert from offset to an address
- dw_addr_t begin_addr = begin + base_addr;
- dw_addr_t end_addr = end + base_addr;
-
- s.AddressRange(begin_addr, end_addr, sizeof (dw_addr_t), verbose ? " ==> addrs = " : NULL);
- }
+void DWARFDebugRanges::Dump(Stream &s,
+ const DWARFDataExtractor &debug_ranges_data,
+ lldb::offset_t *offset_ptr,
+ dw_addr_t cu_base_addr) {
+ uint32_t addr_size = s.GetAddressByteSize();
+ bool verbose = s.GetVerbose();
+
+ dw_addr_t base_addr = cu_base_addr;
+ while (
+ debug_ranges_data.ValidOffsetForDataOfSize(*offset_ptr, 2 * addr_size)) {
+ dw_addr_t begin = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
+ dw_addr_t end = debug_ranges_data.GetMaxU64(offset_ptr, addr_size);
+ // Extend 4 byte addresses that consists of 32 bits of 1's to be 64 bits
+ // of ones
+ if (begin == 0xFFFFFFFFull && addr_size == 4)
+ begin = LLDB_INVALID_ADDRESS;
+
+ s.Indent();
+ if (verbose) {
+ s.AddressRange(begin, end, sizeof(dw_addr_t), " offsets = ");
}
-}
-bool
-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())
- {
- range_list = pos->second;
- return true;
+ if (begin == 0 && end == 0) {
+ s.PutCString(" End");
+ break;
+ } else if (begin == LLDB_INVALID_ADDRESS) {
+ // A base address selection entry
+ base_addr = end;
+ s.Address(base_addr, sizeof(dw_addr_t), " Base address = ");
+ } else {
+ // Convert from offset to an address
+ dw_addr_t begin_addr = begin + base_addr;
+ dw_addr_t end_addr = end + base_addr;
+
+ s.AddressRange(begin_addr, end_addr, sizeof(dw_addr_t),
+ verbose ? " ==> addrs = " : NULL);
}
- return false;
+ }
}
-
-
+bool 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()) {
+ range_list = pos->second;
+ return true;
+ }
+ return false;
+}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
index 3ff4ea3502c..767b74c52fe 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
@@ -10,33 +10,30 @@
#ifndef SymbolFileDWARF_DWARFDebugRanges_h_
#define SymbolFileDWARF_DWARFDebugRanges_h_
-#include "SymbolFileDWARF.h"
#include "DWARFDIE.h"
+#include "SymbolFileDWARF.h"
#include <map>
-class DWARFDebugRanges
-{
+class DWARFDebugRanges {
public:
-
- 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, DWARFRangeList& range_list) const;
+ 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,
+ DWARFRangeList &range_list) const;
protected:
+ bool Extract(SymbolFileDWARF *dwarf2Data, lldb::offset_t *offset_ptr,
+ DWARFRangeList &range_list);
- bool
- Extract (SymbolFileDWARF* dwarf2Data,
- lldb::offset_t *offset_ptr,
- DWARFRangeList &range_list);
-
- 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;
+ 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;
};
-
-#endif // SymbolFileDWARF_DWARFDebugRanges_h_
+#endif // SymbolFileDWARF_DWARFDebugRanges_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp
index 5512072529f..79f2f221696 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp
@@ -9,96 +9,80 @@
#include "DWARFDeclContext.h"
-const char *
-DWARFDeclContext::GetQualifiedName () const
-{
- if (m_qualified_name.empty())
- {
- // The declaration context array for a class named "foo" in namespace
- // "a::b::c" will be something like:
- // [0] DW_TAG_class_type "foo"
- // [1] DW_TAG_namespace "c"
- // [2] DW_TAG_namespace "b"
- // [3] DW_TAG_namespace "a"
- if (!m_entries.empty())
- {
- if (m_entries.size() == 1)
- {
- if (m_entries[0].name)
- {
- m_qualified_name.append("::");
- m_qualified_name.append(m_entries[0].name);
- }
- }
+const char *DWARFDeclContext::GetQualifiedName() const {
+ if (m_qualified_name.empty()) {
+ // The declaration context array for a class named "foo" in namespace
+ // "a::b::c" will be something like:
+ // [0] DW_TAG_class_type "foo"
+ // [1] DW_TAG_namespace "c"
+ // [2] DW_TAG_namespace "b"
+ // [3] DW_TAG_namespace "a"
+ if (!m_entries.empty()) {
+ if (m_entries.size() == 1) {
+ if (m_entries[0].name) {
+ m_qualified_name.append("::");
+ m_qualified_name.append(m_entries[0].name);
+ }
+ } else {
+ collection::const_reverse_iterator pos;
+ collection::const_reverse_iterator begin = m_entries.rbegin();
+ collection::const_reverse_iterator end = m_entries.rend();
+ for (pos = begin; pos != end; ++pos) {
+ if (pos != begin)
+ m_qualified_name.append("::");
+ if (pos->name == NULL) {
+ if (pos->tag == DW_TAG_namespace)
+ m_qualified_name.append("(anonymous namespace)");
+ else if (pos->tag == DW_TAG_class_type)
+ m_qualified_name.append("(anonymous class)");
+ else if (pos->tag == DW_TAG_structure_type)
+ m_qualified_name.append("(anonymous struct)");
+ else if (pos->tag == DW_TAG_union_type)
+ m_qualified_name.append("(anonymous union)");
else
- {
- collection::const_reverse_iterator pos;
- collection::const_reverse_iterator begin = m_entries.rbegin();
- collection::const_reverse_iterator end = m_entries.rend();
- for (pos = begin; pos != end; ++pos)
- {
- if (pos != begin)
- m_qualified_name.append("::");
- if (pos->name == NULL)
- {
- if (pos->tag == DW_TAG_namespace)
- m_qualified_name.append ("(anonymous namespace)");
- else if (pos->tag == DW_TAG_class_type)
- m_qualified_name.append ("(anonymous class)");
- else if (pos->tag == DW_TAG_structure_type)
- m_qualified_name.append ("(anonymous struct)");
- else if (pos->tag == DW_TAG_union_type)
- m_qualified_name.append ("(anonymous union)");
- else
- m_qualified_name.append ("(anonymous)");
- }
- else
- m_qualified_name.append(pos->name);
- }
- }
+ m_qualified_name.append("(anonymous)");
+ } else
+ m_qualified_name.append(pos->name);
}
+ }
}
- if (m_qualified_name.empty())
- return NULL;
- return m_qualified_name.c_str();
+ }
+ if (m_qualified_name.empty())
+ return NULL;
+ return m_qualified_name.c_str();
}
+bool DWARFDeclContext::operator==(const DWARFDeclContext &rhs) const {
+ if (m_entries.size() != rhs.m_entries.size())
+ return false;
-bool
-DWARFDeclContext::operator==(const DWARFDeclContext& rhs) const
-{
- if (m_entries.size() != rhs.m_entries.size())
- return false;
-
- collection::const_iterator pos;
- collection::const_iterator begin = m_entries.begin();
- collection::const_iterator end = m_entries.end();
+ collection::const_iterator pos;
+ collection::const_iterator begin = m_entries.begin();
+ collection::const_iterator end = m_entries.end();
- collection::const_iterator rhs_pos;
- collection::const_iterator rhs_begin = rhs.m_entries.begin();
- // The two entry arrays have the same size
-
- // First compare the tags before we do expensive name compares
- for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos)
- {
- if (pos->tag != rhs_pos->tag)
- {
- // Check for DW_TAG_structure_type and DW_TAG_class_type as they are often
- // used interchangeably in GCC
- if (pos->tag == DW_TAG_structure_type && rhs_pos->tag == DW_TAG_class_type)
- continue;
- if (pos->tag == DW_TAG_class_type && rhs_pos->tag == DW_TAG_structure_type)
- continue;
- return false;
- }
- }
- // The tags all match, now compare the names
- for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos)
- {
- if (!pos->NameMatches (*rhs_pos))
- return false;
+ collection::const_iterator rhs_pos;
+ collection::const_iterator rhs_begin = rhs.m_entries.begin();
+ // The two entry arrays have the same size
+
+ // First compare the tags before we do expensive name compares
+ for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos) {
+ if (pos->tag != rhs_pos->tag) {
+ // Check for DW_TAG_structure_type and DW_TAG_class_type as they are often
+ // used interchangeably in GCC
+ if (pos->tag == DW_TAG_structure_type &&
+ rhs_pos->tag == DW_TAG_class_type)
+ continue;
+ if (pos->tag == DW_TAG_class_type &&
+ rhs_pos->tag == DW_TAG_structure_type)
+ continue;
+ return false;
}
- // All tags and names match
- return true;
+ }
+ // The tags all match, now compare the names
+ for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos) {
+ if (!pos->NameMatches(*rhs_pos))
+ return false;
+ }
+ // All tags and names match
+ return true;
}
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h
index 2452274a293..0d0a5a31726 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h
@@ -27,112 +27,69 @@
// in another DWARF file.
//----------------------------------------------------------------------
-class DWARFDeclContext
-{
+class DWARFDeclContext {
public:
- struct Entry
- {
- Entry () :
- tag(0),
- name(NULL)
- {
- }
- Entry (dw_tag_t t, const char *n) :
- tag(t),
- name(n)
- {
- }
-
- bool
- NameMatches (const Entry& rhs) const
- {
- if (name == rhs.name)
- return true;
- else if (name && rhs.name)
- return strcmp(name, rhs.name) == 0;
- return false;
- }
-
- // Test operator
- explicit operator bool() const
- {
- return tag != 0;
- }
-
- dw_tag_t tag;
- const char *name;
- };
-
- DWARFDeclContext () :
- m_entries(),
- m_language(lldb::eLanguageTypeUnknown)
- {
+ struct Entry {
+ Entry() : tag(0), name(NULL) {}
+ Entry(dw_tag_t t, const char *n) : tag(t), name(n) {}
+
+ bool NameMatches(const Entry &rhs) const {
+ if (name == rhs.name)
+ return true;
+ else if (name && rhs.name)
+ return strcmp(name, rhs.name) == 0;
+ return false;
}
- void
- AppendDeclContext (dw_tag_t tag, const char *name)
- {
- m_entries.push_back(Entry(tag, name));
- }
+ // Test operator
+ explicit operator bool() const { return tag != 0; }
- bool
- operator ==(const DWARFDeclContext& rhs) const;
+ dw_tag_t tag;
+ const char *name;
+ };
- uint32_t
- GetSize() const
- {
- return m_entries.size();
- }
+ DWARFDeclContext() : m_entries(), m_language(lldb::eLanguageTypeUnknown) {}
- Entry &
- operator[] (uint32_t idx)
- {
- // "idx" must be valid
- return m_entries[idx];
- }
+ void AppendDeclContext(dw_tag_t tag, const char *name) {
+ m_entries.push_back(Entry(tag, name));
+ }
- const Entry &
- operator[] (uint32_t idx) const
- {
- // "idx" must be valid
- return m_entries[idx];
- }
+ bool operator==(const DWARFDeclContext &rhs) const;
- const char *
- GetQualifiedName () const;
+ uint32_t GetSize() const { return m_entries.size(); }
- // Same as GetQaulifiedName, but the life time of the returned string will
- // be that of the LLDB session.
- lldb_private::ConstString
- GetQualifiedNameAsConstString () const
- {
- return lldb_private::ConstString (GetQualifiedName ());
- }
+ Entry &operator[](uint32_t idx) {
+ // "idx" must be valid
+ return m_entries[idx];
+ }
- void
- Clear()
- {
- m_entries.clear();
- m_qualified_name.clear();
- }
+ const Entry &operator[](uint32_t idx) const {
+ // "idx" must be valid
+ return m_entries[idx];
+ }
- lldb::LanguageType
- GetLanguage() const
- {
- return m_language;
- }
+ const char *GetQualifiedName() const;
- void
- SetLanguage(lldb::LanguageType language)
- {
- m_language = language;
- }
+ // Same as GetQaulifiedName, but the life time of the returned string will
+ // be that of the LLDB session.
+ lldb_private::ConstString GetQualifiedNameAsConstString() const {
+ return lldb_private::ConstString(GetQualifiedName());
+ }
+
+ void Clear() {
+ m_entries.clear();
+ m_qualified_name.clear();
+ }
+
+ lldb::LanguageType GetLanguage() const { return m_language; }
+
+ void SetLanguage(lldb::LanguageType language) { m_language = language; }
protected:
- typedef std::vector<Entry> collection;
- collection m_entries;
- mutable std::string m_qualified_name;
- lldb::LanguageType m_language;
+ typedef std::vector<Entry> collection;
+ collection m_entries;
+ mutable std::string m_qualified_name;
+ lldb::LanguageType m_language;
};
-#endif // SymbolFileDWARF_DWARFDeclContext_h_
+#endif // SymbolFileDWARF_DWARFDeclContext_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
index fe4093bc130..7103e9827f2 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
@@ -8,490 +8,640 @@
//===----------------------------------------------------------------------===//
#include "DWARFDefines.h"
+#include "lldb/Core/ConstString.h"
#include <cstdio>
#include <cstring>
#include <string>
-#include "lldb/Core/ConstString.h"
namespace lldb_private {
-const char *
-DW_TAG_value_to_name (uint32_t val)
-{
+const char *DW_TAG_value_to_name(uint32_t val) {
static char invalid[100];
if (val == 0)
- return "NULL";
+ return "NULL";
- const char *llvmstr = llvm::dwarf::TagString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_TAG constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::TagString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_TAG constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
-}
+}
-const char *
-DW_CHILDREN_value_to_name (uint8_t val)
-{
+const char *DW_CHILDREN_value_to_name(uint8_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::ChildrenString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_CHILDREN constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::ChildrenString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_CHILDREN constant: 0x%x",
+ val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_AT_value_to_name (uint32_t val)
-{
+const char *DW_AT_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::AttributeString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_AT constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::AttributeString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_AT constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_FORM_value_to_name (uint32_t val)
-{
+const char *DW_FORM_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::FormEncodingString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_FORM constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::FormEncodingString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_FORM constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_OP_value_to_name (uint32_t val)
-{
+const char *DW_OP_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::OperationEncodingString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_OP constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::OperationEncodingString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_OP constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-DRC_class
-DW_OP_value_to_class (uint32_t val)
-{
+DRC_class DW_OP_value_to_class(uint32_t val) {
switch (val) {
- case 0x03: return DRC_ONEOPERAND;
- case 0x06: return DRC_ZEROOPERANDS;
- case 0x08: return DRC_ONEOPERAND;
- case 0x09: return DRC_ONEOPERAND;
- case 0x0a: return DRC_ONEOPERAND;
- case 0x0b: return DRC_ONEOPERAND;
- case 0x0c: return DRC_ONEOPERAND;
- case 0x0d: return DRC_ONEOPERAND;
- case 0x0e: return DRC_ONEOPERAND;
- case 0x0f: return DRC_ONEOPERAND;
- case 0x10: return DRC_ONEOPERAND;
- case 0x11: return DRC_ONEOPERAND;
- case 0x12: return DRC_ZEROOPERANDS;
- case 0x13: return DRC_ZEROOPERANDS;
- case 0x14: return DRC_ZEROOPERANDS;
- case 0x15: return DRC_ONEOPERAND;
- case 0x16: return DRC_ZEROOPERANDS;
- case 0x17: return DRC_ZEROOPERANDS;
- case 0x18: return DRC_ZEROOPERANDS;
- case 0x19: return DRC_ZEROOPERANDS;
- case 0x1a: return DRC_ZEROOPERANDS;
- case 0x1b: return DRC_ZEROOPERANDS;
- case 0x1c: return DRC_ZEROOPERANDS;
- case 0x1d: return DRC_ZEROOPERANDS;
- case 0x1e: return DRC_ZEROOPERANDS;
- case 0x1f: return DRC_ZEROOPERANDS;
- case 0x20: return DRC_ZEROOPERANDS;
- case 0x21: return DRC_ZEROOPERANDS;
- case 0x22: return DRC_ZEROOPERANDS;
- case 0x23: return DRC_ONEOPERAND;
- case 0x24: return DRC_ZEROOPERANDS;
- case 0x25: return DRC_ZEROOPERANDS;
- case 0x26: return DRC_ZEROOPERANDS;
- case 0x27: return DRC_ZEROOPERANDS;
- case 0x2f: return DRC_ONEOPERAND;
- case 0x28: return DRC_ONEOPERAND;
- case 0x29: return DRC_ZEROOPERANDS;
- case 0x2a: return DRC_ZEROOPERANDS;
- case 0x2b: return DRC_ZEROOPERANDS;
- case 0x2c: return DRC_ZEROOPERANDS;
- case 0x2d: return DRC_ZEROOPERANDS;
- case 0x2e: return DRC_ZEROOPERANDS;
- case 0x30: return DRC_ZEROOPERANDS;
- case 0x31: return DRC_ZEROOPERANDS;
- case 0x32: return DRC_ZEROOPERANDS;
- case 0x33: return DRC_ZEROOPERANDS;
- case 0x34: return DRC_ZEROOPERANDS;
- case 0x35: return DRC_ZEROOPERANDS;
- case 0x36: return DRC_ZEROOPERANDS;
- case 0x37: return DRC_ZEROOPERANDS;
- case 0x38: return DRC_ZEROOPERANDS;
- case 0x39: return DRC_ZEROOPERANDS;
- case 0x3a: return DRC_ZEROOPERANDS;
- case 0x3b: return DRC_ZEROOPERANDS;
- case 0x3c: return DRC_ZEROOPERANDS;
- case 0x3d: return DRC_ZEROOPERANDS;
- case 0x3e: return DRC_ZEROOPERANDS;
- case 0x3f: return DRC_ZEROOPERANDS;
- case 0x40: return DRC_ZEROOPERANDS;
- case 0x41: return DRC_ZEROOPERANDS;
- case 0x42: return DRC_ZEROOPERANDS;
- case 0x43: return DRC_ZEROOPERANDS;
- case 0x44: return DRC_ZEROOPERANDS;
- case 0x45: return DRC_ZEROOPERANDS;
- case 0x46: return DRC_ZEROOPERANDS;
- case 0x47: return DRC_ZEROOPERANDS;
- case 0x48: return DRC_ZEROOPERANDS;
- case 0x49: return DRC_ZEROOPERANDS;
- case 0x4a: return DRC_ZEROOPERANDS;
- case 0x4b: return DRC_ZEROOPERANDS;
- case 0x4c: return DRC_ZEROOPERANDS;
- case 0x4d: return DRC_ZEROOPERANDS;
- case 0x4e: return DRC_ZEROOPERANDS;
- case 0x4f: return DRC_ZEROOPERANDS;
- case 0x50: return DRC_ZEROOPERANDS;
- case 0x51: return DRC_ZEROOPERANDS;
- case 0x52: return DRC_ZEROOPERANDS;
- case 0x53: return DRC_ZEROOPERANDS;
- case 0x54: return DRC_ZEROOPERANDS;
- case 0x55: return DRC_ZEROOPERANDS;
- case 0x56: return DRC_ZEROOPERANDS;
- case 0x57: return DRC_ZEROOPERANDS;
- case 0x58: return DRC_ZEROOPERANDS;
- case 0x59: return DRC_ZEROOPERANDS;
- case 0x5a: return DRC_ZEROOPERANDS;
- case 0x5b: return DRC_ZEROOPERANDS;
- case 0x5c: return DRC_ZEROOPERANDS;
- case 0x5d: return DRC_ZEROOPERANDS;
- case 0x5e: return DRC_ZEROOPERANDS;
- case 0x5f: return DRC_ZEROOPERANDS;
- case 0x60: return DRC_ZEROOPERANDS;
- case 0x61: return DRC_ZEROOPERANDS;
- case 0x62: return DRC_ZEROOPERANDS;
- case 0x63: return DRC_ZEROOPERANDS;
- case 0x64: return DRC_ZEROOPERANDS;
- case 0x65: return DRC_ZEROOPERANDS;
- case 0x66: return DRC_ZEROOPERANDS;
- case 0x67: return DRC_ZEROOPERANDS;
- case 0x68: return DRC_ZEROOPERANDS;
- case 0x69: return DRC_ZEROOPERANDS;
- case 0x6a: return DRC_ZEROOPERANDS;
- case 0x6b: return DRC_ZEROOPERANDS;
- case 0x6c: return DRC_ZEROOPERANDS;
- case 0x6d: return DRC_ZEROOPERANDS;
- case 0x6e: return DRC_ZEROOPERANDS;
- case 0x6f: return DRC_ZEROOPERANDS;
- case 0x70: return DRC_ONEOPERAND;
- case 0x71: return DRC_ONEOPERAND;
- case 0x72: return DRC_ONEOPERAND;
- case 0x73: return DRC_ONEOPERAND;
- case 0x74: return DRC_ONEOPERAND;
- case 0x75: return DRC_ONEOPERAND;
- case 0x76: return DRC_ONEOPERAND;
- case 0x77: return DRC_ONEOPERAND;
- case 0x78: return DRC_ONEOPERAND;
- case 0x79: return DRC_ONEOPERAND;
- case 0x7a: return DRC_ONEOPERAND;
- case 0x7b: return DRC_ONEOPERAND;
- case 0x7c: return DRC_ONEOPERAND;
- case 0x7d: return DRC_ONEOPERAND;
- case 0x7e: return DRC_ONEOPERAND;
- case 0x7f: return DRC_ONEOPERAND;
- case 0x80: return DRC_ONEOPERAND;
- case 0x81: return DRC_ONEOPERAND;
- case 0x82: return DRC_ONEOPERAND;
- case 0x83: return DRC_ONEOPERAND;
- case 0x84: return DRC_ONEOPERAND;
- case 0x85: return DRC_ONEOPERAND;
- case 0x86: return DRC_ONEOPERAND;
- case 0x87: return DRC_ONEOPERAND;
- case 0x88: return DRC_ONEOPERAND;
- case 0x89: return DRC_ONEOPERAND;
- case 0x8a: return DRC_ONEOPERAND;
- case 0x8b: return DRC_ONEOPERAND;
- case 0x8c: return DRC_ONEOPERAND;
- case 0x8d: return DRC_ONEOPERAND;
- case 0x8e: return DRC_ONEOPERAND;
- case 0x8f: return DRC_ONEOPERAND;
- case 0x90: return DRC_ONEOPERAND;
- case 0x91: return DRC_ONEOPERAND;
- case 0x92: return DRC_TWOOPERANDS;
- case 0x93: return DRC_ONEOPERAND;
- case 0x94: return DRC_ONEOPERAND;
- case 0x95: return DRC_ONEOPERAND;
- case 0x96: return DRC_ZEROOPERANDS;
- case 0x97: return DRC_DWARFv3 | DRC_ZEROOPERANDS;
- case 0x98: return DRC_DWARFv3 | DRC_ONEOPERAND;
- case 0x99: return DRC_DWARFv3 | DRC_ONEOPERAND;
- case 0x9a: return DRC_DWARFv3 | DRC_ONEOPERAND;
- case 0xf0: return DRC_ZEROOPERANDS; /* DW_OP_APPLE_uninit */
- case 0xe0: return 0;
- case 0xff: return 0;
- default: return 0;
+ case 0x03:
+ return DRC_ONEOPERAND;
+ case 0x06:
+ return DRC_ZEROOPERANDS;
+ case 0x08:
+ return DRC_ONEOPERAND;
+ case 0x09:
+ return DRC_ONEOPERAND;
+ case 0x0a:
+ return DRC_ONEOPERAND;
+ case 0x0b:
+ return DRC_ONEOPERAND;
+ case 0x0c:
+ return DRC_ONEOPERAND;
+ case 0x0d:
+ return DRC_ONEOPERAND;
+ case 0x0e:
+ return DRC_ONEOPERAND;
+ case 0x0f:
+ return DRC_ONEOPERAND;
+ case 0x10:
+ return DRC_ONEOPERAND;
+ case 0x11:
+ return DRC_ONEOPERAND;
+ case 0x12:
+ return DRC_ZEROOPERANDS;
+ case 0x13:
+ return DRC_ZEROOPERANDS;
+ case 0x14:
+ return DRC_ZEROOPERANDS;
+ case 0x15:
+ return DRC_ONEOPERAND;
+ case 0x16:
+ return DRC_ZEROOPERANDS;
+ case 0x17:
+ return DRC_ZEROOPERANDS;
+ case 0x18:
+ return DRC_ZEROOPERANDS;
+ case 0x19:
+ return DRC_ZEROOPERANDS;
+ case 0x1a:
+ return DRC_ZEROOPERANDS;
+ case 0x1b:
+ return DRC_ZEROOPERANDS;
+ case 0x1c:
+ return DRC_ZEROOPERANDS;
+ case 0x1d:
+ return DRC_ZEROOPERANDS;
+ case 0x1e:
+ return DRC_ZEROOPERANDS;
+ case 0x1f:
+ return DRC_ZEROOPERANDS;
+ case 0x20:
+ return DRC_ZEROOPERANDS;
+ case 0x21:
+ return DRC_ZEROOPERANDS;
+ case 0x22:
+ return DRC_ZEROOPERANDS;
+ case 0x23:
+ return DRC_ONEOPERAND;
+ case 0x24:
+ return DRC_ZEROOPERANDS;
+ case 0x25:
+ return DRC_ZEROOPERANDS;
+ case 0x26:
+ return DRC_ZEROOPERANDS;
+ case 0x27:
+ return DRC_ZEROOPERANDS;
+ case 0x2f:
+ return DRC_ONEOPERAND;
+ case 0x28:
+ return DRC_ONEOPERAND;
+ case 0x29:
+ return DRC_ZEROOPERANDS;
+ case 0x2a:
+ return DRC_ZEROOPERANDS;
+ case 0x2b:
+ return DRC_ZEROOPERANDS;
+ case 0x2c:
+ return DRC_ZEROOPERANDS;
+ case 0x2d:
+ return DRC_ZEROOPERANDS;
+ case 0x2e:
+ return DRC_ZEROOPERANDS;
+ case 0x30:
+ return DRC_ZEROOPERANDS;
+ case 0x31:
+ return DRC_ZEROOPERANDS;
+ case 0x32:
+ return DRC_ZEROOPERANDS;
+ case 0x33:
+ return DRC_ZEROOPERANDS;
+ case 0x34:
+ return DRC_ZEROOPERANDS;
+ case 0x35:
+ return DRC_ZEROOPERANDS;
+ case 0x36:
+ return DRC_ZEROOPERANDS;
+ case 0x37:
+ return DRC_ZEROOPERANDS;
+ case 0x38:
+ return DRC_ZEROOPERANDS;
+ case 0x39:
+ return DRC_ZEROOPERANDS;
+ case 0x3a:
+ return DRC_ZEROOPERANDS;
+ case 0x3b:
+ return DRC_ZEROOPERANDS;
+ case 0x3c:
+ return DRC_ZEROOPERANDS;
+ case 0x3d:
+ return DRC_ZEROOPERANDS;
+ case 0x3e:
+ return DRC_ZEROOPERANDS;
+ case 0x3f:
+ return DRC_ZEROOPERANDS;
+ case 0x40:
+ return DRC_ZEROOPERANDS;
+ case 0x41:
+ return DRC_ZEROOPERANDS;
+ case 0x42:
+ return DRC_ZEROOPERANDS;
+ case 0x43:
+ return DRC_ZEROOPERANDS;
+ case 0x44:
+ return DRC_ZEROOPERANDS;
+ case 0x45:
+ return DRC_ZEROOPERANDS;
+ case 0x46:
+ return DRC_ZEROOPERANDS;
+ case 0x47:
+ return DRC_ZEROOPERANDS;
+ case 0x48:
+ return DRC_ZEROOPERANDS;
+ case 0x49:
+ return DRC_ZEROOPERANDS;
+ case 0x4a:
+ return DRC_ZEROOPERANDS;
+ case 0x4b:
+ return DRC_ZEROOPERANDS;
+ case 0x4c:
+ return DRC_ZEROOPERANDS;
+ case 0x4d:
+ return DRC_ZEROOPERANDS;
+ case 0x4e:
+ return DRC_ZEROOPERANDS;
+ case 0x4f:
+ return DRC_ZEROOPERANDS;
+ case 0x50:
+ return DRC_ZEROOPERANDS;
+ case 0x51:
+ return DRC_ZEROOPERANDS;
+ case 0x52:
+ return DRC_ZEROOPERANDS;
+ case 0x53:
+ return DRC_ZEROOPERANDS;
+ case 0x54:
+ return DRC_ZEROOPERANDS;
+ case 0x55:
+ return DRC_ZEROOPERANDS;
+ case 0x56:
+ return DRC_ZEROOPERANDS;
+ case 0x57:
+ return DRC_ZEROOPERANDS;
+ case 0x58:
+ return DRC_ZEROOPERANDS;
+ case 0x59:
+ return DRC_ZEROOPERANDS;
+ case 0x5a:
+ return DRC_ZEROOPERANDS;
+ case 0x5b:
+ return DRC_ZEROOPERANDS;
+ case 0x5c:
+ return DRC_ZEROOPERANDS;
+ case 0x5d:
+ return DRC_ZEROOPERANDS;
+ case 0x5e:
+ return DRC_ZEROOPERANDS;
+ case 0x5f:
+ return DRC_ZEROOPERANDS;
+ case 0x60:
+ return DRC_ZEROOPERANDS;
+ case 0x61:
+ return DRC_ZEROOPERANDS;
+ case 0x62:
+ return DRC_ZEROOPERANDS;
+ case 0x63:
+ return DRC_ZEROOPERANDS;
+ case 0x64:
+ return DRC_ZEROOPERANDS;
+ case 0x65:
+ return DRC_ZEROOPERANDS;
+ case 0x66:
+ return DRC_ZEROOPERANDS;
+ case 0x67:
+ return DRC_ZEROOPERANDS;
+ case 0x68:
+ return DRC_ZEROOPERANDS;
+ case 0x69:
+ return DRC_ZEROOPERANDS;
+ case 0x6a:
+ return DRC_ZEROOPERANDS;
+ case 0x6b:
+ return DRC_ZEROOPERANDS;
+ case 0x6c:
+ return DRC_ZEROOPERANDS;
+ case 0x6d:
+ return DRC_ZEROOPERANDS;
+ case 0x6e:
+ return DRC_ZEROOPERANDS;
+ case 0x6f:
+ return DRC_ZEROOPERANDS;
+ case 0x70:
+ return DRC_ONEOPERAND;
+ case 0x71:
+ return DRC_ONEOPERAND;
+ case 0x72:
+ return DRC_ONEOPERAND;
+ case 0x73:
+ return DRC_ONEOPERAND;
+ case 0x74:
+ return DRC_ONEOPERAND;
+ case 0x75:
+ return DRC_ONEOPERAND;
+ case 0x76:
+ return DRC_ONEOPERAND;
+ case 0x77:
+ return DRC_ONEOPERAND;
+ case 0x78:
+ return DRC_ONEOPERAND;
+ case 0x79:
+ return DRC_ONEOPERAND;
+ case 0x7a:
+ return DRC_ONEOPERAND;
+ case 0x7b:
+ return DRC_ONEOPERAND;
+ case 0x7c:
+ return DRC_ONEOPERAND;
+ case 0x7d:
+ return DRC_ONEOPERAND;
+ case 0x7e:
+ return DRC_ONEOPERAND;
+ case 0x7f:
+ return DRC_ONEOPERAND;
+ case 0x80:
+ return DRC_ONEOPERAND;
+ case 0x81:
+ return DRC_ONEOPERAND;
+ case 0x82:
+ return DRC_ONEOPERAND;
+ case 0x83:
+ return DRC_ONEOPERAND;
+ case 0x84:
+ return DRC_ONEOPERAND;
+ case 0x85:
+ return DRC_ONEOPERAND;
+ case 0x86:
+ return DRC_ONEOPERAND;
+ case 0x87:
+ return DRC_ONEOPERAND;
+ case 0x88:
+ return DRC_ONEOPERAND;
+ case 0x89:
+ return DRC_ONEOPERAND;
+ case 0x8a:
+ return DRC_ONEOPERAND;
+ case 0x8b:
+ return DRC_ONEOPERAND;
+ case 0x8c:
+ return DRC_ONEOPERAND;
+ case 0x8d:
+ return DRC_ONEOPERAND;
+ case 0x8e:
+ return DRC_ONEOPERAND;
+ case 0x8f:
+ return DRC_ONEOPERAND;
+ case 0x90:
+ return DRC_ONEOPERAND;
+ case 0x91:
+ return DRC_ONEOPERAND;
+ case 0x92:
+ return DRC_TWOOPERANDS;
+ case 0x93:
+ return DRC_ONEOPERAND;
+ case 0x94:
+ return DRC_ONEOPERAND;
+ case 0x95:
+ return DRC_ONEOPERAND;
+ case 0x96:
+ return DRC_ZEROOPERANDS;
+ case 0x97:
+ return DRC_DWARFv3 | DRC_ZEROOPERANDS;
+ case 0x98:
+ return DRC_DWARFv3 | DRC_ONEOPERAND;
+ case 0x99:
+ return DRC_DWARFv3 | DRC_ONEOPERAND;
+ case 0x9a:
+ return DRC_DWARFv3 | DRC_ONEOPERAND;
+ case 0xf0:
+ return DRC_ZEROOPERANDS; /* DW_OP_APPLE_uninit */
+ case 0xe0:
+ return 0;
+ case 0xff:
+ return 0;
+ default:
+ return 0;
}
}
-const char *
-DW_ATE_value_to_name (uint32_t val)
-{
+const char *DW_ATE_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::AttributeEncodingString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_ATE constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::AttributeEncodingString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_ATE constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_ACCESS_value_to_name (uint32_t val)
-{
+const char *DW_ACCESS_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::AccessibilityString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_ACCESS constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::AccessibilityString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_ACCESS constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_VIS_value_to_name (uint32_t val)
-{
+const char *DW_VIS_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::VisibilityString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_VIS constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::VisibilityString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_VIS constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_VIRTUALITY_value_to_name (uint32_t val)
-{
+const char *DW_VIRTUALITY_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::VirtualityString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_VIRTUALITY constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::VirtualityString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_VIRTUALITY constant: 0x%x",
+ val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_LANG_value_to_name (uint32_t val)
-{
+const char *DW_LANG_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::LanguageString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_LANG constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::LanguageString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_LANG constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_ID_value_to_name (uint32_t val)
-{
+const char *DW_ID_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::CaseString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_ID constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::CaseString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_ID constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_CC_value_to_name (uint32_t val)
-{
+const char *DW_CC_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::ConventionString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_CC constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::ConventionString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_CC constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_INL_value_to_name (uint32_t val)
-{
+const char *DW_INL_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::InlineCodeString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_INL constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::InlineCodeString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_INL constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_ORD_value_to_name (uint32_t val)
-{
+const char *DW_ORD_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::ArrayOrderString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_ORD constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::ArrayOrderString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_ORD constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_DSC_value_to_name (uint32_t val)
-{
+const char *DW_DSC_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::DiscriminantString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_DSC constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::DiscriminantString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_DSC constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_LNS_value_to_name (uint32_t val)
-{
+const char *DW_LNS_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::LNStandardString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_LNS constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::LNStandardString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_LNS constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_LNE_value_to_name (uint32_t val)
-{
+const char *DW_LNE_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::LNExtendedString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_LNE constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::LNExtendedString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_LNE constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_MACINFO_value_to_name (uint32_t val)
-{
+const char *DW_MACINFO_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::MacinfoString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_MACINFO constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::MacinfoString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_MACINFO constant: 0x%x",
+ val);
+ return invalid;
}
return llvmstr;
}
-const char *
-DW_CFA_value_to_name (uint32_t val)
-{
+const char *DW_CFA_value_to_name(uint32_t val) {
static char invalid[100];
- const char *llvmstr = llvm::dwarf::CallFrameString (val);
- if (llvmstr == NULL)
- {
- snprintf (invalid, sizeof (invalid), "Unknown DW_CFA constant: 0x%x", val);
- return invalid;
+ const char *llvmstr = llvm::dwarf::CallFrameString(val);
+ if (llvmstr == NULL) {
+ snprintf(invalid, sizeof(invalid), "Unknown DW_CFA constant: 0x%x", val);
+ return invalid;
}
return llvmstr;
}
-DW_TAG_CategoryEnum
-get_tag_category (uint16_t tag)
-{
- switch (tag)
- {
- case DW_TAG_array_type : return TagCategoryType;
- case DW_TAG_class_type : return TagCategoryType;
- case DW_TAG_entry_point : return TagCategoryProgram;
- case DW_TAG_enumeration_type : return TagCategoryType;
- case DW_TAG_formal_parameter : return TagCategoryVariable;
- case DW_TAG_imported_declaration : return TagCategoryProgram;
- case DW_TAG_label : return TagCategoryProgram;
- case DW_TAG_lexical_block : return TagCategoryProgram;
- case DW_TAG_member : return TagCategoryType;
- case DW_TAG_pointer_type : return TagCategoryType;
- case DW_TAG_reference_type : return TagCategoryType;
- case DW_TAG_compile_unit : return TagCategoryProgram;
- case DW_TAG_string_type : return TagCategoryType;
- case DW_TAG_structure_type : return TagCategoryType;
- case DW_TAG_subroutine_type : return TagCategoryType;
- case DW_TAG_typedef : return TagCategoryType;
- case DW_TAG_union_type : return TagCategoryType;
- case DW_TAG_unspecified_parameters : return TagCategoryVariable;
- case DW_TAG_variant : return TagCategoryType;
- case DW_TAG_common_block : return TagCategoryProgram;
- case DW_TAG_common_inclusion : return TagCategoryProgram;
- case DW_TAG_inheritance : return TagCategoryType;
- case DW_TAG_inlined_subroutine : return TagCategoryProgram;
- case DW_TAG_module : return TagCategoryProgram;
- case DW_TAG_ptr_to_member_type : return TagCategoryType;
- case DW_TAG_set_type : return TagCategoryType;
- case DW_TAG_subrange_type : return TagCategoryType;
- case DW_TAG_with_stmt : return TagCategoryProgram;
- case DW_TAG_access_declaration : return TagCategoryProgram;
- case DW_TAG_base_type : return TagCategoryType;
- case DW_TAG_catch_block : return TagCategoryProgram;
- case DW_TAG_const_type : return TagCategoryType;
- case DW_TAG_constant : return TagCategoryVariable;
- case DW_TAG_enumerator : return TagCategoryType;
- case DW_TAG_file_type : return TagCategoryType;
- case DW_TAG_friend : return TagCategoryType;
- case DW_TAG_namelist : return TagCategoryVariable;
- case DW_TAG_namelist_item : return TagCategoryVariable;
- case DW_TAG_packed_type : return TagCategoryType;
- case DW_TAG_subprogram : return TagCategoryProgram;
- case DW_TAG_template_type_parameter : return TagCategoryType;
- case DW_TAG_template_value_parameter : return TagCategoryType;
- case DW_TAG_thrown_type : return TagCategoryType;
- case DW_TAG_try_block : return TagCategoryProgram;
- case DW_TAG_variant_part : return TagCategoryType;
- case DW_TAG_variable : return TagCategoryVariable;
- case DW_TAG_volatile_type : return TagCategoryType;
- case DW_TAG_dwarf_procedure : return TagCategoryProgram;
- case DW_TAG_restrict_type : return TagCategoryType;
- case DW_TAG_interface_type : return TagCategoryType;
- case DW_TAG_namespace : return TagCategoryProgram;
- case DW_TAG_imported_module : return TagCategoryProgram;
- case DW_TAG_unspecified_type : return TagCategoryType;
- case DW_TAG_partial_unit : return TagCategoryProgram;
- case DW_TAG_imported_unit : return TagCategoryProgram;
- case DW_TAG_shared_type : return TagCategoryType;
- default: break;
- }
+DW_TAG_CategoryEnum get_tag_category(uint16_t tag) {
+ switch (tag) {
+ case DW_TAG_array_type:
+ return TagCategoryType;
+ case DW_TAG_class_type:
+ return TagCategoryType;
+ case DW_TAG_entry_point:
+ return TagCategoryProgram;
+ case DW_TAG_enumeration_type:
+ return TagCategoryType;
+ case DW_TAG_formal_parameter:
+ return TagCategoryVariable;
+ case DW_TAG_imported_declaration:
+ return TagCategoryProgram;
+ case DW_TAG_label:
+ return TagCategoryProgram;
+ case DW_TAG_lexical_block:
+ return TagCategoryProgram;
+ case DW_TAG_member:
+ return TagCategoryType;
+ case DW_TAG_pointer_type:
+ return TagCategoryType;
+ case DW_TAG_reference_type:
+ return TagCategoryType;
+ case DW_TAG_compile_unit:
+ return TagCategoryProgram;
+ case DW_TAG_string_type:
+ return TagCategoryType;
+ case DW_TAG_structure_type:
+ return TagCategoryType;
+ case DW_TAG_subroutine_type:
+ return TagCategoryType;
+ case DW_TAG_typedef:
+ return TagCategoryType;
+ case DW_TAG_union_type:
+ return TagCategoryType;
+ case DW_TAG_unspecified_parameters:
+ return TagCategoryVariable;
+ case DW_TAG_variant:
+ return TagCategoryType;
+ case DW_TAG_common_block:
+ return TagCategoryProgram;
+ case DW_TAG_common_inclusion:
+ return TagCategoryProgram;
+ case DW_TAG_inheritance:
+ return TagCategoryType;
+ case DW_TAG_inlined_subroutine:
+ return TagCategoryProgram;
+ case DW_TAG_module:
+ return TagCategoryProgram;
+ case DW_TAG_ptr_to_member_type:
+ return TagCategoryType;
+ case DW_TAG_set_type:
+ return TagCategoryType;
+ case DW_TAG_subrange_type:
+ return TagCategoryType;
+ case DW_TAG_with_stmt:
return TagCategoryProgram;
+ case DW_TAG_access_declaration:
+ return TagCategoryProgram;
+ case DW_TAG_base_type:
+ return TagCategoryType;
+ case DW_TAG_catch_block:
+ return TagCategoryProgram;
+ case DW_TAG_const_type:
+ return TagCategoryType;
+ case DW_TAG_constant:
+ return TagCategoryVariable;
+ case DW_TAG_enumerator:
+ return TagCategoryType;
+ case DW_TAG_file_type:
+ return TagCategoryType;
+ case DW_TAG_friend:
+ return TagCategoryType;
+ case DW_TAG_namelist:
+ return TagCategoryVariable;
+ case DW_TAG_namelist_item:
+ return TagCategoryVariable;
+ case DW_TAG_packed_type:
+ return TagCategoryType;
+ case DW_TAG_subprogram:
+ return TagCategoryProgram;
+ case DW_TAG_template_type_parameter:
+ return TagCategoryType;
+ case DW_TAG_template_value_parameter:
+ return TagCategoryType;
+ case DW_TAG_thrown_type:
+ return TagCategoryType;
+ case DW_TAG_try_block:
+ return TagCategoryProgram;
+ case DW_TAG_variant_part:
+ return TagCategoryType;
+ case DW_TAG_variable:
+ return TagCategoryVariable;
+ case DW_TAG_volatile_type:
+ return TagCategoryType;
+ case DW_TAG_dwarf_procedure:
+ return TagCategoryProgram;
+ case DW_TAG_restrict_type:
+ return TagCategoryType;
+ case DW_TAG_interface_type:
+ return TagCategoryType;
+ case DW_TAG_namespace:
+ return TagCategoryProgram;
+ case DW_TAG_imported_module:
+ return TagCategoryProgram;
+ case DW_TAG_unspecified_type:
+ return TagCategoryType;
+ case DW_TAG_partial_unit:
+ return TagCategoryProgram;
+ case DW_TAG_imported_unit:
+ return TagCategoryProgram;
+ case DW_TAG_shared_type:
+ return TagCategoryType;
+ default:
+ break;
+ }
+ return TagCategoryProgram;
}
} // namespace lldb_private
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h
index d47e6a350c9..038f5706c06 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h
@@ -10,106 +10,104 @@
#ifndef SymbolFileDWARF_DWARFDefines_h_
#define SymbolFileDWARF_DWARFDefines_h_
-#include <stdint.h>
#include "lldb/Core/dwarf.h"
+#include <stdint.h>
namespace lldb_private {
-typedef uint32_t DRC_class; // Holds DRC_* class bitfields
+typedef uint32_t DRC_class; // Holds DRC_* class bitfields
-enum DW_TAG_Category
-{
- TagCategoryVariable,
- TagCategoryType,
- TagCategoryProgram,
- kNumTagCategories
+enum DW_TAG_Category {
+ TagCategoryVariable,
+ TagCategoryType,
+ TagCategoryProgram,
+ kNumTagCategories
};
typedef enum DW_TAG_Category DW_TAG_CategoryEnum;
-const char *DW_TAG_value_to_name (uint32_t val);
+const char *DW_TAG_value_to_name(uint32_t val);
-DW_TAG_CategoryEnum get_tag_category (uint16_t tag);
+DW_TAG_CategoryEnum get_tag_category(uint16_t tag);
-const char *DW_CHILDREN_value_to_name (uint8_t val);
+const char *DW_CHILDREN_value_to_name(uint8_t val);
-const char *DW_AT_value_to_name (uint32_t val);
+const char *DW_AT_value_to_name(uint32_t val);
-const char *DW_FORM_value_to_name (uint32_t val);
+const char *DW_FORM_value_to_name(uint32_t val);
-const char *DW_OP_value_to_name (uint32_t val);
+const char *DW_OP_value_to_name(uint32_t val);
-DRC_class DW_OP_value_to_class (uint32_t val);
+DRC_class DW_OP_value_to_class(uint32_t val);
-const char *DW_ATE_value_to_name (uint32_t val);
+const char *DW_ATE_value_to_name(uint32_t val);
-const char *DW_ACCESS_value_to_name (uint32_t val);
+const char *DW_ACCESS_value_to_name(uint32_t val);
-const char *DW_VIS_value_to_name (uint32_t val);
+const char *DW_VIS_value_to_name(uint32_t val);
-const char *DW_VIRTUALITY_value_to_name (uint32_t val);
+const char *DW_VIRTUALITY_value_to_name(uint32_t val);
-const char *DW_LANG_value_to_name (uint32_t val);
+const char *DW_LANG_value_to_name(uint32_t val);
-const char *DW_ID_value_to_name (uint32_t val);
+const char *DW_ID_value_to_name(uint32_t val);
-const char *DW_CC_value_to_name (uint32_t val);
+const char *DW_CC_value_to_name(uint32_t val);
-const char *DW_INL_value_to_name (uint32_t val);
+const char *DW_INL_value_to_name(uint32_t val);
-const char *DW_ORD_value_to_name (uint32_t val);
+const char *DW_ORD_value_to_name(uint32_t val);
-const char *DW_DSC_value_to_name (uint32_t val);
+const char *DW_DSC_value_to_name(uint32_t val);
-const char *DW_LNS_value_to_name (uint32_t val);
+const char *DW_LNS_value_to_name(uint32_t val);
-const char *DW_LNE_value_to_name (uint32_t val);
+const char *DW_LNE_value_to_name(uint32_t val);
-const char *DW_MACINFO_value_to_name (uint32_t val);
+const char *DW_MACINFO_value_to_name(uint32_t val);
-const char *DW_CFA_value_to_name (uint32_t val);
+const char *DW_CFA_value_to_name(uint32_t val);
-const char *DW_GNU_EH_PE_value_to_name (uint32_t val);
+const char *DW_GNU_EH_PE_value_to_name(uint32_t val);
/* These DRC are entirely our own construction,
although they are derived from various comments in the DWARF standard.
Most of these are not useful to the parser, but the DW_AT and DW_FORM
classes should prove to be usable in some fashion. */
-#define DRC_0x65 0x1
-#define DRC_ADDRESS 0x2
-#define DRC_BLOCK 0x4
-#define DRC_CONSTANT 0x8
-#define DRC_DWARFv3 0x10
-#define DRC_FLAG 0x20
-#define DRC_INDIRECT_SPECIAL 0x40
-#define DRC_LINEPTR 0x80
-#define DRC_LOCEXPR 0x100
-#define DRC_LOCLISTPTR 0x200
-#define DRC_MACPTR 0x400
-#define DRC_ONEOPERAND 0x800
-#define DRC_OPERANDONE_1BYTE_DELTA 0x1000
-#define DRC_OPERANDONE_2BYTE_DELTA 0x2000
-#define DRC_OPERANDONE_4BYTE_DELTA 0x4000
-#define DRC_OPERANDONE_ADDRESS 0x8000
-#define DRC_OPERANDONE_BLOCK 0x10000
-#define DRC_OPERANDONE_SLEB128_OFFSET 0x20000
-#define DRC_OPERANDONE_ULEB128_OFFSET 0x40000
-#define DRC_OPERANDONE_ULEB128_REGISTER 0x80000
-#define DRC_OPERANDTWO_BLOCK 0x100000
-#define DRC_OPERANDTWO_SLEB128_OFFSET 0x200000
-#define DRC_OPERANDTWO_ULEB128_OFFSET 0x400000
-#define DRC_OPERANDTWO_ULEB128_REGISTER 0x800000
-#define DRC_OPERNADONE_ULEB128_REGISTER 0x1000000
-#define DRC_RANGELISTPTR 0x2000000
-#define DRC_REFERENCE 0x4000000
-#define DRC_STRING 0x8000000
-#define DRC_TWOOPERANDS 0x10000000
-#define DRC_VENDOR_GNU 0x20000000
-#define DRC_VENDOR_MIPS 0x40000000
-#define DRC_ZEROOPERANDS 0x80000000
+#define DRC_0x65 0x1
+#define DRC_ADDRESS 0x2
+#define DRC_BLOCK 0x4
+#define DRC_CONSTANT 0x8
+#define DRC_DWARFv3 0x10
+#define DRC_FLAG 0x20
+#define DRC_INDIRECT_SPECIAL 0x40
+#define DRC_LINEPTR 0x80
+#define DRC_LOCEXPR 0x100
+#define DRC_LOCLISTPTR 0x200
+#define DRC_MACPTR 0x400
+#define DRC_ONEOPERAND 0x800
+#define DRC_OPERANDONE_1BYTE_DELTA 0x1000
+#define DRC_OPERANDONE_2BYTE_DELTA 0x2000
+#define DRC_OPERANDONE_4BYTE_DELTA 0x4000
+#define DRC_OPERANDONE_ADDRESS 0x8000
+#define DRC_OPERANDONE_BLOCK 0x10000
+#define DRC_OPERANDONE_SLEB128_OFFSET 0x20000
+#define DRC_OPERANDONE_ULEB128_OFFSET 0x40000
+#define DRC_OPERANDONE_ULEB128_REGISTER 0x80000
+#define DRC_OPERANDTWO_BLOCK 0x100000
+#define DRC_OPERANDTWO_SLEB128_OFFSET 0x200000
+#define DRC_OPERANDTWO_ULEB128_OFFSET 0x400000
+#define DRC_OPERANDTWO_ULEB128_REGISTER 0x800000
+#define DRC_OPERNADONE_ULEB128_REGISTER 0x1000000
+#define DRC_RANGELISTPTR 0x2000000
+#define DRC_REFERENCE 0x4000000
+#define DRC_STRING 0x8000000
+#define DRC_TWOOPERANDS 0x10000000
+#define DRC_VENDOR_GNU 0x20000000
+#define DRC_VENDOR_MIPS 0x40000000
+#define DRC_ZEROOPERANDS 0x80000000
} // namespace lldb_private
-
-#endif // SymbolFileDWARF_DWARFDefines_h_
+#endif // SymbolFileDWARF_DWARFDefines_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
index f8d137f713f..ad18c56b330 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
@@ -9,19 +9,17 @@
#include <assert.h>
-#include "lldb/Core/dwarf.h"
#include "lldb/Core/Stream.h"
+#include "lldb/Core/dwarf.h"
-#include "DWARFFormValue.h"
#include "DWARFCompileUnit.h"
+#include "DWARFFormValue.h"
class DWARFCompileUnit;
using namespace lldb_private;
-
-static uint8_t g_form_sizes_addr4[] =
-{
+static uint8_t g_form_sizes_addr4[] = {
0, // 0x00 unused
4, // 0x01 DW_FORM_addr
0, // 0x02 unused
@@ -38,7 +36,8 @@ static uint8_t g_form_sizes_addr4[] =
0, // 0x0d DW_FORM_sdata
4, // 0x0e DW_FORM_strp
0, // 0x0f DW_FORM_udata
- 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
+ 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for
+ // DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
1, // 0x11 DW_FORM_ref1
2, // 0x12 DW_FORM_ref2
4, // 0x13 DW_FORM_ref4
@@ -58,9 +57,7 @@ static uint8_t g_form_sizes_addr4[] =
};
-static uint8_t
-g_form_sizes_addr8[] =
-{
+static uint8_t g_form_sizes_addr8[] = {
0, // 0x00 unused
8, // 0x01 DW_FORM_addr
0, // 0x02 unused
@@ -77,7 +74,8 @@ g_form_sizes_addr8[] =
0, // 0x0d DW_FORM_sdata
4, // 0x0e DW_FORM_strp
0, // 0x0f DW_FORM_udata
- 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
+ 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for
+ // DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
1, // 0x11 DW_FORM_ref1
2, // 0x12 DW_FORM_ref2
4, // 0x13 DW_FORM_ref4
@@ -98,9 +96,7 @@ g_form_sizes_addr8[] =
// Difference with g_form_sizes_addr8:
// DW_FORM_strp and DW_FORM_sec_offset are 8 instead of 4
-static uint8_t
-g_form_sizes_addr8_dwarf64[] =
-{
+static uint8_t g_form_sizes_addr8_dwarf64[] = {
0, // 0x00 unused
8, // 0x01 DW_FORM_addr
0, // 0x02 unused
@@ -117,7 +113,8 @@ g_form_sizes_addr8_dwarf64[] =
0, // 0x0d DW_FORM_sdata
8, // 0x0e DW_FORM_strp
0, // 0x0f DW_FORM_udata
- 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
+ 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for
+ // DWARF32, 8 bytes for DWARF32 in DWARF 3 and later
1, // 0x11 DW_FORM_ref1
2, // 0x12 DW_FORM_ref2
4, // 0x13 DW_FORM_ref4
@@ -137,553 +134,612 @@ g_form_sizes_addr8_dwarf64[] =
};
DWARFFormValue::FixedFormSizes
-DWARFFormValue::GetFixedFormSizesForAddressSize (uint8_t addr_size, bool is_dwarf64)
-{
- if (!is_dwarf64) {
- switch (addr_size)
- {
- case 4: return FixedFormSizes(g_form_sizes_addr4, sizeof(g_form_sizes_addr4));
- case 8: return FixedFormSizes(g_form_sizes_addr8, sizeof(g_form_sizes_addr8));
- }
- } else {
- if (addr_size == 8)
- return FixedFormSizes(g_form_sizes_addr8_dwarf64, sizeof(g_form_sizes_addr8_dwarf64));
- // is_dwarf64 && addr_size == 4 : no provider does this.
+DWARFFormValue::GetFixedFormSizesForAddressSize(uint8_t addr_size,
+ bool is_dwarf64) {
+ if (!is_dwarf64) {
+ switch (addr_size) {
+ case 4:
+ return FixedFormSizes(g_form_sizes_addr4, sizeof(g_form_sizes_addr4));
+ case 8:
+ return FixedFormSizes(g_form_sizes_addr8, sizeof(g_form_sizes_addr8));
}
- return FixedFormSizes();
-}
-
-DWARFFormValue::DWARFFormValue() :
- m_cu (NULL),
- m_form(0),
- m_value()
-{
-}
-
-DWARFFormValue::DWARFFormValue(const DWARFCompileUnit* cu, dw_form_t form) :
- m_cu (cu),
- m_form(form),
- m_value()
-{
-}
-
-void
-DWARFFormValue::Clear()
-{
- m_cu = nullptr;
- m_form = 0;
- memset(&m_value, 0, sizeof(m_value));
+ } else {
+ if (addr_size == 8)
+ return FixedFormSizes(g_form_sizes_addr8_dwarf64,
+ sizeof(g_form_sizes_addr8_dwarf64));
+ // is_dwarf64 && addr_size == 4 : no provider does this.
+ }
+ return FixedFormSizes();
}
-bool
-DWARFFormValue::ExtractValue(const DWARFDataExtractor& data, lldb::offset_t* offset_ptr)
-{
- bool indirect = false;
- bool is_block = false;
- m_value.data = NULL;
- uint8_t ref_addr_size;
- // Read the value for the form into value and follow and DW_FORM_indirect instances we run into
- do
- {
- indirect = false;
- switch (m_form)
- {
- case DW_FORM_addr: assert(m_cu);
- m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(m_cu)); break;
- case DW_FORM_block2: m_value.value.uval = data.GetU16(offset_ptr); is_block = true; break;
- case DW_FORM_block4: m_value.value.uval = data.GetU32(offset_ptr); is_block = true; break;
- case DW_FORM_data2: m_value.value.uval = data.GetU16(offset_ptr); break;
- case DW_FORM_data4: m_value.value.uval = data.GetU32(offset_ptr); break;
- case DW_FORM_data8: m_value.value.uval = data.GetU64(offset_ptr); break;
- case DW_FORM_string: m_value.value.cstr = data.GetCStr(offset_ptr); break;
- case DW_FORM_exprloc:
- case DW_FORM_block: m_value.value.uval = data.GetULEB128(offset_ptr); is_block = true; break;
- case DW_FORM_block1: m_value.value.uval = data.GetU8(offset_ptr); is_block = true; break;
- case DW_FORM_data1: m_value.value.uval = data.GetU8(offset_ptr); break;
- case DW_FORM_flag: m_value.value.uval = data.GetU8(offset_ptr); break;
- case DW_FORM_sdata: m_value.value.sval = data.GetSLEB128(offset_ptr); break;
- case DW_FORM_strp: assert(m_cu);
- m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(m_cu) ? 8 : 4); break;
- // case DW_FORM_APPLE_db_str:
- case DW_FORM_udata: m_value.value.uval = data.GetULEB128(offset_ptr); break;
- case DW_FORM_ref_addr: assert(m_cu);
- ref_addr_size = 4;
- if (m_cu->GetVersion() <= 2)
- ref_addr_size = m_cu->GetAddressByteSize();
- else
- ref_addr_size = m_cu->IsDWARF64() ? 8 : 4;
- m_value.value.uval = data.GetMaxU64(offset_ptr, ref_addr_size); break;
- case DW_FORM_ref1: m_value.value.uval = data.GetU8(offset_ptr); break;
- case DW_FORM_ref2: m_value.value.uval = data.GetU16(offset_ptr); break;
- case DW_FORM_ref4: m_value.value.uval = data.GetU32(offset_ptr); break;
- case DW_FORM_ref8: m_value.value.uval = data.GetU64(offset_ptr); break;
- case DW_FORM_ref_udata: m_value.value.uval = data.GetULEB128(offset_ptr); break;
- case DW_FORM_indirect:
- m_form = data.GetULEB128(offset_ptr);
- indirect = true;
- break;
-
- case DW_FORM_sec_offset: assert(m_cu);
- m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(m_cu) ? 8 : 4); break;
- case DW_FORM_flag_present: m_value.value.uval = 1; break;
- case DW_FORM_ref_sig8: m_value.value.uval = data.GetU64(offset_ptr); break;
- case DW_FORM_GNU_str_index: m_value.value.uval = data.GetULEB128(offset_ptr); break;
- case DW_FORM_GNU_addr_index: m_value.value.uval = data.GetULEB128(offset_ptr); break;
- default:
- return false;
- break;
- }
- } while (indirect);
-
- if (is_block)
- {
- m_value.data = data.PeekData(*offset_ptr, m_value.value.uval);
- if (m_value.data != NULL)
- {
- *offset_ptr += m_value.value.uval;
- }
- }
+DWARFFormValue::DWARFFormValue() : m_cu(NULL), m_form(0), m_value() {}
- return true;
-}
+DWARFFormValue::DWARFFormValue(const DWARFCompileUnit *cu, dw_form_t form)
+ : m_cu(cu), m_form(form), m_value() {}
-bool
-DWARFFormValue::SkipValue(const DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr) const
-{
- return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, m_cu);
+void DWARFFormValue::Clear() {
+ m_cu = nullptr;
+ m_form = 0;
+ memset(&m_value, 0, sizeof(m_value));
}
-bool
-DWARFFormValue::SkipValue(dw_form_t form, const DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu)
-{
- uint8_t ref_addr_size;
- switch (form)
- {
- // Blocks if inlined data that have a length field and the data bytes
- // inlined in the .debug_info
- case DW_FORM_exprloc:
- case DW_FORM_block: { dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr); *offset_ptr += size; } return true;
- case DW_FORM_block1: { dw_uleb128_t size = debug_info_data.GetU8(offset_ptr); *offset_ptr += size; } return true;
- case DW_FORM_block2: { dw_uleb128_t size = debug_info_data.GetU16(offset_ptr); *offset_ptr += size; } return true;
- case DW_FORM_block4: { dw_uleb128_t size = debug_info_data.GetU32(offset_ptr); *offset_ptr += size; } return true;
-
- // Inlined NULL terminated C-strings
- case DW_FORM_string:
- debug_info_data.GetCStr(offset_ptr);
- return true;
-
- // Compile unit address sized values
+bool DWARFFormValue::ExtractValue(const DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr) {
+ bool indirect = false;
+ bool is_block = false;
+ m_value.data = NULL;
+ uint8_t ref_addr_size;
+ // Read the value for the form into value and follow and DW_FORM_indirect
+ // instances we run into
+ do {
+ indirect = false;
+ switch (m_form) {
case DW_FORM_addr:
- *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu);
- return true;
-
- case DW_FORM_ref_addr:
- ref_addr_size = 4;
- assert (cu); // CU must be valid for DW_FORM_ref_addr objects or we will get this wrong
- if (cu->GetVersion() <= 2)
- ref_addr_size = cu->GetAddressByteSize();
- else
- ref_addr_size = cu->IsDWARF64() ? 8 : 4;
- *offset_ptr += ref_addr_size;
- return true;
-
- // 0 bytes values (implied from DW_FORM)
- case DW_FORM_flag_present:
- return true;
-
- // 1 byte values
+ assert(m_cu);
+ m_value.value.uval = data.GetMaxU64(
+ offset_ptr, DWARFCompileUnit::GetAddressByteSize(m_cu));
+ break;
+ case DW_FORM_block2:
+ m_value.value.uval = data.GetU16(offset_ptr);
+ is_block = true;
+ break;
+ case DW_FORM_block4:
+ m_value.value.uval = data.GetU32(offset_ptr);
+ is_block = true;
+ break;
+ case DW_FORM_data2:
+ m_value.value.uval = data.GetU16(offset_ptr);
+ break;
+ case DW_FORM_data4:
+ m_value.value.uval = data.GetU32(offset_ptr);
+ break;
+ case DW_FORM_data8:
+ m_value.value.uval = data.GetU64(offset_ptr);
+ break;
+ case DW_FORM_string:
+ m_value.value.cstr = data.GetCStr(offset_ptr);
+ break;
+ case DW_FORM_exprloc:
+ case DW_FORM_block:
+ m_value.value.uval = data.GetULEB128(offset_ptr);
+ is_block = true;
+ break;
+ case DW_FORM_block1:
+ m_value.value.uval = data.GetU8(offset_ptr);
+ is_block = true;
+ break;
case DW_FORM_data1:
+ m_value.value.uval = data.GetU8(offset_ptr);
+ break;
case DW_FORM_flag:
+ m_value.value.uval = data.GetU8(offset_ptr);
+ break;
+ case DW_FORM_sdata:
+ m_value.value.sval = data.GetSLEB128(offset_ptr);
+ break;
+ case DW_FORM_strp:
+ assert(m_cu);
+ m_value.value.uval =
+ data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(m_cu) ? 8 : 4);
+ break;
+ // case DW_FORM_APPLE_db_str:
+ case DW_FORM_udata:
+ m_value.value.uval = data.GetULEB128(offset_ptr);
+ break;
+ case DW_FORM_ref_addr:
+ assert(m_cu);
+ ref_addr_size = 4;
+ if (m_cu->GetVersion() <= 2)
+ ref_addr_size = m_cu->GetAddressByteSize();
+ else
+ ref_addr_size = m_cu->IsDWARF64() ? 8 : 4;
+ m_value.value.uval = data.GetMaxU64(offset_ptr, ref_addr_size);
+ break;
case DW_FORM_ref1:
- *offset_ptr += 1;
- return true;
-
- // 2 byte values
- case DW_FORM_data2:
+ m_value.value.uval = data.GetU8(offset_ptr);
+ break;
case DW_FORM_ref2:
- *offset_ptr += 2;
- return true;
-
- // 32 bit for DWARF 32, 64 for DWARF 64
- case DW_FORM_sec_offset:
- case DW_FORM_strp:
- assert(cu);
- *offset_ptr += (cu->IsDWARF64() ? 8 : 4);
- return true;
-
- // 4 byte values
- case DW_FORM_data4:
+ m_value.value.uval = data.GetU16(offset_ptr);
+ break;
case DW_FORM_ref4:
- *offset_ptr += 4;
- return true;
-
- // 8 byte values
- case DW_FORM_data8:
+ m_value.value.uval = data.GetU32(offset_ptr);
+ break;
case DW_FORM_ref8:
- case DW_FORM_ref_sig8:
- *offset_ptr += 8;
- return true;
-
- // signed or unsigned LEB 128 values
- case DW_FORM_sdata:
- case DW_FORM_udata:
+ m_value.value.uval = data.GetU64(offset_ptr);
+ break;
case DW_FORM_ref_udata:
- case DW_FORM_GNU_addr_index:
- case DW_FORM_GNU_str_index:
- debug_info_data.Skip_LEB128(offset_ptr);
- return true;
-
+ m_value.value.uval = data.GetULEB128(offset_ptr);
+ break;
case DW_FORM_indirect:
- {
- dw_form_t indirect_form = debug_info_data.GetULEB128(offset_ptr);
- return DWARFFormValue::SkipValue (indirect_form,
- debug_info_data,
- offset_ptr,
- cu);
- }
+ m_form = data.GetULEB128(offset_ptr);
+ indirect = true;
+ break;
+ case DW_FORM_sec_offset:
+ assert(m_cu);
+ m_value.value.uval =
+ data.GetMaxU64(offset_ptr, DWARFCompileUnit::IsDWARF64(m_cu) ? 8 : 4);
+ break;
+ case DW_FORM_flag_present:
+ m_value.value.uval = 1;
+ break;
+ case DW_FORM_ref_sig8:
+ m_value.value.uval = data.GetU64(offset_ptr);
+ break;
+ case DW_FORM_GNU_str_index:
+ m_value.value.uval = data.GetULEB128(offset_ptr);
+ break;
+ case DW_FORM_GNU_addr_index:
+ m_value.value.uval = data.GetULEB128(offset_ptr);
+ break;
default:
- break;
+ return false;
+ break;
}
- return false;
-}
+ } while (indirect);
+ if (is_block) {
+ m_value.data = data.PeekData(*offset_ptr, m_value.value.uval);
+ if (m_value.data != NULL) {
+ *offset_ptr += m_value.value.uval;
+ }
+ }
-void
-DWARFFormValue::Dump(Stream &s) const
-{
- uint64_t uvalue = Unsigned();
- bool cu_relative_offset = false;
+ return true;
+}
- bool verbose = s.GetVerbose();
+bool DWARFFormValue::SkipValue(const DWARFDataExtractor &debug_info_data,
+ lldb::offset_t *offset_ptr) const {
+ return DWARFFormValue::SkipValue(m_form, debug_info_data, offset_ptr, m_cu);
+}
- switch (m_form)
- {
- case DW_FORM_addr: s.Address(uvalue, sizeof (uint64_t)); break;
- case DW_FORM_flag:
- case DW_FORM_data1: s.PutHex8(uvalue); break;
- case DW_FORM_data2: s.PutHex16(uvalue); break;
- case DW_FORM_sec_offset:
- 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()); break;
- case DW_FORM_exprloc:
- case DW_FORM_block:
- case DW_FORM_block1:
- case DW_FORM_block2:
- case DW_FORM_block4:
- if (uvalue > 0)
- {
- switch (m_form)
- {
- case DW_FORM_exprloc:
- case DW_FORM_block: s.Printf("<0x%" PRIx64 "> ", uvalue); break;
- case DW_FORM_block1: s.Printf("<0x%2.2x> ", (uint8_t)uvalue); break;
- case DW_FORM_block2: s.Printf("<0x%4.4x> ", (uint16_t)uvalue); break;
- case DW_FORM_block4: s.Printf("<0x%8.8x> ", (uint32_t)uvalue); break;
- default: break;
- }
-
- const uint8_t* data_ptr = m_value.data;
- if (data_ptr)
- {
- const uint8_t* end_data_ptr = data_ptr + uvalue; // uvalue contains size of block
- while (data_ptr < end_data_ptr)
- {
- s.Printf("%2.2x ", *data_ptr);
- ++data_ptr;
- }
- }
- else
- s.PutCString("NULL");
- }
- break;
+bool DWARFFormValue::SkipValue(dw_form_t form,
+ const DWARFDataExtractor &debug_info_data,
+ lldb::offset_t *offset_ptr,
+ const DWARFCompileUnit *cu) {
+ uint8_t ref_addr_size;
+ switch (form) {
+ // Blocks if inlined data that have a length field and the data bytes
+ // inlined in the .debug_info
+ case DW_FORM_exprloc:
+ case DW_FORM_block: {
+ dw_uleb128_t size = debug_info_data.GetULEB128(offset_ptr);
+ *offset_ptr += size;
+ }
+ return true;
+ case DW_FORM_block1: {
+ dw_uleb128_t size = debug_info_data.GetU8(offset_ptr);
+ *offset_ptr += size;
+ }
+ return true;
+ case DW_FORM_block2: {
+ dw_uleb128_t size = debug_info_data.GetU16(offset_ptr);
+ *offset_ptr += size;
+ }
+ return true;
+ case DW_FORM_block4: {
+ dw_uleb128_t size = debug_info_data.GetU32(offset_ptr);
+ *offset_ptr += size;
+ }
+ return true;
- case DW_FORM_sdata: s.PutSLEB128(uvalue); break;
- case DW_FORM_udata: s.PutULEB128(uvalue); break;
- case DW_FORM_strp:
- {
- 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);
- }
- }
- break;
+ // Inlined NULL terminated C-strings
+ case DW_FORM_string:
+ debug_info_data.GetCStr(offset_ptr);
+ return true;
- case DW_FORM_ref_addr:
- {
- assert (m_cu); // CU must be valid for DW_FORM_ref_addr objects or we will get this wrong
- if (m_cu->GetVersion() <= 2)
- s.Address(uvalue, sizeof (uint64_t) * 2);
- else
- s.Address(uvalue, 4 * 2);// 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet
- break;
- }
- case DW_FORM_ref1: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%2.2x", (uint8_t)uvalue); break;
- case DW_FORM_ref2: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%4.4x", (uint16_t)uvalue); break;
- case DW_FORM_ref4: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%4.4x", (uint32_t)uvalue); break;
- case DW_FORM_ref8: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%8.8" PRIx64, uvalue); break;
- case DW_FORM_ref_udata: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%" PRIx64, uvalue); break;
-
- // All DW_FORM_indirect attributes should be resolved prior to calling this function
- case DW_FORM_indirect: s.PutCString("DW_FORM_indirect"); break;
- case DW_FORM_flag_present: break;
- default:
- s.Printf("DW_FORM(0x%4.4x)", m_form);
- break;
- }
+ // Compile unit address sized values
+ case DW_FORM_addr:
+ *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu);
+ return true;
- if (cu_relative_offset)
- {
- assert (m_cu); // CU must be valid for DW_FORM_ref forms that are compile unit relative or we will get this wrong
- if (verbose)
- s.PutCString(" => ");
+ case DW_FORM_ref_addr:
+ ref_addr_size = 4;
+ assert(cu); // CU must be valid for DW_FORM_ref_addr objects or we will get
+ // this wrong
+ if (cu->GetVersion() <= 2)
+ ref_addr_size = cu->GetAddressByteSize();
+ else
+ ref_addr_size = cu->IsDWARF64() ? 8 : 4;
+ *offset_ptr += ref_addr_size;
+ return true;
- s.Printf("{0x%8.8" PRIx64 "}", uvalue + m_cu->GetOffset());
- }
-}
+ // 0 bytes values (implied from DW_FORM)
+ case DW_FORM_flag_present:
+ return true;
-const char*
-DWARFFormValue::AsCString() const
-{
- SymbolFileDWARF* symbol_file = m_cu->GetSymbolFileDWARF();
+ // 1 byte values
+ case DW_FORM_data1:
+ case DW_FORM_flag:
+ case DW_FORM_ref1:
+ *offset_ptr += 1;
+ return true;
- if (m_form == DW_FORM_string)
- {
- return m_value.value.cstr;
- }
- else if (m_form == DW_FORM_strp)
- {
- if (!symbol_file)
- return nullptr;
+ // 2 byte values
+ case DW_FORM_data2:
+ case DW_FORM_ref2:
+ *offset_ptr += 2;
+ return true;
- return symbol_file->get_debug_str_data().PeekCStr(m_value.value.uval);
- }
- else if (m_form == DW_FORM_GNU_str_index)
- {
- if (!symbol_file)
- return nullptr;
-
- uint32_t index_size = m_cu->IsDWARF64() ? 8 : 4;
- lldb::offset_t offset = m_value.value.uval * index_size;
- dw_offset_t str_offset = symbol_file->get_debug_str_offsets_data().GetMaxU64(&offset, index_size);
- return symbol_file->get_debug_str_data().PeekCStr(str_offset);
- }
- return nullptr;
-}
+ // 32 bit for DWARF 32, 64 for DWARF 64
+ case DW_FORM_sec_offset:
+ case DW_FORM_strp:
+ assert(cu);
+ *offset_ptr += (cu->IsDWARF64() ? 8 : 4);
+ return true;
-dw_addr_t
-DWARFFormValue::Address() const
-{
- SymbolFileDWARF* symbol_file = m_cu->GetSymbolFileDWARF();
+ // 4 byte values
+ case DW_FORM_data4:
+ case DW_FORM_ref4:
+ *offset_ptr += 4;
+ return true;
- if (m_form == DW_FORM_addr)
- return Unsigned();
+ // 8 byte values
+ case DW_FORM_data8:
+ case DW_FORM_ref8:
+ case DW_FORM_ref_sig8:
+ *offset_ptr += 8;
+ return true;
- assert(m_cu);
- assert(m_form == DW_FORM_GNU_addr_index);
+ // signed or unsigned LEB 128 values
+ case DW_FORM_sdata:
+ case DW_FORM_udata:
+ case DW_FORM_ref_udata:
+ case DW_FORM_GNU_addr_index:
+ case DW_FORM_GNU_str_index:
+ debug_info_data.Skip_LEB128(offset_ptr);
+ return true;
- if (!symbol_file)
- return 0;
+ case DW_FORM_indirect: {
+ dw_form_t indirect_form = debug_info_data.GetULEB128(offset_ptr);
+ return DWARFFormValue::SkipValue(indirect_form, debug_info_data, offset_ptr,
+ cu);
+ }
- uint32_t index_size = m_cu->GetAddressByteSize();
- dw_offset_t addr_base = m_cu->GetAddrBase();
- lldb::offset_t offset = addr_base + m_value.value.uval * index_size;
- return symbol_file->get_debug_addr_data().GetMaxU64(&offset, index_size);
+ default:
+ break;
+ }
+ return false;
}
-uint64_t
-DWARFFormValue::Reference() const
-{
- uint64_t die_offset = m_value.value.uval;
- switch (m_form)
- {
- case DW_FORM_ref1:
- case DW_FORM_ref2:
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- assert (m_cu); // CU must be valid for DW_FORM_ref forms that are compile unit relative or we will get this wrong
- die_offset += m_cu->GetOffset();
+void DWARFFormValue::Dump(Stream &s) const {
+ uint64_t uvalue = Unsigned();
+ bool cu_relative_offset = false;
+
+ bool verbose = s.GetVerbose();
+
+ switch (m_form) {
+ case DW_FORM_addr:
+ s.Address(uvalue, sizeof(uint64_t));
+ break;
+ case DW_FORM_flag:
+ case DW_FORM_data1:
+ s.PutHex8(uvalue);
+ break;
+ case DW_FORM_data2:
+ s.PutHex16(uvalue);
+ break;
+ case DW_FORM_sec_offset:
+ 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());
+ break;
+ case DW_FORM_exprloc:
+ case DW_FORM_block:
+ case DW_FORM_block1:
+ case DW_FORM_block2:
+ case DW_FORM_block4:
+ if (uvalue > 0) {
+ switch (m_form) {
+ case DW_FORM_exprloc:
+ case DW_FORM_block:
+ s.Printf("<0x%" PRIx64 "> ", uvalue);
break;
-
- default:
+ case DW_FORM_block1:
+ s.Printf("<0x%2.2x> ", (uint8_t)uvalue);
+ break;
+ case DW_FORM_block2:
+ s.Printf("<0x%4.4x> ", (uint16_t)uvalue);
+ break;
+ case DW_FORM_block4:
+ s.Printf("<0x%8.8x> ", (uint32_t)uvalue);
break;
+ default:
+ break;
+ }
+
+ const uint8_t *data_ptr = m_value.data;
+ if (data_ptr) {
+ const uint8_t *end_data_ptr =
+ data_ptr + uvalue; // uvalue contains size of block
+ while (data_ptr < end_data_ptr) {
+ s.Printf("%2.2x ", *data_ptr);
+ ++data_ptr;
+ }
+ } else
+ s.PutCString("NULL");
}
-
- return die_offset;
-}
-
-uint64_t
-DWARFFormValue::Reference (dw_offset_t base_offset) const
-{
- uint64_t die_offset = m_value.value.uval;
- switch (m_form)
- {
- case DW_FORM_ref1:
- case DW_FORM_ref2:
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- die_offset += base_offset;
- break;
-
- default:
- break;
+ break;
+
+ case DW_FORM_sdata:
+ s.PutSLEB128(uvalue);
+ break;
+ case DW_FORM_udata:
+ s.PutULEB128(uvalue);
+ break;
+ case DW_FORM_strp: {
+ 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);
}
-
- return die_offset;
+ } break;
+
+ case DW_FORM_ref_addr: {
+ assert(m_cu); // CU must be valid for DW_FORM_ref_addr objects or we will
+ // get this wrong
+ if (m_cu->GetVersion() <= 2)
+ s.Address(uvalue, sizeof(uint64_t) * 2);
+ else
+ s.Address(uvalue, 4 * 2); // 4 for DWARF32, 8 for DWARF64, but we don't
+ // support DWARF64 yet
+ break;
+ }
+ case DW_FORM_ref1:
+ cu_relative_offset = true;
+ if (verbose)
+ s.Printf("cu + 0x%2.2x", (uint8_t)uvalue);
+ break;
+ case DW_FORM_ref2:
+ cu_relative_offset = true;
+ if (verbose)
+ s.Printf("cu + 0x%4.4x", (uint16_t)uvalue);
+ break;
+ case DW_FORM_ref4:
+ cu_relative_offset = true;
+ if (verbose)
+ s.Printf("cu + 0x%4.4x", (uint32_t)uvalue);
+ break;
+ case DW_FORM_ref8:
+ cu_relative_offset = true;
+ if (verbose)
+ s.Printf("cu + 0x%8.8" PRIx64, uvalue);
+ break;
+ case DW_FORM_ref_udata:
+ cu_relative_offset = true;
+ if (verbose)
+ s.Printf("cu + 0x%" PRIx64, uvalue);
+ break;
+
+ // All DW_FORM_indirect attributes should be resolved prior to calling this
+ // function
+ case DW_FORM_indirect:
+ s.PutCString("DW_FORM_indirect");
+ break;
+ case DW_FORM_flag_present:
+ break;
+ default:
+ s.Printf("DW_FORM(0x%4.4x)", m_form);
+ break;
+ }
+
+ if (cu_relative_offset) {
+ assert(m_cu); // CU must be valid for DW_FORM_ref forms that are compile
+ // unit relative or we will get this wrong
+ if (verbose)
+ s.PutCString(" => ");
+
+ s.Printf("{0x%8.8" PRIx64 "}", uvalue + m_cu->GetOffset());
+ }
}
+const char *DWARFFormValue::AsCString() const {
+ SymbolFileDWARF *symbol_file = m_cu->GetSymbolFileDWARF();
-const uint8_t*
-DWARFFormValue::BlockData() const
-{
- return m_value.data;
+ if (m_form == DW_FORM_string) {
+ return m_value.value.cstr;
+ } else if (m_form == DW_FORM_strp) {
+ if (!symbol_file)
+ return nullptr;
+
+ return symbol_file->get_debug_str_data().PeekCStr(m_value.value.uval);
+ } else if (m_form == DW_FORM_GNU_str_index) {
+ if (!symbol_file)
+ return nullptr;
+
+ uint32_t index_size = m_cu->IsDWARF64() ? 8 : 4;
+ lldb::offset_t offset = m_value.value.uval * index_size;
+ dw_offset_t str_offset =
+ symbol_file->get_debug_str_offsets_data().GetMaxU64(&offset,
+ index_size);
+ return symbol_file->get_debug_str_data().PeekCStr(str_offset);
+ }
+ return nullptr;
}
+dw_addr_t DWARFFormValue::Address() const {
+ SymbolFileDWARF *symbol_file = m_cu->GetSymbolFileDWARF();
-bool
-DWARFFormValue::IsBlockForm(const dw_form_t form)
-{
- switch (form)
- {
- case DW_FORM_exprloc:
- case DW_FORM_block:
- case DW_FORM_block1:
- case DW_FORM_block2:
- case DW_FORM_block4:
- return true;
- }
- return false;
-}
+ if (m_form == DW_FORM_addr)
+ return Unsigned();
-bool
-DWARFFormValue::IsDataForm(const dw_form_t form)
-{
- switch (form)
- {
- case DW_FORM_sdata:
- case DW_FORM_udata:
- case DW_FORM_data1:
- case DW_FORM_data2:
- case DW_FORM_data4:
- case DW_FORM_data8:
- return true;
- }
- return false;
-}
+ assert(m_cu);
+ assert(m_form == DW_FORM_GNU_addr_index);
-int
-DWARFFormValue::Compare (const DWARFFormValue& a_value,
- const DWARFFormValue& b_value)
-{
- dw_form_t a_form = a_value.Form();
- dw_form_t b_form = b_value.Form();
- if (a_form < b_form)
- return -1;
- if (a_form > b_form)
- return 1;
- switch (a_form)
- {
- case DW_FORM_addr:
- case DW_FORM_flag:
- case DW_FORM_data1:
- case DW_FORM_data2:
- case DW_FORM_data4:
- case DW_FORM_data8:
- case DW_FORM_udata:
- case DW_FORM_ref_addr:
- case DW_FORM_sec_offset:
- case DW_FORM_flag_present:
- case DW_FORM_ref_sig8:
- case DW_FORM_GNU_addr_index:
- {
- uint64_t a = a_value.Unsigned();
- uint64_t b = b_value.Unsigned();
- if (a < b)
- return -1;
- if (a > b)
- return 1;
- return 0;
- }
+ if (!symbol_file)
+ return 0;
- case DW_FORM_sdata:
- {
- int64_t a = a_value.Signed();
- int64_t b = b_value.Signed();
- if (a < b)
- return -1;
- if (a > b)
- return 1;
- return 0;
- }
+ uint32_t index_size = m_cu->GetAddressByteSize();
+ dw_offset_t addr_base = m_cu->GetAddrBase();
+ lldb::offset_t offset = addr_base + m_value.value.uval * index_size;
+ return symbol_file->get_debug_addr_data().GetMaxU64(&offset, index_size);
+}
- case DW_FORM_string:
- case DW_FORM_strp:
- case DW_FORM_GNU_str_index:
- {
- 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)
- return strcmp(a_string, b_string);
- else if (a_string == NULL)
- return -1; // A string is NULL, and B is valid
- else
- return 1; // A string valid, and B is NULL
- }
+uint64_t DWARFFormValue::Reference() const {
+ uint64_t die_offset = m_value.value.uval;
+ switch (m_form) {
+ case DW_FORM_ref1:
+ case DW_FORM_ref2:
+ case DW_FORM_ref4:
+ case DW_FORM_ref8:
+ case DW_FORM_ref_udata:
+ assert(m_cu); // CU must be valid for DW_FORM_ref forms that are compile
+ // unit relative or we will get this wrong
+ die_offset += m_cu->GetOffset();
+ break;
+
+ default:
+ break;
+ }
+
+ return die_offset;
+}
+uint64_t DWARFFormValue::Reference(dw_offset_t base_offset) const {
+ uint64_t die_offset = m_value.value.uval;
+ switch (m_form) {
+ case DW_FORM_ref1:
+ case DW_FORM_ref2:
+ case DW_FORM_ref4:
+ case DW_FORM_ref8:
+ case DW_FORM_ref_udata:
+ die_offset += base_offset;
+ break;
+
+ default:
+ break;
+ }
+
+ return die_offset;
+}
- case DW_FORM_block:
- case DW_FORM_block1:
- case DW_FORM_block2:
- case DW_FORM_block4:
- case DW_FORM_exprloc:
- {
- uint64_t a_len = a_value.Unsigned();
- uint64_t b_len = b_value.Unsigned();
- if (a_len < b_len)
- return -1;
- if (a_len > b_len)
- return 1;
- // The block lengths are the same
- return memcmp(a_value.BlockData(), b_value.BlockData(), a_value.Unsigned());
- }
- break;
+const uint8_t *DWARFFormValue::BlockData() const { return m_value.data; }
- case DW_FORM_ref1:
- case DW_FORM_ref2:
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- {
- uint64_t a = a_value.Reference();
- uint64_t b = b_value.Reference();
- if (a < b)
- return -1;
- if (a > b)
- return 1;
- return 0;
- }
+bool DWARFFormValue::IsBlockForm(const dw_form_t form) {
+ switch (form) {
+ case DW_FORM_exprloc:
+ case DW_FORM_block:
+ case DW_FORM_block1:
+ case DW_FORM_block2:
+ case DW_FORM_block4:
+ return true;
+ }
+ return false;
+}
- case DW_FORM_indirect:
- assert(!"This shouldn't happen after the form has been extracted...");
- break;
+bool DWARFFormValue::IsDataForm(const dw_form_t form) {
+ switch (form) {
+ case DW_FORM_sdata:
+ case DW_FORM_udata:
+ case DW_FORM_data1:
+ case DW_FORM_data2:
+ case DW_FORM_data4:
+ case DW_FORM_data8:
+ return true;
+ }
+ return false;
+}
- default:
- assert(!"Unhandled DW_FORM");
- break;
- }
+int DWARFFormValue::Compare(const DWARFFormValue &a_value,
+ const DWARFFormValue &b_value) {
+ dw_form_t a_form = a_value.Form();
+ dw_form_t b_form = b_value.Form();
+ if (a_form < b_form)
return -1;
+ if (a_form > b_form)
+ return 1;
+ switch (a_form) {
+ case DW_FORM_addr:
+ case DW_FORM_flag:
+ case DW_FORM_data1:
+ case DW_FORM_data2:
+ case DW_FORM_data4:
+ case DW_FORM_data8:
+ case DW_FORM_udata:
+ case DW_FORM_ref_addr:
+ case DW_FORM_sec_offset:
+ case DW_FORM_flag_present:
+ case DW_FORM_ref_sig8:
+ case DW_FORM_GNU_addr_index: {
+ uint64_t a = a_value.Unsigned();
+ uint64_t b = b_value.Unsigned();
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+ }
+
+ case DW_FORM_sdata: {
+ int64_t a = a_value.Signed();
+ int64_t b = b_value.Signed();
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+ }
+
+ case DW_FORM_string:
+ case DW_FORM_strp:
+ case DW_FORM_GNU_str_index: {
+ 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)
+ return strcmp(a_string, b_string);
+ else if (a_string == NULL)
+ return -1; // A string is NULL, and B is valid
+ else
+ return 1; // A string valid, and B is NULL
+ }
+
+ case DW_FORM_block:
+ case DW_FORM_block1:
+ case DW_FORM_block2:
+ case DW_FORM_block4:
+ case DW_FORM_exprloc: {
+ uint64_t a_len = a_value.Unsigned();
+ uint64_t b_len = b_value.Unsigned();
+ if (a_len < b_len)
+ return -1;
+ if (a_len > b_len)
+ return 1;
+ // The block lengths are the same
+ return memcmp(a_value.BlockData(), b_value.BlockData(), a_value.Unsigned());
+ } break;
+
+ case DW_FORM_ref1:
+ case DW_FORM_ref2:
+ case DW_FORM_ref4:
+ case DW_FORM_ref8:
+ case DW_FORM_ref_udata: {
+ uint64_t a = a_value.Reference();
+ uint64_t b = b_value.Reference();
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+ }
+
+ case DW_FORM_indirect:
+ assert(!"This shouldn't happen after the form has been extracted...");
+ break;
+
+ default:
+ assert(!"Unhandled DW_FORM");
+ break;
+ }
+ return -1;
}
-
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
index 07bd038d948..8d6af3d65b3 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h
@@ -10,103 +10,87 @@
#ifndef SymbolFileDWARF_DWARFFormValue_h_
#define SymbolFileDWARF_DWARFFormValue_h_
-#include <stddef.h> // for NULL
#include "DWARFDataExtractor.h"
+#include <stddef.h> // for NULL
class DWARFCompileUnit;
-class DWARFFormValue
-{
+class DWARFFormValue {
public:
- typedef struct ValueTypeTag
- {
- ValueTypeTag() :
- value(),
- data(NULL)
- {
- value.uval = 0;
- }
+ typedef struct ValueTypeTag {
+ ValueTypeTag() : value(), data(NULL) { value.uval = 0; }
+
+ union {
+ uint64_t uval;
+ int64_t sval;
+ const char *cstr;
+ } value;
+ const uint8_t *data;
+ } ValueType;
- union
- {
- uint64_t uval;
- int64_t sval;
- const char* cstr;
- } value;
- const uint8_t* data;
- } ValueType;
-
- class FixedFormSizes
- {
- public:
- FixedFormSizes() :
- m_fix_sizes(nullptr), m_size(0)
- {}
+ class FixedFormSizes {
+ public:
+ FixedFormSizes() : m_fix_sizes(nullptr), m_size(0) {}
- FixedFormSizes(const uint8_t* fix_sizes, size_t size) :
- m_fix_sizes(fix_sizes), m_size(size)
- {}
+ FixedFormSizes(const uint8_t *fix_sizes, size_t size)
+ : m_fix_sizes(fix_sizes), m_size(size) {}
- uint8_t
- GetSize(uint32_t index) const
- {
- return index < m_size ? m_fix_sizes[index] : 0;
- }
+ uint8_t GetSize(uint32_t index) const {
+ return index < m_size ? m_fix_sizes[index] : 0;
+ }
- bool
- Empty() const
- {
- return m_size == 0;
- }
+ bool Empty() const { return m_size == 0; }
- private:
- const uint8_t* m_fix_sizes;
- size_t m_size;
- };
+ private:
+ const uint8_t *m_fix_sizes;
+ size_t m_size;
+ };
- enum
- {
- eValueTypeInvalid = 0,
- eValueTypeUnsigned,
- eValueTypeSigned,
- eValueTypeCStr,
- eValueTypeBlock
- };
+ enum {
+ eValueTypeInvalid = 0,
+ eValueTypeUnsigned,
+ eValueTypeSigned,
+ eValueTypeCStr,
+ eValueTypeBlock
+ };
+
+ DWARFFormValue();
+ DWARFFormValue(const DWARFCompileUnit *cu, dw_form_t form);
+ const DWARFCompileUnit *GetCompileUnit() const { return m_cu; }
+ void SetCompileUnit(const DWARFCompileUnit *cu) { m_cu = cu; }
+ 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) const;
+ bool ExtractValue(const lldb_private::DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr);
+ const uint8_t *BlockData() const;
+ uint64_t Reference() const;
+ uint64_t Reference(dw_offset_t offset) const;
+ bool Boolean() const { return m_value.value.uval != 0; }
+ uint64_t Unsigned() const { return m_value.value.uval; }
+ 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() const;
+ dw_addr_t Address() const;
+ bool IsValid() const { return m_form != 0; }
+ bool SkipValue(const lldb_private::DWARFDataExtractor &debug_info_data,
+ lldb::offset_t *offset_ptr) const;
+ static bool SkipValue(const dw_form_t form,
+ const lldb_private::DWARFDataExtractor &debug_info_data,
+ lldb::offset_t *offset_ptr, const DWARFCompileUnit *cu);
+ static bool IsBlockForm(const dw_form_t form);
+ 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);
+ void Clear();
- DWARFFormValue();
- DWARFFormValue(const DWARFCompileUnit* cu, dw_form_t form);
- const DWARFCompileUnit* GetCompileUnit () const { return m_cu; }
- void SetCompileUnit (const DWARFCompileUnit* cu) { m_cu = cu; }
- 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) const;
- bool ExtractValue(const lldb_private::DWARFDataExtractor& data,
- lldb::offset_t* offset_ptr);
- const uint8_t* BlockData() const;
- uint64_t Reference() const;
- uint64_t Reference (dw_offset_t offset) const;
- bool Boolean() const { return m_value.value.uval != 0; }
- uint64_t Unsigned() const { return m_value.value.uval; }
- 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() const;
- dw_addr_t Address() const;
- bool IsValid() const { return m_form != 0; }
- bool SkipValue(const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr) const;
- static bool SkipValue(const dw_form_t form, const lldb_private::DWARFDataExtractor& debug_info_data, lldb::offset_t *offset_ptr, const DWARFCompileUnit* cu);
- static bool IsBlockForm(const dw_form_t form);
- 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);
- void Clear();
protected:
- const DWARFCompileUnit* m_cu; // Compile unit for this form
- dw_form_t m_form; // Form for this value
- ValueType m_value; // Contains all data for the form
+ const DWARFCompileUnit *m_cu; // Compile unit for this form
+ dw_form_t m_form; // Form for this value
+ ValueType m_value; // Contains all data for the form
};
-
-#endif // SymbolFileDWARF_DWARFFormValue_h_
+#endif // SymbolFileDWARF_DWARFFormValue_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp
index 12e1e89c36b..16c0b907a18 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.cpp
@@ -9,746 +9,635 @@
#include "HashedNameToDIE.h"
-void
-DWARFMappedHash::ExtractDIEArray (const DIEInfoArray &die_info_array, DIEArray &die_offsets)
-{
+void DWARFMappedHash::ExtractDIEArray(const DIEInfoArray &die_info_array,
+ DIEArray &die_offsets) {
+ const size_t count = die_info_array.size();
+ for (size_t i = 0; i < count; ++i)
+ die_offsets.emplace_back(die_info_array[i].cu_offset,
+ die_info_array[i].offset);
+}
+
+void DWARFMappedHash::ExtractDIEArray(const DIEInfoArray &die_info_array,
+ const dw_tag_t tag,
+ DIEArray &die_offsets) {
+ if (tag == 0) {
+ ExtractDIEArray(die_info_array, die_offsets);
+ } else {
const size_t count = die_info_array.size();
- for (size_t i=0; i<count; ++i)
- die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
-}
-
-void
-DWARFMappedHash::ExtractDIEArray (const DIEInfoArray &die_info_array,
- const dw_tag_t tag,
- DIEArray &die_offsets)
-{
- if (tag == 0)
- {
- ExtractDIEArray (die_info_array, die_offsets);
- }
- else
- {
- const size_t count = die_info_array.size();
- for (size_t i=0; i<count; ++i)
- {
- const dw_tag_t die_tag = die_info_array[i].tag;
- bool tag_matches = die_tag == 0 || tag == die_tag;
- if (!tag_matches)
- {
- if (die_tag == DW_TAG_class_type || die_tag == DW_TAG_structure_type)
- tag_matches = tag == DW_TAG_structure_type || tag == DW_TAG_class_type;
- }
- if (tag_matches)
- die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
- }
+ for (size_t i = 0; i < count; ++i) {
+ const dw_tag_t die_tag = die_info_array[i].tag;
+ bool tag_matches = die_tag == 0 || tag == die_tag;
+ if (!tag_matches) {
+ if (die_tag == DW_TAG_class_type || die_tag == DW_TAG_structure_type)
+ tag_matches =
+ tag == DW_TAG_structure_type || tag == DW_TAG_class_type;
+ }
+ if (tag_matches)
+ die_offsets.emplace_back(die_info_array[i].cu_offset,
+ die_info_array[i].offset);
}
+ }
}
-void
-DWARFMappedHash::ExtractDIEArray (const DIEInfoArray &die_info_array,
- const dw_tag_t tag,
- const uint32_t qualified_name_hash,
- DIEArray &die_offsets)
-{
- if (tag == 0)
- {
- ExtractDIEArray (die_info_array, die_offsets);
- }
- else
- {
- const size_t count = die_info_array.size();
- for (size_t i=0; i<count; ++i)
- {
- if (qualified_name_hash != die_info_array[i].qualified_name_hash)
- continue;
- const dw_tag_t die_tag = die_info_array[i].tag;
- bool tag_matches = die_tag == 0 || tag == die_tag;
- if (!tag_matches)
- {
- if (die_tag == DW_TAG_class_type || die_tag == DW_TAG_structure_type)
- tag_matches = tag == DW_TAG_structure_type || tag == DW_TAG_class_type;
- }
- if (tag_matches)
- die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
- }
- }
-}
-
-void
-DWARFMappedHash::ExtractClassOrStructDIEArray (const DIEInfoArray &die_info_array,
- bool return_implementation_only_if_available,
- DIEArray &die_offsets)
-{
+void DWARFMappedHash::ExtractDIEArray(const DIEInfoArray &die_info_array,
+ const dw_tag_t tag,
+ const uint32_t qualified_name_hash,
+ DIEArray &die_offsets) {
+ if (tag == 0) {
+ ExtractDIEArray(die_info_array, die_offsets);
+ } else {
const size_t count = die_info_array.size();
- for (size_t i=0; i<count; ++i)
- {
- const dw_tag_t die_tag = die_info_array[i].tag;
- if (die_tag == 0 || die_tag == DW_TAG_class_type || die_tag == DW_TAG_structure_type)
- {
- if (die_info_array[i].type_flags & eTypeFlagClassIsImplementation)
- {
- if (return_implementation_only_if_available)
- {
- // We found the one true definition for this class, so
- // only return that
- die_offsets.clear();
- die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
- return;
- }
- else
- {
- // Put the one true definition as the first entry so it
- // matches first
- die_offsets.emplace(die_offsets.begin(), die_info_array[i].cu_offset, die_info_array[i].offset);
- }
- }
- else
- {
- die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
- }
- }
+ for (size_t i = 0; i < count; ++i) {
+ if (qualified_name_hash != die_info_array[i].qualified_name_hash)
+ continue;
+ const dw_tag_t die_tag = die_info_array[i].tag;
+ bool tag_matches = die_tag == 0 || tag == die_tag;
+ if (!tag_matches) {
+ if (die_tag == DW_TAG_class_type || die_tag == DW_TAG_structure_type)
+ tag_matches =
+ tag == DW_TAG_structure_type || tag == DW_TAG_class_type;
+ }
+ if (tag_matches)
+ die_offsets.emplace_back(die_info_array[i].cu_offset,
+ die_info_array[i].offset);
}
-}
-
-void
-DWARFMappedHash::ExtractTypesFromDIEArray (const DIEInfoArray &die_info_array,
- uint32_t type_flag_mask,
- uint32_t type_flag_value,
- DIEArray &die_offsets)
-{
- const size_t count = die_info_array.size();
- for (size_t i=0; i<count; ++i)
- {
- if ((die_info_array[i].type_flags & type_flag_mask) == type_flag_value)
- die_offsets.emplace_back(die_info_array[i].cu_offset, die_info_array[i].offset);
+ }
+}
+
+void DWARFMappedHash::ExtractClassOrStructDIEArray(
+ const DIEInfoArray &die_info_array,
+ bool return_implementation_only_if_available, DIEArray &die_offsets) {
+ const size_t count = die_info_array.size();
+ for (size_t i = 0; i < count; ++i) {
+ const dw_tag_t die_tag = die_info_array[i].tag;
+ if (die_tag == 0 || die_tag == DW_TAG_class_type ||
+ die_tag == DW_TAG_structure_type) {
+ if (die_info_array[i].type_flags & eTypeFlagClassIsImplementation) {
+ if (return_implementation_only_if_available) {
+ // We found the one true definition for this class, so
+ // only return that
+ die_offsets.clear();
+ die_offsets.emplace_back(die_info_array[i].cu_offset,
+ die_info_array[i].offset);
+ return;
+ } else {
+ // Put the one true definition as the first entry so it
+ // matches first
+ die_offsets.emplace(die_offsets.begin(), die_info_array[i].cu_offset,
+ die_info_array[i].offset);
+ }
+ } else {
+ die_offsets.emplace_back(die_info_array[i].cu_offset,
+ die_info_array[i].offset);
+ }
}
+ }
+}
+
+void DWARFMappedHash::ExtractTypesFromDIEArray(
+ const DIEInfoArray &die_info_array, uint32_t type_flag_mask,
+ uint32_t type_flag_value, DIEArray &die_offsets) {
+ const size_t count = die_info_array.size();
+ for (size_t i = 0; i < count; ++i) {
+ if ((die_info_array[i].type_flags & type_flag_mask) == type_flag_value)
+ die_offsets.emplace_back(die_info_array[i].cu_offset,
+ die_info_array[i].offset);
+ }
+}
+
+const char *DWARFMappedHash::GetAtomTypeName(uint16_t atom) {
+ switch (atom) {
+ case eAtomTypeNULL:
+ return "NULL";
+ case eAtomTypeDIEOffset:
+ return "die-offset";
+ case eAtomTypeCUOffset:
+ return "cu-offset";
+ case eAtomTypeTag:
+ return "die-tag";
+ case eAtomTypeNameFlags:
+ return "name-flags";
+ case eAtomTypeTypeFlags:
+ return "type-flags";
+ case eAtomTypeQualNameHash:
+ return "qualified-name-hash";
+ }
+ return "<invalid>";
+}
+
+DWARFMappedHash::DIEInfo::DIEInfo()
+ : cu_offset(DW_INVALID_OFFSET), offset(DW_INVALID_OFFSET), tag(0),
+ type_flags(0), qualified_name_hash(0) {}
+
+DWARFMappedHash::DIEInfo::DIEInfo(dw_offset_t c, dw_offset_t o, dw_tag_t t,
+ uint32_t f, uint32_t h)
+ : cu_offset(c), offset(o), tag(t), type_flags(f), qualified_name_hash(h) {}
+
+DWARFMappedHash::Prologue::Prologue(dw_offset_t _die_base_offset)
+ : die_base_offset(_die_base_offset), atoms(), atom_mask(0),
+ min_hash_data_byte_size(0), hash_data_has_fixed_byte_size(true) {
+ // Define an array of DIE offsets by first defining an array,
+ // and then define the atom type for the array, in this case
+ // we have an array of DIE offsets
+ AppendAtom(eAtomTypeDIEOffset, DW_FORM_data4);
+}
+
+void DWARFMappedHash::Prologue::ClearAtoms() {
+ hash_data_has_fixed_byte_size = true;
+ min_hash_data_byte_size = 0;
+ atom_mask = 0;
+ atoms.clear();
+}
+
+bool DWARFMappedHash::Prologue::ContainsAtom(AtomType atom_type) const {
+ return (atom_mask & (1u << atom_type)) != 0;
+}
+
+void DWARFMappedHash::Prologue::Clear() {
+ die_base_offset = 0;
+ ClearAtoms();
+}
+
+void DWARFMappedHash::Prologue::AppendAtom(AtomType type, dw_form_t form) {
+ atoms.push_back({type, form});
+ atom_mask |= 1u << type;
+ switch (form) {
+ case DW_FORM_indirect:
+ case DW_FORM_exprloc:
+ case DW_FORM_flag_present:
+ case DW_FORM_ref_sig8:
+ assert(!"Unhandled atom form");
+ break;
+
+ case DW_FORM_string:
+ case DW_FORM_block:
+ case DW_FORM_block1:
+ case DW_FORM_sdata:
+ case DW_FORM_udata:
+ case DW_FORM_ref_udata:
+ case DW_FORM_GNU_addr_index:
+ case DW_FORM_GNU_str_index:
+ hash_data_has_fixed_byte_size = false;
+ LLVM_FALLTHROUGH;
+ case DW_FORM_flag:
+ case DW_FORM_data1:
+ case DW_FORM_ref1:
+ case DW_FORM_sec_offset:
+ min_hash_data_byte_size += 1;
+ break;
+
+ case DW_FORM_block2:
+ hash_data_has_fixed_byte_size = false;
+ LLVM_FALLTHROUGH;
+ case DW_FORM_data2:
+ case DW_FORM_ref2:
+ min_hash_data_byte_size += 2;
+ break;
+
+ case DW_FORM_block4:
+ hash_data_has_fixed_byte_size = false;
+ LLVM_FALLTHROUGH;
+ case DW_FORM_data4:
+ case DW_FORM_ref4:
+ case DW_FORM_addr:
+ case DW_FORM_ref_addr:
+ case DW_FORM_strp:
+ min_hash_data_byte_size += 4;
+ break;
+
+ case DW_FORM_data8:
+ case DW_FORM_ref8:
+ min_hash_data_byte_size += 8;
+ break;
+ }
}
-const char *
-DWARFMappedHash::GetAtomTypeName (uint16_t atom)
-{
- switch (atom)
- {
- case eAtomTypeNULL: return "NULL";
- case eAtomTypeDIEOffset: return "die-offset";
- case eAtomTypeCUOffset: return "cu-offset";
- case eAtomTypeTag: return "die-tag";
- case eAtomTypeNameFlags: return "name-flags";
- case eAtomTypeTypeFlags: return "type-flags";
- case eAtomTypeQualNameHash: return "qualified-name-hash";
+lldb::offset_t
+DWARFMappedHash::Prologue::Read(const lldb_private::DataExtractor &data,
+ lldb::offset_t offset) {
+ ClearAtoms();
+
+ die_base_offset = data.GetU32(&offset);
+
+ const uint32_t atom_count = data.GetU32(&offset);
+ if (atom_count == 0x00060003u) {
+ // Old format, deal with contents of old pre-release format
+ while (data.GetU32(&offset))
+ /* do nothing */;
+
+ // Hardcode to the only known value for now.
+ AppendAtom(eAtomTypeDIEOffset, DW_FORM_data4);
+ } else {
+ for (uint32_t i = 0; i < atom_count; ++i) {
+ AtomType type = (AtomType)data.GetU16(&offset);
+ dw_form_t form = (dw_form_t)data.GetU16(&offset);
+ AppendAtom(type, form);
}
- return "<invalid>";
+ }
+ return offset;
}
-DWARFMappedHash::DIEInfo::DIEInfo () :
- cu_offset (DW_INVALID_OFFSET),
- offset (DW_INVALID_OFFSET),
- tag (0),
- type_flags (0),
- qualified_name_hash (0)
-{
+size_t DWARFMappedHash::Prologue::GetByteSize() const {
+ // Add an extra count to the atoms size for the zero termination Atom that
+ // gets
+ // written to disk
+ return sizeof(die_base_offset) + sizeof(uint32_t) +
+ atoms.size() * sizeof(Atom);
}
-DWARFMappedHash::DIEInfo::DIEInfo (dw_offset_t c,
- dw_offset_t o,
- dw_tag_t t,
- uint32_t f,
- uint32_t h) :
- cu_offset (c),
- offset (o),
- tag (t),
- type_flags (f),
- qualified_name_hash (h)
-{
+size_t DWARFMappedHash::Prologue::GetMinimumHashDataByteSize() const {
+ return min_hash_data_byte_size;
}
-DWARFMappedHash::Prologue::Prologue (dw_offset_t _die_base_offset) :
- die_base_offset (_die_base_offset),
- atoms(),
- atom_mask (0),
- min_hash_data_byte_size(0),
- hash_data_has_fixed_byte_size(true)
-{
- // Define an array of DIE offsets by first defining an array,
- // and then define the atom type for the array, in this case
- // we have an array of DIE offsets
- AppendAtom (eAtomTypeDIEOffset, DW_FORM_data4);
+bool DWARFMappedHash::Prologue::HashDataHasFixedByteSize() const {
+ return hash_data_has_fixed_byte_size;
}
-void
-DWARFMappedHash::Prologue::ClearAtoms ()
-{
- hash_data_has_fixed_byte_size = true;
- min_hash_data_byte_size = 0;
- atom_mask = 0;
- atoms.clear();
+size_t DWARFMappedHash::Header::GetByteSize(const HeaderData &header_data) {
+ return header_data.GetByteSize();
}
-bool
-DWARFMappedHash::Prologue::ContainsAtom (AtomType atom_type) const
-{
- return (atom_mask & (1u << atom_type)) != 0;
+lldb::offset_t DWARFMappedHash::Header::Read(lldb_private::DataExtractor &data,
+ lldb::offset_t offset) {
+ offset = MappedHash::Header<Prologue>::Read(data, offset);
+ if (offset != UINT32_MAX) {
+ offset = header_data.Read(data, offset);
+ }
+ return offset;
}
-void
-DWARFMappedHash::Prologue::Clear ()
-{
- die_base_offset = 0;
- ClearAtoms ();
-}
+bool DWARFMappedHash::Header::Read(const lldb_private::DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr,
+ DIEInfo &hash_data) const {
+ const size_t num_atoms = header_data.atoms.size();
+ if (num_atoms == 0)
+ return false;
-void
-DWARFMappedHash::Prologue::AppendAtom (AtomType type, dw_form_t form)
-{
- atoms.push_back ({type, form});
- atom_mask |= 1u << type;
- switch (form)
- {
- case DW_FORM_indirect:
- case DW_FORM_exprloc:
- case DW_FORM_flag_present:
- case DW_FORM_ref_sig8:
- assert (!"Unhandled atom form");
- break;
-
- case DW_FORM_string:
- case DW_FORM_block:
- case DW_FORM_block1:
- case DW_FORM_sdata:
- case DW_FORM_udata:
- case DW_FORM_ref_udata:
- case DW_FORM_GNU_addr_index:
- case DW_FORM_GNU_str_index:
- hash_data_has_fixed_byte_size = false;
- LLVM_FALLTHROUGH;
- case DW_FORM_flag:
- case DW_FORM_data1:
- case DW_FORM_ref1:
- case DW_FORM_sec_offset:
- min_hash_data_byte_size += 1;
- break;
-
- case DW_FORM_block2:
- hash_data_has_fixed_byte_size = false;
- LLVM_FALLTHROUGH;
- case DW_FORM_data2:
- case DW_FORM_ref2:
- min_hash_data_byte_size += 2;
- break;
-
- case DW_FORM_block4:
- hash_data_has_fixed_byte_size = false;
- LLVM_FALLTHROUGH;
- case DW_FORM_data4:
- case DW_FORM_ref4:
- case DW_FORM_addr:
- case DW_FORM_ref_addr:
- case DW_FORM_strp:
- min_hash_data_byte_size += 4;
- break;
-
- case DW_FORM_data8:
- case DW_FORM_ref8:
- min_hash_data_byte_size += 8;
- break;
-
- }
-}
+ for (size_t i = 0; i < num_atoms; ++i) {
+ DWARFFormValue form_value(NULL, header_data.atoms[i].form);
-lldb::offset_t
-DWARFMappedHash::Prologue::Read (const lldb_private::DataExtractor &data,
- lldb::offset_t offset)
-{
- ClearAtoms ();
-
- die_base_offset = data.GetU32 (&offset);
-
- const uint32_t atom_count = data.GetU32 (&offset);
- if (atom_count == 0x00060003u)
- {
- // Old format, deal with contents of old pre-release format
- while (data.GetU32(&offset))
- /* do nothing */;
-
- // Hardcode to the only known value for now.
- AppendAtom (eAtomTypeDIEOffset, DW_FORM_data4);
- }
- else
- {
- for (uint32_t i=0; i<atom_count; ++i)
- {
- AtomType type = (AtomType)data.GetU16 (&offset);
- dw_form_t form = (dw_form_t)data.GetU16 (&offset);
- AppendAtom (type, form);
- }
- }
- return offset;
-}
+ if (!form_value.ExtractValue(data, offset_ptr))
+ return false;
-size_t
-DWARFMappedHash::Prologue::GetByteSize () const
-{
- // Add an extra count to the atoms size for the zero termination Atom that gets
- // written to disk
- return sizeof(die_base_offset) + sizeof(uint32_t) + atoms.size() * sizeof(Atom);
-}
+ switch (header_data.atoms[i].type) {
+ case eAtomTypeDIEOffset: // DIE offset, check form for encoding
+ hash_data.offset =
+ (dw_offset_t)form_value.Reference(header_data.die_base_offset);
+ break;
-size_t
-DWARFMappedHash::Prologue::GetMinimumHashDataByteSize () const
-{
- return min_hash_data_byte_size;
-}
+ case eAtomTypeTag: // DW_TAG value for the DIE
+ hash_data.tag = (dw_tag_t)form_value.Unsigned();
+ break;
-bool
-DWARFMappedHash::Prologue::HashDataHasFixedByteSize() const
-{
- return hash_data_has_fixed_byte_size;
-}
+ case eAtomTypeTypeFlags: // Flags from enum TypeFlags
+ hash_data.type_flags = (uint32_t)form_value.Unsigned();
+ break;
-size_t
-DWARFMappedHash::Header::GetByteSize (const HeaderData &header_data)
-{
- return header_data.GetByteSize();
-}
+ case eAtomTypeQualNameHash: // Flags from enum TypeFlags
+ hash_data.qualified_name_hash = form_value.Unsigned();
+ break;
-lldb::offset_t
-DWARFMappedHash::Header::Read (lldb_private::DataExtractor &data, lldb::offset_t offset)
-{
- offset = MappedHash::Header<Prologue>::Read (data, offset);
- if (offset != UINT32_MAX)
- {
- offset = header_data.Read (data, offset);
+ default:
+ // We can always skip atoms we don't know about
+ break;
}
- return offset;
+ }
+ return true;
}
-bool
-DWARFMappedHash::Header::Read (const lldb_private::DWARFDataExtractor &data,
- lldb::offset_t *offset_ptr,
- DIEInfo &hash_data) const
-{
- const size_t num_atoms = header_data.atoms.size();
- if (num_atoms == 0)
- return false;
-
- for (size_t i=0; i<num_atoms; ++i)
- {
- DWARFFormValue form_value (NULL, header_data.atoms[i].form);
-
- if (!form_value.ExtractValue(data, offset_ptr))
- return false;
-
- switch (header_data.atoms[i].type)
- {
- case eAtomTypeDIEOffset: // DIE offset, check form for encoding
- hash_data.offset = (dw_offset_t)form_value.Reference (header_data.die_base_offset);
- break;
-
- case eAtomTypeTag: // DW_TAG value for the DIE
- hash_data.tag = (dw_tag_t)form_value.Unsigned ();
- break;
-
- case eAtomTypeTypeFlags: // Flags from enum TypeFlags
- hash_data.type_flags = (uint32_t)form_value.Unsigned ();
- break;
-
- case eAtomTypeQualNameHash: // Flags from enum TypeFlags
- hash_data.qualified_name_hash = form_value.Unsigned ();
- break;
-
- default:
- // We can always skip atoms we don't know about
- break;
- }
- }
- return true;
-}
+void DWARFMappedHash::Header::Dump(lldb_private::Stream &strm,
+ const DIEInfo &hash_data) const {
+ const size_t num_atoms = header_data.atoms.size();
+ for (size_t i = 0; i < num_atoms; ++i) {
+ if (i > 0)
+ strm.PutCString(", ");
+
+ DWARFFormValue form_value(NULL, header_data.atoms[i].form);
+ switch (header_data.atoms[i].type) {
+ case eAtomTypeDIEOffset: // DIE offset, check form for encoding
+ strm.Printf("{0x%8.8x}", hash_data.offset);
+ break;
-void
-DWARFMappedHash::Header::Dump (lldb_private::Stream& strm, const DIEInfo &hash_data) const
-{
- const size_t num_atoms = header_data.atoms.size();
- for (size_t i=0; i<num_atoms; ++i)
+ case eAtomTypeTag: // DW_TAG value for the DIE
{
- if (i > 0)
- strm.PutCString (", ");
-
- DWARFFormValue form_value (NULL, header_data.atoms[i].form);
- switch (header_data.atoms[i].type)
- {
- case eAtomTypeDIEOffset: // DIE offset, check form for encoding
- strm.Printf ("{0x%8.8x}", hash_data.offset);
- break;
-
- case eAtomTypeTag: // DW_TAG value for the DIE
- {
- const char *tag_cstr = lldb_private::DW_TAG_value_to_name (hash_data.tag);
- if (tag_cstr)
- strm.PutCString (tag_cstr);
- else
- strm.Printf ("DW_TAG_(0x%4.4x)", hash_data.tag);
- }
- break;
-
- case eAtomTypeTypeFlags: // Flags from enum TypeFlags
- strm.Printf ("0x%2.2x", hash_data.type_flags);
- if (hash_data.type_flags)
- {
- strm.PutCString (" (");
- if (hash_data.type_flags & eTypeFlagClassIsImplementation)
- strm.PutCString (" implementation");
- strm.PutCString (" )");
- }
- break;
-
- case eAtomTypeQualNameHash: // Flags from enum TypeFlags
- strm.Printf ("0x%8.8x", hash_data.qualified_name_hash);
- break;
-
- default:
- strm.Printf ("AtomType(0x%x)", header_data.atoms[i].type);
- break;
- }
+ const char *tag_cstr = lldb_private::DW_TAG_value_to_name(hash_data.tag);
+ if (tag_cstr)
+ strm.PutCString(tag_cstr);
+ else
+ strm.Printf("DW_TAG_(0x%4.4x)", hash_data.tag);
+ } break;
+
+ case eAtomTypeTypeFlags: // Flags from enum TypeFlags
+ strm.Printf("0x%2.2x", hash_data.type_flags);
+ if (hash_data.type_flags) {
+ strm.PutCString(" (");
+ if (hash_data.type_flags & eTypeFlagClassIsImplementation)
+ strm.PutCString(" implementation");
+ strm.PutCString(" )");
+ }
+ break;
+
+ case eAtomTypeQualNameHash: // Flags from enum TypeFlags
+ strm.Printf("0x%8.8x", hash_data.qualified_name_hash);
+ break;
+
+ default:
+ strm.Printf("AtomType(0x%x)", header_data.atoms[i].type);
+ break;
}
+ }
}
-DWARFMappedHash::MemoryTable::MemoryTable (lldb_private::DWARFDataExtractor &table_data,
- const lldb_private::DWARFDataExtractor &string_table,
- const char *name) :
- MappedHash::MemoryTable<uint32_t, Header, DIEInfoArray> (table_data),
- m_data (table_data),
- m_string_table (string_table),
- m_name (name)
-{
-}
+DWARFMappedHash::MemoryTable::MemoryTable(
+ lldb_private::DWARFDataExtractor &table_data,
+ const lldb_private::DWARFDataExtractor &string_table, const char *name)
+ : MappedHash::MemoryTable<uint32_t, Header, DIEInfoArray>(table_data),
+ m_data(table_data), m_string_table(string_table), m_name(name) {}
const char *
-DWARFMappedHash::MemoryTable::GetStringForKeyType (KeyType key) const
-{
- // The key in the DWARF table is the .debug_str offset for the string
- return m_string_table.PeekCStr (key);
-}
-
-bool
-DWARFMappedHash::MemoryTable::ReadHashData (uint32_t hash_data_offset, HashData &hash_data) const
-{
- lldb::offset_t offset = hash_data_offset;
- offset += 4; // Skip string table offset that contains offset of hash name in .debug_str
- const uint32_t count = m_data.GetU32 (&offset);
- if (count > 0)
- {
- hash_data.resize(count);
- for (uint32_t i=0; i<count; ++i)
- {
- if (!m_header.Read(m_data, &offset, hash_data[i]))
- return false;
- }
+DWARFMappedHash::MemoryTable::GetStringForKeyType(KeyType key) const {
+ // The key in the DWARF table is the .debug_str offset for the string
+ return m_string_table.PeekCStr(key);
+}
+
+bool DWARFMappedHash::MemoryTable::ReadHashData(uint32_t hash_data_offset,
+ HashData &hash_data) const {
+ lldb::offset_t offset = hash_data_offset;
+ offset += 4; // Skip string table offset that contains offset of hash name in
+ // .debug_str
+ const uint32_t count = m_data.GetU32(&offset);
+ if (count > 0) {
+ hash_data.resize(count);
+ for (uint32_t i = 0; i < count; ++i) {
+ if (!m_header.Read(m_data, &offset, hash_data[i]))
+ return false;
}
- else
- hash_data.clear();
- return true;
+ } else
+ hash_data.clear();
+ return true;
}
DWARFMappedHash::MemoryTable::Result
-DWARFMappedHash::MemoryTable::GetHashDataForName (const char *name,
- lldb::offset_t* hash_data_offset_ptr,
- Pair &pair) const
-{
- pair.key = m_data.GetU32 (hash_data_offset_ptr);
- pair.value.clear();
-
- // If the key is zero, this terminates our chain of HashData objects
- // for this hash value.
- if (pair.key == 0)
- return eResultEndOfHashData;
-
- // There definitely should be a string for this string offset, if
- // there isn't, there is something wrong, return and error
- const char *strp_cstr = m_string_table.PeekCStr (pair.key);
- if (strp_cstr == NULL)
- {
- *hash_data_offset_ptr = UINT32_MAX;
- return eResultError;
- }
-
- const uint32_t count = m_data.GetU32 (hash_data_offset_ptr);
- const size_t min_total_hash_data_size = count * m_header.header_data.GetMinimumHashDataByteSize();
- if (count > 0 && m_data.ValidOffsetForDataOfSize (*hash_data_offset_ptr, min_total_hash_data_size))
- {
- // We have at least one HashData entry, and we have enough
- // data to parse at least "count" HashData entries.
-
- // First make sure the entire C string matches...
- const bool match = strcmp (name, strp_cstr) == 0;
-
- if (!match && m_header.header_data.HashDataHasFixedByteSize())
- {
- // If the string doesn't match and we have fixed size data,
- // we can just add the total byte size of all HashData objects
- // to the hash data offset and be done...
- *hash_data_offset_ptr += min_total_hash_data_size;
+DWARFMappedHash::MemoryTable::GetHashDataForName(
+ const char *name, lldb::offset_t *hash_data_offset_ptr, Pair &pair) const {
+ pair.key = m_data.GetU32(hash_data_offset_ptr);
+ pair.value.clear();
+
+ // If the key is zero, this terminates our chain of HashData objects
+ // for this hash value.
+ if (pair.key == 0)
+ return eResultEndOfHashData;
+
+ // There definitely should be a string for this string offset, if
+ // there isn't, there is something wrong, return and error
+ const char *strp_cstr = m_string_table.PeekCStr(pair.key);
+ if (strp_cstr == NULL) {
+ *hash_data_offset_ptr = UINT32_MAX;
+ return eResultError;
+ }
+
+ const uint32_t count = m_data.GetU32(hash_data_offset_ptr);
+ const size_t min_total_hash_data_size =
+ count * m_header.header_data.GetMinimumHashDataByteSize();
+ if (count > 0 &&
+ m_data.ValidOffsetForDataOfSize(*hash_data_offset_ptr,
+ min_total_hash_data_size)) {
+ // We have at least one HashData entry, and we have enough
+ // data to parse at least "count" HashData entries.
+
+ // First make sure the entire C string matches...
+ const bool match = strcmp(name, strp_cstr) == 0;
+
+ if (!match && m_header.header_data.HashDataHasFixedByteSize()) {
+ // If the string doesn't match and we have fixed size data,
+ // we can just add the total byte size of all HashData objects
+ // to the hash data offset and be done...
+ *hash_data_offset_ptr += min_total_hash_data_size;
+ } else {
+ // If the string does match, or we don't have fixed size data
+ // then we need to read the hash data as a stream. If the
+ // string matches we also append all HashData objects to the
+ // value array.
+ for (uint32_t i = 0; i < count; ++i) {
+ DIEInfo die_info;
+ if (m_header.Read(m_data, hash_data_offset_ptr, die_info)) {
+ // Only happened if the HashData of the string matched...
+ if (match)
+ pair.value.push_back(die_info);
+ } else {
+ // Something went wrong while reading the data
+ *hash_data_offset_ptr = UINT32_MAX;
+ return eResultError;
}
- else
- {
- // If the string does match, or we don't have fixed size data
- // then we need to read the hash data as a stream. If the
- // string matches we also append all HashData objects to the
- // value array.
- for (uint32_t i=0; i<count; ++i)
- {
- DIEInfo die_info;
- if (m_header.Read(m_data, hash_data_offset_ptr, die_info))
- {
- // Only happened if the HashData of the string matched...
- if (match)
- pair.value.push_back (die_info);
- }
- else
- {
- // Something went wrong while reading the data
- *hash_data_offset_ptr = UINT32_MAX;
- return eResultError;
- }
- }
- }
- // Return the correct response depending on if the string matched
- // or not...
- if (match)
- return eResultKeyMatch; // The key (cstring) matches and we have lookup results!
- else
- return eResultKeyMismatch; // The key doesn't match, this function will get called
- // again for the next key/value or the key terminator
- // which in our case is a zero .debug_str offset.
+ }
}
+ // Return the correct response depending on if the string matched
+ // or not...
+ if (match)
+ return eResultKeyMatch; // The key (cstring) matches and we have lookup
+ // results!
else
- {
- *hash_data_offset_ptr = UINT32_MAX;
- return eResultError;
- }
+ return eResultKeyMismatch; // The key doesn't match, this function will
+ // get called
+ // again for the next key/value or the key terminator
+ // which in our case is a zero .debug_str offset.
+ } else {
+ *hash_data_offset_ptr = UINT32_MAX;
+ return eResultError;
+ }
}
DWARFMappedHash::MemoryTable::Result
-DWARFMappedHash::MemoryTable::AppendHashDataForRegularExpression (
- const lldb_private::RegularExpression& regex,
- lldb::offset_t* hash_data_offset_ptr,
- Pair &pair) const
-{
- pair.key = m_data.GetU32 (hash_data_offset_ptr);
- // If the key is zero, this terminates our chain of HashData objects
- // for this hash value.
- if (pair.key == 0)
- return eResultEndOfHashData;
-
- // There definitely should be a string for this string offset, if
- // there isn't, there is something wrong, return and error
- const char *strp_cstr = m_string_table.PeekCStr (pair.key);
- if (strp_cstr == NULL)
- return eResultError;
-
- const uint32_t count = m_data.GetU32 (hash_data_offset_ptr);
- const size_t min_total_hash_data_size = count * m_header.header_data.GetMinimumHashDataByteSize();
- if (count > 0 && m_data.ValidOffsetForDataOfSize (*hash_data_offset_ptr, min_total_hash_data_size))
- {
- const bool match = regex.Execute(strp_cstr);
-
- if (!match && m_header.header_data.HashDataHasFixedByteSize())
- {
- // If the regex doesn't match and we have fixed size data,
- // we can just add the total byte size of all HashData objects
- // to the hash data offset and be done...
- *hash_data_offset_ptr += min_total_hash_data_size;
- }
- else
- {
- // If the string does match, or we don't have fixed size data
- // then we need to read the hash data as a stream. If the
- // string matches we also append all HashData objects to the
- // value array.
- for (uint32_t i=0; i<count; ++i)
- {
- DIEInfo die_info;
- if (m_header.Read(m_data, hash_data_offset_ptr, die_info))
- {
- // Only happened if the HashData of the string matched...
- if (match)
- pair.value.push_back (die_info);
- }
- else
- {
- // Something went wrong while reading the data
- *hash_data_offset_ptr = UINT32_MAX;
- return eResultError;
- }
- }
+DWARFMappedHash::MemoryTable::AppendHashDataForRegularExpression(
+ const lldb_private::RegularExpression &regex,
+ lldb::offset_t *hash_data_offset_ptr, Pair &pair) const {
+ pair.key = m_data.GetU32(hash_data_offset_ptr);
+ // If the key is zero, this terminates our chain of HashData objects
+ // for this hash value.
+ if (pair.key == 0)
+ return eResultEndOfHashData;
+
+ // There definitely should be a string for this string offset, if
+ // there isn't, there is something wrong, return and error
+ const char *strp_cstr = m_string_table.PeekCStr(pair.key);
+ if (strp_cstr == NULL)
+ return eResultError;
+
+ const uint32_t count = m_data.GetU32(hash_data_offset_ptr);
+ const size_t min_total_hash_data_size =
+ count * m_header.header_data.GetMinimumHashDataByteSize();
+ if (count > 0 &&
+ m_data.ValidOffsetForDataOfSize(*hash_data_offset_ptr,
+ min_total_hash_data_size)) {
+ const bool match = regex.Execute(strp_cstr);
+
+ if (!match && m_header.header_data.HashDataHasFixedByteSize()) {
+ // If the regex doesn't match and we have fixed size data,
+ // we can just add the total byte size of all HashData objects
+ // to the hash data offset and be done...
+ *hash_data_offset_ptr += min_total_hash_data_size;
+ } else {
+ // If the string does match, or we don't have fixed size data
+ // then we need to read the hash data as a stream. If the
+ // string matches we also append all HashData objects to the
+ // value array.
+ for (uint32_t i = 0; i < count; ++i) {
+ DIEInfo die_info;
+ if (m_header.Read(m_data, hash_data_offset_ptr, die_info)) {
+ // Only happened if the HashData of the string matched...
+ if (match)
+ pair.value.push_back(die_info);
+ } else {
+ // Something went wrong while reading the data
+ *hash_data_offset_ptr = UINT32_MAX;
+ return eResultError;
}
- // Return the correct response depending on if the string matched
- // or not...
- if (match)
- return eResultKeyMatch; // The key (cstring) matches and we have lookup results!
- else
- return eResultKeyMismatch; // The key doesn't match, this function will get called
- // again for the next key/value or the key terminator
- // which in our case is a zero .debug_str offset.
+ }
}
+ // Return the correct response depending on if the string matched
+ // or not...
+ if (match)
+ return eResultKeyMatch; // The key (cstring) matches and we have lookup
+ // results!
else
- {
- *hash_data_offset_ptr = UINT32_MAX;
- return eResultError;
+ return eResultKeyMismatch; // The key doesn't match, this function will
+ // get called
+ // again for the next key/value or the key terminator
+ // which in our case is a zero .debug_str offset.
+ } else {
+ *hash_data_offset_ptr = UINT32_MAX;
+ return eResultError;
+ }
+}
+
+size_t DWARFMappedHash::MemoryTable::AppendAllDIEsThatMatchingRegex(
+ const lldb_private::RegularExpression &regex,
+ DIEInfoArray &die_info_array) const {
+ const uint32_t hash_count = m_header.hashes_count;
+ Pair pair;
+ for (uint32_t offset_idx = 0; offset_idx < hash_count; ++offset_idx) {
+ lldb::offset_t hash_data_offset = GetHashDataOffset(offset_idx);
+ while (hash_data_offset != UINT32_MAX) {
+ const lldb::offset_t prev_hash_data_offset = hash_data_offset;
+ Result hash_result =
+ AppendHashDataForRegularExpression(regex, &hash_data_offset, pair);
+ if (prev_hash_data_offset == hash_data_offset)
+ break;
+
+ // Check the result of getting our hash data
+ switch (hash_result) {
+ case eResultKeyMatch:
+ case eResultKeyMismatch:
+ // Whether we matches or not, it doesn't matter, we
+ // keep looking.
+ break;
+
+ case eResultEndOfHashData:
+ case eResultError:
+ hash_data_offset = UINT32_MAX;
+ break;
+ }
}
-}
-
-size_t
-DWARFMappedHash::MemoryTable::AppendAllDIEsThatMatchingRegex (
- const lldb_private::RegularExpression& regex,
- DIEInfoArray &die_info_array) const
-{
- const uint32_t hash_count = m_header.hashes_count;
- Pair pair;
- for (uint32_t offset_idx=0; offset_idx<hash_count; ++offset_idx)
- {
- lldb::offset_t hash_data_offset = GetHashDataOffset (offset_idx);
- while (hash_data_offset != UINT32_MAX)
- {
- const lldb::offset_t prev_hash_data_offset = hash_data_offset;
- Result hash_result = AppendHashDataForRegularExpression (regex, &hash_data_offset, pair);
- if (prev_hash_data_offset == hash_data_offset)
- break;
-
- // Check the result of getting our hash data
- switch (hash_result)
- {
- case eResultKeyMatch:
- case eResultKeyMismatch:
- // Whether we matches or not, it doesn't matter, we
- // keep looking.
- break;
-
- case eResultEndOfHashData:
- case eResultError:
- hash_data_offset = UINT32_MAX;
- break;
- }
+ }
+ die_info_array.swap(pair.value);
+ return die_info_array.size();
+}
+
+size_t DWARFMappedHash::MemoryTable::AppendAllDIEsInRange(
+ const uint32_t die_offset_start, const uint32_t die_offset_end,
+ DIEInfoArray &die_info_array) const {
+ const uint32_t hash_count = m_header.hashes_count;
+ for (uint32_t offset_idx = 0; offset_idx < hash_count; ++offset_idx) {
+ bool done = false;
+ lldb::offset_t hash_data_offset = GetHashDataOffset(offset_idx);
+ while (!done && hash_data_offset != UINT32_MAX) {
+ KeyType key = m_data.GetU32(&hash_data_offset);
+ // If the key is zero, this terminates our chain of HashData objects
+ // for this hash value.
+ if (key == 0)
+ break;
+
+ const uint32_t count = m_data.GetU32(&hash_data_offset);
+ for (uint32_t i = 0; i < count; ++i) {
+ DIEInfo die_info;
+ if (m_header.Read(m_data, &hash_data_offset, die_info)) {
+ if (die_info.offset == 0)
+ done = true;
+ if (die_offset_start <= die_info.offset &&
+ die_info.offset < die_offset_end)
+ die_info_array.push_back(die_info);
}
+ }
}
- die_info_array.swap (pair.value);
- return die_info_array.size();
-}
-
-size_t
-DWARFMappedHash::MemoryTable::AppendAllDIEsInRange (const uint32_t die_offset_start,
- const uint32_t die_offset_end,
- DIEInfoArray &die_info_array) const
-{
- const uint32_t hash_count = m_header.hashes_count;
- for (uint32_t offset_idx=0; offset_idx<hash_count; ++offset_idx)
- {
- bool done = false;
- lldb::offset_t hash_data_offset = GetHashDataOffset (offset_idx);
- while (!done && hash_data_offset != UINT32_MAX)
- {
- KeyType key = m_data.GetU32 (&hash_data_offset);
- // If the key is zero, this terminates our chain of HashData objects
- // for this hash value.
- if (key == 0)
- break;
-
- const uint32_t count = m_data.GetU32 (&hash_data_offset);
- for (uint32_t i=0; i<count; ++i)
- {
- DIEInfo die_info;
- if (m_header.Read(m_data, &hash_data_offset, die_info))
- {
- if (die_info.offset == 0)
- done = true;
- if (die_offset_start <= die_info.offset && die_info.offset < die_offset_end)
- die_info_array.push_back(die_info);
- }
- }
- }
- }
- return die_info_array.size();
-}
-
-size_t
-DWARFMappedHash::MemoryTable::FindByName (const char *name, DIEArray &die_offsets)
-{
- if (!name || !name[0])
- return 0;
-
- DIEInfoArray die_info_array;
- if (FindByName(name, die_info_array))
- DWARFMappedHash::ExtractDIEArray (die_info_array, die_offsets);
- return die_info_array.size();
+ }
+ return die_info_array.size();
}
-size_t
-DWARFMappedHash::MemoryTable::FindByNameAndTag (const char *name,
- const dw_tag_t tag,
- DIEArray &die_offsets)
-{
- DIEInfoArray die_info_array;
- if (FindByName(name, die_info_array))
- DWARFMappedHash::ExtractDIEArray (die_info_array, tag, die_offsets);
- return die_info_array.size();
-}
-
-size_t
-DWARFMappedHash::MemoryTable::FindByNameAndTagAndQualifiedNameHash (const char *name,
- const dw_tag_t tag,
- const uint32_t qualified_name_hash,
- DIEArray &die_offsets)
-{
- DIEInfoArray die_info_array;
- if (FindByName(name, die_info_array))
- DWARFMappedHash::ExtractDIEArray (die_info_array, tag, qualified_name_hash, die_offsets);
- return die_info_array.size();
-}
+size_t DWARFMappedHash::MemoryTable::FindByName(const char *name,
+ DIEArray &die_offsets) {
+ if (!name || !name[0])
+ return 0;
-size_t
-DWARFMappedHash::MemoryTable::FindCompleteObjCClassByName (const char *name,
- DIEArray &die_offsets,
- bool must_be_implementation)
-{
- DIEInfoArray die_info_array;
- if (FindByName(name, die_info_array))
- {
- if (must_be_implementation && GetHeader().header_data.ContainsAtom (eAtomTypeTypeFlags))
- {
- // If we have two atoms, then we have the DIE offset and
- // the type flags so we can find the objective C class
- // efficiently.
- DWARFMappedHash::ExtractTypesFromDIEArray (die_info_array,
- UINT32_MAX,
- eTypeFlagClassIsImplementation,
- die_offsets);
- }
- else
- {
- // We don't only want the one true definition, so try and see
- // what we can find, and only return class or struct DIEs.
- // If we do have the full implementation, then return it alone,
- // else return all possible matches.
- const bool return_implementation_only_if_available = true;
- DWARFMappedHash::ExtractClassOrStructDIEArray (die_info_array,
- return_implementation_only_if_available,
- die_offsets);
- }
+ DIEInfoArray die_info_array;
+ if (FindByName(name, die_info_array))
+ DWARFMappedHash::ExtractDIEArray(die_info_array, die_offsets);
+ return die_info_array.size();
+}
+
+size_t DWARFMappedHash::MemoryTable::FindByNameAndTag(const char *name,
+ const dw_tag_t tag,
+ DIEArray &die_offsets) {
+ DIEInfoArray die_info_array;
+ if (FindByName(name, die_info_array))
+ DWARFMappedHash::ExtractDIEArray(die_info_array, tag, die_offsets);
+ return die_info_array.size();
+}
+
+size_t DWARFMappedHash::MemoryTable::FindByNameAndTagAndQualifiedNameHash(
+ const char *name, const dw_tag_t tag, const uint32_t qualified_name_hash,
+ DIEArray &die_offsets) {
+ DIEInfoArray die_info_array;
+ if (FindByName(name, die_info_array))
+ DWARFMappedHash::ExtractDIEArray(die_info_array, tag, qualified_name_hash,
+ die_offsets);
+ return die_info_array.size();
+}
+
+size_t DWARFMappedHash::MemoryTable::FindCompleteObjCClassByName(
+ const char *name, DIEArray &die_offsets, bool must_be_implementation) {
+ DIEInfoArray die_info_array;
+ if (FindByName(name, die_info_array)) {
+ if (must_be_implementation &&
+ GetHeader().header_data.ContainsAtom(eAtomTypeTypeFlags)) {
+ // If we have two atoms, then we have the DIE offset and
+ // the type flags so we can find the objective C class
+ // efficiently.
+ DWARFMappedHash::ExtractTypesFromDIEArray(die_info_array, UINT32_MAX,
+ eTypeFlagClassIsImplementation,
+ die_offsets);
+ } else {
+ // We don't only want the one true definition, so try and see
+ // what we can find, and only return class or struct DIEs.
+ // If we do have the full implementation, then return it alone,
+ // else return all possible matches.
+ const bool return_implementation_only_if_available = true;
+ DWARFMappedHash::ExtractClassOrStructDIEArray(
+ die_info_array, return_implementation_only_if_available, die_offsets);
}
- return die_offsets.size();
+ }
+ return die_offsets.size();
}
-size_t
-DWARFMappedHash::MemoryTable::FindByName (const char *name, DIEInfoArray &die_info_array)
-{
- if (!name || !name[0])
- return 0;
-
- Pair kv_pair;
- size_t old_size = die_info_array.size();
- if (Find (name, kv_pair))
- {
- die_info_array.swap(kv_pair.value);
- return die_info_array.size() - old_size;
- }
+size_t DWARFMappedHash::MemoryTable::FindByName(const char *name,
+ DIEInfoArray &die_info_array) {
+ if (!name || !name[0])
return 0;
+
+ Pair kv_pair;
+ size_t old_size = die_info_array.size();
+ if (Find(name, kv_pair)) {
+ die_info_array.swap(kv_pair.value);
+ return die_info_array.size() - old_size;
+ }
+ return 0;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h
index bcde558ae44..c1cb30b6004 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h
@@ -12,10 +12,10 @@
#include <vector>
-#include "lldb/lldb-defines.h"
-#include "lldb/Core/dwarf.h"
-#include "lldb/Core/RegularExpression.h"
#include "lldb/Core/MappedHash.h"
+#include "lldb/Core/RegularExpression.h"
+#include "lldb/Core/dwarf.h"
+#include "lldb/lldb-defines.h"
#include "DWARFDefines.h"
#include "DWARFFormValue.h"
@@ -25,195 +25,169 @@ class SymbolFileDWARF;
class DWARFCompileUnit;
class DWARFDebugInfoEntry;
-class DWARFMappedHash
-{
+class DWARFMappedHash {
public:
- enum AtomType : uint16_t
- {
- eAtomTypeNULL = 0u,
- eAtomTypeDIEOffset = 1u, // DIE offset, check form for encoding
- eAtomTypeCUOffset = 2u, // DIE offset of the compiler unit header that contains the item in question
- eAtomTypeTag = 3u, // DW_TAG_xxx value, should be encoded as DW_FORM_data1 (if no tags exceed 255) or DW_FORM_data2
- eAtomTypeNameFlags = 4u, // Flags from enum NameFlags
- eAtomTypeTypeFlags = 5u, // Flags from enum TypeFlags,
- eAtomTypeQualNameHash = 6u // A 32 bit hash of the full qualified name (since all hash entries are basename only)
- // For example a type like "std::vector<int>::iterator" would have a name of "iterator"
- // and a 32 bit hash for "std::vector<int>::iterator" to allow us to not have to pull
- // in debug info for a type when we know the fully qualified name.
- };
-
- // Bit definitions for the eAtomTypeTypeFlags flags
- enum TypeFlags
- {
- // Always set for C++, only set for ObjC if this is the
- // @implementation for class
- eTypeFlagClassIsImplementation = ( 1u << 1 )
- };
-
- struct DIEInfo
- {
- dw_offset_t cu_offset;
- dw_offset_t offset; // The DIE offset
- dw_tag_t tag;
- uint32_t type_flags; // Any flags for this DIEInfo
- uint32_t qualified_name_hash; // A 32 bit hash of the fully qualified name
-
- DIEInfo ();
- DIEInfo (dw_offset_t c, dw_offset_t o, dw_tag_t t, uint32_t f, uint32_t h);
- };
-
- struct Atom
- {
- AtomType type;
- dw_form_t form;
- };
-
- typedef std::vector<DIEInfo> DIEInfoArray;
- typedef std::vector<Atom> AtomArray;
-
- class Prologue
- {
- public:
- Prologue (dw_offset_t _die_base_offset = 0);
-
- void
- ClearAtoms ();
-
- bool
- ContainsAtom (AtomType atom_type) const;
-
- void
- Clear ();
-
- void
- AppendAtom (AtomType type, dw_form_t form);
-
- lldb::offset_t
- Read (const lldb_private::DataExtractor &data, lldb::offset_t offset);
-
- size_t
- GetByteSize () const;
-
- size_t
- GetMinimumHashDataByteSize () const;
-
- bool
- HashDataHasFixedByteSize() const;
-
- // DIE offset base so die offsets in hash_data can be CU relative
- dw_offset_t die_base_offset;
- AtomArray atoms;
- uint32_t atom_mask;
- size_t min_hash_data_byte_size;
- bool hash_data_has_fixed_byte_size;
- };
-
- class Header : public MappedHash::Header<Prologue>
- {
- public:
- size_t
- GetByteSize (const HeaderData &header_data) override;
-
- lldb::offset_t
- Read (lldb_private::DataExtractor &data, lldb::offset_t offset) override;
-
- bool
- Read (const lldb_private::DWARFDataExtractor &data,
- lldb::offset_t *offset_ptr,
- DIEInfo &hash_data) const;
-
- void
- Dump (lldb_private::Stream& strm, const DIEInfo &hash_data) const;
- };
-
- // A class for reading and using a saved hash table from a block of data
- // in memory
- class MemoryTable : public MappedHash::MemoryTable<uint32_t, DWARFMappedHash::Header, DIEInfoArray>
- {
- public:
- MemoryTable (lldb_private::DWARFDataExtractor &table_data,
- const lldb_private::DWARFDataExtractor &string_table,
- const char *name);
-
- const char *
- GetStringForKeyType (KeyType key) const override;
-
- bool
- ReadHashData (uint32_t hash_data_offset, HashData &hash_data) const override;
-
- size_t
- AppendAllDIEsThatMatchingRegex (const lldb_private::RegularExpression& regex,
- DIEInfoArray &die_info_array) const;
-
- size_t
- AppendAllDIEsInRange (const uint32_t die_offset_start,
- const uint32_t die_offset_end,
- DIEInfoArray &die_info_array) const;
-
- size_t
- FindByName (const char *name, DIEArray &die_offsets);
-
- size_t
- FindByNameAndTag (const char *name, const dw_tag_t tag, DIEArray &die_offsets);
-
- size_t
- FindByNameAndTagAndQualifiedNameHash (const char *name,
- const dw_tag_t tag,
- const uint32_t qualified_name_hash,
- DIEArray &die_offsets);
-
- size_t
- FindCompleteObjCClassByName (const char *name,
- DIEArray &die_offsets,
- bool must_be_implementation);
-
- protected:
- Result
- AppendHashDataForRegularExpression (const lldb_private::RegularExpression& regex,
- lldb::offset_t* hash_data_offset_ptr,
- Pair &pair) const;
-
- size_t
- FindByName (const char *name, DIEInfoArray &die_info_array);
-
- Result
- GetHashDataForName (const char *name,
- lldb::offset_t* hash_data_offset_ptr,
- Pair &pair) const override;
-
- const lldb_private::DWARFDataExtractor &m_data;
- const lldb_private::DWARFDataExtractor &m_string_table;
- std::string m_name;
- };
-
- static void
- ExtractDIEArray (const DIEInfoArray &die_info_array, DIEArray &die_offsets);
+ enum AtomType : uint16_t {
+ eAtomTypeNULL = 0u,
+ eAtomTypeDIEOffset = 1u, // DIE offset, check form for encoding
+ eAtomTypeCUOffset = 2u, // DIE offset of the compiler unit header that
+ // contains the item in question
+ eAtomTypeTag = 3u, // DW_TAG_xxx value, should be encoded as DW_FORM_data1
+ // (if no tags exceed 255) or DW_FORM_data2
+ eAtomTypeNameFlags = 4u, // Flags from enum NameFlags
+ eAtomTypeTypeFlags = 5u, // Flags from enum TypeFlags,
+ eAtomTypeQualNameHash = 6u // A 32 bit hash of the full qualified name
+ // (since all hash entries are basename only)
+ // For example a type like "std::vector<int>::iterator" would have a name of
+ // "iterator"
+ // and a 32 bit hash for "std::vector<int>::iterator" to allow us to not
+ // have to pull
+ // in debug info for a type when we know the fully qualified name.
+ };
+
+ // Bit definitions for the eAtomTypeTypeFlags flags
+ enum TypeFlags {
+ // Always set for C++, only set for ObjC if this is the
+ // @implementation for class
+ eTypeFlagClassIsImplementation = (1u << 1)
+ };
+
+ struct DIEInfo {
+ dw_offset_t cu_offset;
+ dw_offset_t offset; // The DIE offset
+ dw_tag_t tag;
+ uint32_t type_flags; // Any flags for this DIEInfo
+ uint32_t qualified_name_hash; // A 32 bit hash of the fully qualified name
+
+ DIEInfo();
+ DIEInfo(dw_offset_t c, dw_offset_t o, dw_tag_t t, uint32_t f, uint32_t h);
+ };
+
+ struct Atom {
+ AtomType type;
+ dw_form_t form;
+ };
+
+ typedef std::vector<DIEInfo> DIEInfoArray;
+ typedef std::vector<Atom> AtomArray;
+
+ class Prologue {
+ public:
+ Prologue(dw_offset_t _die_base_offset = 0);
+
+ void ClearAtoms();
+
+ bool ContainsAtom(AtomType atom_type) const;
+
+ void Clear();
+
+ void AppendAtom(AtomType type, dw_form_t form);
+
+ lldb::offset_t Read(const lldb_private::DataExtractor &data,
+ lldb::offset_t offset);
+
+ size_t GetByteSize() const;
+
+ size_t GetMinimumHashDataByteSize() const;
+
+ bool HashDataHasFixedByteSize() const;
+
+ // DIE offset base so die offsets in hash_data can be CU relative
+ dw_offset_t die_base_offset;
+ AtomArray atoms;
+ uint32_t atom_mask;
+ size_t min_hash_data_byte_size;
+ bool hash_data_has_fixed_byte_size;
+ };
+
+ class Header : public MappedHash::Header<Prologue> {
+ public:
+ size_t GetByteSize(const HeaderData &header_data) override;
+
+ lldb::offset_t Read(lldb_private::DataExtractor &data,
+ lldb::offset_t offset) override;
+
+ bool Read(const lldb_private::DWARFDataExtractor &data,
+ lldb::offset_t *offset_ptr, DIEInfo &hash_data) const;
+
+ void Dump(lldb_private::Stream &strm, const DIEInfo &hash_data) const;
+ };
+
+ // A class for reading and using a saved hash table from a block of data
+ // in memory
+ class MemoryTable
+ : public MappedHash::MemoryTable<uint32_t, DWARFMappedHash::Header,
+ DIEInfoArray> {
+ public:
+ MemoryTable(lldb_private::DWARFDataExtractor &table_data,
+ const lldb_private::DWARFDataExtractor &string_table,
+ const char *name);
+
+ const char *GetStringForKeyType(KeyType key) const override;
+
+ bool ReadHashData(uint32_t hash_data_offset,
+ HashData &hash_data) const override;
+
+ size_t
+ AppendAllDIEsThatMatchingRegex(const lldb_private::RegularExpression &regex,
+ DIEInfoArray &die_info_array) const;
+
+ size_t AppendAllDIEsInRange(const uint32_t die_offset_start,
+ const uint32_t die_offset_end,
+ DIEInfoArray &die_info_array) const;
+
+ size_t FindByName(const char *name, DIEArray &die_offsets);
+
+ size_t FindByNameAndTag(const char *name, const dw_tag_t tag,
+ DIEArray &die_offsets);
+
+ size_t
+ FindByNameAndTagAndQualifiedNameHash(const char *name, const dw_tag_t tag,
+ const uint32_t qualified_name_hash,
+ DIEArray &die_offsets);
+
+ size_t FindCompleteObjCClassByName(const char *name, DIEArray &die_offsets,
+ bool must_be_implementation);
+
+ protected:
+ Result AppendHashDataForRegularExpression(
+ const lldb_private::RegularExpression &regex,
+ lldb::offset_t *hash_data_offset_ptr, Pair &pair) const;
+
+ size_t FindByName(const char *name, DIEInfoArray &die_info_array);
+
+ Result GetHashDataForName(const char *name,
+ lldb::offset_t *hash_data_offset_ptr,
+ Pair &pair) const override;
+
+ const lldb_private::DWARFDataExtractor &m_data;
+ const lldb_private::DWARFDataExtractor &m_string_table;
+ std::string m_name;
+ };
+
+ static void ExtractDIEArray(const DIEInfoArray &die_info_array,
+ DIEArray &die_offsets);
protected:
- static void
- ExtractDIEArray (const DIEInfoArray &die_info_array,
- const dw_tag_t tag,
- DIEArray &die_offsets);
-
- static void
- ExtractDIEArray (const DIEInfoArray &die_info_array,
- const dw_tag_t tag,
- const uint32_t qualified_name_hash,
- DIEArray &die_offsets);
-
- static void
- ExtractClassOrStructDIEArray (const DIEInfoArray &die_info_array,
- bool return_implementation_only_if_available,
- DIEArray &die_offsets);
-
- static void
- ExtractTypesFromDIEArray (const DIEInfoArray &die_info_array,
- uint32_t type_flag_mask,
- uint32_t type_flag_value,
+ static void ExtractDIEArray(const DIEInfoArray &die_info_array,
+ const dw_tag_t tag, DIEArray &die_offsets);
+
+ static void ExtractDIEArray(const DIEInfoArray &die_info_array,
+ const dw_tag_t tag,
+ const uint32_t qualified_name_hash,
DIEArray &die_offsets);
- static const char *
- GetAtomTypeName (uint16_t atom);
+ static void
+ ExtractClassOrStructDIEArray(const DIEInfoArray &die_info_array,
+ bool return_implementation_only_if_available,
+ DIEArray &die_offsets);
+
+ static void ExtractTypesFromDIEArray(const DIEInfoArray &die_info_array,
+ uint32_t type_flag_mask,
+ uint32_t type_flag_value,
+ DIEArray &die_offsets);
+
+ static const char *GetAtomTypeName(uint16_t atom);
};
-#endif // SymbolFileDWARF_HashedNameToDIE_h_
+#endif // SymbolFileDWARF_HashedNameToDIE_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp
index fbbc03c9462..1385e3dd28d 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp
@@ -9,227 +9,195 @@
#include "LogChannelDWARF.h"
-#include "lldb/Interpreter/Args.h"
+#include "SymbolFileDWARF.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/StreamFile.h"
-#include "SymbolFileDWARF.h"
+#include "lldb/Interpreter/Args.h"
using namespace lldb;
using namespace lldb_private;
-
// when the one and only logging channel is enabled, then this will be non NULL.
-static LogChannelDWARF* g_log_channel = NULL;
-
-LogChannelDWARF::LogChannelDWARF () :
- LogChannel ()
-{
-}
-
-LogChannelDWARF::~LogChannelDWARF ()
-{
-}
+static LogChannelDWARF *g_log_channel = NULL;
+LogChannelDWARF::LogChannelDWARF() : LogChannel() {}
-void
-LogChannelDWARF::Initialize()
-{
- PluginManager::RegisterPlugin (GetPluginNameStatic(),
- GetPluginDescriptionStatic(),
- LogChannelDWARF::CreateInstance);
-}
+LogChannelDWARF::~LogChannelDWARF() {}
-void
-LogChannelDWARF::Terminate()
-{
- PluginManager::UnregisterPlugin (LogChannelDWARF::CreateInstance);
+void LogChannelDWARF::Initialize() {
+ PluginManager::RegisterPlugin(GetPluginNameStatic(),
+ GetPluginDescriptionStatic(),
+ LogChannelDWARF::CreateInstance);
}
-LogChannel*
-LogChannelDWARF::CreateInstance ()
-{
- return new LogChannelDWARF ();
+void LogChannelDWARF::Terminate() {
+ PluginManager::UnregisterPlugin(LogChannelDWARF::CreateInstance);
}
-lldb_private::ConstString
-LogChannelDWARF::GetPluginNameStatic()
-{
- return SymbolFileDWARF::GetPluginNameStatic();
-}
+LogChannel *LogChannelDWARF::CreateInstance() { return new LogChannelDWARF(); }
-const char *
-LogChannelDWARF::GetPluginDescriptionStatic()
-{
- return "DWARF log channel for debugging plug-in issues.";
+lldb_private::ConstString LogChannelDWARF::GetPluginNameStatic() {
+ return SymbolFileDWARF::GetPluginNameStatic();
}
-lldb_private::ConstString
-LogChannelDWARF::GetPluginName()
-{
- return GetPluginNameStatic();
+const char *LogChannelDWARF::GetPluginDescriptionStatic() {
+ return "DWARF log channel for debugging plug-in issues.";
}
-uint32_t
-LogChannelDWARF::GetPluginVersion()
-{
- return 1;
-}
-
-
-void
-LogChannelDWARF::Delete ()
-{
- g_log_channel = NULL;
+lldb_private::ConstString LogChannelDWARF::GetPluginName() {
+ return GetPluginNameStatic();
}
+uint32_t LogChannelDWARF::GetPluginVersion() { return 1; }
-void
-LogChannelDWARF::Disable (const char **categories, Stream *feedback_strm)
-{
- if (m_log_ap.get() == NULL)
- return;
-
- uint32_t flag_bits = m_log_ap->GetMask().Get();
- for (size_t i = 0; categories[i] != NULL; ++i)
- {
- const char *arg = categories[i];
-
- if (::strcasecmp (arg, "all") == 0) flag_bits &= ~DWARF_LOG_ALL;
- else if (::strcasecmp (arg, "info") == 0) flag_bits &= ~DWARF_LOG_DEBUG_INFO;
- else if (::strcasecmp (arg, "line") == 0) flag_bits &= ~DWARF_LOG_DEBUG_LINE;
- else if (::strcasecmp (arg, "pubnames") == 0) flag_bits &= ~DWARF_LOG_DEBUG_PUBNAMES;
- else if (::strcasecmp (arg, "pubtypes") == 0) flag_bits &= ~DWARF_LOG_DEBUG_PUBTYPES;
- else if (::strcasecmp (arg, "aranges") == 0) flag_bits &= ~DWARF_LOG_DEBUG_ARANGES;
- else if (::strcasecmp (arg, "lookups") == 0) flag_bits &= ~DWARF_LOG_LOOKUPS;
- else if (::strcasecmp (arg, "map") == 0) flag_bits &= ~DWARF_LOG_DEBUG_MAP;
- else if (::strcasecmp (arg, "default") == 0) flag_bits &= ~DWARF_LOG_DEFAULT;
- else if (::strcasecmp (arg, "verbose") == 0) flag_bits &= ~DWARF_LOG_VERBOSE;
- else if (::strncasecmp(arg, "comp", 4) == 0) flag_bits &= ~DWARF_LOG_TYPE_COMPLETION;
- else
- {
- feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
- ListCategories (feedback_strm);
- }
- }
-
- if (flag_bits == 0)
- Delete ();
- else
- m_log_ap->GetMask().Reset (flag_bits);
+void LogChannelDWARF::Delete() { g_log_channel = NULL; }
+void LogChannelDWARF::Disable(const char **categories, Stream *feedback_strm) {
+ if (m_log_ap.get() == NULL)
return;
-}
-bool
-LogChannelDWARF::Enable
-(
- StreamSP &log_stream_sp,
- uint32_t log_options,
- Stream *feedback_strm, // Feedback stream for argument errors etc
- const char **categories // The categories to enable within this logging stream, if empty, enable default set
-)
-{
- Delete ();
-
- if (m_log_ap)
- m_log_ap->SetStream(log_stream_sp);
- else
- m_log_ap.reset(new Log (log_stream_sp));
-
- g_log_channel = this;
- uint32_t flag_bits = 0;
- bool got_unknown_category = false;
- for (size_t i = 0; categories[i] != NULL; ++i)
- {
- const char *arg = categories[i];
-
- if (::strcasecmp (arg, "all") == 0) flag_bits |= DWARF_LOG_ALL;
- else if (::strcasecmp (arg, "info") == 0) flag_bits |= DWARF_LOG_DEBUG_INFO;
- else if (::strcasecmp (arg, "line") == 0) flag_bits |= DWARF_LOG_DEBUG_LINE;
- else if (::strcasecmp (arg, "pubnames") == 0) flag_bits |= DWARF_LOG_DEBUG_PUBNAMES;
- else if (::strcasecmp (arg, "pubtypes") == 0) flag_bits |= DWARF_LOG_DEBUG_PUBTYPES;
- else if (::strcasecmp (arg, "aranges") == 0) flag_bits |= DWARF_LOG_DEBUG_ARANGES;
- else if (::strcasecmp (arg, "lookups") == 0) flag_bits |= DWARF_LOG_LOOKUPS;
- else if (::strcasecmp (arg, "map") == 0) flag_bits |= DWARF_LOG_DEBUG_MAP;
- else if (::strcasecmp (arg, "default") == 0) flag_bits |= DWARF_LOG_DEFAULT;
- else if (::strcasecmp (arg, "verbose") == 0) flag_bits |= DWARF_LOG_VERBOSE;
- else if (::strncasecmp(arg, "comp", 4) == 0) flag_bits |= DWARF_LOG_TYPE_COMPLETION;
- else
- {
- feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
- if (got_unknown_category == false)
- {
- got_unknown_category = true;
- ListCategories (feedback_strm);
- }
- }
+ uint32_t flag_bits = m_log_ap->GetMask().Get();
+ for (size_t i = 0; categories[i] != NULL; ++i) {
+ const char *arg = categories[i];
+
+ if (::strcasecmp(arg, "all") == 0)
+ flag_bits &= ~DWARF_LOG_ALL;
+ else if (::strcasecmp(arg, "info") == 0)
+ flag_bits &= ~DWARF_LOG_DEBUG_INFO;
+ else if (::strcasecmp(arg, "line") == 0)
+ flag_bits &= ~DWARF_LOG_DEBUG_LINE;
+ else if (::strcasecmp(arg, "pubnames") == 0)
+ flag_bits &= ~DWARF_LOG_DEBUG_PUBNAMES;
+ else if (::strcasecmp(arg, "pubtypes") == 0)
+ flag_bits &= ~DWARF_LOG_DEBUG_PUBTYPES;
+ else if (::strcasecmp(arg, "aranges") == 0)
+ flag_bits &= ~DWARF_LOG_DEBUG_ARANGES;
+ else if (::strcasecmp(arg, "lookups") == 0)
+ flag_bits &= ~DWARF_LOG_LOOKUPS;
+ else if (::strcasecmp(arg, "map") == 0)
+ flag_bits &= ~DWARF_LOG_DEBUG_MAP;
+ else if (::strcasecmp(arg, "default") == 0)
+ flag_bits &= ~DWARF_LOG_DEFAULT;
+ else if (::strcasecmp(arg, "verbose") == 0)
+ flag_bits &= ~DWARF_LOG_VERBOSE;
+ else if (::strncasecmp(arg, "comp", 4) == 0)
+ flag_bits &= ~DWARF_LOG_TYPE_COMPLETION;
+ else {
+ feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
+ ListCategories(feedback_strm);
}
- if (flag_bits == 0)
- flag_bits = DWARF_LOG_DEFAULT;
- m_log_ap->GetMask().Reset(flag_bits);
- m_log_ap->GetOptions().Reset(log_options);
- return m_log_ap.get() != NULL;
-}
-
-void
-LogChannelDWARF::ListCategories (Stream *strm)
-{
- strm->Printf ("Logging categories for '%s':\n"
- " all - turn on all available logging categories\n"
- " info - log the parsing of .debug_info\n"
- " line - log the parsing of .debug_line\n"
- " pubnames - log the parsing of .debug_pubnames\n"
- " pubtypes - log the parsing of .debug_pubtypes\n"
- " aranges - log the parsing of .debug_aranges\n"
- " lookups - log any lookups that happen by name, regex, or address\n"
- " completion - log struct/unions/class type completions\n"
- " map - log insertions of object files into DWARF debug maps\n",
- SymbolFileDWARF::GetPluginNameStatic().GetCString());
-}
-
-Log *
-LogChannelDWARF::GetLog ()
-{
- if (g_log_channel)
- return g_log_channel->m_log_ap.get();
+ }
- return NULL;
-}
+ if (flag_bits == 0)
+ Delete();
+ else
+ m_log_ap->GetMask().Reset(flag_bits);
-Log *
-LogChannelDWARF::GetLogIfAll (uint32_t mask)
-{
- if (g_log_channel && g_log_channel->m_log_ap.get())
- {
- if (g_log_channel->m_log_ap->GetMask().AllSet(mask))
- return g_log_channel->m_log_ap.get();
- }
- return NULL;
+ return;
}
-Log *
-LogChannelDWARF::GetLogIfAny (uint32_t mask)
-{
- if (g_log_channel && g_log_channel->m_log_ap.get())
- {
- if (g_log_channel->m_log_ap->GetMask().AnySet(mask))
- return g_log_channel->m_log_ap.get();
+bool LogChannelDWARF::Enable(
+ StreamSP &log_stream_sp, uint32_t log_options,
+ Stream *feedback_strm, // Feedback stream for argument errors etc
+ const char **categories // The categories to enable within this logging
+ // stream, if empty, enable default set
+ ) {
+ Delete();
+
+ if (m_log_ap)
+ m_log_ap->SetStream(log_stream_sp);
+ else
+ m_log_ap.reset(new Log(log_stream_sp));
+
+ g_log_channel = this;
+ uint32_t flag_bits = 0;
+ bool got_unknown_category = false;
+ for (size_t i = 0; categories[i] != NULL; ++i) {
+ const char *arg = categories[i];
+
+ if (::strcasecmp(arg, "all") == 0)
+ flag_bits |= DWARF_LOG_ALL;
+ else if (::strcasecmp(arg, "info") == 0)
+ flag_bits |= DWARF_LOG_DEBUG_INFO;
+ else if (::strcasecmp(arg, "line") == 0)
+ flag_bits |= DWARF_LOG_DEBUG_LINE;
+ else if (::strcasecmp(arg, "pubnames") == 0)
+ flag_bits |= DWARF_LOG_DEBUG_PUBNAMES;
+ else if (::strcasecmp(arg, "pubtypes") == 0)
+ flag_bits |= DWARF_LOG_DEBUG_PUBTYPES;
+ else if (::strcasecmp(arg, "aranges") == 0)
+ flag_bits |= DWARF_LOG_DEBUG_ARANGES;
+ else if (::strcasecmp(arg, "lookups") == 0)
+ flag_bits |= DWARF_LOG_LOOKUPS;
+ else if (::strcasecmp(arg, "map") == 0)
+ flag_bits |= DWARF_LOG_DEBUG_MAP;
+ else if (::strcasecmp(arg, "default") == 0)
+ flag_bits |= DWARF_LOG_DEFAULT;
+ else if (::strcasecmp(arg, "verbose") == 0)
+ flag_bits |= DWARF_LOG_VERBOSE;
+ else if (::strncasecmp(arg, "comp", 4) == 0)
+ flag_bits |= DWARF_LOG_TYPE_COMPLETION;
+ else {
+ feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
+ if (got_unknown_category == false) {
+ got_unknown_category = true;
+ ListCategories(feedback_strm);
+ }
}
- return NULL;
-}
-
-void
-LogChannelDWARF::LogIf (uint32_t mask, const char *format, ...)
-{
- if (g_log_channel)
- {
- Log *log = g_log_channel->m_log_ap.get();
- if (log && log->GetMask().AnySet(mask))
- {
- va_list args;
- va_start (args, format);
- log->VAPrintf (format, args);
- va_end (args);
- }
+ }
+ if (flag_bits == 0)
+ flag_bits = DWARF_LOG_DEFAULT;
+ m_log_ap->GetMask().Reset(flag_bits);
+ m_log_ap->GetOptions().Reset(log_options);
+ return m_log_ap.get() != NULL;
+}
+
+void LogChannelDWARF::ListCategories(Stream *strm) {
+ strm->Printf(
+ "Logging categories for '%s':\n"
+ " all - turn on all available logging categories\n"
+ " info - log the parsing of .debug_info\n"
+ " line - log the parsing of .debug_line\n"
+ " pubnames - log the parsing of .debug_pubnames\n"
+ " pubtypes - log the parsing of .debug_pubtypes\n"
+ " aranges - log the parsing of .debug_aranges\n"
+ " lookups - log any lookups that happen by name, regex, or address\n"
+ " completion - log struct/unions/class type completions\n"
+ " map - log insertions of object files into DWARF debug maps\n",
+ SymbolFileDWARF::GetPluginNameStatic().GetCString());
+}
+
+Log *LogChannelDWARF::GetLog() {
+ if (g_log_channel)
+ return g_log_channel->m_log_ap.get();
+
+ return NULL;
+}
+
+Log *LogChannelDWARF::GetLogIfAll(uint32_t mask) {
+ if (g_log_channel && g_log_channel->m_log_ap.get()) {
+ if (g_log_channel->m_log_ap->GetMask().AllSet(mask))
+ return g_log_channel->m_log_ap.get();
+ }
+ return NULL;
+}
+
+Log *LogChannelDWARF::GetLogIfAny(uint32_t mask) {
+ if (g_log_channel && g_log_channel->m_log_ap.get()) {
+ if (g_log_channel->m_log_ap->GetMask().AnySet(mask))
+ return g_log_channel->m_log_ap.get();
+ }
+ return NULL;
+}
+
+void LogChannelDWARF::LogIf(uint32_t mask, const char *format, ...) {
+ if (g_log_channel) {
+ Log *log = g_log_channel->m_log_ap.get();
+ if (log && log->GetMask().AnySet(mask)) {
+ va_list args;
+ va_start(args, format);
+ log->VAPrintf(format, args);
+ va_end(args);
}
+ }
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.h
index 24fa7d148cd..4802f858f3a 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.h
@@ -16,72 +16,59 @@
// Project includes
#include "lldb/Core/Log.h"
-#define DWARF_LOG_VERBOSE (1u << 0)
-#define DWARF_LOG_DEBUG_INFO (1u << 1)
-#define DWARF_LOG_DEBUG_LINE (1u << 2)
-#define DWARF_LOG_DEBUG_PUBNAMES (1u << 3)
-#define DWARF_LOG_DEBUG_PUBTYPES (1u << 4)
-#define DWARF_LOG_DEBUG_ARANGES (1u << 5)
-#define DWARF_LOG_LOOKUPS (1u << 6)
-#define DWARF_LOG_TYPE_COMPLETION (1u << 7)
-#define DWARF_LOG_DEBUG_MAP (1u << 8)
-#define DWARF_LOG_ALL (UINT32_MAX)
-#define DWARF_LOG_DEFAULT (DWARF_LOG_DEBUG_INFO)
-
-class LogChannelDWARF : public lldb_private::LogChannel
-{
+#define DWARF_LOG_VERBOSE (1u << 0)
+#define DWARF_LOG_DEBUG_INFO (1u << 1)
+#define DWARF_LOG_DEBUG_LINE (1u << 2)
+#define DWARF_LOG_DEBUG_PUBNAMES (1u << 3)
+#define DWARF_LOG_DEBUG_PUBTYPES (1u << 4)
+#define DWARF_LOG_DEBUG_ARANGES (1u << 5)
+#define DWARF_LOG_LOOKUPS (1u << 6)
+#define DWARF_LOG_TYPE_COMPLETION (1u << 7)
+#define DWARF_LOG_DEBUG_MAP (1u << 8)
+#define DWARF_LOG_ALL (UINT32_MAX)
+#define DWARF_LOG_DEFAULT (DWARF_LOG_DEBUG_INFO)
+
+class LogChannelDWARF : public lldb_private::LogChannel {
public:
- LogChannelDWARF ();
+ LogChannelDWARF();
- ~LogChannelDWARF() override;
+ ~LogChannelDWARF() override;
- static void
- Initialize();
+ static void Initialize();
- static void
- Terminate();
+ static void Terminate();
- static lldb_private::ConstString
- GetPluginNameStatic();
+ static lldb_private::ConstString GetPluginNameStatic();
- static const char *
- GetPluginDescriptionStatic();
+ static const char *GetPluginDescriptionStatic();
- static lldb_private::LogChannel *
- CreateInstance ();
+ static lldb_private::LogChannel *CreateInstance();
- lldb_private::ConstString
- GetPluginName() override;
+ lldb_private::ConstString GetPluginName() override;
- uint32_t
- GetPluginVersion() override;
+ uint32_t GetPluginVersion() override;
- void
- Disable(const char** categories, lldb_private::Stream *feedback_strm) override;
+ void Disable(const char **categories,
+ lldb_private::Stream *feedback_strm) override;
- void
- Delete ();
+ void Delete();
- bool
- Enable(lldb::StreamSP &log_stream_sp,
- uint32_t log_options,
- lldb_private::Stream *feedback_strm, // Feedback stream for argument errors etc
- const char **categories) override; // The categories to enable within this logging stream, if empty, enable default set
+ bool Enable(lldb::StreamSP &log_stream_sp, uint32_t log_options,
+ lldb_private::Stream
+ *feedback_strm, // Feedback stream for argument errors etc
+ const char **categories) override; // The categories to enable
+ // within this logging stream,
+ // if empty, enable default set
- void
- ListCategories(lldb_private::Stream *strm) override;
+ void ListCategories(lldb_private::Stream *strm) override;
- static lldb_private::Log *
- GetLog ();
+ static lldb_private::Log *GetLog();
- static lldb_private::Log *
- GetLogIfAll (uint32_t mask);
-
- static lldb_private::Log *
- GetLogIfAny (uint32_t mask);
-
- static void
- LogIf (uint32_t mask, const char *format, ...);
+ static lldb_private::Log *GetLogIfAll(uint32_t mask);
+
+ static lldb_private::Log *GetLogIfAny(uint32_t mask);
+
+ static void LogIf(uint32_t mask, const char *format, ...);
};
#endif // SymbolFileDWARF_LogChannelDWARF_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
index fe02adbb6c8..df185267c08 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
@@ -9,9 +9,9 @@
#include "NameToDIE.h"
#include "lldb/Core/ConstString.h"
+#include "lldb/Core/RegularExpression.h"
#include "lldb/Core/Stream.h"
#include "lldb/Core/StreamString.h"
-#include "lldb/Core/RegularExpression.h"
#include "lldb/Symbol/ObjectFile.h"
#include "DWARFCompileUnit.h"
@@ -22,75 +22,61 @@
using namespace lldb;
using namespace lldb_private;
-void
-NameToDIE::Finalize()
-{
- m_map.Sort ();
- m_map.SizeToFit ();
+void NameToDIE::Finalize() {
+ m_map.Sort();
+ m_map.SizeToFit();
}
-void
-NameToDIE::Insert (const ConstString& name, const DIERef& die_ref)
-{
- m_map.Append(name.GetCString(), die_ref);
+void NameToDIE::Insert(const ConstString &name, const DIERef &die_ref) {
+ m_map.Append(name.GetCString(), die_ref);
}
-size_t
-NameToDIE::Find (const ConstString &name, DIEArray &info_array) const
-{
- return m_map.GetValues (name.GetCString(), info_array);
+size_t NameToDIE::Find(const ConstString &name, DIEArray &info_array) const {
+ return m_map.GetValues(name.GetCString(), info_array);
}
-size_t
-NameToDIE::Find (const RegularExpression& regex, DIEArray &info_array) const
-{
- return m_map.GetValues (regex, info_array);
+size_t NameToDIE::Find(const RegularExpression &regex,
+ DIEArray &info_array) const {
+ return m_map.GetValues(regex, info_array);
}
-size_t
-NameToDIE::FindAllEntriesForCompileUnit (dw_offset_t cu_offset, DIEArray &info_array) const
-{
- const size_t initial_size = info_array.size();
- const uint32_t size = m_map.GetSize();
- for (uint32_t i=0; i<size; ++i)
- {
- const DIERef& die_ref = m_map.GetValueAtIndexUnchecked(i);
- if (cu_offset == die_ref.cu_offset)
- info_array.push_back (die_ref);
- }
- return info_array.size() - initial_size;
+size_t NameToDIE::FindAllEntriesForCompileUnit(dw_offset_t cu_offset,
+ DIEArray &info_array) const {
+ const size_t initial_size = info_array.size();
+ const uint32_t size = m_map.GetSize();
+ for (uint32_t i = 0; i < size; ++i) {
+ const DIERef &die_ref = m_map.GetValueAtIndexUnchecked(i);
+ if (cu_offset == die_ref.cu_offset)
+ info_array.push_back(die_ref);
+ }
+ return info_array.size() - initial_size;
}
-void
-NameToDIE::Dump (Stream *s)
-{
- const uint32_t size = m_map.GetSize();
- for (uint32_t i=0; i<size; ++i)
- {
- const char *cstr = m_map.GetCStringAtIndex(i);
- const DIERef& die_ref = m_map.GetValueAtIndexUnchecked(i);
- s->Printf("%p: {0x%8.8x/0x%8.8x} \"%s\"\n", (const void*) cstr, die_ref.cu_offset, die_ref.die_offset, cstr);
- }
+void NameToDIE::Dump(Stream *s) {
+ const uint32_t size = m_map.GetSize();
+ for (uint32_t i = 0; i < size; ++i) {
+ const char *cstr = m_map.GetCStringAtIndex(i);
+ const DIERef &die_ref = m_map.GetValueAtIndexUnchecked(i);
+ s->Printf("%p: {0x%8.8x/0x%8.8x} \"%s\"\n", (const void *)cstr,
+ die_ref.cu_offset, die_ref.die_offset, cstr);
+ }
}
-void
-NameToDIE::ForEach (std::function <bool(const char *name, const DIERef& die_ref)> const &callback) const
-{
- const uint32_t size = m_map.GetSize();
- for (uint32_t i=0; i<size; ++i)
- {
- if (!callback(m_map.GetCStringAtIndexUnchecked(i), m_map.GetValueAtIndexUnchecked (i)))
- break;
- }
+void NameToDIE::ForEach(
+ std::function<bool(const char *name, const DIERef &die_ref)> const
+ &callback) const {
+ const uint32_t size = m_map.GetSize();
+ for (uint32_t i = 0; i < size; ++i) {
+ if (!callback(m_map.GetCStringAtIndexUnchecked(i),
+ m_map.GetValueAtIndexUnchecked(i)))
+ break;
+ }
}
-void
-NameToDIE::Append (const NameToDIE& other)
-{
- const uint32_t size = other.m_map.GetSize();
- for (uint32_t i = 0; i < size; ++i)
- {
- m_map.Append(other.m_map.GetCStringAtIndexUnchecked (i),
- other.m_map.GetValueAtIndexUnchecked (i));
- }
+void NameToDIE::Append(const NameToDIE &other) {
+ const uint32_t size = other.m_map.GetSize();
+ for (uint32_t i = 0; i < size; ++i) {
+ m_map.Append(other.m_map.GetCStringAtIndexUnchecked(i),
+ other.m_map.GetValueAtIndexUnchecked(i));
+ }
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h
index 7fc66138f51..d9a7f197fa6 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h
@@ -12,51 +12,42 @@
#include <functional>
-#include "lldb/Core/dwarf.h"
+#include "DIERef.h"
#include "lldb/Core/UniqueCStringMap.h"
+#include "lldb/Core/dwarf.h"
#include "lldb/lldb-defines.h"
-#include "DIERef.h"
class SymbolFileDWARF;
-class NameToDIE
-{
+class NameToDIE {
public:
- NameToDIE () :
- m_map()
- {
- }
+ NameToDIE() : m_map() {}
+
+ ~NameToDIE() {}
- ~NameToDIE ()
- {
- }
+ void Dump(lldb_private::Stream *s);
- void
- Dump (lldb_private::Stream *s);
+ void Insert(const lldb_private::ConstString &name, const DIERef &die_ref);
- void
- Insert (const lldb_private::ConstString& name, const DIERef& die_ref);
+ void Append(const NameToDIE &other);
- void
- Append (const NameToDIE& other);
+ void Finalize();
- void
- Finalize();
+ size_t Find(const lldb_private::ConstString &name,
+ DIEArray &info_array) const;
- size_t
- Find (const lldb_private::ConstString &name, DIEArray &info_array) const;
-
- size_t
- Find (const lldb_private::RegularExpression& regex, DIEArray &info_array) const;
+ size_t Find(const lldb_private::RegularExpression &regex,
+ DIEArray &info_array) const;
- size_t
- FindAllEntriesForCompileUnit (dw_offset_t cu_offset, DIEArray &info_array) const;
+ size_t FindAllEntriesForCompileUnit(dw_offset_t cu_offset,
+ DIEArray &info_array) const;
- void
- ForEach (std::function <bool(const char *name, const DIERef& die_ref)> const &callback) const;
+ void
+ ForEach(std::function<bool(const char *name, const DIERef &die_ref)> const
+ &callback) const;
protected:
- lldb_private::UniqueCStringMap<DIERef> m_map;
+ lldb_private::UniqueCStringMap<DIERef> m_map;
};
-#endif // SymbolFileDWARF_NameToDIE_h_
+#endif // SymbolFileDWARF_NameToDIE_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index eb23f4204c2..e9edee6bc73 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -88,8 +88,8 @@
using namespace lldb;
using namespace lldb_private;
-//static inline bool
-//child_requires_parent_class_union_or_struct_to_be_completed (dw_tag_t tag)
+// static inline bool
+// child_requires_parent_class_union_or_struct_to_be_completed (dw_tag_t tag)
//{
// switch (tag)
// {
@@ -108,4713 +108,4169 @@ using namespace lldb_private;
namespace {
- PropertyDefinition
- g_properties[] =
- {
- { "comp-dir-symlink-paths" , OptionValue::eTypeFileSpecList, true, 0 , nullptr, nullptr, "If the DW_AT_comp_dir matches any of these paths the symbolic links will be resolved at DWARF parse time." },
- { nullptr , OptionValue::eTypeInvalid , false, 0, nullptr, nullptr, nullptr }
- };
-
- enum
- {
- ePropertySymLinkPaths
- };
-
-
- class PluginProperties : public Properties
- {
- public:
- static ConstString
- GetSettingName()
- {
- return SymbolFileDWARF::GetPluginNameStatic();
- }
+PropertyDefinition g_properties[] = {
+ {"comp-dir-symlink-paths", OptionValue::eTypeFileSpecList, true, 0, nullptr,
+ nullptr, "If the DW_AT_comp_dir matches any of these paths the symbolic "
+ "links will be resolved at DWARF parse time."},
+ {nullptr, OptionValue::eTypeInvalid, false, 0, nullptr, nullptr, nullptr}};
+
+enum { ePropertySymLinkPaths };
+
+class PluginProperties : public Properties {
+public:
+ static ConstString GetSettingName() {
+ return SymbolFileDWARF::GetPluginNameStatic();
+ }
+
+ PluginProperties() {
+ m_collection_sp.reset(new OptionValueProperties(GetSettingName()));
+ m_collection_sp->Initialize(g_properties);
+ }
+
+ FileSpecList &GetSymLinkPaths() {
+ OptionValueFileSpecList *option_value =
+ m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(
+ nullptr, true, ePropertySymLinkPaths);
+ assert(option_value);
+ return option_value->GetCurrentValue();
+ }
+};
- PluginProperties()
- {
- m_collection_sp.reset (new OptionValueProperties(GetSettingName()));
- m_collection_sp->Initialize(g_properties);
- }
+typedef std::shared_ptr<PluginProperties> SymbolFileDWARFPropertiesSP;
- FileSpecList&
- GetSymLinkPaths()
- {
- OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, true, ePropertySymLinkPaths);
- assert(option_value);
- return option_value->GetCurrentValue();
- }
+static const SymbolFileDWARFPropertiesSP &GetGlobalPluginProperties() {
+ static const auto g_settings_sp(std::make_shared<PluginProperties>());
+ return g_settings_sp;
+}
- };
+} // anonymous namespace end
- typedef std::shared_ptr<PluginProperties> SymbolFileDWARFPropertiesSP;
+static const char *removeHostnameFromPathname(const char *path_from_dwarf) {
+ if (!path_from_dwarf || !path_from_dwarf[0]) {
+ return path_from_dwarf;
+ }
- static const SymbolFileDWARFPropertiesSP&
- GetGlobalPluginProperties()
- {
- static const auto g_settings_sp(std::make_shared<PluginProperties>());
- return g_settings_sp;
- }
+ const char *colon_pos = strchr(path_from_dwarf, ':');
+ if (nullptr == colon_pos) {
+ return path_from_dwarf;
+ }
-} // anonymous namespace end
+ const char *slash_pos = strchr(path_from_dwarf, '/');
+ if (slash_pos && (slash_pos < colon_pos)) {
+ return path_from_dwarf;
+ }
+ // check whether we have a windows path, and so the first character
+ // is a drive-letter not a hostname.
+ if (colon_pos == path_from_dwarf + 1 && isalpha(*path_from_dwarf) &&
+ strlen(path_from_dwarf) > 2 && '\\' == path_from_dwarf[2]) {
+ return path_from_dwarf;
+ }
-static const char*
-removeHostnameFromPathname(const char* path_from_dwarf)
-{
- if (!path_from_dwarf || !path_from_dwarf[0])
- {
- return path_from_dwarf;
- }
-
- const char *colon_pos = strchr(path_from_dwarf, ':');
- if (nullptr == colon_pos)
- {
- return path_from_dwarf;
- }
-
- const char *slash_pos = strchr(path_from_dwarf, '/');
- if (slash_pos && (slash_pos < colon_pos))
- {
- return path_from_dwarf;
- }
-
- // check whether we have a windows path, and so the first character
- // is a drive-letter not a hostname.
- if (
- colon_pos == path_from_dwarf + 1 &&
- isalpha(*path_from_dwarf) &&
- strlen(path_from_dwarf) > 2 &&
- '\\' == path_from_dwarf[2])
- {
- return path_from_dwarf;
- }
-
- return colon_pos + 1;
+ return colon_pos + 1;
}
-static const char*
-resolveCompDir(const char* path_from_dwarf)
-{
- if (!path_from_dwarf)
- return nullptr;
+static const char *resolveCompDir(const char *path_from_dwarf) {
+ if (!path_from_dwarf)
+ return nullptr;
- // DWARF2/3 suggests the form hostname:pathname for compilation directory.
- // Remove the host part if present.
- const char* local_path = removeHostnameFromPathname(path_from_dwarf);
- if (!local_path)
- return nullptr;
+ // DWARF2/3 suggests the form hostname:pathname for compilation directory.
+ // Remove the host part if present.
+ const char *local_path = removeHostnameFromPathname(path_from_dwarf);
+ if (!local_path)
+ return nullptr;
- bool is_symlink = false;
- FileSpec local_path_spec(local_path, false);
- const auto& file_specs = GetGlobalPluginProperties()->GetSymLinkPaths();
- for (size_t i = 0; i < file_specs.GetSize() && !is_symlink; ++i)
- is_symlink = FileSpec::Equal(file_specs.GetFileSpecAtIndex(i), local_path_spec, true);
+ bool is_symlink = false;
+ FileSpec local_path_spec(local_path, false);
+ const auto &file_specs = GetGlobalPluginProperties()->GetSymLinkPaths();
+ for (size_t i = 0; i < file_specs.GetSize() && !is_symlink; ++i)
+ is_symlink = FileSpec::Equal(file_specs.GetFileSpecAtIndex(i),
+ local_path_spec, true);
- if (!is_symlink)
- return local_path;
+ if (!is_symlink)
+ return local_path;
- if (!local_path_spec.IsSymbolicLink())
- return local_path;
+ if (!local_path_spec.IsSymbolicLink())
+ return local_path;
- FileSpec resolved_local_path_spec;
- const auto error = FileSystem::Readlink(local_path_spec, resolved_local_path_spec);
- if (error.Success())
- return resolved_local_path_spec.GetCString();
+ FileSpec resolved_local_path_spec;
+ const auto error =
+ FileSystem::Readlink(local_path_spec, resolved_local_path_spec);
+ if (error.Success())
+ return resolved_local_path_spec.GetCString();
- return nullptr;
+ return nullptr;
}
-
-void
-SymbolFileDWARF::Initialize()
-{
- LogChannelDWARF::Initialize();
- PluginManager::RegisterPlugin (GetPluginNameStatic(),
- GetPluginDescriptionStatic(),
- CreateInstance,
- DebuggerInitialize);
+void SymbolFileDWARF::Initialize() {
+ LogChannelDWARF::Initialize();
+ PluginManager::RegisterPlugin(GetPluginNameStatic(),
+ GetPluginDescriptionStatic(), CreateInstance,
+ DebuggerInitialize);
}
-void
-SymbolFileDWARF::DebuggerInitialize(Debugger &debugger)
-{
- if (!PluginManager::GetSettingForSymbolFilePlugin(debugger, PluginProperties::GetSettingName()))
- {
- const bool is_global_setting = true;
- PluginManager::CreateSettingForSymbolFilePlugin(debugger,
- GetGlobalPluginProperties()->GetValueProperties(),
- ConstString ("Properties for the dwarf symbol-file plug-in."),
- is_global_setting);
- }
+void SymbolFileDWARF::DebuggerInitialize(Debugger &debugger) {
+ if (!PluginManager::GetSettingForSymbolFilePlugin(
+ debugger, PluginProperties::GetSettingName())) {
+ const bool is_global_setting = true;
+ PluginManager::CreateSettingForSymbolFilePlugin(
+ debugger, GetGlobalPluginProperties()->GetValueProperties(),
+ ConstString("Properties for the dwarf symbol-file plug-in."),
+ is_global_setting);
+ }
}
-void
-SymbolFileDWARF::Terminate()
-{
- PluginManager::UnregisterPlugin (CreateInstance);
- LogChannelDWARF::Initialize();
+void SymbolFileDWARF::Terminate() {
+ PluginManager::UnregisterPlugin(CreateInstance);
+ LogChannelDWARF::Initialize();
}
-
-lldb_private::ConstString
-SymbolFileDWARF::GetPluginNameStatic()
-{
- static ConstString g_name("dwarf");
- return g_name;
+lldb_private::ConstString SymbolFileDWARF::GetPluginNameStatic() {
+ static ConstString g_name("dwarf");
+ return g_name;
}
-const char *
-SymbolFileDWARF::GetPluginDescriptionStatic()
-{
- return "DWARF and DWARF3 debug symbol file reader.";
+const char *SymbolFileDWARF::GetPluginDescriptionStatic() {
+ return "DWARF and DWARF3 debug symbol file reader.";
}
-
-SymbolFile*
-SymbolFileDWARF::CreateInstance (ObjectFile* obj_file)
-{
- return new SymbolFileDWARF(obj_file);
+SymbolFile *SymbolFileDWARF::CreateInstance(ObjectFile *obj_file) {
+ return new SymbolFileDWARF(obj_file);
}
-TypeList *
-SymbolFileDWARF::GetTypeList ()
-{
- SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
- if (debug_map_symfile)
- return debug_map_symfile->GetTypeList();
- else
- return m_obj_file->GetModule()->GetTypeList();
-
+TypeList *SymbolFileDWARF::GetTypeList() {
+ SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+ if (debug_map_symfile)
+ return debug_map_symfile->GetTypeList();
+ else
+ return m_obj_file->GetModule()->GetTypeList();
}
-void
-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 (die)
- {
- const dw_offset_t die_offset = die.GetOffset();
-
- if (die_offset >= max_die_offset)
- return;
-
- if (die_offset >= min_die_offset)
- {
- const dw_tag_t tag = die.Tag();
-
- bool add_type = false;
-
- 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)
- {
- if (type_set.find(type) == type_set.end())
- type_set.insert(type);
- }
- }
- }
-
- 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);
+void 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 (die) {
+ const dw_offset_t die_offset = die.GetOffset();
+
+ if (die_offset >= max_die_offset)
+ return;
+
+ if (die_offset >= min_die_offset) {
+ const dw_tag_t tag = die.Tag();
+
+ bool add_type = false;
+
+ 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) {
+ if (type_set.find(type) == type_set.end())
+ type_set.insert(type);
}
+ }
}
+
+ 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);
+ }
+ }
}
-size_t
-SymbolFileDWARF::GetTypes (SymbolContextScope *sc_scope,
- uint32_t type_mask,
- TypeList &type_list)
+size_t SymbolFileDWARF::GetTypes(SymbolContextScope *sc_scope,
+ uint32_t type_mask, TypeList &type_list)
{
- TypeSet type_set;
-
- CompileUnit *comp_unit = NULL;
- DWARFCompileUnit* dwarf_cu = NULL;
- if (sc_scope)
- comp_unit = sc_scope->CalculateSymbolContextCompileUnit();
-
- if (comp_unit)
- {
- dwarf_cu = GetDWARFCompileUnit(comp_unit);
- if (dwarf_cu == 0)
- return 0;
- GetTypes (dwarf_cu->DIE(),
- dwarf_cu->GetOffset(),
- dwarf_cu->GetNextCompileUnitOffset(),
- type_mask,
- type_set);
- }
- else
- {
- DWARFDebugInfo* info = DebugInfo();
- if (info)
- {
- const size_t num_cus = info->GetNumCompileUnits();
- for (size_t cu_idx=0; cu_idx<num_cus; ++cu_idx)
- {
- dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
- if (dwarf_cu)
- {
- GetTypes (dwarf_cu->DIE(),
- 0,
- UINT32_MAX,
- type_mask,
- type_set);
- }
- }
+ TypeSet type_set;
+
+ CompileUnit *comp_unit = NULL;
+ DWARFCompileUnit *dwarf_cu = NULL;
+ if (sc_scope)
+ comp_unit = sc_scope->CalculateSymbolContextCompileUnit();
+
+ if (comp_unit) {
+ dwarf_cu = GetDWARFCompileUnit(comp_unit);
+ if (dwarf_cu == 0)
+ return 0;
+ GetTypes(dwarf_cu->DIE(), dwarf_cu->GetOffset(),
+ dwarf_cu->GetNextCompileUnitOffset(), type_mask, type_set);
+ } else {
+ DWARFDebugInfo *info = DebugInfo();
+ if (info) {
+ const size_t num_cus = info->GetNumCompileUnits();
+ for (size_t cu_idx = 0; cu_idx < num_cus; ++cu_idx) {
+ dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
+ if (dwarf_cu) {
+ GetTypes(dwarf_cu->DIE(), 0, UINT32_MAX, type_mask, type_set);
}
+ }
}
-
- std::set<CompilerType> compiler_type_set;
- size_t num_types_added = 0;
- for (Type *type : type_set)
- {
- CompilerType compiler_type = type->GetForwardCompilerType ();
- if (compiler_type_set.find(compiler_type) == compiler_type_set.end())
- {
- compiler_type_set.insert(compiler_type);
- type_list.Insert (type->shared_from_this());
- ++num_types_added;
- }
+ }
+
+ std::set<CompilerType> compiler_type_set;
+ size_t num_types_added = 0;
+ for (Type *type : type_set) {
+ CompilerType compiler_type = type->GetForwardCompilerType();
+ if (compiler_type_set.find(compiler_type) == compiler_type_set.end()) {
+ compiler_type_set.insert(compiler_type);
+ type_list.Insert(type->shared_from_this());
+ ++num_types_added;
}
- return num_types_added;
+ }
+ return num_types_added;
}
-
//----------------------------------------------------------------------
// Gets the first parent that is a lexical block, function or inlined
// subroutine, or compile unit.
//----------------------------------------------------------------------
DWARFDIE
-SymbolFileDWARF::GetParentSymbolContextDIE(const DWARFDIE &child_die)
-{
- DWARFDIE die;
- for (die = child_die.GetParent(); die; die = die.GetParent())
- {
- dw_tag_t tag = die.Tag();
-
- switch (tag)
- {
- case DW_TAG_compile_unit:
- case DW_TAG_subprogram:
- case DW_TAG_inlined_subroutine:
- case DW_TAG_lexical_block:
- return die;
- }
+SymbolFileDWARF::GetParentSymbolContextDIE(const DWARFDIE &child_die) {
+ DWARFDIE die;
+ for (die = child_die.GetParent(); die; die = die.GetParent()) {
+ dw_tag_t tag = die.Tag();
+
+ switch (tag) {
+ case DW_TAG_compile_unit:
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_lexical_block:
+ return die;
}
- return DWARFDIE();
+ }
+ return DWARFDIE();
}
-
-SymbolFileDWARF::SymbolFileDWARF(ObjectFile* objfile) :
- SymbolFile (objfile),
- UserID (0), // Used by SymbolFileDWARFDebugMap to when this class parses .o files to contain the .o file index/ID
- m_debug_map_module_wp (),
- m_debug_map_symfile (NULL),
- m_data_debug_abbrev (),
- m_data_debug_aranges (),
- m_data_debug_frame (),
- m_data_debug_info (),
- m_data_debug_line (),
- m_data_debug_macro (),
- m_data_debug_loc (),
- m_data_debug_ranges (),
- m_data_debug_str (),
- m_data_apple_names (),
- m_data_apple_types (),
- m_data_apple_namespaces (),
- m_abbr(),
- m_info(),
- m_line(),
- m_apple_names_ap (),
- m_apple_types_ap (),
- m_apple_namespaces_ap (),
- m_apple_objc_ap (),
- m_function_basename_index(),
- m_function_fullname_index(),
- m_function_method_index(),
- m_function_selector_index(),
- m_objc_class_selectors_index(),
- m_global_index(),
- m_type_index(),
- m_namespace_index(),
- m_indexed (false),
- m_using_apple_tables (false),
- m_fetched_external_modules (false),
- m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate),
- m_ranges(),
- m_unique_ast_type_map ()
-{
+SymbolFileDWARF::SymbolFileDWARF(ObjectFile *objfile)
+ : SymbolFile(objfile), UserID(0), // Used by SymbolFileDWARFDebugMap to when
+ // this class parses .o files to contain
+ // the .o file index/ID
+ m_debug_map_module_wp(), m_debug_map_symfile(NULL), m_data_debug_abbrev(),
+ m_data_debug_aranges(), m_data_debug_frame(), m_data_debug_info(),
+ m_data_debug_line(), m_data_debug_macro(), m_data_debug_loc(),
+ m_data_debug_ranges(), m_data_debug_str(), m_data_apple_names(),
+ m_data_apple_types(), m_data_apple_namespaces(), m_abbr(), m_info(),
+ m_line(), m_apple_names_ap(), m_apple_types_ap(), m_apple_namespaces_ap(),
+ m_apple_objc_ap(), m_function_basename_index(),
+ m_function_fullname_index(), m_function_method_index(),
+ m_function_selector_index(), m_objc_class_selectors_index(),
+ m_global_index(), m_type_index(), m_namespace_index(), m_indexed(false),
+ m_using_apple_tables(false), m_fetched_external_modules(false),
+ m_supports_DW_AT_APPLE_objc_complete_type(eLazyBoolCalculate), m_ranges(),
+ m_unique_ast_type_map() {}
+
+SymbolFileDWARF::~SymbolFileDWARF() {}
+
+static const ConstString &GetDWARFMachOSegmentName() {
+ static ConstString g_dwarf_section_name("__DWARF");
+ return g_dwarf_section_name;
}
-SymbolFileDWARF::~SymbolFileDWARF()
-{
+UniqueDWARFASTTypeMap &SymbolFileDWARF::GetUniqueDWARFASTTypeMap() {
+ SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+ if (debug_map_symfile)
+ return debug_map_symfile->GetUniqueDWARFASTTypeMap();
+ else
+ return m_unique_ast_type_map;
}
-static const ConstString &
-GetDWARFMachOSegmentName ()
-{
- static ConstString g_dwarf_section_name ("__DWARF");
- return g_dwarf_section_name;
+TypeSystem *SymbolFileDWARF::GetTypeSystemForLanguage(LanguageType language) {
+ SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+ TypeSystem *type_system;
+ if (debug_map_symfile) {
+ type_system = debug_map_symfile->GetTypeSystemForLanguage(language);
+ } else {
+ type_system = m_obj_file->GetModule()->GetTypeSystemForLanguage(language);
+ if (type_system)
+ type_system->SetSymbolFile(this);
+ }
+ return type_system;
}
-UniqueDWARFASTTypeMap &
-SymbolFileDWARF::GetUniqueDWARFASTTypeMap ()
-{
- SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
- if (debug_map_symfile)
- return debug_map_symfile->GetUniqueDWARFASTTypeMap ();
+void SymbolFileDWARF::InitializeObject() {
+ ModuleSP module_sp(m_obj_file->GetModule());
+ if (module_sp) {
+ const SectionList *section_list = module_sp->GetSectionList();
+ const Section *section =
+ section_list->FindSectionByName(GetDWARFMachOSegmentName()).get();
+
+ // Memory map the DWARF mach-o segment so we have everything mmap'ed
+ // to keep our heap memory usage down.
+ if (section)
+ m_obj_file->MemoryMapSectionData(section, m_dwarf_data);
+ }
+
+ get_apple_names_data();
+ if (m_data_apple_names.m_data.GetByteSize() > 0) {
+ m_apple_names_ap.reset(new DWARFMappedHash::MemoryTable(
+ m_data_apple_names.m_data, get_debug_str_data(), ".apple_names"));
+ if (m_apple_names_ap->IsValid())
+ m_using_apple_tables = true;
else
- return m_unique_ast_type_map;
-}
-
-TypeSystem *
-SymbolFileDWARF::GetTypeSystemForLanguage (LanguageType language)
-{
- SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
- TypeSystem *type_system;
- if (debug_map_symfile)
- {
- type_system = debug_map_symfile->GetTypeSystemForLanguage(language);
- }
+ m_apple_names_ap.reset();
+ }
+ get_apple_types_data();
+ if (m_data_apple_types.m_data.GetByteSize() > 0) {
+ m_apple_types_ap.reset(new DWARFMappedHash::MemoryTable(
+ m_data_apple_types.m_data, get_debug_str_data(), ".apple_types"));
+ if (m_apple_types_ap->IsValid())
+ m_using_apple_tables = true;
else
- {
- type_system = m_obj_file->GetModule()->GetTypeSystemForLanguage(language);
- if (type_system)
- type_system->SetSymbolFile(this);
- }
- return type_system;
-}
-
-void
-SymbolFileDWARF::InitializeObject()
-{
- ModuleSP module_sp (m_obj_file->GetModule());
- if (module_sp)
- {
- const SectionList *section_list = module_sp->GetSectionList();
- const Section* section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get();
-
- // Memory map the DWARF mach-o segment so we have everything mmap'ed
- // to keep our heap memory usage down.
- if (section)
- m_obj_file->MemoryMapSectionData(section, m_dwarf_data);
- }
-
- get_apple_names_data();
- if (m_data_apple_names.m_data.GetByteSize() > 0)
- {
- m_apple_names_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_names.m_data,
- get_debug_str_data(),
- ".apple_names"));
- if (m_apple_names_ap->IsValid())
- m_using_apple_tables = true;
- else
- m_apple_names_ap.reset();
- }
- get_apple_types_data();
- if (m_data_apple_types.m_data.GetByteSize() > 0)
- {
- m_apple_types_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_types.m_data,
- get_debug_str_data(),
- ".apple_types"));
- if (m_apple_types_ap->IsValid())
- m_using_apple_tables = true;
- else
- m_apple_types_ap.reset();
- }
-
- get_apple_namespaces_data();
- if (m_data_apple_namespaces.m_data.GetByteSize() > 0)
- {
- m_apple_namespaces_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_namespaces.m_data,
- get_debug_str_data(),
- ".apple_namespaces"));
- if (m_apple_namespaces_ap->IsValid())
- m_using_apple_tables = true;
- else
- m_apple_namespaces_ap.reset();
- }
-
- get_apple_objc_data();
- if (m_data_apple_objc.m_data.GetByteSize() > 0)
- {
- m_apple_objc_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_objc.m_data,
- get_debug_str_data(),
- ".apple_objc"));
- if (m_apple_objc_ap->IsValid())
- m_using_apple_tables = true;
- else
- m_apple_objc_ap.reset();
- }
+ m_apple_types_ap.reset();
+ }
+
+ get_apple_namespaces_data();
+ if (m_data_apple_namespaces.m_data.GetByteSize() > 0) {
+ m_apple_namespaces_ap.reset(new DWARFMappedHash::MemoryTable(
+ m_data_apple_namespaces.m_data, get_debug_str_data(),
+ ".apple_namespaces"));
+ if (m_apple_namespaces_ap->IsValid())
+ m_using_apple_tables = true;
+ else
+ m_apple_namespaces_ap.reset();
+ }
+
+ get_apple_objc_data();
+ if (m_data_apple_objc.m_data.GetByteSize() > 0) {
+ m_apple_objc_ap.reset(new DWARFMappedHash::MemoryTable(
+ m_data_apple_objc.m_data, get_debug_str_data(), ".apple_objc"));
+ if (m_apple_objc_ap->IsValid())
+ m_using_apple_tables = true;
+ else
+ m_apple_objc_ap.reset();
+ }
}
-bool
-SymbolFileDWARF::SupportedVersion(uint16_t version)
-{
- return version == 2 || version == 3 || version == 4;
+bool SymbolFileDWARF::SupportedVersion(uint16_t version) {
+ return version == 2 || version == 3 || version == 4;
}
-uint32_t
-SymbolFileDWARF::CalculateAbilities ()
-{
- uint32_t abilities = 0;
- if (m_obj_file != NULL)
- {
- const Section* section = NULL;
- const SectionList *section_list = m_obj_file->GetSectionList();
- if (section_list == NULL)
- return 0;
-
- uint64_t debug_abbrev_file_size = 0;
- uint64_t debug_info_file_size = 0;
- uint64_t debug_line_file_size = 0;
-
- section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get();
-
- if (section)
- section_list = &section->GetChildren ();
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugInfo, true).get();
- if (section != NULL)
- {
- debug_info_file_size = section->GetFileSize();
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugAbbrev, true).get();
- if (section)
- debug_abbrev_file_size = section->GetFileSize();
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugLine, true).get();
- if (section)
- debug_line_file_size = section->GetFileSize();
- }
- else
- {
- const char *symfile_dir_cstr = m_obj_file->GetFileSpec().GetDirectory().GetCString();
- if (symfile_dir_cstr)
- {
- if (strcasestr(symfile_dir_cstr, ".dsym"))
- {
- if (m_obj_file->GetType() == ObjectFile::eTypeDebugInfo)
- {
- // We have a dSYM file that didn't have a any debug info.
- // If the string table has a size of 1, then it was made from
- // an executable with no debug info, or from an executable that
- // was stripped.
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get();
- if (section && section->GetFileSize() == 1)
- {
- m_obj_file->GetModule()->ReportWarning ("empty dSYM file detected, dSYM was created with an executable with no debug info.");
- }
- }
- }
+uint32_t SymbolFileDWARF::CalculateAbilities() {
+ uint32_t abilities = 0;
+ if (m_obj_file != NULL) {
+ const Section *section = NULL;
+ const SectionList *section_list = m_obj_file->GetSectionList();
+ if (section_list == NULL)
+ return 0;
+
+ uint64_t debug_abbrev_file_size = 0;
+ uint64_t debug_info_file_size = 0;
+ uint64_t debug_line_file_size = 0;
+
+ section = section_list->FindSectionByName(GetDWARFMachOSegmentName()).get();
+
+ if (section)
+ section_list = &section->GetChildren();
+
+ section =
+ section_list->FindSectionByType(eSectionTypeDWARFDebugInfo, true).get();
+ if (section != NULL) {
+ debug_info_file_size = section->GetFileSize();
+
+ section =
+ section_list->FindSectionByType(eSectionTypeDWARFDebugAbbrev, true)
+ .get();
+ if (section)
+ debug_abbrev_file_size = section->GetFileSize();
+
+ section =
+ section_list->FindSectionByType(eSectionTypeDWARFDebugLine, true)
+ .get();
+ if (section)
+ debug_line_file_size = section->GetFileSize();
+ } else {
+ const char *symfile_dir_cstr =
+ m_obj_file->GetFileSpec().GetDirectory().GetCString();
+ if (symfile_dir_cstr) {
+ if (strcasestr(symfile_dir_cstr, ".dsym")) {
+ if (m_obj_file->GetType() == ObjectFile::eTypeDebugInfo) {
+ // We have a dSYM file that didn't have a any debug info.
+ // If the string table has a size of 1, then it was made from
+ // an executable with no debug info, or from an executable that
+ // was stripped.
+ section =
+ section_list->FindSectionByType(eSectionTypeDWARFDebugStr, true)
+ .get();
+ if (section && section->GetFileSize() == 1) {
+ m_obj_file->GetModule()->ReportWarning(
+ "empty dSYM file detected, dSYM was created with an "
+ "executable with no debug info.");
}
+ }
}
+ }
+ }
- if (debug_abbrev_file_size > 0 && debug_info_file_size > 0)
- abilities |= CompileUnits | Functions | Blocks | GlobalVariables | LocalVariables | VariableTypes;
+ if (debug_abbrev_file_size > 0 && debug_info_file_size > 0)
+ abilities |= CompileUnits | Functions | Blocks | GlobalVariables |
+ LocalVariables | VariableTypes;
- if (debug_line_file_size > 0)
- abilities |= LineTables;
- }
- return abilities;
+ if (debug_line_file_size > 0)
+ abilities |= LineTables;
+ }
+ return abilities;
}
-const DWARFDataExtractor&
-SymbolFileDWARF::GetCachedSectionData (lldb::SectionType sect_type, DWARFDataSegment& data_segment)
-{
- std::call_once(data_segment.m_flag,
- &SymbolFileDWARF::LoadSectionData,
- this,
- sect_type,
- std::ref(data_segment.m_data));
- return data_segment.m_data;
+const DWARFDataExtractor &
+SymbolFileDWARF::GetCachedSectionData(lldb::SectionType sect_type,
+ DWARFDataSegment &data_segment) {
+ std::call_once(data_segment.m_flag, &SymbolFileDWARF::LoadSectionData, this,
+ sect_type, std::ref(data_segment.m_data));
+ return data_segment.m_data;
}
-void
-SymbolFileDWARF::LoadSectionData (lldb::SectionType sect_type, DWARFDataExtractor& data)
-{
- ModuleSP module_sp (m_obj_file->GetModule());
- const SectionList *section_list = module_sp->GetSectionList();
- if (section_list)
- {
- SectionSP section_sp (section_list->FindSectionByType(sect_type, true));
- if (section_sp)
- {
- // See if we memory mapped the DWARF segment?
- if (m_dwarf_data.GetByteSize())
- {
- data.SetData(m_dwarf_data, section_sp->GetOffset(), section_sp->GetFileSize());
- }
- else
- {
- if (m_obj_file->ReadSectionData(section_sp.get(), data) == 0)
- data.Clear();
- }
- }
+void SymbolFileDWARF::LoadSectionData(lldb::SectionType sect_type,
+ DWARFDataExtractor &data) {
+ ModuleSP module_sp(m_obj_file->GetModule());
+ const SectionList *section_list = module_sp->GetSectionList();
+ if (section_list) {
+ SectionSP section_sp(section_list->FindSectionByType(sect_type, true));
+ if (section_sp) {
+ // See if we memory mapped the DWARF segment?
+ if (m_dwarf_data.GetByteSize()) {
+ data.SetData(m_dwarf_data, section_sp->GetOffset(),
+ section_sp->GetFileSize());
+ } else {
+ if (m_obj_file->ReadSectionData(section_sp.get(), data) == 0)
+ data.Clear();
+ }
}
+ }
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_abbrev_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugAbbrev, m_data_debug_abbrev);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_abbrev_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugAbbrev,
+ m_data_debug_abbrev);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_addr_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugAddr, m_data_debug_addr);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_addr_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugAddr, m_data_debug_addr);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_aranges_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugAranges, m_data_debug_aranges);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_aranges_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugAranges,
+ m_data_debug_aranges);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_frame_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugFrame, m_data_debug_frame);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_frame_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugFrame, m_data_debug_frame);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_info_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugInfo, m_data_debug_info);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_info_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugInfo, m_data_debug_info);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_line_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugLine, m_data_debug_line);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_line_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugLine, m_data_debug_line);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_macro_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugMacro, m_data_debug_macro);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_macro_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugMacro, m_data_debug_macro);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_loc_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugLoc, m_data_debug_loc);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_loc_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugLoc, m_data_debug_loc);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_ranges_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugRanges, m_data_debug_ranges);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_ranges_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugRanges,
+ m_data_debug_ranges);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_str_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugStr, m_data_debug_str);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_str_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugStr, m_data_debug_str);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_debug_str_offsets_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFDebugStrOffsets, m_data_debug_str_offsets);
+const DWARFDataExtractor &SymbolFileDWARF::get_debug_str_offsets_data() {
+ return GetCachedSectionData(eSectionTypeDWARFDebugStrOffsets,
+ m_data_debug_str_offsets);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_apple_names_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFAppleNames, m_data_apple_names);
+const DWARFDataExtractor &SymbolFileDWARF::get_apple_names_data() {
+ return GetCachedSectionData(eSectionTypeDWARFAppleNames, m_data_apple_names);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_apple_types_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFAppleTypes, m_data_apple_types);
+const DWARFDataExtractor &SymbolFileDWARF::get_apple_types_data() {
+ return GetCachedSectionData(eSectionTypeDWARFAppleTypes, m_data_apple_types);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_apple_namespaces_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces);
+const DWARFDataExtractor &SymbolFileDWARF::get_apple_namespaces_data() {
+ return GetCachedSectionData(eSectionTypeDWARFAppleNamespaces,
+ m_data_apple_namespaces);
}
-const DWARFDataExtractor&
-SymbolFileDWARF::get_apple_objc_data()
-{
- return GetCachedSectionData (eSectionTypeDWARFAppleObjC, m_data_apple_objc);
+const DWARFDataExtractor &SymbolFileDWARF::get_apple_objc_data() {
+ return GetCachedSectionData(eSectionTypeDWARFAppleObjC, m_data_apple_objc);
}
-
-DWARFDebugAbbrev*
-SymbolFileDWARF::DebugAbbrev()
-{
- if (m_abbr.get() == NULL)
- {
- const DWARFDataExtractor &debug_abbrev_data = get_debug_abbrev_data();
- if (debug_abbrev_data.GetByteSize() > 0)
- {
- m_abbr.reset(new DWARFDebugAbbrev());
- if (m_abbr.get())
- m_abbr->Parse(debug_abbrev_data);
- }
+DWARFDebugAbbrev *SymbolFileDWARF::DebugAbbrev() {
+ if (m_abbr.get() == NULL) {
+ const DWARFDataExtractor &debug_abbrev_data = get_debug_abbrev_data();
+ if (debug_abbrev_data.GetByteSize() > 0) {
+ m_abbr.reset(new DWARFDebugAbbrev());
+ if (m_abbr.get())
+ m_abbr->Parse(debug_abbrev_data);
}
- return m_abbr.get();
+ }
+ return m_abbr.get();
}
-const DWARFDebugAbbrev*
-SymbolFileDWARF::DebugAbbrev() const
-{
- return m_abbr.get();
+const DWARFDebugAbbrev *SymbolFileDWARF::DebugAbbrev() const {
+ return m_abbr.get();
}
-
-DWARFDebugInfo*
-SymbolFileDWARF::DebugInfo()
-{
- if (m_info.get() == NULL)
- {
- Timer scoped_timer(LLVM_PRETTY_FUNCTION, "%s this = %p",
- LLVM_PRETTY_FUNCTION, static_cast<void*>(this));
- if (get_debug_info_data().GetByteSize() > 0)
- {
- m_info.reset(new DWARFDebugInfo());
- if (m_info.get())
- {
- m_info->SetDwarfData(this);
- }
- }
+DWARFDebugInfo *SymbolFileDWARF::DebugInfo() {
+ if (m_info.get() == NULL) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION, "%s this = %p",
+ LLVM_PRETTY_FUNCTION, static_cast<void *>(this));
+ if (get_debug_info_data().GetByteSize() > 0) {
+ m_info.reset(new DWARFDebugInfo());
+ if (m_info.get()) {
+ m_info->SetDwarfData(this);
+ }
}
- return m_info.get();
+ }
+ return m_info.get();
}
-const DWARFDebugInfo*
-SymbolFileDWARF::DebugInfo() const
-{
- return m_info.get();
+const DWARFDebugInfo *SymbolFileDWARF::DebugInfo() const {
+ return m_info.get();
}
-DWARFCompileUnit*
-SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit)
-{
- if (!comp_unit)
- return nullptr;
-
- DWARFDebugInfo* info = DebugInfo();
- if (info)
- {
- // Just a normal DWARF file whose user ID for the compile unit is
- // the DWARF offset itself
-
- DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID());
- if (dwarf_cu && dwarf_cu->GetUserData() == NULL)
- dwarf_cu->SetUserData(comp_unit);
- return dwarf_cu;
- }
- return NULL;
-}
+DWARFCompileUnit *
+SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) {
+ if (!comp_unit)
+ return nullptr;
+ DWARFDebugInfo *info = DebugInfo();
+ if (info) {
+ // Just a normal DWARF file whose user ID for the compile unit is
+ // the DWARF offset itself
+
+ DWARFCompileUnit *dwarf_cu =
+ info->GetCompileUnit((dw_offset_t)comp_unit->GetID());
+ if (dwarf_cu && dwarf_cu->GetUserData() == NULL)
+ dwarf_cu->SetUserData(comp_unit);
+ return dwarf_cu;
+ }
+ return NULL;
+}
-DWARFDebugRanges*
-SymbolFileDWARF::DebugRanges()
-{
- if (m_ranges.get() == NULL)
- {
- Timer scoped_timer(LLVM_PRETTY_FUNCTION, "%s this = %p",
- LLVM_PRETTY_FUNCTION, static_cast<void*>(this));
- if (get_debug_ranges_data().GetByteSize() > 0)
- {
- m_ranges.reset(new DWARFDebugRanges());
- if (m_ranges.get())
- m_ranges->Extract(this);
- }
+DWARFDebugRanges *SymbolFileDWARF::DebugRanges() {
+ if (m_ranges.get() == NULL) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION, "%s this = %p",
+ LLVM_PRETTY_FUNCTION, static_cast<void *>(this));
+ if (get_debug_ranges_data().GetByteSize() > 0) {
+ m_ranges.reset(new DWARFDebugRanges());
+ if (m_ranges.get())
+ m_ranges->Extract(this);
}
- return m_ranges.get();
+ }
+ return m_ranges.get();
}
-const DWARFDebugRanges*
-SymbolFileDWARF::DebugRanges() const
-{
- return m_ranges.get();
+const DWARFDebugRanges *SymbolFileDWARF::DebugRanges() const {
+ return m_ranges.get();
}
-lldb::CompUnitSP
-SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
-{
- CompUnitSP cu_sp;
- if (dwarf_cu)
- {
- CompileUnit *comp_unit = (CompileUnit*)dwarf_cu->GetUserData();
- if (comp_unit)
- {
- // We already parsed this compile unit, had out a shared pointer to it
- cu_sp = comp_unit->shared_from_this();
- }
- else
- {
- if (dwarf_cu->GetSymbolFileDWARF() != this)
- {
- return dwarf_cu->GetSymbolFileDWARF()->ParseCompileUnit(dwarf_cu, cu_idx);
- }
- else if (dwarf_cu->GetOffset() == 0 && GetDebugMapSymfile ())
- {
- // Let the debug map create the compile unit
- cu_sp = m_debug_map_symfile->GetCompileUnit(this);
- dwarf_cu->SetUserData(cu_sp.get());
+lldb::CompUnitSP SymbolFileDWARF::ParseCompileUnit(DWARFCompileUnit *dwarf_cu,
+ uint32_t cu_idx) {
+ CompUnitSP cu_sp;
+ if (dwarf_cu) {
+ CompileUnit *comp_unit = (CompileUnit *)dwarf_cu->GetUserData();
+ if (comp_unit) {
+ // We already parsed this compile unit, had out a shared pointer to it
+ cu_sp = comp_unit->shared_from_this();
+ } else {
+ if (dwarf_cu->GetSymbolFileDWARF() != this) {
+ return dwarf_cu->GetSymbolFileDWARF()->ParseCompileUnit(dwarf_cu,
+ cu_idx);
+ } else if (dwarf_cu->GetOffset() == 0 && GetDebugMapSymfile()) {
+ // Let the debug map create the compile unit
+ cu_sp = m_debug_map_symfile->GetCompileUnit(this);
+ dwarf_cu->SetUserData(cu_sp.get());
+ } else {
+ ModuleSP module_sp(m_obj_file->GetModule());
+ if (module_sp) {
+ const DWARFDIE cu_die = dwarf_cu->GetCompileUnitDIEOnly();
+ if (cu_die) {
+ FileSpec cu_file_spec{cu_die.GetName(), false};
+ if (cu_file_spec) {
+ // If we have a full path to the compile unit, we don't need to
+ // resolve
+ // the file. This can be expensive e.g. when the source files are
+ // NFS mounted.
+ if (cu_file_spec.IsRelative()) {
+ const char *cu_comp_dir{
+ cu_die.GetAttributeValueAsString(DW_AT_comp_dir, nullptr)};
+ cu_file_spec.PrependPathComponent(resolveCompDir(cu_comp_dir));
+ }
+
+ std::string remapped_file;
+ if (module_sp->RemapSourceFile(cu_file_spec.GetCString(),
+ remapped_file))
+ cu_file_spec.SetFile(remapped_file, false);
}
- else
- {
- ModuleSP module_sp (m_obj_file->GetModule());
- if (module_sp)
- {
- const DWARFDIE cu_die = dwarf_cu->GetCompileUnitDIEOnly ();
- if (cu_die)
- {
- FileSpec cu_file_spec{cu_die.GetName(), false};
- if (cu_file_spec)
- {
- // If we have a full path to the compile unit, we don't need to resolve
- // the file. This can be expensive e.g. when the source files are NFS mounted.
- if (cu_file_spec.IsRelative())
- {
- const char *cu_comp_dir{cu_die.GetAttributeValueAsString(DW_AT_comp_dir, nullptr)};
- cu_file_spec.PrependPathComponent(resolveCompDir(cu_comp_dir));
- }
-
- std::string remapped_file;
- if (module_sp->RemapSourceFile(cu_file_spec.GetCString(), remapped_file))
- cu_file_spec.SetFile(remapped_file, false);
- }
- LanguageType cu_language = DWARFCompileUnit::LanguageTypeFromDWARF(cu_die.GetAttributeValueAsUnsigned(DW_AT_language, 0));
-
- bool is_optimized = dwarf_cu->GetIsOptimized ();
- cu_sp.reset(new CompileUnit(module_sp, dwarf_cu, cu_file_spec, dwarf_cu->GetID(), cu_language,
- is_optimized ? eLazyBoolYes : eLazyBoolNo));
- if (cu_sp)
- {
- // If we just created a compile unit with an invalid file spec, try and get the
- // first entry in the supports files from the line table as that should be the
- // compile unit.
- if (!cu_file_spec)
- {
- cu_file_spec = cu_sp->GetSupportFiles().GetFileSpecAtIndex(1);
- if (cu_file_spec)
- {
- (FileSpec &)(*cu_sp) = cu_file_spec;
- // Also fix the invalid file spec which was copied from the compile unit.
- cu_sp->GetSupportFiles().Replace(0, cu_file_spec);
- }
- }
-
- dwarf_cu->SetUserData(cu_sp.get());
-
- // Figure out the compile unit index if we weren't given one
- if (cu_idx == UINT32_MAX)
- DebugInfo()->GetCompileUnit(dwarf_cu->GetOffset(), &cu_idx);
-
- m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
- }
- }
+ LanguageType cu_language = DWARFCompileUnit::LanguageTypeFromDWARF(
+ cu_die.GetAttributeValueAsUnsigned(DW_AT_language, 0));
+
+ bool is_optimized = dwarf_cu->GetIsOptimized();
+ cu_sp.reset(new CompileUnit(
+ module_sp, dwarf_cu, cu_file_spec, dwarf_cu->GetID(),
+ cu_language, is_optimized ? eLazyBoolYes : eLazyBoolNo));
+ if (cu_sp) {
+ // If we just created a compile unit with an invalid file spec,
+ // try and get the
+ // first entry in the supports files from the line table as that
+ // should be the
+ // compile unit.
+ if (!cu_file_spec) {
+ cu_file_spec = cu_sp->GetSupportFiles().GetFileSpecAtIndex(1);
+ if (cu_file_spec) {
+ (FileSpec &)(*cu_sp) = cu_file_spec;
+ // Also fix the invalid file spec which was copied from the
+ // compile unit.
+ cu_sp->GetSupportFiles().Replace(0, cu_file_spec);
}
+ }
+
+ dwarf_cu->SetUserData(cu_sp.get());
+
+ // Figure out the compile unit index if we weren't given one
+ if (cu_idx == UINT32_MAX)
+ DebugInfo()->GetCompileUnit(dwarf_cu->GetOffset(), &cu_idx);
+
+ m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(
+ cu_idx, cu_sp);
}
+ }
}
+ }
}
- return cu_sp;
+ }
+ return cu_sp;
}
-uint32_t
-SymbolFileDWARF::GetNumCompileUnits()
-{
- DWARFDebugInfo* info = DebugInfo();
- if (info)
- return info->GetNumCompileUnits();
- return 0;
+uint32_t SymbolFileDWARF::GetNumCompileUnits() {
+ DWARFDebugInfo *info = DebugInfo();
+ if (info)
+ return info->GetNumCompileUnits();
+ return 0;
}
-CompUnitSP
-SymbolFileDWARF::ParseCompileUnitAtIndex(uint32_t cu_idx)
-{
- CompUnitSP cu_sp;
- DWARFDebugInfo* info = DebugInfo();
- if (info)
- {
- DWARFCompileUnit* dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
- if (dwarf_cu)
- cu_sp = ParseCompileUnit(dwarf_cu, cu_idx);
- }
- return cu_sp;
+CompUnitSP SymbolFileDWARF::ParseCompileUnitAtIndex(uint32_t cu_idx) {
+ CompUnitSP cu_sp;
+ DWARFDebugInfo *info = DebugInfo();
+ if (info) {
+ DWARFCompileUnit *dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
+ if (dwarf_cu)
+ cu_sp = ParseCompileUnit(dwarf_cu, cu_idx);
+ }
+ return cu_sp;
}
-Function *
-SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, const DWARFDIE &die)
-{
- if (die.IsValid())
- {
- TypeSystem *type_system = GetTypeSystemForLanguage(die.GetCU()->GetLanguageType());
-
- if (type_system)
- {
- DWARFASTParser *dwarf_ast = type_system->GetDWARFParser();
- if (dwarf_ast)
- return dwarf_ast->ParseFunctionFromDWARF(sc, die);
- }
+Function *SymbolFileDWARF::ParseCompileUnitFunction(const SymbolContext &sc,
+ const DWARFDIE &die) {
+ if (die.IsValid()) {
+ TypeSystem *type_system =
+ GetTypeSystemForLanguage(die.GetCU()->GetLanguageType());
+
+ if (type_system) {
+ DWARFASTParser *dwarf_ast = type_system->GetDWARFParser();
+ if (dwarf_ast)
+ return dwarf_ast->ParseFunctionFromDWARF(sc, die);
}
- return nullptr;
+ }
+ return nullptr;
}
-bool
-SymbolFileDWARF::FixupAddress (Address &addr)
-{
- SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile();
- if (debug_map_symfile)
- {
- return debug_map_symfile->LinkOSOAddress(addr);
- }
- // This is a normal DWARF file, no address fixups need to happen
- return true;
+bool SymbolFileDWARF::FixupAddress(Address &addr) {
+ SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+ if (debug_map_symfile) {
+ return debug_map_symfile->LinkOSOAddress(addr);
+ }
+ // This is a normal DWARF file, no address fixups need to happen
+ return true;
}
lldb::LanguageType
-SymbolFileDWARF::ParseCompileUnitLanguage (const SymbolContext& sc)
-{
- assert (sc.comp_unit);
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- return dwarf_cu->GetLanguageType();
- else
- return eLanguageTypeUnknown;
+SymbolFileDWARF::ParseCompileUnitLanguage(const SymbolContext &sc) {
+ assert(sc.comp_unit);
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu)
+ return dwarf_cu->GetLanguageType();
+ else
+ return eLanguageTypeUnknown;
}
-size_t
-SymbolFileDWARF::ParseCompileUnitFunctions(const SymbolContext &sc)
-{
- assert (sc.comp_unit);
- size_t functions_added = 0;
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- {
- DWARFDIECollection function_dies;
- const size_t num_functions = dwarf_cu->AppendDIEsWithTag (DW_TAG_subprogram, function_dies);
- size_t func_idx;
- for (func_idx = 0; func_idx < num_functions; ++func_idx)
- {
- DWARFDIE die = function_dies.GetDIEAtIndex(func_idx);
- if (sc.comp_unit->FindFunctionByUID (die.GetID()).get() == NULL)
- {
- if (ParseCompileUnitFunction(sc, die))
- ++functions_added;
- }
- }
- //FixupTypes();
+size_t SymbolFileDWARF::ParseCompileUnitFunctions(const SymbolContext &sc) {
+ assert(sc.comp_unit);
+ size_t functions_added = 0;
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu) {
+ DWARFDIECollection function_dies;
+ const size_t num_functions =
+ dwarf_cu->AppendDIEsWithTag(DW_TAG_subprogram, function_dies);
+ size_t func_idx;
+ for (func_idx = 0; func_idx < num_functions; ++func_idx) {
+ DWARFDIE die = function_dies.GetDIEAtIndex(func_idx);
+ if (sc.comp_unit->FindFunctionByUID(die.GetID()).get() == NULL) {
+ if (ParseCompileUnitFunction(sc, die))
+ ++functions_added;
+ }
}
- return functions_added;
+ // FixupTypes();
+ }
+ return functions_added;
}
-bool
-SymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files)
-{
- assert (sc.comp_unit);
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- {
- const DWARFDIE cu_die = dwarf_cu->GetCompileUnitDIEOnly();
-
- if (cu_die)
- {
- const char * cu_comp_dir = resolveCompDir(cu_die.GetAttributeValueAsString(DW_AT_comp_dir, nullptr));
- const dw_offset_t stmt_list = cu_die.GetAttributeValueAsUnsigned(DW_AT_stmt_list, DW_INVALID_OFFSET);
- if (stmt_list != DW_INVALID_OFFSET)
- {
- // All file indexes in DWARF are one based and a file of index zero is
- // supposed to be the compile unit itself.
- support_files.Append (*sc.comp_unit);
- return DWARFDebugLine::ParseSupportFiles(sc.comp_unit->GetModule(),
- get_debug_line_data(),
- cu_comp_dir,
- stmt_list,
- support_files);
- }
- }
+bool SymbolFileDWARF::ParseCompileUnitSupportFiles(
+ const SymbolContext &sc, FileSpecList &support_files) {
+ assert(sc.comp_unit);
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu) {
+ const DWARFDIE cu_die = dwarf_cu->GetCompileUnitDIEOnly();
+
+ if (cu_die) {
+ const char *cu_comp_dir = resolveCompDir(
+ cu_die.GetAttributeValueAsString(DW_AT_comp_dir, nullptr));
+ const dw_offset_t stmt_list = cu_die.GetAttributeValueAsUnsigned(
+ DW_AT_stmt_list, DW_INVALID_OFFSET);
+ if (stmt_list != DW_INVALID_OFFSET) {
+ // All file indexes in DWARF are one based and a file of index zero is
+ // supposed to be the compile unit itself.
+ support_files.Append(*sc.comp_unit);
+ return DWARFDebugLine::ParseSupportFiles(
+ sc.comp_unit->GetModule(), get_debug_line_data(), cu_comp_dir,
+ stmt_list, support_files);
+ }
}
- return false;
+ }
+ return false;
}
-bool
-SymbolFileDWARF::ParseCompileUnitIsOptimized(const lldb_private::SymbolContext &sc)
-{
- DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- return dwarf_cu->GetIsOptimized();
- return false;
+bool SymbolFileDWARF::ParseCompileUnitIsOptimized(
+ const lldb_private::SymbolContext &sc) {
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu)
+ return dwarf_cu->GetIsOptimized();
+ return false;
}
-bool
-SymbolFileDWARF::ParseImportedModules(const lldb_private::SymbolContext &sc,
- std::vector<lldb_private::ConstString> &imported_modules)
-{
- assert (sc.comp_unit);
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- {
- if (ClangModulesDeclVendor::LanguageSupportsClangModules(sc.comp_unit->GetLanguage()))
- {
- UpdateExternalModuleListIfNeeded();
-
- if (sc.comp_unit)
- {
- const DWARFDIE die = dwarf_cu->GetCompileUnitDIEOnly();
-
- if (die)
- {
- for (DWARFDIE child_die = die.GetFirstChild();
- child_die;
- child_die = child_die.GetSibling())
- {
- if (child_die.Tag() == DW_TAG_imported_declaration)
- {
- if (DWARFDIE module_die = child_die.GetReferencedDIE(DW_AT_import))
- {
- if (module_die.Tag() == DW_TAG_module)
- {
- if (const char *name = module_die.GetAttributeValueAsString(DW_AT_name, nullptr))
- {
- ConstString const_name(name);
- imported_modules.push_back(const_name);
- }
- }
- }
- }
- }
- }
- }
- else
- {
- for (const auto &pair : m_external_type_modules)
- {
- imported_modules.push_back(pair.first);
+bool SymbolFileDWARF::ParseImportedModules(
+ const lldb_private::SymbolContext &sc,
+ std::vector<lldb_private::ConstString> &imported_modules) {
+ assert(sc.comp_unit);
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu) {
+ if (ClangModulesDeclVendor::LanguageSupportsClangModules(
+ sc.comp_unit->GetLanguage())) {
+ UpdateExternalModuleListIfNeeded();
+
+ if (sc.comp_unit) {
+ const DWARFDIE die = dwarf_cu->GetCompileUnitDIEOnly();
+
+ if (die) {
+ for (DWARFDIE child_die = die.GetFirstChild(); child_die;
+ child_die = child_die.GetSibling()) {
+ if (child_die.Tag() == DW_TAG_imported_declaration) {
+ if (DWARFDIE module_die =
+ child_die.GetReferencedDIE(DW_AT_import)) {
+ if (module_die.Tag() == DW_TAG_module) {
+ if (const char *name = module_die.GetAttributeValueAsString(
+ DW_AT_name, nullptr)) {
+ ConstString const_name(name);
+ imported_modules.push_back(const_name);
+ }
}
+ }
}
+ }
+ }
+ } else {
+ for (const auto &pair : m_external_type_modules) {
+ imported_modules.push_back(pair.first);
}
+ }
}
- return false;
+ }
+ return false;
}
-struct ParseDWARFLineTableCallbackInfo
-{
- LineTable* line_table;
- std::unique_ptr<LineSequence> sequence_ap;
- lldb::addr_t addr_mask;
+struct ParseDWARFLineTableCallbackInfo {
+ LineTable *line_table;
+ std::unique_ptr<LineSequence> sequence_ap;
+ lldb::addr_t addr_mask;
};
//----------------------------------------------------------------------
// ParseStatementTableCallback
//----------------------------------------------------------------------
-static void
-ParseDWARFLineTableCallback(dw_offset_t offset, const DWARFDebugLine::State& state, void* userData)
-{
- if (state.row == DWARFDebugLine::State::StartParsingLineTable)
- {
- // Just started parsing the line table
+static void ParseDWARFLineTableCallback(dw_offset_t offset,
+ const DWARFDebugLine::State &state,
+ void *userData) {
+ if (state.row == DWARFDebugLine::State::StartParsingLineTable) {
+ // Just started parsing the line table
+ } else if (state.row == DWARFDebugLine::State::DoneParsingLineTable) {
+ // Done parsing line table, nothing to do for the cleanup
+ } else {
+ ParseDWARFLineTableCallbackInfo *info =
+ (ParseDWARFLineTableCallbackInfo *)userData;
+ LineTable *line_table = info->line_table;
+
+ // If this is our first time here, we need to create a
+ // sequence container.
+ if (!info->sequence_ap.get()) {
+ info->sequence_ap.reset(line_table->CreateLineSequenceContainer());
+ assert(info->sequence_ap.get());
}
- else if (state.row == DWARFDebugLine::State::DoneParsingLineTable)
- {
- // Done parsing line table, nothing to do for the cleanup
- }
- else
- {
- ParseDWARFLineTableCallbackInfo* info = (ParseDWARFLineTableCallbackInfo*)userData;
- LineTable* line_table = info->line_table;
-
- // If this is our first time here, we need to create a
- // sequence container.
- if (!info->sequence_ap.get())
- {
- info->sequence_ap.reset(line_table->CreateLineSequenceContainer());
- assert(info->sequence_ap.get());
- }
- line_table->AppendLineEntryToSequence (info->sequence_ap.get(),
- state.address & info->addr_mask,
- state.line,
- state.column,
- state.file,
- state.is_stmt,
- state.basic_block,
- state.prologue_end,
- state.epilogue_begin,
- state.end_sequence);
- if (state.end_sequence)
- {
- // First, put the current sequence into the line table.
- line_table->InsertSequence(info->sequence_ap.get());
- // Then, empty it to prepare for the next sequence.
- info->sequence_ap->Clear();
- }
+ line_table->AppendLineEntryToSequence(
+ info->sequence_ap.get(), state.address & info->addr_mask, state.line,
+ state.column, state.file, state.is_stmt, state.basic_block,
+ state.prologue_end, state.epilogue_begin, state.end_sequence);
+ if (state.end_sequence) {
+ // First, put the current sequence into the line table.
+ line_table->InsertSequence(info->sequence_ap.get());
+ // Then, empty it to prepare for the next sequence.
+ info->sequence_ap->Clear();
}
+ }
}
-bool
-SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc)
-{
- assert (sc.comp_unit);
- if (sc.comp_unit->GetLineTable() != NULL)
- return true;
-
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- {
- const DWARFDIE dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly();
- if (dwarf_cu_die)
- {
- const dw_offset_t cu_line_offset = dwarf_cu_die.GetAttributeValueAsUnsigned(DW_AT_stmt_list, DW_INVALID_OFFSET);
- if (cu_line_offset != DW_INVALID_OFFSET)
- {
- std::unique_ptr<LineTable> line_table_ap(new LineTable(sc.comp_unit));
- if (line_table_ap.get())
- {
- ParseDWARFLineTableCallbackInfo info;
- info.line_table = line_table_ap.get();
-
- /*
- * MIPS:
- * The SymbolContext may not have a valid target, thus we may not be able
- * to call Address::GetOpcodeLoadAddress() which would clear the bit #0
- * for MIPS. Use ArchSpec to clear the bit #0.
- */
- ArchSpec arch;
- GetObjectFile()->GetArchitecture(arch);
- switch (arch.GetMachine())
- {
- case llvm::Triple::mips:
- case llvm::Triple::mipsel:
- case llvm::Triple::mips64:
- case llvm::Triple::mips64el:
- info.addr_mask = ~((lldb::addr_t)1);
- break;
- default:
- info.addr_mask = ~((lldb::addr_t)0);
- break;
- }
+bool SymbolFileDWARF::ParseCompileUnitLineTable(const SymbolContext &sc) {
+ assert(sc.comp_unit);
+ if (sc.comp_unit->GetLineTable() != NULL)
+ return true;
- lldb::offset_t offset = cu_line_offset;
- DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset, ParseDWARFLineTableCallback, &info);
- SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
- if (debug_map_symfile)
- {
- // We have an object file that has a line table with addresses
- // that are not linked. We need to link the line table and convert
- // the addresses that are relative to the .o file into addresses
- // for the main executable.
- sc.comp_unit->SetLineTable (debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get()));
- }
- else
- {
- sc.comp_unit->SetLineTable(line_table_ap.release());
- return true;
- }
- }
- }
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu) {
+ const DWARFDIE dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly();
+ if (dwarf_cu_die) {
+ const dw_offset_t cu_line_offset =
+ dwarf_cu_die.GetAttributeValueAsUnsigned(DW_AT_stmt_list,
+ DW_INVALID_OFFSET);
+ if (cu_line_offset != DW_INVALID_OFFSET) {
+ std::unique_ptr<LineTable> line_table_ap(new LineTable(sc.comp_unit));
+ if (line_table_ap.get()) {
+ ParseDWARFLineTableCallbackInfo info;
+ info.line_table = line_table_ap.get();
+
+ /*
+ * MIPS:
+ * The SymbolContext may not have a valid target, thus we may not be
+ * able
+ * to call Address::GetOpcodeLoadAddress() which would clear the bit
+ * #0
+ * for MIPS. Use ArchSpec to clear the bit #0.
+ */
+ ArchSpec arch;
+ GetObjectFile()->GetArchitecture(arch);
+ switch (arch.GetMachine()) {
+ case llvm::Triple::mips:
+ case llvm::Triple::mipsel:
+ case llvm::Triple::mips64:
+ case llvm::Triple::mips64el:
+ info.addr_mask = ~((lldb::addr_t)1);
+ break;
+ default:
+ info.addr_mask = ~((lldb::addr_t)0);
+ break;
+ }
+
+ lldb::offset_t offset = cu_line_offset;
+ DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset,
+ ParseDWARFLineTableCallback,
+ &info);
+ SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+ if (debug_map_symfile) {
+ // We have an object file that has a line table with addresses
+ // that are not linked. We need to link the line table and convert
+ // the addresses that are relative to the .o file into addresses
+ // for the main executable.
+ sc.comp_unit->SetLineTable(
+ debug_map_symfile->LinkOSOLineTable(this, line_table_ap.get()));
+ } else {
+ sc.comp_unit->SetLineTable(line_table_ap.release());
+ return true;
+ }
}
+ }
}
- return false;
+ }
+ return false;
}
lldb_private::DebugMacrosSP
-SymbolFileDWARF::ParseDebugMacros(lldb::offset_t *offset)
-{
- auto iter = m_debug_macros_map.find(*offset);
- if (iter != m_debug_macros_map.end())
- return iter->second;
+SymbolFileDWARF::ParseDebugMacros(lldb::offset_t *offset) {
+ auto iter = m_debug_macros_map.find(*offset);
+ if (iter != m_debug_macros_map.end())
+ return iter->second;
- const DWARFDataExtractor &debug_macro_data = get_debug_macro_data();
- if (debug_macro_data.GetByteSize() == 0)
- return DebugMacrosSP();
+ const DWARFDataExtractor &debug_macro_data = get_debug_macro_data();
+ if (debug_macro_data.GetByteSize() == 0)
+ return DebugMacrosSP();
- lldb_private::DebugMacrosSP debug_macros_sp(new lldb_private::DebugMacros());
- m_debug_macros_map[*offset] = debug_macros_sp;
+ lldb_private::DebugMacrosSP debug_macros_sp(new lldb_private::DebugMacros());
+ m_debug_macros_map[*offset] = debug_macros_sp;
- const DWARFDebugMacroHeader &header = DWARFDebugMacroHeader::ParseHeader(debug_macro_data, offset);
- DWARFDebugMacroEntry::ReadMacroEntries(
- debug_macro_data, get_debug_str_data(), header.OffsetIs64Bit(), offset, this, debug_macros_sp);
+ const DWARFDebugMacroHeader &header =
+ DWARFDebugMacroHeader::ParseHeader(debug_macro_data, offset);
+ DWARFDebugMacroEntry::ReadMacroEntries(debug_macro_data, get_debug_str_data(),
+ header.OffsetIs64Bit(), offset, this,
+ debug_macros_sp);
- return debug_macros_sp;
+ return debug_macros_sp;
}
-bool
-SymbolFileDWARF::ParseCompileUnitDebugMacros(const SymbolContext& sc)
-{
- assert (sc.comp_unit);
+bool SymbolFileDWARF::ParseCompileUnitDebugMacros(const SymbolContext &sc) {
+ assert(sc.comp_unit);
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu == nullptr)
- return false;
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu == nullptr)
+ return false;
- const DWARFDIE dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly();
- if (!dwarf_cu_die)
- return false;
+ const DWARFDIE dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly();
+ if (!dwarf_cu_die)
+ return false;
- lldb::offset_t sect_offset = dwarf_cu_die.GetAttributeValueAsUnsigned(DW_AT_macros, DW_INVALID_OFFSET);
- if (sect_offset == DW_INVALID_OFFSET)
- sect_offset = dwarf_cu_die.GetAttributeValueAsUnsigned(DW_AT_GNU_macros, DW_INVALID_OFFSET);
- if (sect_offset == DW_INVALID_OFFSET)
- return false;
+ lldb::offset_t sect_offset =
+ dwarf_cu_die.GetAttributeValueAsUnsigned(DW_AT_macros, DW_INVALID_OFFSET);
+ if (sect_offset == DW_INVALID_OFFSET)
+ sect_offset = dwarf_cu_die.GetAttributeValueAsUnsigned(DW_AT_GNU_macros,
+ DW_INVALID_OFFSET);
+ if (sect_offset == DW_INVALID_OFFSET)
+ return false;
- sc.comp_unit->SetDebugMacros(ParseDebugMacros(&sect_offset));
+ sc.comp_unit->SetDebugMacros(ParseDebugMacros(&sect_offset));
- return true;
+ return true;
}
-size_t
-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;
- DWARFDIE die = orig_die;
- while (die)
- {
- dw_tag_t tag = die.Tag();
-
- switch (tag)
- {
- case DW_TAG_inlined_subroutine:
- case DW_TAG_subprogram:
- case DW_TAG_lexical_block:
- {
- Block *block = NULL;
- if (tag == DW_TAG_subprogram)
- {
- // Skip any DW_TAG_subprogram DIEs that are inside
- // of a normal or inlined functions. These will be
- // parsed on their own as separate entities.
-
- if (depth > 0)
- break;
-
- block = parent_block;
- }
- else
- {
- BlockSP block_sp(new Block (die.GetID()));
- parent_block->AddChild(block_sp);
- block = block_sp.get();
- }
- DWARFRangeList ranges;
- const char *name = NULL;
- const char *mangled_name = NULL;
-
- int decl_file = 0;
- int decl_line = 0;
- int decl_column = 0;
- int call_file = 0;
- int call_line = 0;
- int call_column = 0;
- 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)
- {
- assert (subprogram_low_pc == LLDB_INVALID_ADDRESS);
- subprogram_low_pc = ranges.GetMinRangeBase(0);
- }
- else if (tag == DW_TAG_inlined_subroutine)
- {
- // We get called here for inlined subroutines in two ways.
- // The first time is when we are making the Function object
- // for this inlined concrete instance. Since we're creating a top level block at
- // here, the subprogram_low_pc will be LLDB_INVALID_ADDRESS. So we need to
- // adjust the containing address.
- // The second time is when we are parsing the blocks inside the function that contains
- // the inlined concrete instance. Since these will be blocks inside the containing "real"
- // function the offset will be for that function.
- if (subprogram_low_pc == LLDB_INVALID_ADDRESS)
- {
- subprogram_low_pc = ranges.GetMinRangeBase(0);
- }
- }
-
- const size_t num_ranges = ranges.GetSize();
- for (size_t i = 0; i<num_ranges; ++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()));
- else
- {
- GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": adding range [0x%" PRIx64 "-0x%" PRIx64 ") which has a base that is less than the function's low PC 0x%" PRIx64 ". Please file a bug and attach the file at the start of this error message",
- block->GetID(),
- range_base,
- range.GetRangeEnd(),
- subprogram_low_pc);
- }
- }
- block->FinalizeRanges ();
-
- if (tag != DW_TAG_subprogram && (name != NULL || mangled_name != NULL))
- {
- std::unique_ptr<Declaration> decl_ap;
- if (decl_file != 0 || decl_line != 0 || decl_column != 0)
- decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
- decl_line, decl_column));
-
- std::unique_ptr<Declaration> call_ap;
- if (call_file != 0 || call_line != 0 || call_column != 0)
- call_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(call_file),
- call_line, call_column));
+size_t 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;
+ DWARFDIE die = orig_die;
+ while (die) {
+ dw_tag_t tag = die.Tag();
+
+ switch (tag) {
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_subprogram:
+ case DW_TAG_lexical_block: {
+ Block *block = NULL;
+ if (tag == DW_TAG_subprogram) {
+ // Skip any DW_TAG_subprogram DIEs that are inside
+ // of a normal or inlined functions. These will be
+ // parsed on their own as separate entities.
+
+ if (depth > 0)
+ break;
+
+ block = parent_block;
+ } else {
+ BlockSP block_sp(new Block(die.GetID()));
+ parent_block->AddChild(block_sp);
+ block = block_sp.get();
+ }
+ DWARFRangeList ranges;
+ const char *name = NULL;
+ const char *mangled_name = NULL;
+
+ int decl_file = 0;
+ int decl_line = 0;
+ int decl_column = 0;
+ int call_file = 0;
+ int call_line = 0;
+ int call_column = 0;
+ 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) {
+ assert(subprogram_low_pc == LLDB_INVALID_ADDRESS);
+ subprogram_low_pc = ranges.GetMinRangeBase(0);
+ } else if (tag == DW_TAG_inlined_subroutine) {
+ // We get called here for inlined subroutines in two ways.
+ // The first time is when we are making the Function object
+ // for this inlined concrete instance. Since we're creating a top
+ // level block at
+ // here, the subprogram_low_pc will be LLDB_INVALID_ADDRESS. So we
+ // need to
+ // adjust the containing address.
+ // The second time is when we are parsing the blocks inside the
+ // function that contains
+ // the inlined concrete instance. Since these will be blocks inside
+ // the containing "real"
+ // function the offset will be for that function.
+ if (subprogram_low_pc == LLDB_INVALID_ADDRESS) {
+ subprogram_low_pc = ranges.GetMinRangeBase(0);
+ }
+ }
- block->SetInlinedFunctionInfo (name, mangled_name, decl_ap.get(), call_ap.get());
- }
+ const size_t num_ranges = ranges.GetSize();
+ for (size_t i = 0; i < num_ranges; ++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()));
+ else {
+ GetObjectFile()->GetModule()->ReportError(
+ "0x%8.8" PRIx64 ": adding range [0x%" PRIx64 "-0x%" PRIx64
+ ") which has a base that is less than the function's low PC "
+ "0x%" PRIx64 ". Please file a bug and attach the file at the "
+ "start of this error message",
+ block->GetID(), range_base, range.GetRangeEnd(),
+ subprogram_low_pc);
+ }
+ }
+ block->FinalizeRanges();
+
+ if (tag != DW_TAG_subprogram &&
+ (name != NULL || mangled_name != NULL)) {
+ std::unique_ptr<Declaration> decl_ap;
+ if (decl_file != 0 || decl_line != 0 || decl_column != 0)
+ decl_ap.reset(new Declaration(
+ sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
+ decl_line, decl_column));
+
+ std::unique_ptr<Declaration> call_ap;
+ if (call_file != 0 || call_line != 0 || call_column != 0)
+ call_ap.reset(new Declaration(
+ sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(call_file),
+ call_line, call_column));
+
+ block->SetInlinedFunctionInfo(name, mangled_name, decl_ap.get(),
+ call_ap.get());
+ }
- ++blocks_added;
+ ++blocks_added;
- if (die.HasChildren())
- {
- blocks_added += ParseFunctionBlocks (sc,
- block,
- die.GetFirstChild(),
- subprogram_low_pc,
- depth + 1);
- }
- }
- }
- break;
- default:
- break;
+ if (die.HasChildren()) {
+ blocks_added += ParseFunctionBlocks(sc, block, die.GetFirstChild(),
+ subprogram_low_pc, depth + 1);
}
-
- // Only parse siblings of the block if we are not at depth zero. A depth
- // of zero indicates we are currently parsing the top level
- // DW_TAG_subprogram DIE
-
- if (depth == 0)
- die.Clear();
- else
- die = die.GetSibling();
+ }
+ } break;
+ default:
+ break;
}
- return blocks_added;
+
+ // Only parse siblings of the block if we are not at depth zero. A depth
+ // of zero indicates we are currently parsing the top level
+ // DW_TAG_subprogram DIE
+
+ if (depth == 0)
+ die.Clear();
+ else
+ die = die.GetSibling();
+ }
+ return blocks_added;
}
-bool
-SymbolFileDWARF::ClassOrStructIsVirtual (const DWARFDIE &parent_die)
-{
- if (parent_die)
- {
- for (DWARFDIE die = parent_die.GetFirstChild(); die; die = die.GetSibling())
- {
- dw_tag_t tag = die.Tag();
- bool check_virtuality = false;
- switch (tag)
- {
- case DW_TAG_inheritance:
- case DW_TAG_subprogram:
- check_virtuality = true;
- break;
- default:
- break;
- }
- if (check_virtuality)
- {
- if (die.GetAttributeValueAsUnsigned(DW_AT_virtuality, 0) != 0)
- return true;
- }
- }
+bool SymbolFileDWARF::ClassOrStructIsVirtual(const DWARFDIE &parent_die) {
+ if (parent_die) {
+ for (DWARFDIE die = parent_die.GetFirstChild(); die;
+ die = die.GetSibling()) {
+ dw_tag_t tag = die.Tag();
+ bool check_virtuality = false;
+ switch (tag) {
+ case DW_TAG_inheritance:
+ case DW_TAG_subprogram:
+ check_virtuality = true;
+ break;
+ default:
+ break;
+ }
+ if (check_virtuality) {
+ if (die.GetAttributeValueAsUnsigned(DW_AT_virtuality, 0) != 0)
+ return true;
+ }
}
- return false;
+ }
+ return false;
}
-void
-SymbolFileDWARF::ParseDeclsForContext (CompilerDeclContext decl_ctx)
-{
- TypeSystem *type_system = decl_ctx.GetTypeSystem();
- DWARFASTParser *ast_parser = type_system->GetDWARFParser();
- std::vector<DWARFDIE> decl_ctx_die_list = ast_parser->GetDIEForDeclContext(decl_ctx);
+void SymbolFileDWARF::ParseDeclsForContext(CompilerDeclContext decl_ctx) {
+ TypeSystem *type_system = decl_ctx.GetTypeSystem();
+ DWARFASTParser *ast_parser = type_system->GetDWARFParser();
+ std::vector<DWARFDIE> decl_ctx_die_list =
+ ast_parser->GetDIEForDeclContext(decl_ctx);
- for (DWARFDIE decl_ctx_die : decl_ctx_die_list)
- for (DWARFDIE decl = decl_ctx_die.GetFirstChild(); decl; decl = decl.GetSibling())
- ast_parser->GetDeclForUIDFromDWARF(decl);
+ for (DWARFDIE decl_ctx_die : decl_ctx_die_list)
+ for (DWARFDIE decl = decl_ctx_die.GetFirstChild(); decl;
+ decl = decl.GetSibling())
+ ast_parser->GetDeclForUIDFromDWARF(decl);
}
-SymbolFileDWARF *
-SymbolFileDWARF::GetDWARFForUID (lldb::user_id_t uid)
-{
- // Anytime we get a "lldb::user_id_t" from an lldb_private::SymbolFile API
- // we must make sure we use the correct DWARF file when resolving things.
- // On MacOSX, when using SymbolFileDWARFDebugMap, we will use multiple
- // SymbolFileDWARF classes, one for each .o file. We can often end up
- // with references to other DWARF objects and we must be ready to receive
- // a "lldb::user_id_t" that specifies a DIE from another SymbolFileDWARF
- // instance.
- SymbolFileDWARFDebugMap *debug_map = GetDebugMapSymfile();
- if (debug_map)
- return debug_map->GetSymbolFileByOSOIndex(debug_map->GetOSOIndexFromUserID(uid));
- return this;
+SymbolFileDWARF *SymbolFileDWARF::GetDWARFForUID(lldb::user_id_t uid) {
+ // Anytime we get a "lldb::user_id_t" from an lldb_private::SymbolFile API
+ // we must make sure we use the correct DWARF file when resolving things.
+ // On MacOSX, when using SymbolFileDWARFDebugMap, we will use multiple
+ // SymbolFileDWARF classes, one for each .o file. We can often end up
+ // with references to other DWARF objects and we must be ready to receive
+ // a "lldb::user_id_t" that specifies a DIE from another SymbolFileDWARF
+ // instance.
+ SymbolFileDWARFDebugMap *debug_map = GetDebugMapSymfile();
+ if (debug_map)
+ return debug_map->GetSymbolFileByOSOIndex(
+ debug_map->GetOSOIndexFromUserID(uid));
+ return this;
}
DWARFDIE
-SymbolFileDWARF::GetDIEFromUID (lldb::user_id_t uid)
-{
- // Anytime we get a "lldb::user_id_t" from an lldb_private::SymbolFile API
- // we must make sure we use the correct DWARF file when resolving things.
- // On MacOSX, when using SymbolFileDWARFDebugMap, we will use multiple
- // SymbolFileDWARF classes, one for each .o file. We can often end up
- // with references to other DWARF objects and we must be ready to receive
- // a "lldb::user_id_t" that specifies a DIE from another SymbolFileDWARF
- // instance.
- SymbolFileDWARF *dwarf = GetDWARFForUID(uid);
- if (dwarf)
- return dwarf->GetDIE(DIERef(uid, dwarf));
- return DWARFDIE();
+SymbolFileDWARF::GetDIEFromUID(lldb::user_id_t uid) {
+ // Anytime we get a "lldb::user_id_t" from an lldb_private::SymbolFile API
+ // we must make sure we use the correct DWARF file when resolving things.
+ // On MacOSX, when using SymbolFileDWARFDebugMap, we will use multiple
+ // SymbolFileDWARF classes, one for each .o file. We can often end up
+ // with references to other DWARF objects and we must be ready to receive
+ // a "lldb::user_id_t" that specifies a DIE from another SymbolFileDWARF
+ // instance.
+ SymbolFileDWARF *dwarf = GetDWARFForUID(uid);
+ if (dwarf)
+ return dwarf->GetDIE(DIERef(uid, dwarf));
+ return DWARFDIE();
}
-CompilerDecl
-SymbolFileDWARF::GetDeclForUID (lldb::user_id_t type_uid)
-{
- // Anytime we have a lldb::user_id_t, we must get the DIE by
- // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
- // the SymbolFileDWARF::GetDIEFromUID() for details.
- DWARFDIE die = GetDIEFromUID(type_uid);
- if (die)
- return die.GetDecl();
- return CompilerDecl();
+CompilerDecl SymbolFileDWARF::GetDeclForUID(lldb::user_id_t type_uid) {
+ // Anytime we have a lldb::user_id_t, we must get the DIE by
+ // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
+ // the SymbolFileDWARF::GetDIEFromUID() for details.
+ DWARFDIE die = GetDIEFromUID(type_uid);
+ if (die)
+ return die.GetDecl();
+ return CompilerDecl();
}
CompilerDeclContext
-SymbolFileDWARF::GetDeclContextForUID (lldb::user_id_t type_uid)
-{
- // Anytime we have a lldb::user_id_t, we must get the DIE by
- // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
- // the SymbolFileDWARF::GetDIEFromUID() for details.
- DWARFDIE die = GetDIEFromUID(type_uid);
- if (die)
- return die.GetDeclContext();
- return CompilerDeclContext();
+SymbolFileDWARF::GetDeclContextForUID(lldb::user_id_t type_uid) {
+ // Anytime we have a lldb::user_id_t, we must get the DIE by
+ // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
+ // the SymbolFileDWARF::GetDIEFromUID() for details.
+ DWARFDIE die = GetDIEFromUID(type_uid);
+ if (die)
+ return die.GetDeclContext();
+ return CompilerDeclContext();
}
CompilerDeclContext
-SymbolFileDWARF::GetDeclContextContainingUID (lldb::user_id_t type_uid)
-{
- // Anytime we have a lldb::user_id_t, we must get the DIE by
- // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
- // the SymbolFileDWARF::GetDIEFromUID() for details.
- DWARFDIE die = GetDIEFromUID(type_uid);
- if (die)
- return die.GetContainingDeclContext();
- return CompilerDeclContext();
+SymbolFileDWARF::GetDeclContextContainingUID(lldb::user_id_t type_uid) {
+ // Anytime we have a lldb::user_id_t, we must get the DIE by
+ // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
+ // the SymbolFileDWARF::GetDIEFromUID() for details.
+ DWARFDIE die = GetDIEFromUID(type_uid);
+ if (die)
+ return die.GetContainingDeclContext();
+ return CompilerDeclContext();
}
-
-Type*
-SymbolFileDWARF::ResolveTypeUID (lldb::user_id_t type_uid)
-{
- // Anytime we have a lldb::user_id_t, we must get the DIE by
- // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
- // the SymbolFileDWARF::GetDIEFromUID() for details.
- DWARFDIE type_die = GetDIEFromUID(type_uid);
- if (type_die)
- return type_die.ResolveType();
- else
- return nullptr;
+Type *SymbolFileDWARF::ResolveTypeUID(lldb::user_id_t type_uid) {
+ // Anytime we have a lldb::user_id_t, we must get the DIE by
+ // calling SymbolFileDWARF::GetDIEFromUID(). See comments inside
+ // the SymbolFileDWARF::GetDIEFromUID() for details.
+ DWARFDIE type_die = GetDIEFromUID(type_uid);
+ if (type_die)
+ return type_die.ResolveType();
+ else
+ return nullptr;
}
-Type*
-SymbolFileDWARF::ResolveTypeUID (const DIERef &die_ref)
-{
- return ResolveType (GetDIE(die_ref), true);
+Type *SymbolFileDWARF::ResolveTypeUID(const DIERef &die_ref) {
+ return ResolveType(GetDIE(die_ref), true);
}
-Type*
-SymbolFileDWARF::ResolveTypeUID (const DWARFDIE &die, bool assert_not_being_parsed)
-{
- if (die)
- {
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
- if (log)
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s'",
- die.GetOffset(),
- die.GetTagAsCString(),
- die.GetName());
-
- // We might be coming in in the middle of a type tree (a class
- // within a class, an enum within a class), so parse any needed
- // parent DIEs before we get to this one...
- DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE (die);
- if (decl_ctx_die)
- {
- 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;
+Type *SymbolFileDWARF::ResolveTypeUID(const DWARFDIE &die,
+ bool assert_not_being_parsed) {
+ 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(), die.GetTagAsCString(), die.GetName());
+
+ // We might be coming in in the middle of a type tree (a class
+ // within a class, an enum within a class), so parse any needed
+ // parent DIEs before we get to this one...
+ DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE(die);
+ if (decl_ctx_die) {
+ 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 (die);
+ }
}
- return NULL;
+ return ResolveType(die);
+ }
+ return NULL;
}
// This function is used when SymbolFileDWARFDebugMap owns a bunch of
// SymbolFileDWARF objects to detect if this DWARF file is the one that
// can resolve a compiler_type.
-bool
-SymbolFileDWARF::HasForwardDeclForClangType (const CompilerType &compiler_type)
-{
- CompilerType compiler_type_no_qualifiers = ClangUtil::RemoveFastQualifiers(compiler_type);
- if (GetForwardDeclClangTypeToDie().count (compiler_type_no_qualifiers.GetOpaqueQualType()))
- {
- return true;
- }
- TypeSystem *type_system = compiler_type.GetTypeSystem();
+bool SymbolFileDWARF::HasForwardDeclForClangType(
+ const CompilerType &compiler_type) {
+ CompilerType compiler_type_no_qualifiers =
+ ClangUtil::RemoveFastQualifiers(compiler_type);
+ if (GetForwardDeclClangTypeToDie().count(
+ compiler_type_no_qualifiers.GetOpaqueQualType())) {
+ return true;
+ }
+ TypeSystem *type_system = compiler_type.GetTypeSystem();
- ClangASTContext *clang_type_system = llvm::dyn_cast_or_null<ClangASTContext>(type_system);
- if (!clang_type_system)
- return false;
- DWARFASTParserClang *ast_parser = static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
- return ast_parser->GetClangASTImporter().CanImport(compiler_type);
+ ClangASTContext *clang_type_system =
+ llvm::dyn_cast_or_null<ClangASTContext>(type_system);
+ if (!clang_type_system)
+ return false;
+ DWARFASTParserClang *ast_parser =
+ static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
+ return ast_parser->GetClangASTImporter().CanImport(compiler_type);
}
+bool SymbolFileDWARF::CompleteType(CompilerType &compiler_type) {
+ std::lock_guard<std::recursive_mutex> guard(
+ GetObjectFile()->GetModule()->GetMutex());
+
+ ClangASTContext *clang_type_system =
+ llvm::dyn_cast_or_null<ClangASTContext>(compiler_type.GetTypeSystem());
+ if (clang_type_system) {
+ DWARFASTParserClang *ast_parser =
+ static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
+ if (ast_parser &&
+ ast_parser->GetClangASTImporter().CanImport(compiler_type))
+ return ast_parser->GetClangASTImporter().CompleteType(compiler_type);
+ }
+
+ // We have a struct/union/class/enum that needs to be fully resolved.
+ CompilerType compiler_type_no_qualifiers =
+ ClangUtil::RemoveFastQualifiers(compiler_type);
+ auto die_it = GetForwardDeclClangTypeToDie().find(
+ compiler_type_no_qualifiers.GetOpaqueQualType());
+ if (die_it == GetForwardDeclClangTypeToDie().end()) {
+ // We have already resolved this type...
+ return true;
+ }
+
+ DWARFDIE dwarf_die = GetDIE(die_it->getSecond());
+ if (dwarf_die) {
+ // Once we start resolving this type, remove it from the forward declaration
+ // map in case anyone child members or other types require this type to get
+ // resolved.
+ // The type will get resolved when all of the calls to
+ // SymbolFileDWARF::ResolveClangOpaqueTypeDefinition
+ // are done.
+ GetForwardDeclClangTypeToDie().erase(die_it);
+
+ Type *type = GetDIEToType().lookup(dwarf_die.GetDIE());
+
+ Log *log(LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO |
+ DWARF_LOG_TYPE_COMPLETION));
+ if (log)
+ GetObjectFile()->GetModule()->LogMessageVerboseBacktrace(
+ log, "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...",
+ dwarf_die.GetID(), dwarf_die.GetTagAsCString(),
+ type->GetName().AsCString());
+ assert(compiler_type);
+ DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser();
+ if (dwarf_ast)
+ return dwarf_ast->CompleteTypeFromDWARF(dwarf_die, type, compiler_type);
+ }
+ return false;
+}
-bool
-SymbolFileDWARF::CompleteType (CompilerType &compiler_type)
-{
- std::lock_guard<std::recursive_mutex> guard(GetObjectFile()->GetModule()->GetMutex());
-
- ClangASTContext *clang_type_system = llvm::dyn_cast_or_null<ClangASTContext>(compiler_type.GetTypeSystem());
- if (clang_type_system)
- {
- DWARFASTParserClang *ast_parser = static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
- if (ast_parser && ast_parser->GetClangASTImporter().CanImport(compiler_type))
- return ast_parser->GetClangASTImporter().CompleteType(compiler_type);
- }
-
- // We have a struct/union/class/enum that needs to be fully resolved.
- CompilerType compiler_type_no_qualifiers = ClangUtil::RemoveFastQualifiers(compiler_type);
- auto die_it = GetForwardDeclClangTypeToDie().find (compiler_type_no_qualifiers.GetOpaqueQualType());
- if (die_it == GetForwardDeclClangTypeToDie().end())
- {
- // We have already resolved this type...
- return true;
- }
+Type *SymbolFileDWARF::ResolveType(const DWARFDIE &die,
+ bool assert_not_being_parsed,
+ bool resolve_function_context) {
+ if (die) {
+ Type *type = GetTypeForDIE(die, resolve_function_context).get();
- DWARFDIE dwarf_die = GetDIE(die_it->getSecond());
- if (dwarf_die)
- {
- // Once we start resolving this type, remove it from the forward declaration
- // map in case anyone child members or other types require this type to get resolved.
- // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition
- // are done.
- GetForwardDeclClangTypeToDie().erase (die_it);
-
- Type *type = GetDIEToType().lookup (dwarf_die.GetDIE());
-
- Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
- if (log)
- GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
- "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...",
- dwarf_die.GetID(),
- dwarf_die.GetTagAsCString(),
- type->GetName().AsCString());
- assert (compiler_type);
- DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser();
- if (dwarf_ast)
- return dwarf_ast->CompleteTypeFromDWARF (dwarf_die, type, compiler_type);
- }
- return false;
-}
+ if (assert_not_being_parsed) {
+ if (type != DIE_IS_BEING_PARSED)
+ return type;
-Type*
-SymbolFileDWARF::ResolveType (const DWARFDIE &die, bool assert_not_being_parsed, bool resolve_function_context)
-{
- if (die)
- {
- Type *type = GetTypeForDIE (die, resolve_function_context).get();
-
- if (assert_not_being_parsed)
- {
- if (type != DIE_IS_BEING_PARSED)
- return type;
-
- GetObjectFile()->GetModule()->ReportError ("Parsing a die that is being parsed die: 0x%8.8x: %s %s",
- die.GetOffset(),
- die.GetTagAsCString(),
- die.GetName());
+ GetObjectFile()->GetModule()->ReportError(
+ "Parsing a die that is being parsed die: 0x%8.8x: %s %s",
+ die.GetOffset(), die.GetTagAsCString(), die.GetName());
- }
- else
- return type;
- }
- return nullptr;
+ } else
+ return type;
+ }
+ return nullptr;
}
-CompileUnit*
-SymbolFileDWARF::GetCompUnitForDWARFCompUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
-{
- // Check if the symbol vendor already knows about this compile unit?
- if (dwarf_cu->GetUserData() == NULL)
- {
- // The symbol vendor doesn't know about this compile unit, we
- // need to parse and add it to the symbol vendor object.
- return ParseCompileUnit(dwarf_cu, cu_idx).get();
- }
- return (CompileUnit*)dwarf_cu->GetUserData();
+CompileUnit *
+SymbolFileDWARF::GetCompUnitForDWARFCompUnit(DWARFCompileUnit *dwarf_cu,
+ uint32_t cu_idx) {
+ // Check if the symbol vendor already knows about this compile unit?
+ if (dwarf_cu->GetUserData() == NULL) {
+ // The symbol vendor doesn't know about this compile unit, we
+ // need to parse and add it to the symbol vendor object.
+ return ParseCompileUnit(dwarf_cu, cu_idx).get();
+ }
+ return (CompileUnit *)dwarf_cu->GetUserData();
}
-size_t
-SymbolFileDWARF::GetObjCMethodDIEOffsets (ConstString class_name, DIEArray &method_die_offsets)
-{
- method_die_offsets.clear();
- if (m_using_apple_tables)
- {
- if (m_apple_objc_ap.get())
- m_apple_objc_ap->FindByName(class_name.GetCString(), method_die_offsets);
- }
- else
- {
- if (!m_indexed)
- Index ();
-
- m_objc_class_selectors_index.Find (class_name, method_die_offsets);
- }
- return method_die_offsets.size();
+size_t SymbolFileDWARF::GetObjCMethodDIEOffsets(ConstString class_name,
+ DIEArray &method_die_offsets) {
+ method_die_offsets.clear();
+ if (m_using_apple_tables) {
+ if (m_apple_objc_ap.get())
+ m_apple_objc_ap->FindByName(class_name.GetCString(), method_die_offsets);
+ } else {
+ if (!m_indexed)
+ Index();
+
+ m_objc_class_selectors_index.Find(class_name, method_die_offsets);
+ }
+ return method_die_offsets.size();
}
-bool
-SymbolFileDWARF::GetFunction (const DWARFDIE &die, SymbolContext& sc)
-{
- sc.Clear(false);
+bool SymbolFileDWARF::GetFunction(const DWARFDIE &die, SymbolContext &sc) {
+ sc.Clear(false);
- if (die)
- {
- // Check if the symbol vendor already knows about this compile unit?
- sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
+ 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;
- }
+ 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;
+ }
+
+ return false;
}
-lldb::ModuleSP
-SymbolFileDWARF::GetDWOModule (ConstString name)
-{
- UpdateExternalModuleListIfNeeded();
- const auto &pos = m_external_type_modules.find(name);
- if (pos != m_external_type_modules.end())
- return pos->second;
- else
- return lldb::ModuleSP();
+lldb::ModuleSP SymbolFileDWARF::GetDWOModule(ConstString name) {
+ UpdateExternalModuleListIfNeeded();
+ const auto &pos = m_external_type_modules.find(name);
+ if (pos != m_external_type_modules.end())
+ return pos->second;
+ else
+ return lldb::ModuleSP();
}
DWARFDIE
-SymbolFileDWARF::GetDIE (const DIERef &die_ref)
-{
- DWARFDebugInfo * debug_info = DebugInfo();
- if (debug_info)
- return debug_info->GetDIE(die_ref);
- else
- return DWARFDIE();
+SymbolFileDWARF::GetDIE(const DIERef &die_ref) {
+ DWARFDebugInfo *debug_info = DebugInfo();
+ if (debug_info)
+ return debug_info->GetDIE(die_ref);
+ else
+ return DWARFDIE();
}
-
std::unique_ptr<SymbolFileDWARFDwo>
-SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die)
-{
- // If we are using a dSYM file, we never want the standard DWO files since
- // the -gmodule support uses the same DWO machanism to specify full debug
- // info files for modules.
- if (GetDebugMapSymfile())
- return nullptr;
-
- const char *dwo_name = cu_die.GetAttributeValueAsString(this, &dwarf_cu, DW_AT_GNU_dwo_name, nullptr);
- if (!dwo_name)
- return nullptr;
-
- FileSpec dwo_file(dwo_name, true);
- if (dwo_file.IsRelative())
- {
- const char *comp_dir = cu_die.GetAttributeValueAsString(this, &dwarf_cu, DW_AT_comp_dir, nullptr);
- if (!comp_dir)
- return nullptr;
-
- dwo_file.SetFile(comp_dir, true);
- dwo_file.AppendPathComponent(dwo_name);
- }
+SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(
+ DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die) {
+ // If we are using a dSYM file, we never want the standard DWO files since
+ // the -gmodule support uses the same DWO machanism to specify full debug
+ // info files for modules.
+ if (GetDebugMapSymfile())
+ return nullptr;
- if (!dwo_file.Exists())
- return nullptr;
+ const char *dwo_name = cu_die.GetAttributeValueAsString(
+ this, &dwarf_cu, DW_AT_GNU_dwo_name, nullptr);
+ if (!dwo_name)
+ return nullptr;
- const lldb::offset_t file_offset = 0;
- DataBufferSP dwo_file_data_sp;
- lldb::offset_t dwo_file_data_offset = 0;
- ObjectFileSP dwo_obj_file = ObjectFile::FindPlugin(GetObjectFile()->GetModule(), &dwo_file, file_offset,
- dwo_file.GetByteSize(), dwo_file_data_sp, dwo_file_data_offset);
- if (dwo_obj_file == nullptr)
- return nullptr;
+ FileSpec dwo_file(dwo_name, true);
+ if (dwo_file.IsRelative()) {
+ const char *comp_dir = cu_die.GetAttributeValueAsString(
+ this, &dwarf_cu, DW_AT_comp_dir, nullptr);
+ if (!comp_dir)
+ return nullptr;
- return llvm::make_unique<SymbolFileDWARFDwo>(dwo_obj_file, &dwarf_cu);
-}
+ dwo_file.SetFile(comp_dir, true);
+ dwo_file.AppendPathComponent(dwo_name);
+ }
-void
-SymbolFileDWARF::UpdateExternalModuleListIfNeeded()
-{
- if (m_fetched_external_modules)
- return;
- m_fetched_external_modules = true;
-
- DWARFDebugInfo * debug_info = DebugInfo();
+ if (!dwo_file.Exists())
+ return nullptr;
- const uint32_t num_compile_units = GetNumCompileUnits();
- for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- {
- DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
-
- const DWARFDIE die = dwarf_cu->GetCompileUnitDIEOnly();
- if (die && die.HasChildren() == false)
- {
- const char *name = die.GetAttributeValueAsString(DW_AT_name, nullptr);
-
- if (name)
- {
- ConstString const_name(name);
- if (m_external_type_modules.find(const_name) == m_external_type_modules.end())
- {
- ModuleSP module_sp;
- const char *dwo_path = die.GetAttributeValueAsString(DW_AT_GNU_dwo_name, nullptr);
- if (dwo_path)
- {
- ModuleSpec dwo_module_spec;
- dwo_module_spec.GetFileSpec().SetFile(dwo_path, false);
- if (dwo_module_spec.GetFileSpec().IsRelative())
- {
- const char *comp_dir = die.GetAttributeValueAsString(DW_AT_comp_dir, nullptr);
- if (comp_dir)
- {
- dwo_module_spec.GetFileSpec().SetFile(comp_dir, true);
- dwo_module_spec.GetFileSpec().AppendPathComponent(dwo_path);
- }
- }
- dwo_module_spec.GetArchitecture() = m_obj_file->GetModule()->GetArchitecture();
- //printf ("Loading dwo = '%s'\n", dwo_path);
- Error error = ModuleList::GetSharedModule (dwo_module_spec, module_sp, NULL, NULL, NULL);
- if (!module_sp)
- {
- GetObjectFile()->GetModule()->ReportWarning ("0x%8.8x: unable to locate module needed for external types: %s\nerror: %s\nDebugging will be degraded due to missing types. Rebuilding your project will regenerate the needed module files.",
- die.GetOffset(),
- dwo_module_spec.GetFileSpec().GetPath().c_str(),
- error.AsCString("unknown error"));
- }
- }
- m_external_type_modules[const_name] = module_sp;
- }
+ const lldb::offset_t file_offset = 0;
+ DataBufferSP dwo_file_data_sp;
+ lldb::offset_t dwo_file_data_offset = 0;
+ ObjectFileSP dwo_obj_file = ObjectFile::FindPlugin(
+ GetObjectFile()->GetModule(), &dwo_file, file_offset,
+ dwo_file.GetByteSize(), dwo_file_data_sp, dwo_file_data_offset);
+ if (dwo_obj_file == nullptr)
+ return nullptr;
+
+ return llvm::make_unique<SymbolFileDWARFDwo>(dwo_obj_file, &dwarf_cu);
+}
+
+void SymbolFileDWARF::UpdateExternalModuleListIfNeeded() {
+ if (m_fetched_external_modules)
+ return;
+ m_fetched_external_modules = true;
+
+ DWARFDebugInfo *debug_info = DebugInfo();
+
+ const uint32_t num_compile_units = GetNumCompileUnits();
+ for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
+ DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+
+ const DWARFDIE die = dwarf_cu->GetCompileUnitDIEOnly();
+ if (die && die.HasChildren() == false) {
+ const char *name = die.GetAttributeValueAsString(DW_AT_name, nullptr);
+
+ if (name) {
+ ConstString const_name(name);
+ if (m_external_type_modules.find(const_name) ==
+ m_external_type_modules.end()) {
+ ModuleSP module_sp;
+ const char *dwo_path =
+ die.GetAttributeValueAsString(DW_AT_GNU_dwo_name, nullptr);
+ if (dwo_path) {
+ ModuleSpec dwo_module_spec;
+ dwo_module_spec.GetFileSpec().SetFile(dwo_path, false);
+ if (dwo_module_spec.GetFileSpec().IsRelative()) {
+ const char *comp_dir =
+ die.GetAttributeValueAsString(DW_AT_comp_dir, nullptr);
+ if (comp_dir) {
+ dwo_module_spec.GetFileSpec().SetFile(comp_dir, true);
+ dwo_module_spec.GetFileSpec().AppendPathComponent(dwo_path);
+ }
+ }
+ dwo_module_spec.GetArchitecture() =
+ m_obj_file->GetModule()->GetArchitecture();
+ // printf ("Loading dwo = '%s'\n", dwo_path);
+ Error error = ModuleList::GetSharedModule(
+ dwo_module_spec, module_sp, NULL, NULL, NULL);
+ if (!module_sp) {
+ GetObjectFile()->GetModule()->ReportWarning(
+ "0x%8.8x: unable to locate module needed for external types: "
+ "%s\nerror: %s\nDebugging will be degraded due to missing "
+ "types. Rebuilding your project will regenerate the needed "
+ "module files.",
+ die.GetOffset(),
+ dwo_module_spec.GetFileSpec().GetPath().c_str(),
+ error.AsCString("unknown error"));
}
+ }
+ m_external_type_modules[const_name] = module_sp;
}
+ }
}
+ }
}
-SymbolFileDWARF::GlobalVariableMap &
-SymbolFileDWARF::GetGlobalAranges()
-{
- if (!m_global_aranges_ap)
- {
- m_global_aranges_ap.reset (new GlobalVariableMap());
-
- ModuleSP module_sp = GetObjectFile()->GetModule();
- if (module_sp)
- {
- const size_t num_cus = module_sp->GetNumCompileUnits();
- for (size_t i = 0; i < num_cus; ++i)
- {
- CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(i);
- if (cu_sp)
- {
- VariableListSP globals_sp = cu_sp->GetVariableList(true);
- if (globals_sp)
- {
- const size_t num_globals = globals_sp->GetSize();
- for (size_t g = 0; g < num_globals; ++g)
- {
- VariableSP var_sp = globals_sp->GetVariableAtIndex(g);
- if (var_sp && !var_sp->GetLocationIsConstantValueData())
- {
- const DWARFExpression &location = var_sp->LocationExpression();
- Value location_result;
- Error error;
- if (location.Evaluate(nullptr, nullptr, nullptr, LLDB_INVALID_ADDRESS, nullptr, nullptr, location_result, &error))
- {
- if (location_result.GetValueType() == Value::eValueTypeFileAddress)
- {
- lldb::addr_t file_addr = location_result.GetScalar().ULongLong();
- lldb::addr_t byte_size = 1;
- if (var_sp->GetType())
- byte_size = var_sp->GetType()->GetByteSize();
- m_global_aranges_ap->Append(GlobalVariableMap::Entry(file_addr, byte_size, var_sp.get()));
- }
- }
- }
- }
- }
+SymbolFileDWARF::GlobalVariableMap &SymbolFileDWARF::GetGlobalAranges() {
+ if (!m_global_aranges_ap) {
+ m_global_aranges_ap.reset(new GlobalVariableMap());
+
+ ModuleSP module_sp = GetObjectFile()->GetModule();
+ if (module_sp) {
+ const size_t num_cus = module_sp->GetNumCompileUnits();
+ for (size_t i = 0; i < num_cus; ++i) {
+ CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(i);
+ if (cu_sp) {
+ VariableListSP globals_sp = cu_sp->GetVariableList(true);
+ if (globals_sp) {
+ const size_t num_globals = globals_sp->GetSize();
+ for (size_t g = 0; g < num_globals; ++g) {
+ VariableSP var_sp = globals_sp->GetVariableAtIndex(g);
+ if (var_sp && !var_sp->GetLocationIsConstantValueData()) {
+ const DWARFExpression &location = var_sp->LocationExpression();
+ Value location_result;
+ Error error;
+ if (location.Evaluate(nullptr, nullptr, nullptr,
+ LLDB_INVALID_ADDRESS, nullptr, nullptr,
+ location_result, &error)) {
+ if (location_result.GetValueType() ==
+ Value::eValueTypeFileAddress) {
+ lldb::addr_t file_addr =
+ location_result.GetScalar().ULongLong();
+ lldb::addr_t byte_size = 1;
+ if (var_sp->GetType())
+ byte_size = var_sp->GetType()->GetByteSize();
+ m_global_aranges_ap->Append(GlobalVariableMap::Entry(
+ file_addr, byte_size, var_sp.get()));
+ }
}
+ }
}
+ }
}
- m_global_aranges_ap->Sort();
+ }
}
- return *m_global_aranges_ap;
+ m_global_aranges_ap->Sort();
+ }
+ return *m_global_aranges_ap;
}
-
-uint32_t
-SymbolFileDWARF::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
-{
- Timer scoped_timer(LLVM_PRETTY_FUNCTION,
- "SymbolFileDWARF::ResolveSymbolContext (so_addr = { section = %p, offset = 0x%" PRIx64 " }, resolve_scope = 0x%8.8x)",
- static_cast<void*>(so_addr.GetSection().get()),
- so_addr.GetOffset(), resolve_scope);
- uint32_t resolved = 0;
- if (resolve_scope & ( eSymbolContextCompUnit |
- eSymbolContextFunction |
- eSymbolContextBlock |
- eSymbolContextLineEntry |
- eSymbolContextVariable ))
- {
- lldb::addr_t file_vm_addr = so_addr.GetFileAddress();
-
- DWARFDebugInfo* debug_info = DebugInfo();
- if (debug_info)
- {
- const dw_offset_t cu_offset = debug_info->GetCompileUnitAranges().FindAddress(file_vm_addr);
- if (cu_offset == DW_INVALID_OFFSET)
- {
- // Global variables are not in the compile unit address ranges. The only way to
- // currently find global variables is to iterate over the .debug_pubnames or the
- // __apple_names table and find all items in there that point to DW_TAG_variable
- // DIEs and then find the address that matches.
- if (resolve_scope & eSymbolContextVariable)
- {
- GlobalVariableMap &map = GetGlobalAranges();
- const GlobalVariableMap::Entry *entry = map.FindEntryThatContains(file_vm_addr);
- if (entry && entry->data)
- {
- Variable *variable = entry->data;
- SymbolContextScope *scc = variable->GetSymbolContextScope();
- if (scc)
- {
- scc->CalculateSymbolContext(&sc);
- sc.variable = variable;
- }
- return sc.GetResolvedMask();
- }
+uint32_t SymbolFileDWARF::ResolveSymbolContext(const Address &so_addr,
+ uint32_t resolve_scope,
+ SymbolContext &sc) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION, "SymbolFileDWARF::"
+ "ResolveSymbolContext (so_addr = { "
+ "section = %p, offset = 0x%" PRIx64
+ " }, resolve_scope = 0x%8.8x)",
+ static_cast<void *>(so_addr.GetSection().get()),
+ so_addr.GetOffset(), resolve_scope);
+ uint32_t resolved = 0;
+ if (resolve_scope &
+ (eSymbolContextCompUnit | eSymbolContextFunction | eSymbolContextBlock |
+ eSymbolContextLineEntry | eSymbolContextVariable)) {
+ lldb::addr_t file_vm_addr = so_addr.GetFileAddress();
+
+ DWARFDebugInfo *debug_info = DebugInfo();
+ if (debug_info) {
+ const dw_offset_t cu_offset =
+ debug_info->GetCompileUnitAranges().FindAddress(file_vm_addr);
+ if (cu_offset == DW_INVALID_OFFSET) {
+ // Global variables are not in the compile unit address ranges. The only
+ // way to
+ // currently find global variables is to iterate over the
+ // .debug_pubnames or the
+ // __apple_names table and find all items in there that point to
+ // DW_TAG_variable
+ // DIEs and then find the address that matches.
+ if (resolve_scope & eSymbolContextVariable) {
+ GlobalVariableMap &map = GetGlobalAranges();
+ const GlobalVariableMap::Entry *entry =
+ map.FindEntryThatContains(file_vm_addr);
+ if (entry && entry->data) {
+ Variable *variable = entry->data;
+ SymbolContextScope *scc = variable->GetSymbolContextScope();
+ if (scc) {
+ scc->CalculateSymbolContext(&sc);
+ sc.variable = variable;
+ }
+ return sc.GetResolvedMask();
+ }
+ }
+ } else {
+ uint32_t cu_idx = DW_INVALID_INDEX;
+ DWARFCompileUnit *dwarf_cu =
+ debug_info->GetCompileUnit(cu_offset, &cu_idx);
+ if (dwarf_cu) {
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
+ if (sc.comp_unit) {
+ resolved |= eSymbolContextCompUnit;
+
+ bool force_check_line_table = false;
+ if (resolve_scope &
+ (eSymbolContextFunction | eSymbolContextBlock)) {
+ DWARFDIE function_die = dwarf_cu->LookupAddress(file_vm_addr);
+ DWARFDIE block_die;
+ if (function_die) {
+ sc.function =
+ sc.comp_unit->FindFunctionByUID(function_die.GetID()).get();
+ if (sc.function == NULL)
+ sc.function = ParseCompileUnitFunction(sc, function_die);
+
+ if (sc.function && (resolve_scope & eSymbolContextBlock))
+ block_die = function_die.LookupDeepestBlock(file_vm_addr);
+ } else {
+ // We might have had a compile unit that had discontiguous
+ // address ranges where the gaps are symbols that don't have
+ // any debug info. Discontiguous compile unit address ranges
+ // should only happen when there aren't other functions from
+ // other compile units in these gaps. This helps keep the size
+ // of the aranges down.
+ force_check_line_table = true;
+ }
+
+ if (sc.function != NULL) {
+ resolved |= eSymbolContextFunction;
+
+ if (resolve_scope & eSymbolContextBlock) {
+ Block &block = sc.function->GetBlock(true);
+
+ if (block_die)
+ sc.block = block.FindBlockByID(block_die.GetID());
+ else
+ sc.block = block.FindBlockByID(function_die.GetID());
+ if (sc.block)
+ resolved |= eSymbolContextBlock;
}
+ }
}
- else
- {
- uint32_t cu_idx = DW_INVALID_INDEX;
- DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx);
- if (dwarf_cu)
- {
- sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
- if (sc.comp_unit)
- {
- resolved |= eSymbolContextCompUnit;
-
- bool force_check_line_table = false;
- if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock))
- {
- DWARFDIE function_die = dwarf_cu->LookupAddress(file_vm_addr);
- DWARFDIE block_die;
- if (function_die)
- {
- sc.function = sc.comp_unit->FindFunctionByUID (function_die.GetID()).get();
- if (sc.function == NULL)
- sc.function = ParseCompileUnitFunction(sc, function_die);
-
- if (sc.function && (resolve_scope & eSymbolContextBlock))
- block_die = function_die.LookupDeepestBlock(file_vm_addr);
- }
- else
- {
- // We might have had a compile unit that had discontiguous
- // address ranges where the gaps are symbols that don't have
- // any debug info. Discontiguous compile unit address ranges
- // should only happen when there aren't other functions from
- // other compile units in these gaps. This helps keep the size
- // of the aranges down.
- force_check_line_table = true;
- }
-
- if (sc.function != NULL)
- {
- resolved |= eSymbolContextFunction;
-
- if (resolve_scope & eSymbolContextBlock)
- {
- Block& block = sc.function->GetBlock (true);
-
- if (block_die)
- sc.block = block.FindBlockByID (block_die.GetID());
- else
- sc.block = block.FindBlockByID (function_die.GetID());
- if (sc.block)
- resolved |= eSymbolContextBlock;
- }
- }
- }
-
- if ((resolve_scope & eSymbolContextLineEntry) || force_check_line_table)
- {
- LineTable *line_table = sc.comp_unit->GetLineTable();
- if (line_table != NULL)
- {
- // And address that makes it into this function should be in terms
- // of this debug file if there is no debug map, or it will be an
- // address in the .o file which needs to be fixed up to be in terms
- // of the debug map executable. Either way, calling FixupAddress()
- // will work for us.
- Address exe_so_addr (so_addr);
- if (FixupAddress(exe_so_addr))
- {
- if (line_table->FindLineEntryByAddress (exe_so_addr, sc.line_entry))
- {
- resolved |= eSymbolContextLineEntry;
- }
- }
- }
- }
-
- if (force_check_line_table && !(resolved & eSymbolContextLineEntry))
- {
- // We might have had a compile unit that had discontiguous
- // address ranges where the gaps are symbols that don't have
- // any debug info. Discontiguous compile unit address ranges
- // should only happen when there aren't other functions from
- // other compile units in these gaps. This helps keep the size
- // of the aranges down.
- sc.comp_unit = NULL;
- resolved &= ~eSymbolContextCompUnit;
- }
- }
- else
- {
- GetObjectFile()->GetModule()->ReportWarning ("0x%8.8x: compile unit %u failed to create a valid lldb_private::CompileUnit class.",
- cu_offset,
- cu_idx);
- }
+
+ if ((resolve_scope & eSymbolContextLineEntry) ||
+ force_check_line_table) {
+ LineTable *line_table = sc.comp_unit->GetLineTable();
+ if (line_table != NULL) {
+ // And address that makes it into this function should be in
+ // terms
+ // of this debug file if there is no debug map, or it will be an
+ // address in the .o file which needs to be fixed up to be in
+ // terms
+ // of the debug map executable. Either way, calling
+ // FixupAddress()
+ // will work for us.
+ Address exe_so_addr(so_addr);
+ if (FixupAddress(exe_so_addr)) {
+ if (line_table->FindLineEntryByAddress(exe_so_addr,
+ sc.line_entry)) {
+ resolved |= eSymbolContextLineEntry;
+ }
}
+ }
}
+
+ if (force_check_line_table &&
+ !(resolved & eSymbolContextLineEntry)) {
+ // We might have had a compile unit that had discontiguous
+ // address ranges where the gaps are symbols that don't have
+ // any debug info. Discontiguous compile unit address ranges
+ // should only happen when there aren't other functions from
+ // other compile units in these gaps. This helps keep the size
+ // of the aranges down.
+ sc.comp_unit = NULL;
+ resolved &= ~eSymbolContextCompUnit;
+ }
+ } else {
+ GetObjectFile()->GetModule()->ReportWarning(
+ "0x%8.8x: compile unit %u failed to create a valid "
+ "lldb_private::CompileUnit class.",
+ cu_offset, cu_idx);
+ }
}
+ }
}
- return resolved;
+ }
+ return resolved;
}
+uint32_t SymbolFileDWARF::ResolveSymbolContext(const FileSpec &file_spec,
+ uint32_t line,
+ bool check_inlines,
+ uint32_t resolve_scope,
+ SymbolContextList &sc_list) {
+ const uint32_t prev_size = sc_list.GetSize();
+ if (resolve_scope & eSymbolContextCompUnit) {
+ DWARFDebugInfo *debug_info = DebugInfo();
+ if (debug_info) {
+ uint32_t cu_idx;
+ DWARFCompileUnit *dwarf_cu = NULL;
+
+ for (cu_idx = 0;
+ (dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL;
+ ++cu_idx) {
+ CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
+ const bool full_match = (bool)file_spec.GetDirectory();
+ bool file_spec_matches_cu_file_spec =
+ dc_cu != NULL && FileSpec::Equal(file_spec, *dc_cu, full_match);
+ if (check_inlines || file_spec_matches_cu_file_spec) {
+ SymbolContext sc(m_obj_file->GetModule());
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
+ if (sc.comp_unit) {
+ uint32_t file_idx = UINT32_MAX;
+
+ // If we are looking for inline functions only and we don't
+ // find it in the support files, we are done.
+ if (check_inlines) {
+ file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex(
+ 1, file_spec, true);
+ if (file_idx == UINT32_MAX)
+ continue;
+ }
-
-uint32_t
-SymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
-{
- const uint32_t prev_size = sc_list.GetSize();
- if (resolve_scope & eSymbolContextCompUnit)
- {
- DWARFDebugInfo* debug_info = DebugInfo();
- if (debug_info)
- {
- uint32_t cu_idx;
- DWARFCompileUnit* dwarf_cu = NULL;
-
- for (cu_idx = 0; (dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx)
- {
- CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
- const bool full_match = (bool)file_spec.GetDirectory();
- bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Equal(file_spec, *dc_cu, full_match);
- if (check_inlines || file_spec_matches_cu_file_spec)
- {
- SymbolContext sc (m_obj_file->GetModule());
- sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
- if (sc.comp_unit)
- {
- uint32_t file_idx = UINT32_MAX;
-
- // If we are looking for inline functions only and we don't
- // find it in the support files, we are done.
- if (check_inlines)
- {
- file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true);
- if (file_idx == UINT32_MAX)
- continue;
+ if (line != 0) {
+ LineTable *line_table = sc.comp_unit->GetLineTable();
+
+ if (line_table != NULL && line != 0) {
+ // We will have already looked up the file index if
+ // we are searching for inline entries.
+ if (!check_inlines)
+ file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex(
+ 1, file_spec, true);
+
+ if (file_idx != UINT32_MAX) {
+ uint32_t found_line;
+ uint32_t line_idx = line_table->FindLineEntryIndexByFileIndex(
+ 0, file_idx, line, false, &sc.line_entry);
+ found_line = sc.line_entry.line;
+
+ while (line_idx != UINT32_MAX) {
+ sc.function = NULL;
+ sc.block = NULL;
+ if (resolve_scope &
+ (eSymbolContextFunction | eSymbolContextBlock)) {
+ const lldb::addr_t file_vm_addr =
+ sc.line_entry.range.GetBaseAddress().GetFileAddress();
+ if (file_vm_addr != LLDB_INVALID_ADDRESS) {
+ DWARFDIE function_die =
+ dwarf_cu->LookupAddress(file_vm_addr);
+ DWARFDIE block_die;
+ if (function_die) {
+ sc.function =
+ sc.comp_unit
+ ->FindFunctionByUID(function_die.GetID())
+ .get();
+ if (sc.function == NULL)
+ sc.function =
+ ParseCompileUnitFunction(sc, function_die);
+
+ if (sc.function &&
+ (resolve_scope & eSymbolContextBlock))
+ block_die =
+ function_die.LookupDeepestBlock(file_vm_addr);
}
- if (line != 0)
- {
- LineTable *line_table = sc.comp_unit->GetLineTable();
-
- if (line_table != NULL && line != 0)
- {
- // We will have already looked up the file index if
- // we are searching for inline entries.
- if (!check_inlines)
- file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true);
-
- if (file_idx != UINT32_MAX)
- {
- uint32_t found_line;
- uint32_t line_idx = line_table->FindLineEntryIndexByFileIndex (0, file_idx, line, false, &sc.line_entry);
- found_line = sc.line_entry.line;
-
- while (line_idx != UINT32_MAX)
- {
- sc.function = NULL;
- sc.block = NULL;
- if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock))
- {
- const lldb::addr_t file_vm_addr = sc.line_entry.range.GetBaseAddress().GetFileAddress();
- if (file_vm_addr != LLDB_INVALID_ADDRESS)
- {
- DWARFDIE function_die = dwarf_cu->LookupAddress(file_vm_addr);
- DWARFDIE block_die;
- if (function_die)
- {
- sc.function = sc.comp_unit->FindFunctionByUID (function_die.GetID()).get();
- if (sc.function == NULL)
- 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)
- sc.block = block.FindBlockByID (block_die.GetID());
- else if (function_die)
- sc.block = block.FindBlockByID (function_die.GetID());
- }
- }
- }
-
- sc_list.Append(sc);
- line_idx = line_table->FindLineEntryIndexByFileIndex (line_idx + 1, file_idx, found_line, true, &sc.line_entry);
- }
- }
- }
- else if (file_spec_matches_cu_file_spec && !check_inlines)
- {
- // only append the context if we aren't looking for inline call sites
- // by file and line and if the file spec matches that of the compile unit
- sc_list.Append(sc);
- }
- }
- else if (file_spec_matches_cu_file_spec && !check_inlines)
- {
- // only append the context if we aren't looking for inline call sites
- // by file and line and if the file spec matches that of the compile unit
- sc_list.Append(sc);
- }
+ if (sc.function != NULL) {
+ Block &block = sc.function->GetBlock(true);
- if (!check_inlines)
- break;
+ if (block_die)
+ sc.block = block.FindBlockByID(block_die.GetID());
+ else if (function_die)
+ sc.block =
+ block.FindBlockByID(function_die.GetID());
+ }
+ }
}
+
+ sc_list.Append(sc);
+ line_idx = line_table->FindLineEntryIndexByFileIndex(
+ line_idx + 1, file_idx, found_line, true,
+ &sc.line_entry);
+ }
}
+ } else if (file_spec_matches_cu_file_spec && !check_inlines) {
+ // only append the context if we aren't looking for inline call
+ // sites
+ // by file and line and if the file spec matches that of the
+ // compile unit
+ sc_list.Append(sc);
+ }
+ } else if (file_spec_matches_cu_file_spec && !check_inlines) {
+ // only append the context if we aren't looking for inline call
+ // sites
+ // by file and line and if the file spec matches that of the
+ // compile unit
+ sc_list.Append(sc);
}
+
+ if (!check_inlines)
+ break;
+ }
}
+ }
}
- return sc_list.GetSize() - prev_size;
+ }
+ return sc_list.GetSize() - prev_size;
}
-void
-SymbolFileDWARF::Index ()
-{
- if (m_indexed)
- return;
- m_indexed = true;
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "SymbolFileDWARF::Index (%s)",
- GetObjectFile()->GetFileSpec().GetFilename().AsCString("<Unknown>"));
-
- DWARFDebugInfo* debug_info = DebugInfo();
- if (debug_info)
- {
- const uint32_t num_compile_units = GetNumCompileUnits();
- if (num_compile_units == 0)
- return;
-
- std::vector<NameToDIE> function_basename_index(num_compile_units);
- std::vector<NameToDIE> function_fullname_index(num_compile_units);
- std::vector<NameToDIE> function_method_index(num_compile_units);
- std::vector<NameToDIE> function_selector_index(num_compile_units);
- std::vector<NameToDIE> objc_class_selectors_index(num_compile_units);
- std::vector<NameToDIE> global_index(num_compile_units);
- std::vector<NameToDIE> type_index(num_compile_units);
- std::vector<NameToDIE> namespace_index(num_compile_units);
-
- std::vector<bool> clear_cu_dies(num_compile_units, false);
- auto parser_fn = [this,
- debug_info,
- &function_basename_index,
- &function_fullname_index,
- &function_method_index,
- &function_selector_index,
- &objc_class_selectors_index,
- &global_index,
- &type_index,
- &namespace_index](uint32_t cu_idx)
- {
- DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
- if (dwarf_cu)
- {
- dwarf_cu->Index(function_basename_index[cu_idx],
- function_fullname_index[cu_idx],
- function_method_index[cu_idx],
- function_selector_index[cu_idx],
- objc_class_selectors_index[cu_idx],
- global_index[cu_idx],
- type_index[cu_idx],
- namespace_index[cu_idx]);
- }
- return cu_idx;
- };
-
- auto extract_fn = [this,
- debug_info,
- num_compile_units](uint32_t cu_idx)
- {
- DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
- if (dwarf_cu)
- {
- // dwarf_cu->ExtractDIEsIfNeeded(false) will return zero if the
- // DIEs for a compile unit have already been parsed.
- return std::make_pair(cu_idx, dwarf_cu->ExtractDIEsIfNeeded(false) > 1);
- }
- return std::make_pair(cu_idx, false);
- };
-
- // Create a task runner that extracts dies for each DWARF compile unit in a separate thread
- TaskRunner<std::pair<uint32_t, bool>> task_runner_extract;
- for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- task_runner_extract.AddTask(extract_fn, cu_idx);
-
- //----------------------------------------------------------------------
- // First figure out which compile units didn't have their DIEs already
- // parsed and remember this. If no DIEs were parsed prior to this index
- // function call, we are going to want to clear the CU dies after we
- // are done indexing to make sure we don't pull in all DWARF dies, but
- // we need to wait until all compile units have been indexed in case
- // a DIE in one compile unit refers to another and the indexes accesses
- // those DIEs.
- //----------------------------------------------------------------------
- while (true)
- {
- auto f = task_runner_extract.WaitForNextCompletedTask();
- if (!f.valid())
- break;
- unsigned cu_idx;
- bool clear;
- std::tie(cu_idx, clear) = f.get();
- clear_cu_dies[cu_idx] = clear;
- }
+void SymbolFileDWARF::Index() {
+ if (m_indexed)
+ return;
+ m_indexed = true;
+ Timer scoped_timer(
+ LLVM_PRETTY_FUNCTION, "SymbolFileDWARF::Index (%s)",
+ GetObjectFile()->GetFileSpec().GetFilename().AsCString("<Unknown>"));
- // Now create a task runner that can index each DWARF compile unit in a separate
- // thread so we can index quickly.
+ DWARFDebugInfo *debug_info = DebugInfo();
+ if (debug_info) {
+ const uint32_t num_compile_units = GetNumCompileUnits();
+ if (num_compile_units == 0)
+ return;
+
+ std::vector<NameToDIE> function_basename_index(num_compile_units);
+ std::vector<NameToDIE> function_fullname_index(num_compile_units);
+ std::vector<NameToDIE> function_method_index(num_compile_units);
+ std::vector<NameToDIE> function_selector_index(num_compile_units);
+ std::vector<NameToDIE> objc_class_selectors_index(num_compile_units);
+ std::vector<NameToDIE> global_index(num_compile_units);
+ std::vector<NameToDIE> type_index(num_compile_units);
+ std::vector<NameToDIE> namespace_index(num_compile_units);
+
+ std::vector<bool> clear_cu_dies(num_compile_units, false);
+ auto parser_fn = [this, debug_info, &function_basename_index,
+ &function_fullname_index, &function_method_index,
+ &function_selector_index, &objc_class_selectors_index,
+ &global_index, &type_index,
+ &namespace_index](uint32_t cu_idx) {
+ DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+ if (dwarf_cu) {
+ dwarf_cu->Index(
+ function_basename_index[cu_idx], function_fullname_index[cu_idx],
+ function_method_index[cu_idx], function_selector_index[cu_idx],
+ objc_class_selectors_index[cu_idx], global_index[cu_idx],
+ type_index[cu_idx], namespace_index[cu_idx]);
+ }
+ return cu_idx;
+ };
- TaskRunner<uint32_t> task_runner;
- for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- task_runner.AddTask(parser_fn, cu_idx);
+ auto extract_fn = [this, debug_info, num_compile_units](uint32_t cu_idx) {
+ DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+ if (dwarf_cu) {
+ // dwarf_cu->ExtractDIEsIfNeeded(false) will return zero if the
+ // DIEs for a compile unit have already been parsed.
+ return std::make_pair(cu_idx, dwarf_cu->ExtractDIEsIfNeeded(false) > 1);
+ }
+ return std::make_pair(cu_idx, false);
+ };
- while (true)
- {
- std::future<uint32_t> f = task_runner.WaitForNextCompletedTask();
- if (!f.valid())
- break;
- uint32_t cu_idx = f.get();
-
- m_function_basename_index.Append(function_basename_index[cu_idx]);
- m_function_fullname_index.Append(function_fullname_index[cu_idx]);
- m_function_method_index.Append(function_method_index[cu_idx]);
- m_function_selector_index.Append(function_selector_index[cu_idx]);
- m_objc_class_selectors_index.Append(objc_class_selectors_index[cu_idx]);
- m_global_index.Append(global_index[cu_idx]);
- m_type_index.Append(type_index[cu_idx]);
- m_namespace_index.Append(namespace_index[cu_idx]);
- }
+ // Create a task runner that extracts dies for each DWARF compile unit in a
+ // separate thread
+ TaskRunner<std::pair<uint32_t, bool>> task_runner_extract;
+ for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
+ task_runner_extract.AddTask(extract_fn, cu_idx);
+
+ //----------------------------------------------------------------------
+ // First figure out which compile units didn't have their DIEs already
+ // parsed and remember this. If no DIEs were parsed prior to this index
+ // function call, we are going to want to clear the CU dies after we
+ // are done indexing to make sure we don't pull in all DWARF dies, but
+ // we need to wait until all compile units have been indexed in case
+ // a DIE in one compile unit refers to another and the indexes accesses
+ // those DIEs.
+ //----------------------------------------------------------------------
+ while (true) {
+ auto f = task_runner_extract.WaitForNextCompletedTask();
+ if (!f.valid())
+ break;
+ unsigned cu_idx;
+ bool clear;
+ std::tie(cu_idx, clear) = f.get();
+ clear_cu_dies[cu_idx] = clear;
+ }
- TaskPool::RunTasks(
- [&]() { m_function_basename_index.Finalize(); },
- [&]() { m_function_fullname_index.Finalize(); },
- [&]() { m_function_method_index.Finalize(); },
- [&]() { m_function_selector_index.Finalize(); },
- [&]() { m_objc_class_selectors_index.Finalize(); },
- [&]() { m_global_index.Finalize(); },
- [&]() { m_type_index.Finalize(); },
- [&]() { m_namespace_index.Finalize(); });
-
- //----------------------------------------------------------------------
- // Keep memory down by clearing DIEs for any compile units if indexing
- // caused us to load the compile unit's DIEs.
- //----------------------------------------------------------------------
- for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- {
- if (clear_cu_dies[cu_idx])
- debug_info->GetCompileUnitAtIndex(cu_idx)->ClearDIEs(true);
- }
+ // Now create a task runner that can index each DWARF compile unit in a
+ // separate
+ // thread so we can index quickly.
-#if defined (ENABLE_DEBUG_PRINTF)
- StreamFile s(stdout, false);
- s.Printf ("DWARF index for '%s':",
- GetObjectFile()->GetFileSpec().GetPath().c_str());
- s.Printf("\nFunction basenames:\n"); m_function_basename_index.Dump (&s);
- s.Printf("\nFunction fullnames:\n"); m_function_fullname_index.Dump (&s);
- s.Printf("\nFunction methods:\n"); m_function_method_index.Dump (&s);
- s.Printf("\nFunction selectors:\n"); m_function_selector_index.Dump (&s);
- s.Printf("\nObjective C class selectors:\n"); m_objc_class_selectors_index.Dump (&s);
- s.Printf("\nGlobals and statics:\n"); m_global_index.Dump (&s);
- s.Printf("\nTypes:\n"); m_type_index.Dump (&s);
- s.Printf("\nNamespaces:\n") m_namespace_index.Dump (&s);
-#endif
+ TaskRunner<uint32_t> task_runner;
+ for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
+ task_runner.AddTask(parser_fn, cu_idx);
+
+ while (true) {
+ std::future<uint32_t> f = task_runner.WaitForNextCompletedTask();
+ if (!f.valid())
+ break;
+ uint32_t cu_idx = f.get();
+
+ m_function_basename_index.Append(function_basename_index[cu_idx]);
+ m_function_fullname_index.Append(function_fullname_index[cu_idx]);
+ m_function_method_index.Append(function_method_index[cu_idx]);
+ m_function_selector_index.Append(function_selector_index[cu_idx]);
+ m_objc_class_selectors_index.Append(objc_class_selectors_index[cu_idx]);
+ m_global_index.Append(global_index[cu_idx]);
+ m_type_index.Append(type_index[cu_idx]);
+ m_namespace_index.Append(namespace_index[cu_idx]);
}
-}
-bool
-SymbolFileDWARF::DeclContextMatchesThisSymbolFile (const lldb_private::CompilerDeclContext *decl_ctx)
-{
- if (decl_ctx == nullptr || !decl_ctx->IsValid())
- {
- // Invalid namespace decl which means we aren't matching only things
- // in this symbol file, so return true to indicate it matches this
- // symbol file.
- return true;
+ TaskPool::RunTasks([&]() { m_function_basename_index.Finalize(); },
+ [&]() { m_function_fullname_index.Finalize(); },
+ [&]() { m_function_method_index.Finalize(); },
+ [&]() { m_function_selector_index.Finalize(); },
+ [&]() { m_objc_class_selectors_index.Finalize(); },
+ [&]() { m_global_index.Finalize(); },
+ [&]() { m_type_index.Finalize(); },
+ [&]() { m_namespace_index.Finalize(); });
+
+ //----------------------------------------------------------------------
+ // Keep memory down by clearing DIEs for any compile units if indexing
+ // caused us to load the compile unit's DIEs.
+ //----------------------------------------------------------------------
+ for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
+ if (clear_cu_dies[cu_idx])
+ debug_info->GetCompileUnitAtIndex(cu_idx)->ClearDIEs(true);
}
- TypeSystem *decl_ctx_type_system = decl_ctx->GetTypeSystem();
- TypeSystem *type_system = GetTypeSystemForLanguage(decl_ctx_type_system->GetMinimumLanguage(nullptr));
- if (decl_ctx_type_system == type_system)
- return true; // The type systems match, return true
-
- // The namespace AST was valid, and it does not match...
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+#if defined(ENABLE_DEBUG_PRINTF)
+ StreamFile s(stdout, false);
+ s.Printf("DWARF index for '%s':",
+ GetObjectFile()->GetFileSpec().GetPath().c_str());
+ s.Printf("\nFunction basenames:\n");
+ m_function_basename_index.Dump(&s);
+ s.Printf("\nFunction fullnames:\n");
+ m_function_fullname_index.Dump(&s);
+ s.Printf("\nFunction methods:\n");
+ m_function_method_index.Dump(&s);
+ s.Printf("\nFunction selectors:\n");
+ m_function_selector_index.Dump(&s);
+ s.Printf("\nObjective C class selectors:\n");
+ m_objc_class_selectors_index.Dump(&s);
+ s.Printf("\nGlobals and statics:\n");
+ m_global_index.Dump(&s);
+ s.Printf("\nTypes:\n");
+ m_type_index.Dump(&s);
+ s.Printf("\nNamespaces:\n") m_namespace_index.Dump(&s);
+#endif
+ }
+}
- if (log)
- GetObjectFile()->GetModule()->LogMessage(log, "Valid namespace does not match symbol file");
-
- return false;
+bool SymbolFileDWARF::DeclContextMatchesThisSymbolFile(
+ const lldb_private::CompilerDeclContext *decl_ctx) {
+ if (decl_ctx == nullptr || !decl_ctx->IsValid()) {
+ // Invalid namespace decl which means we aren't matching only things
+ // in this symbol file, so return true to indicate it matches this
+ // symbol file.
+ return true;
+ }
+
+ TypeSystem *decl_ctx_type_system = decl_ctx->GetTypeSystem();
+ TypeSystem *type_system = GetTypeSystemForLanguage(
+ decl_ctx_type_system->GetMinimumLanguage(nullptr));
+ if (decl_ctx_type_system == type_system)
+ return true; // The type systems match, return true
+
+ // The namespace AST was valid, and it does not match...
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+
+ if (log)
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "Valid namespace does not match symbol file");
+
+ return false;
}
-uint32_t
-SymbolFileDWARF::FindGlobalVariables (const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, VariableList& variables)
-{
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+uint32_t SymbolFileDWARF::FindGlobalVariables(
+ const ConstString &name, const CompilerDeclContext *parent_decl_ctx,
+ bool append, uint32_t max_matches, VariableList &variables) {
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
- if (log)
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", parent_decl_ctx=%p, append=%u, max_matches=%u, variables)",
- name.GetCString(),
- static_cast<const void*>(parent_decl_ctx),
- append, max_matches);
+ if (log)
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", "
+ "parent_decl_ctx=%p, append=%u, max_matches=%u, variables)",
+ name.GetCString(), static_cast<const void *>(parent_decl_ctx), append,
+ max_matches);
- if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
- return 0;
+ if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
+ return 0;
- DWARFDebugInfo* info = DebugInfo();
- if (info == NULL)
- return 0;
+ DWARFDebugInfo *info = DebugInfo();
+ if (info == NULL)
+ return 0;
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- variables.Clear();
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ variables.Clear();
- // Remember how many variables are in the list before we search in case
- // we are appending the results to a variable list.
- const uint32_t original_size = variables.GetSize();
+ // Remember how many variables are in the list before we search in case
+ // we are appending the results to a variable list.
+ const uint32_t original_size = variables.GetSize();
- DIEArray die_offsets;
+ DIEArray die_offsets;
- if (m_using_apple_tables)
- {
- if (m_apple_names_ap.get())
- {
- const char *name_cstr = name.GetCString();
- llvm::StringRef basename;
- llvm::StringRef context;
+ if (m_using_apple_tables) {
+ if (m_apple_names_ap.get()) {
+ const char *name_cstr = name.GetCString();
+ llvm::StringRef basename;
+ llvm::StringRef context;
- if (!CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context, basename))
- basename = name_cstr;
+ if (!CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context,
+ basename))
+ basename = name_cstr;
- m_apple_names_ap->FindByName (basename.data(), die_offsets);
- }
+ m_apple_names_ap->FindByName(basename.data(), die_offsets);
}
- else
- {
- // Index the DWARF if we haven't already
- if (!m_indexed)
- Index ();
+ } else {
+ // Index the DWARF if we haven't already
+ if (!m_indexed)
+ Index();
- m_global_index.Find (name, die_offsets);
- }
+ m_global_index.Find(name, die_offsets);
+ }
- const size_t num_die_matches = die_offsets.size();
- if (num_die_matches)
- {
- SymbolContext sc;
- sc.module_sp = m_obj_file->GetModule();
- assert (sc.module_sp);
-
- bool done = false;
- for (size_t i=0; i<num_die_matches && !done; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = GetDIE (die_ref);
-
- if (die)
- {
- switch (die.Tag())
- {
- default:
- case DW_TAG_subprogram:
- case DW_TAG_inlined_subroutine:
- case DW_TAG_try_block:
- case DW_TAG_catch_block:
- break;
-
- case DW_TAG_variable:
- {
- sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
-
- if (parent_decl_ctx)
- {
- DWARFASTParser *dwarf_ast = die.GetDWARFParser();
- if (dwarf_ast)
- {
- CompilerDeclContext actual_parent_decl_ctx = dwarf_ast->GetDeclContextContainingUIDFromDWARF (die);
- if (!actual_parent_decl_ctx || actual_parent_decl_ctx != *parent_decl_ctx)
- continue;
- }
- }
-
- ParseVariables(sc, die, LLDB_INVALID_ADDRESS, false, false, &variables);
-
- if (variables.GetSize() - original_size >= max_matches)
- done = true;
- }
- break;
- }
- }
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')\n",
- die_ref.die_offset, name.GetCString());
- }
+ const size_t num_die_matches = die_offsets.size();
+ if (num_die_matches) {
+ SymbolContext sc;
+ sc.module_sp = m_obj_file->GetModule();
+ assert(sc.module_sp);
+
+ bool done = false;
+ for (size_t i = 0; i < num_die_matches && !done; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = GetDIE(die_ref);
+
+ if (die) {
+ switch (die.Tag()) {
+ default:
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_try_block:
+ case DW_TAG_catch_block:
+ break;
+
+ case DW_TAG_variable: {
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
+
+ if (parent_decl_ctx) {
+ DWARFASTParser *dwarf_ast = die.GetDWARFParser();
+ if (dwarf_ast) {
+ CompilerDeclContext actual_parent_decl_ctx =
+ dwarf_ast->GetDeclContextContainingUIDFromDWARF(die);
+ if (!actual_parent_decl_ctx ||
+ actual_parent_decl_ctx != *parent_decl_ctx)
+ continue;
}
- }
- }
+ }
- // Return the number of variable that were appended to the list
- const uint32_t num_matches = variables.GetSize() - original_size;
- if (log && num_matches > 0)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", parent_decl_ctx=%p, append=%u, max_matches=%u, variables) => %u",
- name.GetCString(),
- static_cast<const void*>(parent_decl_ctx),
- append, max_matches,
- num_matches);
+ ParseVariables(sc, die, LLDB_INVALID_ADDRESS, false, false,
+ &variables);
+
+ if (variables.GetSize() - original_size >= max_matches)
+ done = true;
+ } break;
+ }
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_names "
+ "accelerator table had bad die 0x%8.8x for '%s')\n",
+ die_ref.die_offset, name.GetCString());
+ }
+ }
}
- return num_matches;
+ }
+
+ // Return the number of variable that were appended to the list
+ const uint32_t num_matches = variables.GetSize() - original_size;
+ if (log && num_matches > 0) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", "
+ "parent_decl_ctx=%p, append=%u, max_matches=%u, variables) => %u",
+ name.GetCString(), static_cast<const void *>(parent_decl_ctx), append,
+ max_matches, num_matches);
+ }
+ return num_matches;
}
-uint32_t
-SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
-{
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+uint32_t SymbolFileDWARF::FindGlobalVariables(const RegularExpression &regex,
+ bool append, uint32_t max_matches,
+ VariableList &variables) {
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
- if (log)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindGlobalVariables (regex=\"%s\", append=%u, max_matches=%u, variables)",
- regex.GetText(), append,
- max_matches);
- }
+ if (log) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindGlobalVariables (regex=\"%s\", append=%u, "
+ "max_matches=%u, variables)",
+ regex.GetText(), append, max_matches);
+ }
- DWARFDebugInfo* info = DebugInfo();
- if (info == NULL)
- return 0;
+ DWARFDebugInfo *info = DebugInfo();
+ if (info == NULL)
+ return 0;
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- variables.Clear();
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ variables.Clear();
- // Remember how many variables are in the list before we search in case
- // we are appending the results to a variable list.
- const uint32_t original_size = variables.GetSize();
+ // Remember how many variables are in the list before we search in case
+ // we are appending the results to a variable list.
+ const uint32_t original_size = variables.GetSize();
- DIEArray die_offsets;
+ DIEArray die_offsets;
- if (m_using_apple_tables)
- {
- if (m_apple_names_ap.get())
- {
- DWARFMappedHash::DIEInfoArray hash_data_array;
- if (m_apple_names_ap->AppendAllDIEsThatMatchingRegex (regex, hash_data_array))
- DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets);
- }
- }
- else
- {
- // Index the DWARF if we haven't already
- if (!m_indexed)
- Index ();
-
- m_global_index.Find (regex, die_offsets);
+ if (m_using_apple_tables) {
+ if (m_apple_names_ap.get()) {
+ DWARFMappedHash::DIEInfoArray hash_data_array;
+ if (m_apple_names_ap->AppendAllDIEsThatMatchingRegex(regex,
+ hash_data_array))
+ DWARFMappedHash::ExtractDIEArray(hash_data_array, die_offsets);
}
+ } else {
+ // Index the DWARF if we haven't already
+ if (!m_indexed)
+ Index();
- SymbolContext sc;
- sc.module_sp = m_obj_file->GetModule();
- assert (sc.module_sp);
-
- const size_t num_matches = die_offsets.size();
- if (num_matches)
- {
- for (size_t i=0; i<num_matches; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = GetDIE (die_ref);
-
- if (die)
- {
- sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
-
- ParseVariables(sc, die, LLDB_INVALID_ADDRESS, false, false, &variables);
-
- if (variables.GetSize() - original_size >= max_matches)
- break;
- }
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for regex '%s')\n",
- die_ref.die_offset, regex.GetText());
- }
- }
+ m_global_index.Find(regex, die_offsets);
+ }
+
+ SymbolContext sc;
+ sc.module_sp = m_obj_file->GetModule();
+ assert(sc.module_sp);
+
+ const size_t num_matches = die_offsets.size();
+ if (num_matches) {
+ for (size_t i = 0; i < num_matches; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = GetDIE(die_ref);
+
+ if (die) {
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(die.GetCU(), UINT32_MAX);
+
+ ParseVariables(sc, die, LLDB_INVALID_ADDRESS, false, false, &variables);
+
+ if (variables.GetSize() - original_size >= max_matches)
+ break;
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_names "
+ "accelerator table had bad die 0x%8.8x for regex '%s')\n",
+ die_ref.die_offset, regex.GetText());
}
+ }
}
+ }
- // Return the number of variable that were appended to the list
- return variables.GetSize() - original_size;
+ // Return the number of variable that were appended to the list
+ return variables.GetSize() - original_size;
}
-
-bool
-SymbolFileDWARF::ResolveFunction (const DIERef& die_ref,
- bool include_inlines,
- SymbolContextList& sc_list)
-{
- DWARFDIE die = DebugInfo()->GetDIE (die_ref);
- return ResolveFunction (die, include_inlines, sc_list);
+bool SymbolFileDWARF::ResolveFunction(const DIERef &die_ref,
+ bool include_inlines,
+ SymbolContextList &sc_list) {
+ DWARFDIE die = DebugInfo()->GetDIE(die_ref);
+ return ResolveFunction(die, include_inlines, sc_list);
}
-
-bool
-SymbolFileDWARF::ResolveFunction (const DWARFDIE &orig_die,
- bool include_inlines,
- SymbolContextList& sc_list)
-{
- SymbolContext sc;
+bool SymbolFileDWARF::ResolveFunction(const DWARFDIE &orig_die,
+ bool include_inlines,
+ SymbolContextList &sc_list) {
+ SymbolContext sc;
- if (!orig_die)
- return false;
+ if (!orig_die)
+ return false;
- // If we were passed a die that is not a function, just return false...
- if (!(orig_die.Tag() == DW_TAG_subprogram || (include_inlines && orig_die.Tag() == DW_TAG_inlined_subroutine)))
- return false;
+ // If we were passed a die that is not a function, just return false...
+ if (!(orig_die.Tag() == DW_TAG_subprogram ||
+ (include_inlines && orig_die.Tag() == DW_TAG_inlined_subroutine)))
+ return false;
- DWARFDIE die = orig_die;
- DWARFDIE inlined_die;
- if (die.Tag() == DW_TAG_inlined_subroutine)
- {
- inlined_die = die;
-
- while (1)
- {
- die = die.GetParent();
-
- if (die)
- {
- if (die.Tag() == DW_TAG_subprogram)
- break;
- }
- else
- break;
- }
- }
- 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 (inlined_die.GetID());
- if (sc.block == NULL)
- sc.block = function_block.FindBlockByID (inlined_die.GetOffset());
- if (sc.block == NULL || sc.block->GetStartAddress (addr) == false)
- addr.Clear();
- }
- else
- {
- sc.block = NULL;
- addr = sc.function->GetAddressRange().GetBaseAddress();
- }
+ DWARFDIE die = orig_die;
+ DWARFDIE inlined_die;
+ if (die.Tag() == DW_TAG_inlined_subroutine) {
+ inlined_die = die;
- if (addr.IsValid())
- {
- sc_list.Append(sc);
- return true;
- }
+ while (1) {
+ die = die.GetParent();
+
+ if (die) {
+ if (die.Tag() == DW_TAG_subprogram)
+ break;
+ } else
+ break;
+ }
+ }
+ 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(inlined_die.GetID());
+ if (sc.block == NULL)
+ sc.block = function_block.FindBlockByID(inlined_die.GetOffset());
+ if (sc.block == NULL || sc.block->GetStartAddress(addr) == false)
+ addr.Clear();
+ } else {
+ sc.block = NULL;
+ addr = sc.function->GetAddressRange().GetBaseAddress();
}
-
- return false;
-}
-void
-SymbolFileDWARF::FindFunctions (const ConstString &name,
- const NameToDIE &name_to_die,
- bool include_inlines,
- SymbolContextList& sc_list)
-{
- DIEArray die_offsets;
- if (name_to_die.Find (name, die_offsets))
- {
- ParseFunctions (die_offsets, include_inlines, sc_list);
+ if (addr.IsValid()) {
+ sc_list.Append(sc);
+ return true;
}
-}
+ }
+ return false;
+}
-void
-SymbolFileDWARF::FindFunctions (const RegularExpression &regex,
- const NameToDIE &name_to_die,
- bool include_inlines,
- SymbolContextList& sc_list)
-{
- DIEArray die_offsets;
- if (name_to_die.Find (regex, die_offsets))
- {
- ParseFunctions (die_offsets, include_inlines, sc_list);
- }
+void SymbolFileDWARF::FindFunctions(const ConstString &name,
+ const NameToDIE &name_to_die,
+ bool include_inlines,
+ SymbolContextList &sc_list) {
+ DIEArray die_offsets;
+ if (name_to_die.Find(name, die_offsets)) {
+ ParseFunctions(die_offsets, include_inlines, sc_list);
+ }
}
+void SymbolFileDWARF::FindFunctions(const RegularExpression &regex,
+ const NameToDIE &name_to_die,
+ bool include_inlines,
+ SymbolContextList &sc_list) {
+ DIEArray die_offsets;
+ if (name_to_die.Find(regex, die_offsets)) {
+ ParseFunctions(die_offsets, include_inlines, sc_list);
+ }
+}
-void
-SymbolFileDWARF::FindFunctions (const RegularExpression &regex,
- const DWARFMappedHash::MemoryTable &memory_table,
- bool include_inlines,
- SymbolContextList& sc_list)
-{
- DIEArray die_offsets;
- DWARFMappedHash::DIEInfoArray hash_data_array;
- if (memory_table.AppendAllDIEsThatMatchingRegex (regex, hash_data_array))
- {
- DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets);
- ParseFunctions (die_offsets, include_inlines, sc_list);
- }
+void SymbolFileDWARF::FindFunctions(
+ const RegularExpression &regex,
+ const DWARFMappedHash::MemoryTable &memory_table, bool include_inlines,
+ SymbolContextList &sc_list) {
+ DIEArray die_offsets;
+ DWARFMappedHash::DIEInfoArray hash_data_array;
+ if (memory_table.AppendAllDIEsThatMatchingRegex(regex, hash_data_array)) {
+ DWARFMappedHash::ExtractDIEArray(hash_data_array, die_offsets);
+ ParseFunctions(die_offsets, include_inlines, sc_list);
+ }
}
-void
-SymbolFileDWARF::ParseFunctions (const DIEArray &die_offsets,
- bool include_inlines,
- SymbolContextList& sc_list)
-{
- const size_t num_matches = die_offsets.size();
- if (num_matches)
- {
- for (size_t i=0; i<num_matches; ++i)
- ResolveFunction (die_offsets[i], include_inlines, sc_list);
- }
+void SymbolFileDWARF::ParseFunctions(const DIEArray &die_offsets,
+ bool include_inlines,
+ SymbolContextList &sc_list) {
+ const size_t num_matches = die_offsets.size();
+ if (num_matches) {
+ for (size_t i = 0; i < num_matches; ++i)
+ ResolveFunction(die_offsets[i], include_inlines, sc_list);
+ }
}
-bool
-SymbolFileDWARF::DIEInDeclContext (const CompilerDeclContext *decl_ctx,
- 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
- // context so any die matches.
- if (decl_ctx == nullptr || !decl_ctx->IsValid())
- return true;
-
- if (die)
- {
- DWARFASTParser *dwarf_ast = die.GetDWARFParser();
- if (dwarf_ast)
- {
- CompilerDeclContext actual_decl_ctx = dwarf_ast->GetDeclContextContainingUIDFromDWARF (die);
- if (actual_decl_ctx)
- return actual_decl_ctx == *decl_ctx;
- }
+bool SymbolFileDWARF::DIEInDeclContext(const CompilerDeclContext *decl_ctx,
+ 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
+ // context so any die matches.
+ if (decl_ctx == nullptr || !decl_ctx->IsValid())
+ return true;
+
+ if (die) {
+ DWARFASTParser *dwarf_ast = die.GetDWARFParser();
+ if (dwarf_ast) {
+ CompilerDeclContext actual_decl_ctx =
+ dwarf_ast->GetDeclContextContainingUIDFromDWARF(die);
+ if (actual_decl_ctx)
+ return actual_decl_ctx == *decl_ctx;
}
- return false;
+ }
+ return false;
}
uint32_t
-SymbolFileDWARF::FindFunctions (const ConstString &name,
- const CompilerDeclContext *parent_decl_ctx,
- uint32_t name_type_mask,
- bool include_inlines,
- bool append,
- SymbolContextList& sc_list)
-{
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "SymbolFileDWARF::FindFunctions (name = '%s')",
- name.AsCString());
-
- // eFunctionNameTypeAuto should be pre-resolved by a call to Module::PrepareForFunctionNameLookup()
- assert ((name_type_mask & eFunctionNameTypeAuto) == 0);
-
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
-
- if (log)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindFunctions (name=\"%s\", name_type_mask=0x%x, append=%u, sc_list)",
- name.GetCString(),
- name_type_mask,
- append);
- }
+SymbolFileDWARF::FindFunctions(const ConstString &name,
+ const CompilerDeclContext *parent_decl_ctx,
+ uint32_t name_type_mask, bool include_inlines,
+ bool append, SymbolContextList &sc_list) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "SymbolFileDWARF::FindFunctions (name = '%s')",
+ name.AsCString());
+
+ // eFunctionNameTypeAuto should be pre-resolved by a call to
+ // Module::PrepareForFunctionNameLookup()
+ assert((name_type_mask & eFunctionNameTypeAuto) == 0);
+
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+
+ if (log) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindFunctions (name=\"%s\", "
+ "name_type_mask=0x%x, append=%u, sc_list)",
+ name.GetCString(), name_type_mask, append);
+ }
+
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ sc_list.Clear();
+
+ if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
+ return 0;
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- sc_list.Clear();
-
- if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
- return 0;
-
- // If name is empty then we won't find anything.
- if (name.IsEmpty())
- return 0;
+ // If name is empty then we won't find anything.
+ if (name.IsEmpty())
+ return 0;
- // Remember how many sc_list are in the list before we search in case
- // we are appending the results to a variable list.
+ // Remember how many sc_list are in the list before we search in case
+ // we are appending the results to a variable list.
- const char *name_cstr = name.GetCString();
+ const char *name_cstr = name.GetCString();
- const uint32_t original_size = sc_list.GetSize();
-
- DWARFDebugInfo* info = DebugInfo();
- if (info == NULL)
- return 0;
+ const uint32_t original_size = sc_list.GetSize();
- std::set<const DWARFDebugInfoEntry *> resolved_dies;
- if (m_using_apple_tables)
- {
- if (m_apple_names_ap.get())
- {
-
- DIEArray die_offsets;
-
- uint32_t num_matches = 0;
-
- if (name_type_mask & eFunctionNameTypeFull)
- {
- // If they asked for the full name, match what they typed. At some point we may
- // want to canonicalize this (strip double spaces, etc. For now, we just add all the
- // dies that we find by exact match.
- num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);
- for (uint32_t i = 0; i < num_matches; i++)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = info->GetDIE (die_ref);
- if (die)
- {
- if (!DIEInDeclContext(parent_decl_ctx, die))
- continue; // The containing decl contexts don't match
-
- if (resolved_dies.find(die.GetDIE()) == resolved_dies.end())
- {
- if (ResolveFunction (die, include_inlines, sc_list))
- resolved_dies.insert(die.GetDIE());
- }
- }
- else
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
- die_ref.die_offset, name_cstr);
- }
- }
- }
+ DWARFDebugInfo *info = DebugInfo();
+ if (info == NULL)
+ return 0;
- if (name_type_mask & eFunctionNameTypeSelector)
- {
- if (parent_decl_ctx && parent_decl_ctx->IsValid())
- return 0; // no selectors in namespaces
-
- num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);
- // Now make sure these are actually ObjC methods. In this case we can simply look up the name,
- // and if it is an ObjC method name, we're good.
-
- for (uint32_t i = 0; i < num_matches; i++)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = info->GetDIE (die_ref);
- if (die)
- {
- const char *die_name = die.GetName();
- if (ObjCLanguage::IsPossibleObjCMethodName(die_name))
- {
- if (resolved_dies.find(die.GetDIE()) == resolved_dies.end())
- {
- if (ResolveFunction (die, include_inlines, sc_list))
- resolved_dies.insert(die.GetDIE());
- }
- }
- }
- else
- {
- GetObjectFile()->GetModule()->ReportError ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
- die_ref.die_offset, name_cstr);
- }
- }
- die_offsets.clear();
+ std::set<const DWARFDebugInfoEntry *> resolved_dies;
+ if (m_using_apple_tables) {
+ if (m_apple_names_ap.get()) {
+
+ DIEArray die_offsets;
+
+ uint32_t num_matches = 0;
+
+ if (name_type_mask & eFunctionNameTypeFull) {
+ // If they asked for the full name, match what they typed. At some
+ // point we may
+ // want to canonicalize this (strip double spaces, etc. For now, we
+ // just add all the
+ // dies that we find by exact match.
+ num_matches = m_apple_names_ap->FindByName(name_cstr, die_offsets);
+ for (uint32_t i = 0; i < num_matches; i++) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = info->GetDIE(die_ref);
+ if (die) {
+ if (!DIEInDeclContext(parent_decl_ctx, die))
+ continue; // The containing decl contexts don't match
+
+ if (resolved_dies.find(die.GetDIE()) == resolved_dies.end()) {
+ if (ResolveFunction(die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
}
-
- if (((name_type_mask & eFunctionNameTypeMethod) && !parent_decl_ctx) || name_type_mask & eFunctionNameTypeBase)
- {
- // The apple_names table stores just the "base name" of C++ methods in the table. So we have to
- // extract the base name, look that up, and if there is any other information in the name we were
- // passed in we have to post-filter based on that.
-
- // FIXME: Arrange the logic above so that we don't calculate the base name twice:
- num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);
-
- for (uint32_t i = 0; i < num_matches; i++)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = info->GetDIE (die_ref);
- if (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.GetDIE()) == resolved_dies.end() && ResolveFunction (die, include_inlines, sc_list))
- {
- bool keep_die = true;
- if ((name_type_mask & (eFunctionNameTypeBase|eFunctionNameTypeMethod)) != (eFunctionNameTypeBase|eFunctionNameTypeMethod))
- {
- // We are looking for either basenames or methods, so we need to
- // trim out the ones we won't want by looking at the type
- SymbolContext sc;
- if (sc_list.GetLastContext(sc))
- {
- if (sc.block)
- {
- // We have an inlined function
- }
- else if (sc.function)
- {
- Type *type = sc.function->GetType();
-
- if (type)
- {
- CompilerDeclContext decl_ctx = GetDeclContextContainingUID (type->GetID());
- if (decl_ctx.IsStructUnionOrClass())
- {
- if (name_type_mask & eFunctionNameTypeBase)
- {
- sc_list.RemoveContextAtIndex(sc_list.GetSize()-1);
- keep_die = false;
- }
- }
- else
- {
- if (name_type_mask & eFunctionNameTypeMethod)
- {
- sc_list.RemoveContextAtIndex(sc_list.GetSize()-1);
- keep_die = false;
- }
- }
- }
- else
- {
- GetObjectFile()->GetModule()->ReportWarning ("function at die offset 0x%8.8x had no function type",
- die_ref.die_offset);
- }
- }
- }
- }
- if (keep_die)
- resolved_dies.insert(die.GetDIE());
- }
- }
- else
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
- die_ref.die_offset, name_cstr);
- }
- }
- die_offsets.clear();
+ } else {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_names "
+ "accelerator table had bad die 0x%8.8x for '%s')",
+ die_ref.die_offset, name_cstr);
+ }
+ }
+ }
+
+ if (name_type_mask & eFunctionNameTypeSelector) {
+ if (parent_decl_ctx && parent_decl_ctx->IsValid())
+ return 0; // no selectors in namespaces
+
+ num_matches = m_apple_names_ap->FindByName(name_cstr, die_offsets);
+ // Now make sure these are actually ObjC methods. In this case we can
+ // simply look up the name,
+ // and if it is an ObjC method name, we're good.
+
+ for (uint32_t i = 0; i < num_matches; i++) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = info->GetDIE(die_ref);
+ if (die) {
+ const char *die_name = die.GetName();
+ if (ObjCLanguage::IsPossibleObjCMethodName(die_name)) {
+ if (resolved_dies.find(die.GetDIE()) == resolved_dies.end()) {
+ if (ResolveFunction(die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
+ }
}
+ } else {
+ GetObjectFile()->GetModule()->ReportError(
+ "the DWARF debug information has been modified (.apple_names "
+ "accelerator table had bad die 0x%8.8x for '%s')",
+ die_ref.die_offset, name_cstr);
+ }
}
- }
- else
- {
-
- // Index the DWARF if we haven't already
- if (!m_indexed)
- Index ();
-
- if (name_type_mask & eFunctionNameTypeFull)
- {
- FindFunctions (name, m_function_fullname_index, include_inlines, sc_list);
-
- // FIXME Temporary workaround for global/anonymous namespace
- // functions debugging FreeBSD and Linux binaries.
- // If we didn't find any functions in the global namespace try
- // looking in the basename index but ignore any returned
- // functions that have a namespace but keep functions which
- // have an anonymous namespace
- // TODO: The arch in the object file isn't correct for MSVC
- // binaries on windows, we should find a way to make it
- // correct and handle those symbols as well.
- if (sc_list.GetSize() == original_size)
- {
- ArchSpec arch;
- if (!parent_decl_ctx &&
- GetObjectFile()->GetArchitecture(arch) &&
- (arch.GetTriple().isOSFreeBSD() || arch.GetTriple().isOSLinux() ||
- arch.GetMachine() == llvm::Triple::hexagon))
- {
- SymbolContextList temp_sc_list;
- FindFunctions (name, m_function_basename_index, include_inlines, temp_sc_list);
- SymbolContext sc;
- for (uint32_t i = 0; i < temp_sc_list.GetSize(); i++)
- {
- if (temp_sc_list.GetContextAtIndex(i, sc))
- {
- ConstString mangled_name = sc.GetFunctionName(Mangled::ePreferMangled);
- ConstString demangled_name = sc.GetFunctionName(Mangled::ePreferDemangled);
- // Mangled names on Linux and FreeBSD are of the form:
- // _ZN18function_namespace13function_nameEv.
- if (strncmp(mangled_name.GetCString(), "_ZN", 3) ||
- !strncmp(demangled_name.GetCString(), "(anonymous namespace)", 21))
- {
- sc_list.Append(sc);
- }
+ die_offsets.clear();
+ }
+
+ if (((name_type_mask & eFunctionNameTypeMethod) && !parent_decl_ctx) ||
+ name_type_mask & eFunctionNameTypeBase) {
+ // The apple_names table stores just the "base name" of C++ methods in
+ // the table. So we have to
+ // extract the base name, look that up, and if there is any other
+ // information in the name we were
+ // passed in we have to post-filter based on that.
+
+ // FIXME: Arrange the logic above so that we don't calculate the base
+ // name twice:
+ num_matches = m_apple_names_ap->FindByName(name_cstr, die_offsets);
+
+ for (uint32_t i = 0; i < num_matches; i++) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = info->GetDIE(die_ref);
+ if (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.GetDIE()) == resolved_dies.end() &&
+ ResolveFunction(die, include_inlines, sc_list)) {
+ bool keep_die = true;
+ if ((name_type_mask &
+ (eFunctionNameTypeBase | eFunctionNameTypeMethod)) !=
+ (eFunctionNameTypeBase | eFunctionNameTypeMethod)) {
+ // We are looking for either basenames or methods, so we need to
+ // trim out the ones we won't want by looking at the type
+ SymbolContext sc;
+ if (sc_list.GetLastContext(sc)) {
+ if (sc.block) {
+ // We have an inlined function
+ } else if (sc.function) {
+ Type *type = sc.function->GetType();
+
+ if (type) {
+ CompilerDeclContext decl_ctx =
+ GetDeclContextContainingUID(type->GetID());
+ if (decl_ctx.IsStructUnionOrClass()) {
+ if (name_type_mask & eFunctionNameTypeBase) {
+ sc_list.RemoveContextAtIndex(sc_list.GetSize() - 1);
+ keep_die = false;
+ }
+ } else {
+ if (name_type_mask & eFunctionNameTypeMethod) {
+ sc_list.RemoveContextAtIndex(sc_list.GetSize() - 1);
+ keep_die = false;
}
+ }
+ } else {
+ GetObjectFile()->GetModule()->ReportWarning(
+ "function at die offset 0x%8.8x had no function type",
+ die_ref.die_offset);
}
+ }
}
+ }
+ if (keep_die)
+ resolved_dies.insert(die.GetDIE());
}
+ } else {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_names "
+ "accelerator table had bad die 0x%8.8x for '%s')",
+ die_ref.die_offset, name_cstr);
+ }
}
- DIEArray die_offsets;
- 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++)
- {
- DWARFDIE die = info->GetDIE (die_offsets[i]);
- if (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.GetDIE()) == resolved_dies.end())
- {
- if (ResolveFunction (die, include_inlines, sc_list))
- resolved_dies.insert(die.GetDIE());
- }
- }
+ die_offsets.clear();
+ }
+ }
+ } else {
+
+ // Index the DWARF if we haven't already
+ if (!m_indexed)
+ Index();
+
+ if (name_type_mask & eFunctionNameTypeFull) {
+ FindFunctions(name, m_function_fullname_index, include_inlines, sc_list);
+
+ // FIXME Temporary workaround for global/anonymous namespace
+ // functions debugging FreeBSD and Linux binaries.
+ // If we didn't find any functions in the global namespace try
+ // looking in the basename index but ignore any returned
+ // functions that have a namespace but keep functions which
+ // have an anonymous namespace
+ // TODO: The arch in the object file isn't correct for MSVC
+ // binaries on windows, we should find a way to make it
+ // correct and handle those symbols as well.
+ if (sc_list.GetSize() == original_size) {
+ ArchSpec arch;
+ if (!parent_decl_ctx && GetObjectFile()->GetArchitecture(arch) &&
+ (arch.GetTriple().isOSFreeBSD() || arch.GetTriple().isOSLinux() ||
+ arch.GetMachine() == llvm::Triple::hexagon)) {
+ SymbolContextList temp_sc_list;
+ FindFunctions(name, m_function_basename_index, include_inlines,
+ temp_sc_list);
+ SymbolContext sc;
+ for (uint32_t i = 0; i < temp_sc_list.GetSize(); i++) {
+ if (temp_sc_list.GetContextAtIndex(i, sc)) {
+ ConstString mangled_name =
+ sc.GetFunctionName(Mangled::ePreferMangled);
+ ConstString demangled_name =
+ sc.GetFunctionName(Mangled::ePreferDemangled);
+ // Mangled names on Linux and FreeBSD are of the form:
+ // _ZN18function_namespace13function_nameEv.
+ if (strncmp(mangled_name.GetCString(), "_ZN", 3) ||
+ !strncmp(demangled_name.GetCString(), "(anonymous namespace)",
+ 21)) {
+ sc_list.Append(sc);
+ }
}
- die_offsets.clear();
+ }
}
-
- if (name_type_mask & eFunctionNameTypeMethod)
- {
- if (parent_decl_ctx && parent_decl_ctx->IsValid())
- return 0; // no methods in namespaces
-
- uint32_t num_base = m_function_method_index.Find(name, die_offsets);
- {
- for (uint32_t i = 0; i < num_base; i++)
- {
- 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.GetDIE()) == resolved_dies.end())
- {
- if (ResolveFunction (die, include_inlines, sc_list))
- resolved_dies.insert(die.GetDIE());
- }
- }
- }
- }
- die_offsets.clear();
+ }
+ }
+ DIEArray die_offsets;
+ 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++) {
+ DWARFDIE die = info->GetDIE(die_offsets[i]);
+ if (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.GetDIE()) == resolved_dies.end()) {
+ if (ResolveFunction(die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
+ }
}
+ }
+ die_offsets.clear();
+ }
- if ((name_type_mask & eFunctionNameTypeSelector) && (!parent_decl_ctx || !parent_decl_ctx->IsValid()))
- {
- FindFunctions (name, m_function_selector_index, include_inlines, sc_list);
+ if (name_type_mask & eFunctionNameTypeMethod) {
+ if (parent_decl_ctx && parent_decl_ctx->IsValid())
+ return 0; // no methods in namespaces
+
+ uint32_t num_base = m_function_method_index.Find(name, die_offsets);
+ {
+ for (uint32_t i = 0; i < num_base; i++) {
+ 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.GetDIE()) == resolved_dies.end()) {
+ if (ResolveFunction(die, include_inlines, sc_list))
+ resolved_dies.insert(die.GetDIE());
+ }
+ }
}
-
+ }
+ die_offsets.clear();
}
- // Return the number of variable that were appended to the list
- const uint32_t num_matches = sc_list.GetSize() - original_size;
-
- if (log && num_matches > 0)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindFunctions (name=\"%s\", name_type_mask=0x%x, include_inlines=%d, append=%u, sc_list) => %u",
- name.GetCString(),
- name_type_mask,
- include_inlines,
- append,
- num_matches);
+ if ((name_type_mask & eFunctionNameTypeSelector) &&
+ (!parent_decl_ctx || !parent_decl_ctx->IsValid())) {
+ FindFunctions(name, m_function_selector_index, include_inlines, sc_list);
}
- return num_matches;
+ }
+
+ // Return the number of variable that were appended to the list
+ const uint32_t num_matches = sc_list.GetSize() - original_size;
+
+ if (log && num_matches > 0) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindFunctions (name=\"%s\", "
+ "name_type_mask=0x%x, include_inlines=%d, append=%u, sc_list) => "
+ "%u",
+ name.GetCString(), name_type_mask, include_inlines, append,
+ num_matches);
+ }
+ return num_matches;
}
-uint32_t
-SymbolFileDWARF::FindFunctions(const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list)
-{
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "SymbolFileDWARF::FindFunctions (regex = '%s')",
- regex.GetText());
-
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
-
- if (log)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindFunctions (regex=\"%s\", append=%u, sc_list)",
- regex.GetText(),
- append);
- }
-
-
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- sc_list.Clear();
-
- // Remember how many sc_list are in the list before we search in case
- // we are appending the results to a variable list.
- uint32_t original_size = sc_list.GetSize();
-
- if (m_using_apple_tables)
- {
- if (m_apple_names_ap.get())
- FindFunctions (regex, *m_apple_names_ap, include_inlines, sc_list);
- }
- else
- {
- // Index the DWARF if we haven't already
- if (!m_indexed)
- Index ();
-
- FindFunctions (regex, m_function_basename_index, include_inlines, sc_list);
-
- FindFunctions (regex, m_function_fullname_index, include_inlines, sc_list);
- }
-
- // Return the number of variable that were appended to the list
- return sc_list.GetSize() - original_size;
+uint32_t SymbolFileDWARF::FindFunctions(const RegularExpression &regex,
+ bool include_inlines, bool append,
+ SymbolContextList &sc_list) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "SymbolFileDWARF::FindFunctions (regex = '%s')",
+ regex.GetText());
+
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+
+ if (log) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log,
+ "SymbolFileDWARF::FindFunctions (regex=\"%s\", append=%u, sc_list)",
+ regex.GetText(), append);
+ }
+
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ sc_list.Clear();
+
+ // Remember how many sc_list are in the list before we search in case
+ // we are appending the results to a variable list.
+ uint32_t original_size = sc_list.GetSize();
+
+ if (m_using_apple_tables) {
+ if (m_apple_names_ap.get())
+ FindFunctions(regex, *m_apple_names_ap, include_inlines, sc_list);
+ } else {
+ // Index the DWARF if we haven't already
+ if (!m_indexed)
+ Index();
+
+ FindFunctions(regex, m_function_basename_index, include_inlines, sc_list);
+
+ FindFunctions(regex, m_function_fullname_index, include_inlines, sc_list);
+ }
+
+ // Return the number of variable that were appended to the list
+ return sc_list.GetSize() - original_size;
}
-void
-SymbolFileDWARF::GetMangledNamesForFunction (const std::string &scope_qualified_name,
- std::vector<ConstString> &mangled_names)
-{
- DWARFDebugInfo* info = DebugInfo();
- uint32_t num_comp_units = 0;
- if (info)
- num_comp_units = info->GetNumCompileUnits();
-
- for (uint32_t i = 0; i < num_comp_units; i++)
- {
- DWARFCompileUnit *cu = info->GetCompileUnitAtIndex(i);
- if (cu == nullptr)
- continue;
-
- SymbolFileDWARFDwo *dwo = cu->GetDwoSymbolFile();
- if (dwo)
- dwo->GetMangledNamesForFunction(scope_qualified_name, mangled_names);
- }
-
- NameToOffsetMap::iterator iter = m_function_scope_qualified_name_map.find(scope_qualified_name);
- if (iter == m_function_scope_qualified_name_map.end())
- return;
-
- DIERefSetSP set_sp = (*iter).second;
- std::set<DIERef>::iterator set_iter;
- for (set_iter = set_sp->begin(); set_iter != set_sp->end(); set_iter++)
- {
- DWARFDIE die = DebugInfo()->GetDIE (*set_iter);
- mangled_names.push_back(ConstString(die.GetMangledName()));
- }
+void SymbolFileDWARF::GetMangledNamesForFunction(
+ const std::string &scope_qualified_name,
+ std::vector<ConstString> &mangled_names) {
+ DWARFDebugInfo *info = DebugInfo();
+ uint32_t num_comp_units = 0;
+ if (info)
+ num_comp_units = info->GetNumCompileUnits();
+
+ for (uint32_t i = 0; i < num_comp_units; i++) {
+ DWARFCompileUnit *cu = info->GetCompileUnitAtIndex(i);
+ if (cu == nullptr)
+ continue;
+
+ SymbolFileDWARFDwo *dwo = cu->GetDwoSymbolFile();
+ if (dwo)
+ dwo->GetMangledNamesForFunction(scope_qualified_name, mangled_names);
+ }
+
+ NameToOffsetMap::iterator iter =
+ m_function_scope_qualified_name_map.find(scope_qualified_name);
+ if (iter == m_function_scope_qualified_name_map.end())
+ return;
+
+ DIERefSetSP set_sp = (*iter).second;
+ std::set<DIERef>::iterator set_iter;
+ for (set_iter = set_sp->begin(); set_iter != set_sp->end(); set_iter++) {
+ DWARFDIE die = DebugInfo()->GetDIE(*set_iter);
+ mangled_names.push_back(ConstString(die.GetMangledName()));
+ }
}
+uint32_t SymbolFileDWARF::FindTypes(
+ const SymbolContext &sc, const ConstString &name,
+ const CompilerDeclContext *parent_decl_ctx, bool append,
+ uint32_t max_matches,
+ llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
+ TypeMap &types) {
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ types.Clear();
+
+ // Make sure we haven't already searched this SymbolFile before...
+ if (searched_symbol_files.count(this))
+ return 0;
+ else
+ searched_symbol_files.insert(this);
-uint32_t
-SymbolFileDWARF::FindTypes (const SymbolContext& sc,
- const ConstString &name,
- const CompilerDeclContext *parent_decl_ctx,
- bool append,
- uint32_t max_matches,
- llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
- TypeMap& types)
-{
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- types.Clear();
+ DWARFDebugInfo *info = DebugInfo();
+ if (info == NULL)
+ return 0;
- // Make sure we haven't already searched this SymbolFile before...
- if (searched_symbol_files.count(this))
- return 0;
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+
+ if (log) {
+ if (parent_decl_ctx)
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = "
+ "%p (\"%s\"), append=%u, max_matches=%u, type_list)",
+ name.GetCString(), static_cast<const void *>(parent_decl_ctx),
+ parent_decl_ctx->GetName().AsCString("<NULL>"), append, max_matches);
else
- searched_symbol_files.insert(this);
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = "
+ "NULL, append=%u, max_matches=%u, type_list)",
+ name.GetCString(), append, max_matches);
+ }
- DWARFDebugInfo* info = DebugInfo();
- if (info == NULL)
- return 0;
+ if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
+ return 0;
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
+ DIEArray die_offsets;
- if (log)
- {
- if (parent_decl_ctx)
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = %p (\"%s\"), append=%u, max_matches=%u, type_list)",
- name.GetCString(),
- static_cast<const void*>(parent_decl_ctx),
- parent_decl_ctx->GetName().AsCString("<NULL>"),
- append, max_matches);
- else
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = NULL, append=%u, max_matches=%u, type_list)",
- name.GetCString(), append,
- max_matches);
+ if (m_using_apple_tables) {
+ if (m_apple_types_ap.get()) {
+ const char *name_cstr = name.GetCString();
+ m_apple_types_ap->FindByName(name_cstr, die_offsets);
}
-
- if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
- return 0;
-
- DIEArray die_offsets;
-
- if (m_using_apple_tables)
- {
- if (m_apple_types_ap.get())
- {
- const char *name_cstr = name.GetCString();
- m_apple_types_ap->FindByName (name_cstr, die_offsets);
+ } else {
+ if (!m_indexed)
+ Index();
+
+ m_type_index.Find(name, die_offsets);
+ }
+
+ const size_t num_die_matches = die_offsets.size();
+
+ if (num_die_matches) {
+ const uint32_t initial_types_size = types.GetSize();
+ for (size_t i = 0; i < num_die_matches; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = GetDIE(die_ref);
+
+ if (die) {
+ if (!DIEInDeclContext(parent_decl_ctx, die))
+ continue; // The containing decl contexts don't match
+
+ Type *matching_type = ResolveType(die, true, true);
+ if (matching_type) {
+ // We found a type pointer, now find the shared pointer form our type
+ // list
+ types.InsertUnique(matching_type->shared_from_this());
+ if (types.GetSize() >= max_matches)
+ break;
+ }
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_types "
+ "accelerator table had bad die 0x%8.8x for '%s')\n",
+ die_ref.die_offset, name.GetCString());
}
+ }
}
- else
- {
- if (!m_indexed)
- Index ();
-
- m_type_index.Find (name, die_offsets);
+ const uint32_t num_matches = types.GetSize() - initial_types_size;
+ if (log && num_matches) {
+ if (parent_decl_ctx) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx "
+ "= %p (\"%s\"), append=%u, max_matches=%u, type_list) => %u",
+ name.GetCString(), static_cast<const void *>(parent_decl_ctx),
+ parent_decl_ctx->GetName().AsCString("<NULL>"), append, max_matches,
+ num_matches);
+ } else {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx "
+ "= NULL, append=%u, max_matches=%u, type_list) => %u",
+ name.GetCString(), append, max_matches, num_matches);
+ }
}
+ return num_matches;
+ } else {
+ UpdateExternalModuleListIfNeeded();
- const size_t num_die_matches = die_offsets.size();
-
- if (num_die_matches)
- {
- const uint32_t initial_types_size = types.GetSize();
- for (size_t i=0; i<num_die_matches; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = GetDIE (die_ref);
-
- if (die)
- {
- if (!DIEInDeclContext(parent_decl_ctx, die))
- continue; // The containing decl contexts don't match
-
- Type *matching_type = ResolveType (die, true, true);
- if (matching_type)
- {
- // We found a type pointer, now find the shared pointer form our type list
- types.InsertUnique (matching_type->shared_from_this());
- if (types.GetSize() >= max_matches)
- break;
- }
- }
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
- die_ref.die_offset, name.GetCString());
- }
- }
-
- }
- const uint32_t num_matches = types.GetSize() - initial_types_size;
- if (log && num_matches)
- {
- if (parent_decl_ctx)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = %p (\"%s\"), append=%u, max_matches=%u, type_list) => %u",
- name.GetCString(),
- static_cast<const void*>(parent_decl_ctx),
- parent_decl_ctx->GetName().AsCString("<NULL>"),
- append, max_matches,
- num_matches);
- }
- else
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = NULL, append=%u, max_matches=%u, type_list) => %u",
- name.GetCString(),
- append, max_matches,
- num_matches);
- }
- }
- return num_matches;
- }
- else
- {
- UpdateExternalModuleListIfNeeded();
-
- for (const auto &pair : m_external_type_modules)
- {
- ModuleSP external_module_sp = pair.second;
- if (external_module_sp)
- {
- SymbolVendor *sym_vendor = external_module_sp->GetSymbolVendor();
- if (sym_vendor)
- {
- const uint32_t num_external_matches = sym_vendor->FindTypes (sc,
- name,
- parent_decl_ctx,
- append,
- max_matches,
- searched_symbol_files,
- types);
- if (num_external_matches)
- return num_external_matches;
- }
- }
+ for (const auto &pair : m_external_type_modules) {
+ ModuleSP external_module_sp = pair.second;
+ if (external_module_sp) {
+ SymbolVendor *sym_vendor = external_module_sp->GetSymbolVendor();
+ if (sym_vendor) {
+ const uint32_t num_external_matches =
+ sym_vendor->FindTypes(sc, name, parent_decl_ctx, append,
+ max_matches, searched_symbol_files, types);
+ if (num_external_matches)
+ return num_external_matches;
}
+ }
}
+ }
- return 0;
+ return 0;
}
+size_t SymbolFileDWARF::FindTypes(const std::vector<CompilerContext> &context,
+ bool append, TypeMap &types) {
+ if (!append)
+ types.Clear();
-size_t
-SymbolFileDWARF::FindTypes (const std::vector<CompilerContext> &context,
- bool append,
- TypeMap& types)
-{
- if (!append)
- types.Clear();
-
- if (context.empty())
- return 0;
-
- DIEArray die_offsets;
+ if (context.empty())
+ return 0;
- ConstString name = context.back().name;
+ DIEArray die_offsets;
- if (!name)
- return 0;
+ ConstString name = context.back().name;
- if (m_using_apple_tables)
- {
- if (m_apple_types_ap.get())
- {
- const char *name_cstr = name.GetCString();
- m_apple_types_ap->FindByName (name_cstr, die_offsets);
- }
- }
- else
- {
- if (!m_indexed)
- Index ();
+ if (!name)
+ return 0;
- m_type_index.Find (name, die_offsets);
+ if (m_using_apple_tables) {
+ if (m_apple_types_ap.get()) {
+ const char *name_cstr = name.GetCString();
+ m_apple_types_ap->FindByName(name_cstr, die_offsets);
}
-
- const size_t num_die_matches = die_offsets.size();
-
- if (num_die_matches)
- {
- size_t num_matches = 0;
- for (size_t i=0; i<num_die_matches; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = GetDIE (die_ref);
-
- if (die)
- {
- std::vector<CompilerContext> die_context;
- die.GetDWOContext(die_context);
- if (die_context != context)
- continue;
-
- Type *matching_type = ResolveType (die, true, true);
- if (matching_type)
- {
- // We found a type pointer, now find the shared pointer form our type list
- types.InsertUnique (matching_type->shared_from_this());
- ++num_matches;
- }
- }
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
- die_ref.die_offset, name.GetCString());
- }
- }
-
+ } else {
+ if (!m_indexed)
+ Index();
+
+ m_type_index.Find(name, die_offsets);
+ }
+
+ const size_t num_die_matches = die_offsets.size();
+
+ if (num_die_matches) {
+ size_t num_matches = 0;
+ for (size_t i = 0; i < num_die_matches; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = GetDIE(die_ref);
+
+ if (die) {
+ std::vector<CompilerContext> die_context;
+ die.GetDWOContext(die_context);
+ if (die_context != context)
+ continue;
+
+ Type *matching_type = ResolveType(die, true, true);
+ if (matching_type) {
+ // We found a type pointer, now find the shared pointer form our type
+ // list
+ types.InsertUnique(matching_type->shared_from_this());
+ ++num_matches;
+ }
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_types "
+ "accelerator table had bad die 0x%8.8x for '%s')\n",
+ die_ref.die_offset, name.GetCString());
}
- return num_matches;
+ }
}
- return 0;
+ return num_matches;
+ }
+ return 0;
}
-
CompilerDeclContext
-SymbolFileDWARF::FindNamespace (const SymbolContext& sc,
- const ConstString &name,
- const CompilerDeclContext *parent_decl_ctx)
-{
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
-
- if (log)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindNamespace (sc, name=\"%s\")",
- name.GetCString());
- }
-
- CompilerDeclContext namespace_decl_ctx;
+SymbolFileDWARF::FindNamespace(const SymbolContext &sc, const ConstString &name,
+ const CompilerDeclContext *parent_decl_ctx) {
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
- if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
- return namespace_decl_ctx;
+ if (log) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindNamespace (sc, name=\"%s\")",
+ name.GetCString());
+ }
+ CompilerDeclContext namespace_decl_ctx;
- DWARFDebugInfo* info = DebugInfo();
- if (info)
- {
- DIEArray die_offsets;
+ if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx))
+ return namespace_decl_ctx;
- // Index if we already haven't to make sure the compile units
- // get indexed and make their global DIE index list
- if (m_using_apple_tables)
- {
- if (m_apple_namespaces_ap.get())
- {
- const char *name_cstr = name.GetCString();
- m_apple_namespaces_ap->FindByName (name_cstr, die_offsets);
- }
- }
- else
- {
- if (!m_indexed)
- Index ();
+ DWARFDebugInfo *info = DebugInfo();
+ if (info) {
+ DIEArray die_offsets;
- m_namespace_index.Find (name, die_offsets);
- }
-
- const size_t num_matches = die_offsets.size();
- if (num_matches)
- {
- for (size_t i=0; i<num_matches; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = GetDIE (die_ref);
-
- if (die)
- {
- if (!DIEInDeclContext (parent_decl_ctx, die))
- continue; // The containing decl contexts don't match
-
- DWARFASTParser *dwarf_ast = die.GetDWARFParser();
- if (dwarf_ast)
- {
- namespace_decl_ctx = dwarf_ast->GetDeclContextForUIDFromDWARF (die);
- if (namespace_decl_ctx)
- break;
- }
- }
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_namespaces accelerator table had bad die 0x%8.8x for '%s')\n",
- die_ref.die_offset, name.GetCString());
- }
- }
+ // Index if we already haven't to make sure the compile units
+ // get indexed and make their global DIE index list
+ if (m_using_apple_tables) {
+ if (m_apple_namespaces_ap.get()) {
+ const char *name_cstr = name.GetCString();
+ m_apple_namespaces_ap->FindByName(name_cstr, die_offsets);
+ }
+ } else {
+ if (!m_indexed)
+ Index();
+
+ m_namespace_index.Find(name, die_offsets);
+ }
- }
+ const size_t num_matches = die_offsets.size();
+ if (num_matches) {
+ for (size_t i = 0; i < num_matches; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = GetDIE(die_ref);
+
+ if (die) {
+ if (!DIEInDeclContext(parent_decl_ctx, die))
+ continue; // The containing decl contexts don't match
+
+ DWARFASTParser *dwarf_ast = die.GetDWARFParser();
+ if (dwarf_ast) {
+ namespace_decl_ctx = dwarf_ast->GetDeclContextForUIDFromDWARF(die);
+ if (namespace_decl_ctx)
+ break;
+ }
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified "
+ "(.apple_namespaces accelerator table had bad die 0x%8.8x for "
+ "'%s')\n",
+ die_ref.die_offset, name.GetCString());
+ }
}
+ }
}
- if (log && namespace_decl_ctx)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindNamespace (sc, name=\"%s\") => CompilerDeclContext(%p/%p) \"%s\"",
- name.GetCString(),
- static_cast<const void*>(namespace_decl_ctx.GetTypeSystem()),
- static_cast<const void*>(namespace_decl_ctx.GetOpaqueDeclContext()),
- namespace_decl_ctx.GetName().AsCString("<NULL>"));
- }
-
- return namespace_decl_ctx;
+ }
+ if (log && namespace_decl_ctx) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindNamespace (sc, name=\"%s\") => "
+ "CompilerDeclContext(%p/%p) \"%s\"",
+ name.GetCString(),
+ static_cast<const void *>(namespace_decl_ctx.GetTypeSystem()),
+ static_cast<const void *>(namespace_decl_ctx.GetOpaqueDeclContext()),
+ namespace_decl_ctx.GetName().AsCString("<NULL>"));
+ }
+
+ return namespace_decl_ctx;
}
-TypeSP
-SymbolFileDWARF::GetTypeForDIE (const DWARFDIE &die, bool resolve_function_context)
-{
- TypeSP type_sp;
- if (die)
- {
- Type *type_ptr = GetDIEToType().lookup (die.GetDIE());
- if (type_ptr == NULL)
- {
- CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(die.GetCU());
- assert (lldb_cu);
- SymbolContext sc(lldb_cu);
- const DWARFDebugInfoEntry* parent_die = die.GetParent().GetDIE();
- while (parent_die != nullptr)
- {
- if (parent_die->Tag() == DW_TAG_subprogram)
- break;
- parent_die = parent_die->GetParent();
- }
- SymbolContext sc_backup = sc;
- if (resolve_function_context && parent_die != nullptr && !GetFunction(DWARFDIE(die.GetCU(),parent_die), sc))
- sc = sc_backup;
-
- type_sp = ParseType(sc, die, NULL);
- }
- else if (type_ptr != DIE_IS_BEING_PARSED)
- {
- // Grab the existing type from the master types lists
- type_sp = type_ptr->shared_from_this();
- }
-
+TypeSP SymbolFileDWARF::GetTypeForDIE(const DWARFDIE &die,
+ bool resolve_function_context) {
+ TypeSP type_sp;
+ if (die) {
+ Type *type_ptr = GetDIEToType().lookup(die.GetDIE());
+ if (type_ptr == NULL) {
+ CompileUnit *lldb_cu = GetCompUnitForDWARFCompUnit(die.GetCU());
+ assert(lldb_cu);
+ SymbolContext sc(lldb_cu);
+ const DWARFDebugInfoEntry *parent_die = die.GetParent().GetDIE();
+ while (parent_die != nullptr) {
+ if (parent_die->Tag() == DW_TAG_subprogram)
+ break;
+ parent_die = parent_die->GetParent();
+ }
+ SymbolContext sc_backup = sc;
+ if (resolve_function_context && parent_die != nullptr &&
+ !GetFunction(DWARFDIE(die.GetCU(), parent_die), sc))
+ sc = sc_backup;
+
+ type_sp = ParseType(sc, die, NULL);
+ } else if (type_ptr != DIE_IS_BEING_PARSED) {
+ // Grab the existing type from the master types lists
+ type_sp = type_ptr->shared_from_this();
}
- return type_sp;
+ }
+ return type_sp;
}
-
DWARFDIE
-SymbolFileDWARF::GetDeclContextDIEContainingDIE (const DWARFDIE &orig_die)
-{
- if (orig_die)
- {
- DWARFDIE die = orig_die;
-
- 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 (orig_die != die)
- {
- switch (die.Tag())
- {
- case DW_TAG_compile_unit:
- case DW_TAG_namespace:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_class_type:
- case DW_TAG_lexical_block:
- case DW_TAG_subprogram:
- return die;
-
- default:
- break;
- }
- }
-
- DWARFDIE spec_die = die.GetReferencedDIE(DW_AT_specification);
- if (spec_die)
- {
- DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE(spec_die);
- if (decl_ctx_die)
- return decl_ctx_die;
- }
+SymbolFileDWARF::GetDeclContextDIEContainingDIE(const DWARFDIE &orig_die) {
+ if (orig_die) {
+ DWARFDIE die = orig_die;
- DWARFDIE abs_die = die.GetReferencedDIE(DW_AT_abstract_origin);
- if (abs_die)
- {
- DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE(abs_die);
- if (decl_ctx_die)
- return decl_ctx_die;
- }
+ 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 (orig_die != die) {
+ switch (die.Tag()) {
+ case DW_TAG_compile_unit:
+ case DW_TAG_namespace:
+ case DW_TAG_structure_type:
+ case DW_TAG_union_type:
+ case DW_TAG_class_type:
+ case DW_TAG_lexical_block:
+ case DW_TAG_subprogram:
+ return die;
- die = die.GetParent();
+ default:
+ break;
}
+ }
+
+ DWARFDIE spec_die = die.GetReferencedDIE(DW_AT_specification);
+ if (spec_die) {
+ DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE(spec_die);
+ if (decl_ctx_die)
+ return decl_ctx_die;
+ }
+
+ DWARFDIE abs_die = die.GetReferencedDIE(DW_AT_abstract_origin);
+ if (abs_die) {
+ DWARFDIE decl_ctx_die = GetDeclContextDIEContainingDIE(abs_die);
+ if (decl_ctx_die)
+ return decl_ctx_die;
+ }
+
+ die = die.GetParent();
}
- return DWARFDIE();
+ }
+ return DWARFDIE();
}
-
Symbol *
-SymbolFileDWARF::GetObjCClassSymbol (const ConstString &objc_class_name)
-{
- Symbol *objc_class_symbol = NULL;
- if (m_obj_file)
- {
- Symtab *symtab = m_obj_file->GetSymtab ();
- if (symtab)
- {
- objc_class_symbol = symtab->FindFirstSymbolWithNameAndType (objc_class_name,
- eSymbolTypeObjCClass,
- Symtab::eDebugNo,
- Symtab::eVisibilityAny);
- }
+SymbolFileDWARF::GetObjCClassSymbol(const ConstString &objc_class_name) {
+ Symbol *objc_class_symbol = NULL;
+ if (m_obj_file) {
+ Symtab *symtab = m_obj_file->GetSymtab();
+ if (symtab) {
+ objc_class_symbol = symtab->FindFirstSymbolWithNameAndType(
+ objc_class_name, eSymbolTypeObjCClass, Symtab::eDebugNo,
+ Symtab::eVisibilityAny);
}
- return objc_class_symbol;
+ }
+ return objc_class_symbol;
}
-// Some compilers don't emit the DW_AT_APPLE_objc_complete_type attribute. If they don't
-// then we can end up looking through all class types for a complete type and never find
-// the full definition. We need to know if this attribute is supported, so we determine
-// this here and cache th result. We also need to worry about the debug map DWARF file
+// Some compilers don't emit the DW_AT_APPLE_objc_complete_type attribute. If
+// they don't
+// then we can end up looking through all class types for a complete type and
+// never find
+// the full definition. We need to know if this attribute is supported, so we
+// determine
+// this here and cache th result. We also need to worry about the debug map
+// DWARF file
// if we are doing darwin DWARF in .o file debugging.
-bool
-SymbolFileDWARF::Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu)
-{
- if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate)
- {
- m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
- if (cu && cu->Supports_DW_AT_APPLE_objc_complete_type())
- m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
- else
- {
- DWARFDebugInfo* debug_info = DebugInfo();
- const uint32_t num_compile_units = GetNumCompileUnits();
- for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
- {
- DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
- if (dwarf_cu != cu && dwarf_cu->Supports_DW_AT_APPLE_objc_complete_type())
- {
- m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
- break;
- }
- }
+bool SymbolFileDWARF::Supports_DW_AT_APPLE_objc_complete_type(
+ DWARFCompileUnit *cu) {
+ if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate) {
+ m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
+ if (cu && cu->Supports_DW_AT_APPLE_objc_complete_type())
+ m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
+ else {
+ DWARFDebugInfo *debug_info = DebugInfo();
+ const uint32_t num_compile_units = GetNumCompileUnits();
+ for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
+ DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+ if (dwarf_cu != cu &&
+ dwarf_cu->Supports_DW_AT_APPLE_objc_complete_type()) {
+ m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
+ break;
}
- if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo && GetDebugMapSymfile ())
- return m_debug_map_symfile->Supports_DW_AT_APPLE_objc_complete_type (this);
+ }
}
- return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
+ if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo &&
+ GetDebugMapSymfile())
+ return m_debug_map_symfile->Supports_DW_AT_APPLE_objc_complete_type(this);
+ }
+ return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
}
// 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 DWARFDIE &die,
- const ConstString &type_name,
- bool must_be_implementation)
-{
-
- TypeSP type_sp;
-
- if (!type_name || (must_be_implementation && !GetObjCClassSymbol (type_name)))
- return type_sp;
-
- DIEArray die_offsets;
-
- if (m_using_apple_tables)
- {
- if (m_apple_types_ap.get())
- {
- const char *name_cstr = type_name.GetCString();
- m_apple_types_ap->FindCompleteObjCClassByName (name_cstr, die_offsets, must_be_implementation);
- }
- }
- else
- {
- if (!m_indexed)
- Index ();
-
- m_type_index.Find (type_name, die_offsets);
+TypeSP SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE(
+ const DWARFDIE &die, const ConstString &type_name,
+ bool must_be_implementation) {
+
+ TypeSP type_sp;
+
+ if (!type_name || (must_be_implementation && !GetObjCClassSymbol(type_name)))
+ return type_sp;
+
+ DIEArray die_offsets;
+
+ if (m_using_apple_tables) {
+ if (m_apple_types_ap.get()) {
+ const char *name_cstr = type_name.GetCString();
+ m_apple_types_ap->FindCompleteObjCClassByName(name_cstr, die_offsets,
+ must_be_implementation);
}
-
- const size_t num_matches = die_offsets.size();
-
- if (num_matches)
- {
- for (size_t i=0; i<num_matches; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE type_die = GetDIE (die_ref);
-
- if (type_die)
- {
- bool try_resolving_type = false;
-
- // Don't try and resolve the DIE we are looking for with the DIE itself!
- if (type_die != die)
- {
- switch (type_die.Tag())
- {
- case DW_TAG_class_type:
- case DW_TAG_structure_type:
- try_resolving_type = true;
- break;
- default:
- break;
- }
- }
-
- if (try_resolving_type)
- {
- 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_die, false, true);
- 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",
- die.GetID(),
- m_obj_file->GetFileSpec().GetFilename().AsCString("<Unknown>"),
- type_die.GetID(),
- type_cu->GetID());
-
- if (die)
- GetDIEToType()[die.GetDIE()] = resolved_type;
- type_sp = resolved_type->shared_from_this();
- break;
- }
- }
- }
+ } else {
+ if (!m_indexed)
+ Index();
+
+ m_type_index.Find(type_name, die_offsets);
+ }
+
+ const size_t num_matches = die_offsets.size();
+
+ if (num_matches) {
+ for (size_t i = 0; i < num_matches; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE type_die = GetDIE(die_ref);
+
+ if (type_die) {
+ bool try_resolving_type = false;
+
+ // Don't try and resolve the DIE we are looking for with the DIE itself!
+ if (type_die != die) {
+ switch (type_die.Tag()) {
+ case DW_TAG_class_type:
+ case DW_TAG_structure_type:
+ try_resolving_type = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (try_resolving_type) {
+ 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_die, false, true);
+ 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",
+ die.GetID(),
+ m_obj_file->GetFileSpec().GetFilename().AsCString(
+ "<Unknown>"),
+ type_die.GetID(), type_cu->GetID());
+
+ if (die)
+ GetDIEToType()[die.GetDIE()] = resolved_type;
+ type_sp = resolved_type->shared_from_this();
+ break;
}
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
- die_ref.die_offset, type_name.GetCString());
- }
- }
-
+ }
+ }
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_types "
+ "accelerator table had bad die 0x%8.8x for '%s')\n",
+ die_ref.die_offset, type_name.GetCString());
}
+ }
}
- return type_sp;
+ }
+ return type_sp;
}
-
//----------------------------------------------------------------------
// This function helps to ensure that the declaration contexts match for
-// two different DIEs. Often times debug information will refer to a
+// two different DIEs. Often times debug information will refer to a
// forward declaration of a type (the equivalent of "struct my_struct;".
// There will often be a declaration of that type elsewhere that has the
// full definition. When we go looking for the full type "my_struct", we
// will find one or more matches in the accelerator tables and we will
-// then need to make sure the type was in the same declaration context
+// then need to make sure the type was in the same declaration context
// as the original DIE. This function can efficiently compare two DIEs
// and will return true when the declaration context matches, and false
-// when they don't.
+// when they don't.
//----------------------------------------------------------------------
-bool
-SymbolFileDWARF::DIEDeclContextsMatch (const DWARFDIE &die1,
- const DWARFDIE &die2)
-{
- if (die1 == die2)
- return true;
-
- DWARFDIECollection decl_ctx_1;
- DWARFDIECollection decl_ctx_2;
- //The declaration DIE stack is a stack of the declaration context
- // DIEs all the way back to the compile unit. If a type "T" is
- // declared inside a class "B", and class "B" is declared inside
- // a class "A" and class "A" is in a namespace "lldb", and the
- // namespace is in a compile unit, there will be a stack of DIEs:
- //
- // [0] DW_TAG_class_type for "B"
- // [1] DW_TAG_class_type for "A"
- // [2] DW_TAG_namespace for "lldb"
- // [3] DW_TAG_compile_unit for the source file.
- //
- // We grab both contexts and make sure that everything matches
- // all the way back to the compiler unit.
-
- // First lets grab the decl contexts for both DIEs
- 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();
- const size_t count2 = decl_ctx_2.Size();
- if (count1 != count2)
- return false;
-
- // Make sure the DW_TAG values match all the way back up the
- // compile unit. If they don't, then we are done.
- DWARFDIE decl_ctx_die1;
- DWARFDIE decl_ctx_die2;
- size_t i;
- for (i=0; i<count1; i++)
- {
- 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;
- }
+bool SymbolFileDWARF::DIEDeclContextsMatch(const DWARFDIE &die1,
+ const DWARFDIE &die2) {
+ if (die1 == die2)
+ return true;
+
+ DWARFDIECollection decl_ctx_1;
+ DWARFDIECollection decl_ctx_2;
+ // The declaration DIE stack is a stack of the declaration context
+ // DIEs all the way back to the compile unit. If a type "T" is
+ // declared inside a class "B", and class "B" is declared inside
+ // a class "A" and class "A" is in a namespace "lldb", and the
+ // namespace is in a compile unit, there will be a stack of DIEs:
+ //
+ // [0] DW_TAG_class_type for "B"
+ // [1] DW_TAG_class_type for "A"
+ // [2] DW_TAG_namespace for "lldb"
+ // [3] DW_TAG_compile_unit for the source file.
+ //
+ // We grab both contexts and make sure that everything matches
+ // all the way back to the compiler unit.
+
+ // First lets grab the decl contexts for both DIEs
+ 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();
+ const size_t count2 = decl_ctx_2.Size();
+ if (count1 != count2)
+ return false;
+
+ // Make sure the DW_TAG values match all the way back up the
+ // compile unit. If they don't, then we are done.
+ DWARFDIE decl_ctx_die1;
+ DWARFDIE decl_ctx_die2;
+ size_t i;
+ for (i = 0; i < count1; i++) {
+ 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
- // 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 DWARFDIE::GetDeclContextDIEs() function...
- assert (decl_ctx_1.GetDIEAtIndex (count1 - 1).Tag() == DW_TAG_compile_unit);
+ // 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 DWARFDIE::GetDeclContextDIEs() function...
+ 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.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)
- continue;
-
- // Name pointers are not equal, so only compare the strings
- // if both are not NULL.
- if (name1 && name2)
- {
- // If the strings don't compare, we are done...
- if (strcmp(name1, name2) != 0)
- return false;
- }
- else
- {
- // One name was NULL while the other wasn't
- return false;
- }
+ // 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.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)
+ continue;
+
+ // Name pointers are not equal, so only compare the strings
+ // if both are not NULL.
+ if (name1 && name2) {
+ // If the strings don't compare, we are done...
+ if (strcmp(name1, name2) != 0)
+ return false;
+ } else {
+ // One name was NULL while the other wasn't
+ return false;
}
- // We made it through all of the checks and the declaration contexts
- // are equal.
- return true;
+ }
+ // We made it through all of the checks and the declaration contexts
+ // are equal.
+ return true;
}
-
-
-TypeSP
-SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &dwarf_decl_ctx)
-{
- TypeSP type_sp;
-
- const uint32_t dwarf_decl_ctx_count = dwarf_decl_ctx.GetSize();
- if (dwarf_decl_ctx_count > 0)
- {
- const ConstString type_name(dwarf_decl_ctx[0].name);
- const dw_tag_t tag = dwarf_decl_ctx[0].tag;
- if (type_name)
- {
- Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_TYPE_COMPLETION|DWARF_LOG_LOOKUPS));
+TypeSP SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(
+ const DWARFDeclContext &dwarf_decl_ctx) {
+ TypeSP type_sp;
+
+ const uint32_t dwarf_decl_ctx_count = dwarf_decl_ctx.GetSize();
+ if (dwarf_decl_ctx_count > 0) {
+ const ConstString type_name(dwarf_decl_ctx[0].name);
+ const dw_tag_t tag = dwarf_decl_ctx[0].tag;
+
+ if (type_name) {
+ Log *log(LogChannelDWARF::GetLogIfAny(DWARF_LOG_TYPE_COMPLETION |
+ DWARF_LOG_LOOKUPS));
+ if (log) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%"
+ "s, qualified-name='%s')",
+ DW_TAG_value_to_name(dwarf_decl_ctx[0].tag),
+ dwarf_decl_ctx.GetQualifiedName());
+ }
+
+ DIEArray die_offsets;
+
+ if (m_using_apple_tables) {
+ if (m_apple_types_ap.get()) {
+ const bool has_tag =
+ m_apple_types_ap->GetHeader().header_data.ContainsAtom(
+ DWARFMappedHash::eAtomTypeTag);
+ const bool has_qualified_name_hash =
+ m_apple_types_ap->GetHeader().header_data.ContainsAtom(
+ DWARFMappedHash::eAtomTypeQualNameHash);
+ if (has_tag && has_qualified_name_hash) {
+ const char *qualified_name = dwarf_decl_ctx.GetQualifiedName();
+ const uint32_t qualified_name_hash =
+ MappedHash::HashStringUsingDJB(qualified_name);
if (log)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s')",
- DW_TAG_value_to_name(dwarf_decl_ctx[0].tag),
- dwarf_decl_ctx.GetQualifiedName());
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "FindByNameAndTagAndQualifiedNameHash()");
+ m_apple_types_ap->FindByNameAndTagAndQualifiedNameHash(
+ type_name.GetCString(), tag, qualified_name_hash, die_offsets);
+ } else if (has_tag) {
+ if (log)
+ GetObjectFile()->GetModule()->LogMessage(log,
+ "FindByNameAndTag()");
+ m_apple_types_ap->FindByNameAndTag(type_name.GetCString(), tag,
+ die_offsets);
+ } else {
+ m_apple_types_ap->FindByName(type_name.GetCString(), die_offsets);
+ }
+ }
+ } else {
+ if (!m_indexed)
+ Index();
+
+ m_type_index.Find(type_name, die_offsets);
+ }
+
+ const size_t num_matches = die_offsets.size();
+
+ // Get the type system that we are looking to find a type for. We will use
+ // this
+ // to ensure any matches we find are in a language that this type system
+ // supports
+ const LanguageType language = dwarf_decl_ctx.GetLanguage();
+ TypeSystem *type_system = (language == eLanguageTypeUnknown)
+ ? nullptr
+ : GetTypeSystemForLanguage(language);
+
+ if (num_matches) {
+ for (size_t i = 0; i < num_matches; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE type_die = GetDIE(die_ref);
+
+ if (type_die) {
+ // Make sure type_die's langauge matches the type system we are
+ // looking for.
+ // We don't want to find a "Foo" type from Java if we are looking
+ // for a "Foo"
+ // type for C, C++, ObjC, or ObjC++.
+ if (type_system &&
+ !type_system->SupportsLanguage(type_die.GetLanguage()))
+ continue;
+ 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();
+ // Make sure the tags match
+ if (type_tag == tag) {
+ // The tags match, lets try resolving this type
+ try_resolving_type = true;
+ } else {
+ // The tags don't match, but we need to watch our for a
+ // forward declaration for a struct and ("struct foo")
+ // ends up being a class ("class foo { ... };") or
+ // vice versa.
+ switch (type_tag) {
+ case DW_TAG_class_type:
+ // We had a "class foo", see if we ended up with a "struct foo {
+ // ... };"
+ try_resolving_type = (tag == DW_TAG_structure_type);
+ break;
+ case DW_TAG_structure_type:
+ // We had a "struct foo", see if we ended up with a "class foo {
+ // ... };"
+ try_resolving_type = (tag == DW_TAG_class_type);
+ break;
+ default:
+ // Tags don't match, don't event try to resolve
+ // using this type whose name matches....
+ break;
+ }
}
-
- DIEArray die_offsets;
-
- if (m_using_apple_tables)
- {
- if (m_apple_types_ap.get())
- {
- const bool has_tag = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeTag);
- const bool has_qualified_name_hash = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeQualNameHash);
- if (has_tag && has_qualified_name_hash)
- {
- const char *qualified_name = dwarf_decl_ctx.GetQualifiedName();
- const uint32_t qualified_name_hash = MappedHash::HashStringUsingDJB (qualified_name);
- if (log)
- GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTagAndQualifiedNameHash()");
- m_apple_types_ap->FindByNameAndTagAndQualifiedNameHash (type_name.GetCString(), tag, qualified_name_hash, die_offsets);
- }
- else if (has_tag)
- {
- if (log)
- GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTag()");
- m_apple_types_ap->FindByNameAndTag (type_name.GetCString(), tag, die_offsets);
- }
- else
- {
- m_apple_types_ap->FindByName (type_name.GetCString(), die_offsets);
- }
+
+ if (try_resolving_type) {
+ DWARFDeclContext type_dwarf_decl_ctx;
+ type_die.GetDWARFDeclContext(type_dwarf_decl_ctx);
+
+ if (log) {
+ GetObjectFile()->GetModule()->LogMessage(
+ log, "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_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_die, false);
+ if (resolved_type && resolved_type != DIE_IS_BEING_PARSED) {
+ type_sp = resolved_type->shared_from_this();
+ break;
}
+ }
+ } else {
+ if (log) {
+ std::string 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(),
+ qualified_name.c_str());
+ }
}
- else
- {
- if (!m_indexed)
- Index ();
-
- m_type_index.Find (type_name, die_offsets);
- }
-
- const size_t num_matches = die_offsets.size();
-
- // Get the type system that we are looking to find a type for. We will use this
- // to ensure any matches we find are in a language that this type system supports
- const LanguageType language = dwarf_decl_ctx.GetLanguage();
- TypeSystem *type_system = (language == eLanguageTypeUnknown) ? nullptr : GetTypeSystemForLanguage(language);
-
- if (num_matches)
- {
- for (size_t i=0; i<num_matches; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE type_die = GetDIE (die_ref);
-
- if (type_die)
- {
- // Make sure type_die's langauge matches the type system we are looking for.
- // We don't want to find a "Foo" type from Java if we are looking for a "Foo"
- // type for C, C++, ObjC, or ObjC++.
- if (type_system && !type_system->SupportsLanguage(type_die.GetLanguage()))
- continue;
- 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();
- // Make sure the tags match
- if (type_tag == tag)
- {
- // The tags match, lets try resolving this type
- try_resolving_type = true;
- }
- else
- {
- // The tags don't match, but we need to watch our for a
- // forward declaration for a struct and ("struct foo")
- // ends up being a class ("class foo { ... };") or
- // vice versa.
- switch (type_tag)
- {
- case DW_TAG_class_type:
- // We had a "class foo", see if we ended up with a "struct foo { ... };"
- try_resolving_type = (tag == DW_TAG_structure_type);
- break;
- case DW_TAG_structure_type:
- // We had a "struct foo", see if we ended up with a "class foo { ... };"
- try_resolving_type = (tag == DW_TAG_class_type);
- break;
- default:
- // Tags don't match, don't event try to resolve
- // using this type whose name matches....
- break;
- }
- }
-
- if (try_resolving_type)
- {
- DWARFDeclContext type_dwarf_decl_ctx;
- type_die.GetDWARFDeclContext (type_dwarf_decl_ctx);
-
- if (log)
- {
- GetObjectFile()->GetModule()->LogMessage (log,
- "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_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_die, false);
- if (resolved_type && resolved_type != DIE_IS_BEING_PARSED)
- {
- type_sp = resolved_type->shared_from_this();
- break;
- }
- }
- }
- else
- {
- if (log)
- {
- std::string 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(),
- qualified_name.c_str());
- }
- }
- }
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
- die_ref.die_offset, type_name.GetCString());
- }
- }
-
- }
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified (.apple_types "
+ "accelerator table had bad die 0x%8.8x for '%s')\n",
+ die_ref.die_offset, type_name.GetCString());
}
+ }
}
+ }
}
- return type_sp;
+ }
+ return type_sp;
}
-TypeSP
-SymbolFileDWARF::ParseType (const SymbolContext& sc, const DWARFDIE &die, bool *type_is_new_ptr)
-{
- TypeSP type_sp;
-
- if (die)
- {
- TypeSystem *type_system = GetTypeSystemForLanguage(die.GetCU()->GetLanguageType());
-
- if (type_system)
- {
- DWARFASTParser *dwarf_ast = type_system->GetDWARFParser();
- if (dwarf_ast)
- {
- Log *log = LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO);
- type_sp = dwarf_ast->ParseTypeFromDWARF (sc, die, log, type_is_new_ptr);
- if (type_sp)
- {
- TypeList* type_list = GetTypeList();
- if (type_list)
- type_list->Insert(type_sp);
-
- if (die.Tag() == DW_TAG_subprogram)
- {
- DIERef die_ref = die.GetDIERef();
- std::string scope_qualified_name(GetDeclContextForUID(die.GetID()).GetScopeQualifiedName().AsCString(""));
- if (scope_qualified_name.size())
- {
- NameToOffsetMap::iterator iter = m_function_scope_qualified_name_map.find(scope_qualified_name);
- if (iter != m_function_scope_qualified_name_map.end())
- (*iter).second->insert(die_ref);
- else
- {
- DIERefSetSP new_set(new std::set<DIERef>);
- new_set->insert(die_ref);
- m_function_scope_qualified_name_map.emplace(std::make_pair(scope_qualified_name, new_set));
- }
- }
- }
- }
+TypeSP SymbolFileDWARF::ParseType(const SymbolContext &sc, const DWARFDIE &die,
+ bool *type_is_new_ptr) {
+ TypeSP type_sp;
+
+ if (die) {
+ TypeSystem *type_system =
+ GetTypeSystemForLanguage(die.GetCU()->GetLanguageType());
+
+ if (type_system) {
+ DWARFASTParser *dwarf_ast = type_system->GetDWARFParser();
+ if (dwarf_ast) {
+ Log *log = LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO);
+ type_sp = dwarf_ast->ParseTypeFromDWARF(sc, die, log, type_is_new_ptr);
+ if (type_sp) {
+ TypeList *type_list = GetTypeList();
+ if (type_list)
+ type_list->Insert(type_sp);
+
+ if (die.Tag() == DW_TAG_subprogram) {
+ DIERef die_ref = die.GetDIERef();
+ std::string scope_qualified_name(GetDeclContextForUID(die.GetID())
+ .GetScopeQualifiedName()
+ .AsCString(""));
+ if (scope_qualified_name.size()) {
+ NameToOffsetMap::iterator iter =
+ m_function_scope_qualified_name_map.find(
+ scope_qualified_name);
+ if (iter != m_function_scope_qualified_name_map.end())
+ (*iter).second->insert(die_ref);
+ else {
+ DIERefSetSP new_set(new std::set<DIERef>);
+ new_set->insert(die_ref);
+ m_function_scope_qualified_name_map.emplace(
+ std::make_pair(scope_qualified_name, new_set));
+ }
}
+ }
}
+ }
}
-
- return type_sp;
-}
+ }
-size_t
-SymbolFileDWARF::ParseTypes
-(
- const SymbolContext& sc,
- const DWARFDIE &orig_die,
- bool parse_siblings,
- bool parse_children
-)
-{
- size_t types_added = 0;
- DWARFDIE die = orig_die;
- while (die)
- {
- bool type_is_new = false;
- if (ParseType(sc, die, &type_is_new).get())
- {
- if (type_is_new)
- ++types_added;
- }
+ return type_sp;
+}
- if (parse_children && die.HasChildren())
- {
- if (die.Tag() == DW_TAG_subprogram)
- {
- SymbolContext child_sc(sc);
- child_sc.function = sc.comp_unit->FindFunctionByUID(die.GetID()).get();
- types_added += ParseTypes(child_sc, die.GetFirstChild(), true, true);
- }
- else
- types_added += ParseTypes(sc, die.GetFirstChild(), true, true);
- }
+size_t SymbolFileDWARF::ParseTypes(const SymbolContext &sc,
+ const DWARFDIE &orig_die,
+ bool parse_siblings, bool parse_children) {
+ size_t types_added = 0;
+ DWARFDIE die = orig_die;
+ while (die) {
+ bool type_is_new = false;
+ if (ParseType(sc, die, &type_is_new).get()) {
+ if (type_is_new)
+ ++types_added;
+ }
- if (parse_siblings)
- die = die.GetSibling();
- else
- die.Clear();
+ if (parse_children && die.HasChildren()) {
+ if (die.Tag() == DW_TAG_subprogram) {
+ SymbolContext child_sc(sc);
+ child_sc.function = sc.comp_unit->FindFunctionByUID(die.GetID()).get();
+ types_added += ParseTypes(child_sc, die.GetFirstChild(), true, true);
+ } else
+ types_added += ParseTypes(sc, die.GetFirstChild(), true, true);
}
- return types_added;
-}
+ if (parse_siblings)
+ die = die.GetSibling();
+ else
+ die.Clear();
+ }
+ return types_added;
+}
-size_t
-SymbolFileDWARF::ParseFunctionBlocks (const SymbolContext &sc)
-{
- assert(sc.comp_unit && sc.function);
- size_t functions_added = 0;
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- {
- 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), function_die, LLDB_INVALID_ADDRESS, 0);
- }
+size_t SymbolFileDWARF::ParseFunctionBlocks(const SymbolContext &sc) {
+ assert(sc.comp_unit && sc.function);
+ size_t functions_added = 0;
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu) {
+ 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), function_die,
+ LLDB_INVALID_ADDRESS, 0);
}
+ }
- return functions_added;
+ return functions_added;
}
-
-size_t
-SymbolFileDWARF::ParseTypes (const SymbolContext &sc)
-{
- // At least a compile unit must be valid
- assert(sc.comp_unit);
- size_t types_added = 0;
- DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
- if (dwarf_cu)
- {
- if (sc.function)
- {
- dw_offset_t function_die_offset = sc.function->GetID();
- DWARFDIE func_die = dwarf_cu->GetDIE(function_die_offset);
- if (func_die && func_die.HasChildren())
- {
- types_added = ParseTypes(sc, func_die.GetFirstChild(), true, true);
- }
- }
- else
- {
- DWARFDIE dwarf_cu_die = dwarf_cu->DIE();
- if (dwarf_cu_die && dwarf_cu_die.HasChildren())
- {
- types_added = ParseTypes(sc, dwarf_cu_die.GetFirstChild(), true, true);
- }
- }
+size_t SymbolFileDWARF::ParseTypes(const SymbolContext &sc) {
+ // At least a compile unit must be valid
+ assert(sc.comp_unit);
+ size_t types_added = 0;
+ DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+ if (dwarf_cu) {
+ if (sc.function) {
+ dw_offset_t function_die_offset = sc.function->GetID();
+ DWARFDIE func_die = dwarf_cu->GetDIE(function_die_offset);
+ if (func_die && func_die.HasChildren()) {
+ types_added = ParseTypes(sc, func_die.GetFirstChild(), true, true);
+ }
+ } else {
+ DWARFDIE dwarf_cu_die = dwarf_cu->DIE();
+ if (dwarf_cu_die && dwarf_cu_die.HasChildren()) {
+ types_added = ParseTypes(sc, dwarf_cu_die.GetFirstChild(), true, true);
+ }
}
+ }
- return types_added;
+ return types_added;
}
-size_t
-SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc)
-{
- if (sc.comp_unit != NULL)
- {
- DWARFDebugInfo* info = DebugInfo();
- if (info == NULL)
- return 0;
-
- if (sc.function)
- {
- DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID(), this));
-
- const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress (DW_AT_low_pc, LLDB_INVALID_ADDRESS);
- if (func_lo_pc != LLDB_INVALID_ADDRESS)
- {
- 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);
- return num_variables;
+size_t SymbolFileDWARF::ParseVariablesForContext(const SymbolContext &sc) {
+ if (sc.comp_unit != NULL) {
+ DWARFDebugInfo *info = DebugInfo();
+ if (info == NULL)
+ return 0;
+
+ if (sc.function) {
+ DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID(), this));
+
+ const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress(
+ DW_AT_low_pc, LLDB_INVALID_ADDRESS);
+ if (func_lo_pc != LLDB_INVALID_ADDRESS) {
+ 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);
+ return num_variables;
+ }
+ } else if (sc.comp_unit) {
+ DWARFCompileUnit *dwarf_cu = info->GetCompileUnit(sc.comp_unit->GetID());
+
+ if (dwarf_cu == NULL)
+ return 0;
+
+ uint32_t vars_added = 0;
+ VariableListSP variables(sc.comp_unit->GetVariableList(false));
+
+ if (variables.get() == NULL) {
+ variables.reset(new VariableList());
+ sc.comp_unit->SetVariableList(variables);
+
+ DIEArray die_offsets;
+ if (m_using_apple_tables) {
+ if (m_apple_names_ap.get()) {
+ DWARFMappedHash::DIEInfoArray hash_data_array;
+ if (m_apple_names_ap->AppendAllDIEsInRange(
+ dwarf_cu->GetOffset(), dwarf_cu->GetNextCompileUnitOffset(),
+ hash_data_array)) {
+ DWARFMappedHash::ExtractDIEArray(hash_data_array, die_offsets);
}
+ }
+ } else {
+ // Index if we already haven't to make sure the compile units
+ // get indexed and make their global DIE index list
+ if (!m_indexed)
+ Index();
+
+ m_global_index.FindAllEntriesForCompileUnit(dwarf_cu->GetOffset(),
+ die_offsets);
}
- else if (sc.comp_unit)
- {
- DWARFCompileUnit* dwarf_cu = info->GetCompileUnit(sc.comp_unit->GetID());
-
- if (dwarf_cu == NULL)
- return 0;
-
- uint32_t vars_added = 0;
- VariableListSP variables (sc.comp_unit->GetVariableList(false));
-
- if (variables.get() == NULL)
- {
- variables.reset(new VariableList());
- sc.comp_unit->SetVariableList(variables);
-
- DIEArray die_offsets;
- if (m_using_apple_tables)
- {
- if (m_apple_names_ap.get())
- {
- DWARFMappedHash::DIEInfoArray hash_data_array;
- if (m_apple_names_ap->AppendAllDIEsInRange (dwarf_cu->GetOffset(),
- dwarf_cu->GetNextCompileUnitOffset(),
- hash_data_array))
- {
- DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets);
- }
- }
- }
- else
- {
- // Index if we already haven't to make sure the compile units
- // get indexed and make their global DIE index list
- if (!m_indexed)
- Index ();
-
- m_global_index.FindAllEntriesForCompileUnit (dwarf_cu->GetOffset(),
- die_offsets);
- }
-
- const size_t num_matches = die_offsets.size();
- if (num_matches)
- {
- for (size_t i=0; i<num_matches; ++i)
- {
- const DIERef& die_ref = die_offsets[i];
- DWARFDIE die = GetDIE (die_ref);
- if (die)
- {
- VariableSP var_sp (ParseVariableDIE(sc, die, LLDB_INVALID_ADDRESS));
- if (var_sp)
- {
- variables->AddVariableIfUnique (var_sp);
- ++vars_added;
- }
- }
- else
- {
- if (m_using_apple_tables)
- {
- GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x)\n", die_ref.die_offset);
- }
- }
- }
- }
+ const size_t num_matches = die_offsets.size();
+ if (num_matches) {
+ for (size_t i = 0; i < num_matches; ++i) {
+ const DIERef &die_ref = die_offsets[i];
+ DWARFDIE die = GetDIE(die_ref);
+ if (die) {
+ VariableSP var_sp(
+ ParseVariableDIE(sc, die, LLDB_INVALID_ADDRESS));
+ if (var_sp) {
+ variables->AddVariableIfUnique(var_sp);
+ ++vars_added;
+ }
+ } else {
+ if (m_using_apple_tables) {
+ GetObjectFile()->GetModule()->ReportErrorIfModifyDetected(
+ "the DWARF debug information has been modified "
+ "(.apple_names accelerator table had bad die 0x%8.8x)\n",
+ die_ref.die_offset);
+ }
}
- return vars_added;
+ }
}
+ }
+ return vars_added;
}
- return 0;
+ }
+ return 0;
}
-VariableSP
-SymbolFileDWARF::ParseVariableDIE
-(
- const SymbolContext& sc,
- const DWARFDIE &die,
- const lldb::addr_t func_low_pc
-)
-{
- if (die.GetDWARF() != this)
- return die.GetDWARF()->ParseVariableDIE(sc, die, func_low_pc);
+VariableSP SymbolFileDWARF::ParseVariableDIE(const SymbolContext &sc,
+ const DWARFDIE &die,
+ const lldb::addr_t func_low_pc) {
+ if (die.GetDWARF() != this)
+ return die.GetDWARF()->ParseVariableDIE(sc, die, func_low_pc);
- VariableSP var_sp;
- if (!die)
- return var_sp;
+ VariableSP var_sp;
+ if (!die)
+ return var_sp;
- var_sp = GetDIEToVariable()[die.GetDIE()];
- if (var_sp)
- return var_sp; // Already been parsed!
-
- 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))
- {
- DWARFAttributes attributes;
- const size_t num_attributes = die.GetAttributes(attributes);
- DWARFDIE spec_die;
- if (num_attributes > 0)
- {
- const char *name = NULL;
- const char *mangled = NULL;
- Declaration decl;
- uint32_t i;
- DWARFFormValue type_die_form;
- DWARFExpression location(die.GetCU());
- bool is_external = false;
- bool is_artificial = false;
- bool location_is_const_value_data = false;
- bool has_explicit_location = false;
- DWARFFormValue const_value;
- Variable::RangeList scope_ranges;
- //AccessType accessibility = eAccessNone;
-
- for (i=0; i<num_attributes; ++i)
- {
- dw_attr_t attr = attributes.AttributeAtIndex(i);
- DWARFFormValue 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(); break;
- case DW_AT_linkage_name:
- case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(); break;
- case DW_AT_type: type_die_form = form_value; break;
- case DW_AT_external: is_external = form_value.Boolean(); break;
- case DW_AT_const_value:
- // If we have already found a DW_AT_location attribute, ignore this attribute.
- if (!has_explicit_location)
- {
- location_is_const_value_data = true;
- // The constant value will be either a block, a data value or a string.
- const DWARFDataExtractor& debug_info_data = get_debug_info_data();
- if (DWARFFormValue::IsBlockForm(form_value.Form()))
- {
- // Retrieve the value as a block expression.
- uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
- uint32_t block_length = form_value.Unsigned();
- location.CopyOpcodeData(module, debug_info_data, block_offset, block_length);
- }
- else if (DWARFFormValue::IsDataForm(form_value.Form()))
- {
- // Retrieve the value as a data expression.
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (
- attributes.CompileUnitAtIndex(i)->GetAddressByteSize(),
- attributes.CompileUnitAtIndex(i)->IsDWARF64());
- uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
- uint32_t data_length = fixed_form_sizes.GetSize(form_value.Form());
- if (data_length == 0)
- {
- const uint8_t *data_pointer = form_value.BlockData();
- if (data_pointer)
- {
- form_value.Unsigned();
- }
- else if (DWARFFormValue::IsDataForm(form_value.Form()))
- {
- // we need to get the byte size of the type later after we create the variable
- const_value = form_value;
- }
- }
- else
- location.CopyOpcodeData(module, debug_info_data, data_offset, data_length);
- }
- else
- {
- // Retrieve the value as a string expression.
- if (form_value.Form() == DW_FORM_strp)
- {
- DWARFFormValue::FixedFormSizes fixed_form_sizes =
- DWARFFormValue::GetFixedFormSizesForAddressSize (
- attributes.CompileUnitAtIndex(i)->GetAddressByteSize(),
- attributes.CompileUnitAtIndex(i)->IsDWARF64());
- uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
- uint32_t data_length = fixed_form_sizes.GetSize(form_value.Form());
- location.CopyOpcodeData(module, debug_info_data, data_offset, data_length);
- }
- else
- {
- 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);
- }
- }
- }
- break;
- case DW_AT_location:
- {
- location_is_const_value_data = false;
- has_explicit_location = true;
- if (DWARFFormValue::IsBlockForm(form_value.Form()))
- {
- const DWARFDataExtractor& debug_info_data = get_debug_info_data();
-
- uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
- uint32_t block_length = form_value.Unsigned();
- location.CopyOpcodeData(module, get_debug_info_data(), block_offset, block_length);
- }
- else
- {
- const DWARFDataExtractor& debug_loc_data = get_debug_loc_data();
- const dw_offset_t debug_loc_offset = form_value.Unsigned();
-
- size_t loc_list_length = DWARFExpression::LocationListSize(die.GetCU(), debug_loc_data, debug_loc_offset);
- if (loc_list_length > 0)
- {
- location.CopyOpcodeData(module, debug_loc_data, debug_loc_offset, loc_list_length);
- assert (func_low_pc != LLDB_INVALID_ADDRESS);
- location.SetLocationListSlide (func_low_pc - attributes.CompileUnitAtIndex(i)->GetBaseAddress());
- }
- }
- }
- break;
- case DW_AT_specification:
- spec_die = GetDIE(DIERef(form_value));
- break;
- case DW_AT_start_scope:
- {
- if (form_value.Form() == DW_FORM_sec_offset)
- {
- DWARFRangeList dwarf_scope_ranges;
- const DWARFDebugRanges* debug_ranges = DebugRanges();
- debug_ranges->FindRanges(form_value.Unsigned(), dwarf_scope_ranges);
-
- // All DW_AT_start_scope are relative to the base address of the
- // compile unit. We add the compile unit base address to make
- // sure all the addresses are properly fixed up.
- for (size_t i = 0, count = dwarf_scope_ranges.GetSize(); i < count; ++i)
- {
- const DWARFRangeList::Entry& range = dwarf_scope_ranges.GetEntryRef(i);
- scope_ranges.Append(range.GetRangeBase() + die.GetCU()->GetBaseAddress(),
- range.GetByteSize());
- }
- }
- else
- {
- // TODO: Handle the case when DW_AT_start_scope have form constant. The
- // dwarf spec is a bit ambiguous about what is the expected behavior in
- // case the enclosing block have a non coninious address range and the
- // DW_AT_start_scope entry have a form constant.
- GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_start_scope has unsupported form type (0x%x)\n",
- die.GetID(),
- form_value.Form());
- }
-
- scope_ranges.Sort();
- scope_ranges.CombineConsecutiveRanges();
- }
- break;
- case DW_AT_artificial: is_artificial = form_value.Boolean(); break;
- case DW_AT_accessibility: break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
- case DW_AT_declaration:
- case DW_AT_description:
- case DW_AT_endianity:
- case DW_AT_segment:
- case DW_AT_visibility:
- default:
- case DW_AT_abstract_origin:
- case DW_AT_sibling:
- break;
- }
+ var_sp = GetDIEToVariable()[die.GetDIE()];
+ if (var_sp)
+ return var_sp; // Already been parsed!
+
+ 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)) {
+ DWARFAttributes attributes;
+ const size_t num_attributes = die.GetAttributes(attributes);
+ DWARFDIE spec_die;
+ if (num_attributes > 0) {
+ const char *name = NULL;
+ const char *mangled = NULL;
+ Declaration decl;
+ uint32_t i;
+ DWARFFormValue type_die_form;
+ DWARFExpression location(die.GetCU());
+ bool is_external = false;
+ bool is_artificial = false;
+ bool location_is_const_value_data = false;
+ bool has_explicit_location = false;
+ DWARFFormValue const_value;
+ Variable::RangeList scope_ranges;
+ // AccessType accessibility = eAccessNone;
+
+ for (i = 0; i < num_attributes; ++i) {
+ dw_attr_t attr = attributes.AttributeAtIndex(i);
+ DWARFFormValue 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();
+ break;
+ case DW_AT_linkage_name:
+ case DW_AT_MIPS_linkage_name:
+ mangled = form_value.AsCString();
+ break;
+ case DW_AT_type:
+ type_die_form = form_value;
+ break;
+ case DW_AT_external:
+ is_external = form_value.Boolean();
+ break;
+ case DW_AT_const_value:
+ // If we have already found a DW_AT_location attribute, ignore this
+ // attribute.
+ if (!has_explicit_location) {
+ location_is_const_value_data = true;
+ // The constant value will be either a block, a data value or a
+ // string.
+ const DWARFDataExtractor &debug_info_data = get_debug_info_data();
+ if (DWARFFormValue::IsBlockForm(form_value.Form())) {
+ // Retrieve the value as a block expression.
+ uint32_t block_offset =
+ form_value.BlockData() - debug_info_data.GetDataStart();
+ uint32_t block_length = form_value.Unsigned();
+ location.CopyOpcodeData(module, debug_info_data, block_offset,
+ block_length);
+ } else if (DWARFFormValue::IsDataForm(form_value.Form())) {
+ // Retrieve the value as a data expression.
+ DWARFFormValue::FixedFormSizes fixed_form_sizes =
+ DWARFFormValue::GetFixedFormSizesForAddressSize(
+ attributes.CompileUnitAtIndex(i)->GetAddressByteSize(),
+ attributes.CompileUnitAtIndex(i)->IsDWARF64());
+ uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
+ uint32_t data_length =
+ fixed_form_sizes.GetSize(form_value.Form());
+ if (data_length == 0) {
+ const uint8_t *data_pointer = form_value.BlockData();
+ if (data_pointer) {
+ form_value.Unsigned();
+ } else if (DWARFFormValue::IsDataForm(form_value.Form())) {
+ // we need to get the byte size of the type later after we
+ // create the variable
+ const_value = form_value;
+ }
+ } else
+ location.CopyOpcodeData(module, debug_info_data, data_offset,
+ data_length);
+ } else {
+ // Retrieve the value as a string expression.
+ if (form_value.Form() == DW_FORM_strp) {
+ DWARFFormValue::FixedFormSizes fixed_form_sizes =
+ DWARFFormValue::GetFixedFormSizesForAddressSize(
+ attributes.CompileUnitAtIndex(i)
+ ->GetAddressByteSize(),
+ attributes.CompileUnitAtIndex(i)->IsDWARF64());
+ uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
+ uint32_t data_length =
+ fixed_form_sizes.GetSize(form_value.Form());
+ location.CopyOpcodeData(module, debug_info_data, data_offset,
+ data_length);
+ } else {
+ 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);
}
+ }
}
-
- 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 DWARFDIE sc_parent_die = GetParentSymbolContextDIE(die);
- SymbolContextScope * symbol_context_scope = NULL;
-
- if (!mangled)
- {
- // LLDB relies on the mangled name (DW_TAG_linkage_name or DW_AT_MIPS_linkage_name) to
- // generate fully qualified names of global variables with commands like "frame var j".
- // For example, if j were an int variable holding a value 4 and declared in a namespace
- // 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 (parent_tag == DW_TAG_compile_unit &&
- Language::LanguageIsCPlusPlus(die.GetLanguage()))
- {
- DWARFDeclContext decl_ctx;
-
- die.GetDWARFDeclContext(decl_ctx);
- mangled = decl_ctx.GetQualifiedNameAsConstString().GetCString();
- }
+ break;
+ case DW_AT_location: {
+ location_is_const_value_data = false;
+ has_explicit_location = true;
+ if (DWARFFormValue::IsBlockForm(form_value.Form())) {
+ const DWARFDataExtractor &debug_info_data = get_debug_info_data();
+
+ uint32_t block_offset =
+ form_value.BlockData() - debug_info_data.GetDataStart();
+ uint32_t block_length = form_value.Unsigned();
+ location.CopyOpcodeData(module, get_debug_info_data(),
+ block_offset, block_length);
+ } else {
+ const DWARFDataExtractor &debug_loc_data = get_debug_loc_data();
+ const dw_offset_t debug_loc_offset = form_value.Unsigned();
+
+ size_t loc_list_length = DWARFExpression::LocationListSize(
+ die.GetCU(), debug_loc_data, debug_loc_offset);
+ if (loc_list_length > 0) {
+ location.CopyOpcodeData(module, debug_loc_data,
+ debug_loc_offset, loc_list_length);
+ assert(func_low_pc != LLDB_INVALID_ADDRESS);
+ location.SetLocationListSlide(
+ func_low_pc -
+ attributes.CompileUnitAtIndex(i)->GetBaseAddress());
+ }
}
-
- // DWARF doesn't specify if a DW_TAG_variable is a local, global
- // or static variable, so we have to do a little digging by
- // looking at the location of a variable to see if it contains
- // a DW_OP_addr opcode _somewhere_ in the definition. I say
- // somewhere because clang likes to combine small global variables
- // into the same symbol and have locations like:
- // DW_OP_addr(0x1000), DW_OP_constu(2), DW_OP_plus
- // So if we don't have a DW_TAG_formal_parameter, we can look at
- // the location to see if it contains a DW_OP_addr opcode, and
- // then we can correctly classify our variables.
- if (tag == DW_TAG_formal_parameter)
- scope = eValueTypeVariableArgument;
- else
- {
- bool op_error = false;
- // Check if the location has a DW_OP_addr with any address value...
- lldb::addr_t location_DW_OP_addr = LLDB_INVALID_ADDRESS;
- if (!location_is_const_value_data)
- {
- location_DW_OP_addr = location.GetLocation_DW_OP_addr (0, op_error);
- if (op_error)
- {
- StreamString strm;
- location.DumpLocationForAddress (&strm, eDescriptionLevelFull, 0, 0, NULL);
- GetObjectFile()->GetModule()->ReportError ("0x%8.8x: %s has an invalid location: %s", die.GetOffset(), die.GetTagAsCString(), strm.GetString().c_str());
- }
- }
- SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
-
- if (location_DW_OP_addr != LLDB_INVALID_ADDRESS)
- {
- if (is_external)
- scope = eValueTypeVariableGlobal;
- else
- scope = eValueTypeVariableStatic;
-
- if (debug_map_symfile)
- {
- // When leaving the DWARF in the .o files on darwin,
- // when we have a global variable that wasn't initialized,
- // the .o file might not have allocated a virtual
- // address for the global variable. In this case it will
- // have created a symbol for the global variable
- // that is undefined/data and external and the value will
- // be the byte size of the variable. When we do the
- // address map in SymbolFileDWARFDebugMap we rely on
- // having an address, we need to do some magic here
- // so we can get the correct address for our global
- // variable. The address for all of these entries
- // will be zero, and there will be an undefined symbol
- // in this object file, and the executable will have
- // a matching symbol with a good address. So here we
- // dig up the correct address and replace it in the
- // location for the variable, and set the variable's
- // symbol context scope to be that of the main executable
- // so the file address will resolve correctly.
- bool linked_oso_file_addr = false;
- if (is_external && location_DW_OP_addr == 0)
- {
- // we have a possible uninitialized extern global
- ConstString const_name(mangled ? mangled : name);
- ObjectFile *debug_map_objfile = debug_map_symfile->GetObjectFile();
- if (debug_map_objfile)
- {
- Symtab *debug_map_symtab = debug_map_objfile->GetSymtab();
- if (debug_map_symtab)
- {
- Symbol *exe_symbol = debug_map_symtab->FindFirstSymbolWithNameAndType (const_name,
- eSymbolTypeData,
- Symtab::eDebugYes,
- Symtab::eVisibilityExtern);
- if (exe_symbol)
- {
- if (exe_symbol->ValueIsAddress())
- {
- const addr_t exe_file_addr = exe_symbol->GetAddressRef().GetFileAddress();
- if (exe_file_addr != LLDB_INVALID_ADDRESS)
- {
- if (location.Update_DW_OP_addr (exe_file_addr))
- {
- linked_oso_file_addr = true;
- symbol_context_scope = exe_symbol;
- }
- }
- }
- }
- }
- }
- }
-
- if (!linked_oso_file_addr)
- {
- // The DW_OP_addr is not zero, but it contains a .o file address which
- // needs to be linked up correctly.
- const lldb::addr_t exe_file_addr = debug_map_symfile->LinkOSOFileAddress(this, location_DW_OP_addr);
- if (exe_file_addr != LLDB_INVALID_ADDRESS)
- {
- // Update the file address for this variable
- location.Update_DW_OP_addr (exe_file_addr);
- }
- else
- {
- // Variable didn't make it into the final executable
- return var_sp;
- }
- }
- }
- }
- else
- {
- if (location_is_const_value_data)
- scope = eValueTypeVariableStatic;
- else
- {
- scope = eValueTypeVariableLocal;
- if (debug_map_symfile)
- {
- // We need to check for TLS addresses that we need to fixup
- if (location.ContainsThreadLocalStorage())
- {
- location.LinkThreadLocalStorage(
- debug_map_symfile->GetObjectFile()->GetModule(),
- [this, debug_map_symfile](lldb::addr_t unlinked_file_addr) -> lldb::addr_t {
- return debug_map_symfile->LinkOSOFileAddress(this, unlinked_file_addr);
- });
- scope = eValueTypeVariableThreadLocal;
- }
- }
- }
- }
+ } break;
+ case DW_AT_specification:
+ spec_die = GetDIE(DIERef(form_value));
+ break;
+ case DW_AT_start_scope: {
+ if (form_value.Form() == DW_FORM_sec_offset) {
+ DWARFRangeList dwarf_scope_ranges;
+ const DWARFDebugRanges *debug_ranges = DebugRanges();
+ debug_ranges->FindRanges(form_value.Unsigned(),
+ dwarf_scope_ranges);
+
+ // All DW_AT_start_scope are relative to the base address of the
+ // compile unit. We add the compile unit base address to make
+ // sure all the addresses are properly fixed up.
+ for (size_t i = 0, count = dwarf_scope_ranges.GetSize();
+ i < count; ++i) {
+ const DWARFRangeList::Entry &range =
+ dwarf_scope_ranges.GetEntryRef(i);
+ scope_ranges.Append(range.GetRangeBase() +
+ die.GetCU()->GetBaseAddress(),
+ range.GetByteSize());
+ }
+ } else {
+ // TODO: Handle the case when DW_AT_start_scope have form
+ // constant. The
+ // dwarf spec is a bit ambiguous about what is the expected
+ // behavior in
+ // case the enclosing block have a non coninious address range and
+ // the
+ // DW_AT_start_scope entry have a form constant.
+ GetObjectFile()->GetModule()->ReportWarning(
+ "0x%8.8" PRIx64
+ ": DW_AT_start_scope has unsupported form type (0x%x)\n",
+ die.GetID(), form_value.Form());
}
- if (symbol_context_scope == NULL)
- {
- switch (parent_tag)
- {
- case DW_TAG_subprogram:
- case DW_TAG_inlined_subroutine:
- case DW_TAG_lexical_block:
- if (sc.function)
- {
- symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
- if (symbol_context_scope == NULL)
- symbol_context_scope = sc.function;
+ scope_ranges.Sort();
+ scope_ranges.CombineConsecutiveRanges();
+ } break;
+ case DW_AT_artificial:
+ is_artificial = form_value.Boolean();
+ break;
+ case DW_AT_accessibility:
+ break; // accessibility =
+ // DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
+ case DW_AT_declaration:
+ case DW_AT_description:
+ case DW_AT_endianity:
+ case DW_AT_segment:
+ case DW_AT_visibility:
+ default:
+ case DW_AT_abstract_origin:
+ case DW_AT_sibling:
+ break;
+ }
+ }
+ }
+
+ 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 DWARFDIE sc_parent_die = GetParentSymbolContextDIE(die);
+ SymbolContextScope *symbol_context_scope = NULL;
+
+ if (!mangled) {
+ // LLDB relies on the mangled name (DW_TAG_linkage_name or
+ // DW_AT_MIPS_linkage_name) to
+ // generate fully qualified names of global variables with commands like
+ // "frame var j".
+ // For example, if j were an int variable holding a value 4 and declared
+ // in a namespace
+ // 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 (parent_tag == DW_TAG_compile_unit &&
+ Language::LanguageIsCPlusPlus(die.GetLanguage())) {
+ DWARFDeclContext decl_ctx;
+
+ die.GetDWARFDeclContext(decl_ctx);
+ mangled = decl_ctx.GetQualifiedNameAsConstString().GetCString();
+ }
+ }
+
+ // DWARF doesn't specify if a DW_TAG_variable is a local, global
+ // or static variable, so we have to do a little digging by
+ // looking at the location of a variable to see if it contains
+ // a DW_OP_addr opcode _somewhere_ in the definition. I say
+ // somewhere because clang likes to combine small global variables
+ // into the same symbol and have locations like:
+ // DW_OP_addr(0x1000), DW_OP_constu(2), DW_OP_plus
+ // So if we don't have a DW_TAG_formal_parameter, we can look at
+ // the location to see if it contains a DW_OP_addr opcode, and
+ // then we can correctly classify our variables.
+ if (tag == DW_TAG_formal_parameter)
+ scope = eValueTypeVariableArgument;
+ else {
+ bool op_error = false;
+ // Check if the location has a DW_OP_addr with any address value...
+ lldb::addr_t location_DW_OP_addr = LLDB_INVALID_ADDRESS;
+ if (!location_is_const_value_data) {
+ location_DW_OP_addr = location.GetLocation_DW_OP_addr(0, op_error);
+ if (op_error) {
+ StreamString strm;
+ location.DumpLocationForAddress(&strm, eDescriptionLevelFull, 0, 0,
+ NULL);
+ GetObjectFile()->GetModule()->ReportError(
+ "0x%8.8x: %s has an invalid location: %s", die.GetOffset(),
+ die.GetTagAsCString(), strm.GetString().c_str());
+ }
+ }
+ SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+
+ if (location_DW_OP_addr != LLDB_INVALID_ADDRESS) {
+ if (is_external)
+ scope = eValueTypeVariableGlobal;
+ else
+ scope = eValueTypeVariableStatic;
+
+ if (debug_map_symfile) {
+ // When leaving the DWARF in the .o files on darwin,
+ // when we have a global variable that wasn't initialized,
+ // the .o file might not have allocated a virtual
+ // address for the global variable. In this case it will
+ // have created a symbol for the global variable
+ // that is undefined/data and external and the value will
+ // be the byte size of the variable. When we do the
+ // address map in SymbolFileDWARFDebugMap we rely on
+ // having an address, we need to do some magic here
+ // so we can get the correct address for our global
+ // variable. The address for all of these entries
+ // will be zero, and there will be an undefined symbol
+ // in this object file, and the executable will have
+ // a matching symbol with a good address. So here we
+ // dig up the correct address and replace it in the
+ // location for the variable, and set the variable's
+ // symbol context scope to be that of the main executable
+ // so the file address will resolve correctly.
+ bool linked_oso_file_addr = false;
+ if (is_external && location_DW_OP_addr == 0) {
+ // we have a possible uninitialized extern global
+ ConstString const_name(mangled ? mangled : name);
+ ObjectFile *debug_map_objfile =
+ debug_map_symfile->GetObjectFile();
+ if (debug_map_objfile) {
+ Symtab *debug_map_symtab = debug_map_objfile->GetSymtab();
+ if (debug_map_symtab) {
+ Symbol *exe_symbol =
+ debug_map_symtab->FindFirstSymbolWithNameAndType(
+ const_name, eSymbolTypeData, Symtab::eDebugYes,
+ Symtab::eVisibilityExtern);
+ if (exe_symbol) {
+ if (exe_symbol->ValueIsAddress()) {
+ const addr_t exe_file_addr =
+ exe_symbol->GetAddressRef().GetFileAddress();
+ if (exe_file_addr != LLDB_INVALID_ADDRESS) {
+ if (location.Update_DW_OP_addr(exe_file_addr)) {
+ linked_oso_file_addr = true;
+ symbol_context_scope = exe_symbol;
+ }
+ }
}
- break;
-
- default:
- symbol_context_scope = sc.comp_unit;
- break;
+ }
}
+ }
}
- if (symbol_context_scope)
- {
- SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID(this)));
-
- if (const_value.Form() && type_sp && type_sp->GetType())
- location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), die.GetCU()->GetAddressByteSize());
-
- var_sp.reset (new Variable (die.GetID(),
- name,
- mangled,
- type_sp,
- scope,
- symbol_context_scope,
- scope_ranges,
- &decl,
- location,
- is_external,
- is_artificial,
- is_static_member));
-
- var_sp->SetLocationIsConstantValueData (location_is_const_value_data);
- }
- else
- {
- // Not ready to parse this variable yet. It might be a global
- // or static variable that is in a function scope and the function
- // in the symbol context wasn't filled in yet
+ if (!linked_oso_file_addr) {
+ // The DW_OP_addr is not zero, but it contains a .o file address
+ // which
+ // needs to be linked up correctly.
+ const lldb::addr_t exe_file_addr =
+ debug_map_symfile->LinkOSOFileAddress(this,
+ location_DW_OP_addr);
+ if (exe_file_addr != LLDB_INVALID_ADDRESS) {
+ // Update the file address for this variable
+ location.Update_DW_OP_addr(exe_file_addr);
+ } else {
+ // Variable didn't make it into the final executable
return var_sp;
+ }
+ }
+ }
+ } else {
+ if (location_is_const_value_data)
+ scope = eValueTypeVariableStatic;
+ else {
+ scope = eValueTypeVariableLocal;
+ if (debug_map_symfile) {
+ // We need to check for TLS addresses that we need to fixup
+ if (location.ContainsThreadLocalStorage()) {
+ location.LinkThreadLocalStorage(
+ debug_map_symfile->GetObjectFile()->GetModule(),
+ [this, debug_map_symfile](
+ lldb::addr_t unlinked_file_addr) -> lldb::addr_t {
+ return debug_map_symfile->LinkOSOFileAddress(
+ this, unlinked_file_addr);
+ });
+ scope = eValueTypeVariableThreadLocal;
+ }
}
+ }
+ }
+ }
+
+ if (symbol_context_scope == NULL) {
+ switch (parent_tag) {
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_lexical_block:
+ if (sc.function) {
+ symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(
+ sc_parent_die.GetID());
+ if (symbol_context_scope == NULL)
+ symbol_context_scope = sc.function;
+ }
+ break;
+
+ default:
+ symbol_context_scope = sc.comp_unit;
+ break;
}
- // Cache var_sp even if NULL (the variable was just a specification or
- // 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...
- GetDIEToVariable()[die.GetDIE()] = var_sp;
- if (spec_die)
- GetDIEToVariable()[spec_die.GetDIE()] = var_sp;
+ }
+
+ if (symbol_context_scope) {
+ SymbolFileTypeSP type_sp(
+ new SymbolFileType(*this, DIERef(type_die_form).GetUID(this)));
+
+ if (const_value.Form() && type_sp && type_sp->GetType())
+ location.CopyOpcodeData(const_value.Unsigned(),
+ type_sp->GetType()->GetByteSize(),
+ die.GetCU()->GetAddressByteSize());
+
+ var_sp.reset(new Variable(die.GetID(), name, mangled, type_sp, scope,
+ symbol_context_scope, scope_ranges, &decl,
+ location, is_external, is_artificial,
+ is_static_member));
+
+ var_sp->SetLocationIsConstantValueData(location_is_const_value_data);
+ } else {
+ // Not ready to parse this variable yet. It might be a global
+ // or static variable that is in a function scope and the function
+ // in the symbol context wasn't filled in yet
+ return var_sp;
+ }
}
- return var_sp;
+ // Cache var_sp even if NULL (the variable was just a specification or
+ // 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...
+ GetDIEToVariable()[die.GetDIE()] = var_sp;
+ if (spec_die)
+ GetDIEToVariable()[spec_die.GetDIE()] = var_sp;
+ }
+ return var_sp;
}
+DWARFDIE
+SymbolFileDWARF::FindBlockContainingSpecification(
+ const DIERef &func_die_ref, dw_offset_t spec_block_die_offset) {
+ // Give the concrete function die specified by "func_die_offset", find the
+ // concrete block whose DW_AT_specification or DW_AT_abstract_origin points
+ // to "spec_block_die_offset"
+ return FindBlockContainingSpecification(DebugInfo()->GetDIE(func_die_ref),
+ spec_block_die_offset);
+}
DWARFDIE
-SymbolFileDWARF::FindBlockContainingSpecification (const DIERef& func_die_ref,
- dw_offset_t spec_block_die_offset)
-{
- // Give the concrete function die specified by "func_die_offset", find the
+SymbolFileDWARF::FindBlockContainingSpecification(
+ const DWARFDIE &die, dw_offset_t spec_block_die_offset) {
+ if (die) {
+ switch (die.Tag()) {
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_lexical_block: {
+ if (die.GetAttributeValueAsReference(
+ DW_AT_specification, DW_INVALID_OFFSET) == spec_block_die_offset)
+ return die;
+
+ if (die.GetAttributeValueAsReference(DW_AT_abstract_origin,
+ DW_INVALID_OFFSET) ==
+ spec_block_die_offset)
+ return die;
+ } break;
+ }
+
+ // Give the concrete function die specified by "func_die_offset", find the
// concrete block whose DW_AT_specification or DW_AT_abstract_origin points
// to "spec_block_die_offset"
- return FindBlockContainingSpecification (DebugInfo()->GetDIE (func_die_ref), spec_block_die_offset);
+ for (DWARFDIE child_die = die.GetFirstChild(); child_die;
+ child_die = child_die.GetSibling()) {
+ DWARFDIE result_die =
+ FindBlockContainingSpecification(child_die, spec_block_die_offset);
+ if (result_die)
+ return result_die;
+ }
+ }
+
+ return DWARFDIE();
}
+size_t 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)
+ return 0;
-DWARFDIE
-SymbolFileDWARF::FindBlockContainingSpecification(const DWARFDIE &die,
- dw_offset_t spec_block_die_offset)
-{
- if (die)
- {
- switch (die.Tag())
- {
- case DW_TAG_subprogram:
- case DW_TAG_inlined_subroutine:
- case DW_TAG_lexical_block:
- {
- if (die.GetAttributeValueAsReference (DW_AT_specification, DW_INVALID_OFFSET) == spec_block_die_offset)
- return die;
+ VariableListSP variable_list_sp;
+
+ size_t vars_added = 0;
+ DWARFDIE die = orig_die;
+ while (die) {
+ dw_tag_t tag = die.Tag();
+
+ // Check to see if we have already parsed this variable or constant?
+ VariableSP var_sp = GetDIEToVariable()[die.GetDIE()];
+ if (var_sp) {
+ if (cc_variable_list)
+ cc_variable_list->AddVariableIfUnique(var_sp);
+ } else {
+ // We haven't already parsed it, lets do that now.
+ if ((tag == DW_TAG_variable) || (tag == DW_TAG_constant) ||
+ (tag == DW_TAG_formal_parameter && sc.function)) {
+ if (variable_list_sp.get() == NULL) {
+ DWARFDIE sc_parent_die = GetParentSymbolContextDIE(orig_die);
+ dw_tag_t parent_tag = sc_parent_die.Tag();
+ switch (parent_tag) {
+ case DW_TAG_compile_unit:
+ if (sc.comp_unit != NULL) {
+ variable_list_sp = sc.comp_unit->GetVariableList(false);
+ if (variable_list_sp.get() == NULL) {
+ variable_list_sp.reset(new VariableList());
+ sc.comp_unit->SetVariableList(variable_list_sp);
+ }
+ } 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",
+ sc_parent_die.GetID(), sc_parent_die.GetTagAsCString(),
+ orig_die.GetID(), orig_die.GetTagAsCString());
+ }
+ break;
- if (die.GetAttributeValueAsReference (DW_AT_abstract_origin, DW_INVALID_OFFSET) == spec_block_die_offset)
- return die;
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine:
+ case DW_TAG_lexical_block:
+ if (sc.function != NULL) {
+ // Check to see if we already have parsed the variables for the
+ // given scope
+
+ 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
+ const DWARFDIE concrete_block_die =
+ FindBlockContainingSpecification(
+ DIERef(sc.function->GetID(), this),
+ sc_parent_die.GetOffset());
+ if (concrete_block_die)
+ block = sc.function->GetBlock(true).FindBlockByID(
+ concrete_block_die.GetID());
+ }
+
+ if (block != NULL) {
+ const bool can_create = false;
+ variable_list_sp = block->GetBlockVariableList(can_create);
+ if (variable_list_sp.get() == NULL) {
+ variable_list_sp.reset(new VariableList());
+ block->SetVariableList(variable_list_sp);
+ }
+ }
}
break;
- }
- // 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 (DWARFDIE child_die = die.GetFirstChild(); child_die; child_die = child_die.GetSibling())
- {
- DWARFDIE result_die = FindBlockContainingSpecification (child_die, spec_block_die_offset);
- if (result_die)
- return result_die;
+ default:
+ GetObjectFile()->GetModule()->ReportError(
+ "didn't find appropriate parent DIE for variable list for "
+ "0x%8.8" PRIx64 " %s.\n",
+ orig_die.GetID(), orig_die.GetTagAsCString());
+ break;
+ }
}
- }
-
- return DWARFDIE();
-}
-
-size_t
-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)
- return 0;
- VariableListSP variable_list_sp;
-
- size_t vars_added = 0;
- DWARFDIE die = orig_die;
- while (die)
- {
- dw_tag_t tag = die.Tag();
-
- // Check to see if we have already parsed this variable or constant?
- VariableSP var_sp = GetDIEToVariable()[die.GetDIE()];
- if (var_sp)
- {
+ if (variable_list_sp) {
+ VariableSP var_sp(ParseVariableDIE(sc, die, func_low_pc));
+ if (var_sp) {
+ variable_list_sp->AddVariableIfUnique(var_sp);
if (cc_variable_list)
- cc_variable_list->AddVariableIfUnique (var_sp);
+ cc_variable_list->AddVariableIfUnique(var_sp);
+ ++vars_added;
+ }
}
- else
- {
- // We haven't already parsed it, lets do that now.
- if ((tag == DW_TAG_variable) ||
- (tag == DW_TAG_constant) ||
- (tag == DW_TAG_formal_parameter && sc.function))
- {
- if (variable_list_sp.get() == NULL)
- {
- DWARFDIE sc_parent_die = GetParentSymbolContextDIE(orig_die);
- dw_tag_t parent_tag = sc_parent_die.Tag();
- switch (parent_tag)
- {
- case DW_TAG_compile_unit:
- if (sc.comp_unit != NULL)
- {
- variable_list_sp = sc.comp_unit->GetVariableList(false);
- if (variable_list_sp.get() == NULL)
- {
- variable_list_sp.reset(new VariableList());
- sc.comp_unit->SetVariableList(variable_list_sp);
- }
- }
- 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",
- sc_parent_die.GetID(),
- sc_parent_die.GetTagAsCString(),
- orig_die.GetID(),
- orig_die.GetTagAsCString());
- }
- break;
-
- case DW_TAG_subprogram:
- case DW_TAG_inlined_subroutine:
- case DW_TAG_lexical_block:
- if (sc.function != NULL)
- {
- // Check to see if we already have parsed the variables for the given scope
-
- 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
- const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID(), this),
- sc_parent_die.GetOffset());
- if (concrete_block_die)
- block = sc.function->GetBlock(true).FindBlockByID(concrete_block_die.GetID());
- }
-
- if (block != NULL)
- {
- const bool can_create = false;
- variable_list_sp = block->GetBlockVariableList (can_create);
- if (variable_list_sp.get() == NULL)
- {
- variable_list_sp.reset(new VariableList());
- block->SetVariableList(variable_list_sp);
- }
- }
- }
- break;
-
- default:
- GetObjectFile()->GetModule()->ReportError ("didn't find appropriate parent DIE for variable list for 0x%8.8" PRIx64 " %s.\n",
- orig_die.GetID(),
- orig_die.GetTagAsCString());
- break;
- }
- }
-
- if (variable_list_sp)
- {
- VariableSP var_sp (ParseVariableDIE(sc, die, func_low_pc));
- if (var_sp)
- {
- variable_list_sp->AddVariableIfUnique (var_sp);
- if (cc_variable_list)
- cc_variable_list->AddVariableIfUnique (var_sp);
- ++vars_added;
- }
- }
- }
- }
-
- bool skip_children = (sc.function == NULL && tag == DW_TAG_subprogram);
+ }
+ }
- if (!skip_children && parse_children && die.HasChildren())
- {
- vars_added += ParseVariables(sc, die.GetFirstChild(), func_low_pc, true, true, cc_variable_list);
- }
+ bool skip_children = (sc.function == NULL && tag == DW_TAG_subprogram);
- if (parse_siblings)
- die = die.GetSibling();
- else
- die.Clear();
+ if (!skip_children && parse_children && die.HasChildren()) {
+ vars_added += ParseVariables(sc, die.GetFirstChild(), func_low_pc, true,
+ true, cc_variable_list);
}
- return vars_added;
+
+ if (parse_siblings)
+ die = die.GetSibling();
+ else
+ die.Clear();
+ }
+ return vars_added;
}
//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
-ConstString
-SymbolFileDWARF::GetPluginName()
-{
- return GetPluginNameStatic();
+ConstString SymbolFileDWARF::GetPluginName() { return GetPluginNameStatic(); }
+
+uint32_t SymbolFileDWARF::GetPluginVersion() { return 1; }
+
+void SymbolFileDWARF::DumpIndexes() {
+ StreamFile s(stdout, false);
+
+ s.Printf(
+ "DWARF index for (%s) '%s':",
+ GetObjectFile()->GetModule()->GetArchitecture().GetArchitectureName(),
+ GetObjectFile()->GetFileSpec().GetPath().c_str());
+ s.Printf("\nFunction basenames:\n");
+ m_function_basename_index.Dump(&s);
+ s.Printf("\nFunction fullnames:\n");
+ m_function_fullname_index.Dump(&s);
+ s.Printf("\nFunction methods:\n");
+ m_function_method_index.Dump(&s);
+ s.Printf("\nFunction selectors:\n");
+ m_function_selector_index.Dump(&s);
+ s.Printf("\nObjective C class selectors:\n");
+ m_objc_class_selectors_index.Dump(&s);
+ s.Printf("\nGlobals and statics:\n");
+ m_global_index.Dump(&s);
+ s.Printf("\nTypes:\n");
+ m_type_index.Dump(&s);
+ s.Printf("\nNamespaces:\n");
+ m_namespace_index.Dump(&s);
}
-uint32_t
-SymbolFileDWARF::GetPluginVersion()
-{
- return 1;
-}
-
-void
-SymbolFileDWARF::DumpIndexes ()
-{
- StreamFile s(stdout, false);
-
- s.Printf ("DWARF index for (%s) '%s':",
- GetObjectFile()->GetModule()->GetArchitecture().GetArchitectureName(),
- GetObjectFile()->GetFileSpec().GetPath().c_str());
- s.Printf("\nFunction basenames:\n"); m_function_basename_index.Dump (&s);
- s.Printf("\nFunction fullnames:\n"); m_function_fullname_index.Dump (&s);
- s.Printf("\nFunction methods:\n"); m_function_method_index.Dump (&s);
- s.Printf("\nFunction selectors:\n"); m_function_selector_index.Dump (&s);
- s.Printf("\nObjective C class selectors:\n"); m_objc_class_selectors_index.Dump (&s);
- s.Printf("\nGlobals and statics:\n"); m_global_index.Dump (&s);
- s.Printf("\nTypes:\n"); m_type_index.Dump (&s);
- s.Printf("\nNamespaces:\n"); m_namespace_index.Dump (&s);
-}
-
-
-SymbolFileDWARFDebugMap *
-SymbolFileDWARF::GetDebugMapSymfile()
-{
- if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired())
- {
- lldb::ModuleSP module_sp (m_debug_map_module_wp.lock());
- if (module_sp)
- {
- SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
- if (sym_vendor)
- m_debug_map_symfile = (SymbolFileDWARFDebugMap *)sym_vendor->GetSymbolFile();
- }
+SymbolFileDWARFDebugMap *SymbolFileDWARF::GetDebugMapSymfile() {
+ if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired()) {
+ lldb::ModuleSP module_sp(m_debug_map_module_wp.lock());
+ if (module_sp) {
+ SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
+ if (sym_vendor)
+ m_debug_map_symfile =
+ (SymbolFileDWARFDebugMap *)sym_vendor->GetSymbolFile();
}
- return m_debug_map_symfile;
+ }
+ return m_debug_map_symfile;
}
DWARFExpression::LocationListFormat
-SymbolFileDWARF::GetLocationListFormat() const
-{
- return DWARFExpression::RegularLocationList;
+SymbolFileDWARF::GetLocationListFormat() const {
+ return DWARFExpression::RegularLocationList;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 09df5280353..52937697500 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -22,20 +22,20 @@
// Other libraries and framework includes
#include "llvm/ADT/DenseMap.h"
-#include "lldb/lldb-private.h"
#include "lldb/Core/ConstString.h"
-#include "lldb/Core/dwarf.h"
#include "lldb/Core/Flags.h"
#include "lldb/Core/RangeMap.h"
#include "lldb/Core/UniqueCStringMap.h"
+#include "lldb/Core/dwarf.h"
#include "lldb/Expression/DWARFExpression.h"
#include "lldb/Symbol/DebugMacros.h"
-#include "lldb/Symbol/SymbolFile.h"
#include "lldb/Symbol/SymbolContext.h"
+#include "lldb/Symbol/SymbolFile.h"
+#include "lldb/lldb-private.h"
// Project includes
-#include "DWARFDefines.h"
#include "DWARFDataExtractor.h"
+#include "DWARFDefines.h"
#include "HashedNameToDIE.h"
#include "NameToDIE.h"
#include "UniqueDWARFASTType.h"
@@ -60,544 +60,465 @@ class DWARFFormValue;
class SymbolFileDWARFDebugMap;
class SymbolFileDWARFDwo;
-#define DIE_IS_BEING_PARSED ((lldb_private::Type*)1)
+#define DIE_IS_BEING_PARSED ((lldb_private::Type *)1)
-class SymbolFileDWARF : public lldb_private::SymbolFile, public lldb_private::UserID
-{
+class SymbolFileDWARF : public lldb_private::SymbolFile,
+ public lldb_private::UserID {
public:
- friend class SymbolFileDWARFDebugMap;
- friend class SymbolFileDWARFDwo;
- friend class DebugMapModule;
- friend struct DIERef;
- friend class DWARFCompileUnit;
- friend class DWARFDIE;
- friend class DWARFASTParserClang;
- friend class DWARFASTParserGo;
- friend class DWARFASTParserJava;
- friend class DWARFASTParserOCaml;
+ friend class SymbolFileDWARFDebugMap;
+ friend class SymbolFileDWARFDwo;
+ friend class DebugMapModule;
+ friend struct DIERef;
+ friend class DWARFCompileUnit;
+ friend class DWARFDIE;
+ friend class DWARFASTParserClang;
+ friend class DWARFASTParserGo;
+ friend class DWARFASTParserJava;
+ friend class DWARFASTParserOCaml;
+
+ //------------------------------------------------------------------
+ // Static Functions
+ //------------------------------------------------------------------
+ static void Initialize();
+
+ static void Terminate();
+
+ static void DebuggerInitialize(lldb_private::Debugger &debugger);
+
+ static lldb_private::ConstString GetPluginNameStatic();
+
+ static const char *GetPluginDescriptionStatic();
+
+ static lldb_private::SymbolFile *
+ CreateInstance(lldb_private::ObjectFile *obj_file);
+
+ //------------------------------------------------------------------
+ // Constructors and Destructors
+ //------------------------------------------------------------------
- //------------------------------------------------------------------
- // Static Functions
- //------------------------------------------------------------------
- static void
- Initialize();
+ SymbolFileDWARF(lldb_private::ObjectFile *ofile);
- static void
- Terminate();
+ ~SymbolFileDWARF() override;
- static void
- DebuggerInitialize(lldb_private::Debugger &debugger);
+ uint32_t CalculateAbilities() override;
- static lldb_private::ConstString
- GetPluginNameStatic();
+ void InitializeObject() override;
- static const char *
- GetPluginDescriptionStatic();
+ //------------------------------------------------------------------
+ // Compile Unit function calls
+ //------------------------------------------------------------------
- static lldb_private::SymbolFile*
- CreateInstance (lldb_private::ObjectFile* obj_file);
+ uint32_t GetNumCompileUnits() override;
- //------------------------------------------------------------------
- // Constructors and Destructors
- //------------------------------------------------------------------
+ lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
- SymbolFileDWARF(lldb_private::ObjectFile* ofile);
+ lldb::LanguageType
+ ParseCompileUnitLanguage(const lldb_private::SymbolContext &sc) override;
- ~SymbolFileDWARF() override;
+ size_t
+ ParseCompileUnitFunctions(const lldb_private::SymbolContext &sc) override;
- uint32_t
- CalculateAbilities () override;
+ bool
+ ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc) override;
- void
- InitializeObject() override;
+ bool
+ ParseCompileUnitDebugMacros(const lldb_private::SymbolContext &sc) override;
- //------------------------------------------------------------------
- // Compile Unit function calls
- //------------------------------------------------------------------
+ bool ParseCompileUnitSupportFiles(
+ const lldb_private::SymbolContext &sc,
+ lldb_private::FileSpecList &support_files) override;
- uint32_t
- GetNumCompileUnits() override;
+ bool
+ ParseCompileUnitIsOptimized(const lldb_private::SymbolContext &sc) override;
- lldb::CompUnitSP
- ParseCompileUnitAtIndex(uint32_t index) override;
+ bool ParseImportedModules(
+ const lldb_private::SymbolContext &sc,
+ std::vector<lldb_private::ConstString> &imported_modules) override;
- lldb::LanguageType
- ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc) override;
+ size_t ParseFunctionBlocks(const lldb_private::SymbolContext &sc) override;
- size_t
- ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc) override;
+ size_t ParseTypes(const lldb_private::SymbolContext &sc) override;
- bool
- ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc) override;
+ size_t
+ ParseVariablesForContext(const lldb_private::SymbolContext &sc) override;
- bool
- ParseCompileUnitDebugMacros (const lldb_private::SymbolContext& sc) override;
-
- bool
- ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc,
- lldb_private::FileSpecList& support_files) override;
-
- bool
- ParseCompileUnitIsOptimized(const lldb_private::SymbolContext &sc) override;
+ lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override;
- bool
- ParseImportedModules(const lldb_private::SymbolContext &sc,
- std::vector<lldb_private::ConstString> &imported_modules) override;
+ bool CompleteType(lldb_private::CompilerType &compiler_type) override;
- size_t
- ParseFunctionBlocks (const lldb_private::SymbolContext& sc) override;
-
- size_t
- ParseTypes (const lldb_private::SymbolContext& sc) override;
-
- size_t
- ParseVariablesForContext (const lldb_private::SymbolContext& sc) override;
-
- lldb_private::Type *
- ResolveTypeUID(lldb::user_id_t type_uid) override;
+ lldb_private::Type *ResolveType(const DWARFDIE &die,
+ bool assert_not_being_parsed = true,
+ bool resolve_function_context = false);
- bool
- CompleteType (lldb_private::CompilerType& compiler_type) override;
+ SymbolFileDWARF *GetDWARFForUID(lldb::user_id_t uid);
- lldb_private::Type *
- ResolveType (const DWARFDIE &die,
- bool assert_not_being_parsed = true,
- bool resolve_function_context = false);
+ DWARFDIE
+ GetDIEFromUID(lldb::user_id_t uid);
- SymbolFileDWARF *
- GetDWARFForUID (lldb::user_id_t uid);
+ lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override;
- DWARFDIE
- GetDIEFromUID (lldb::user_id_t uid);
+ lldb_private::CompilerDeclContext
+ GetDeclContextForUID(lldb::user_id_t uid) override;
- lldb_private::CompilerDecl
- GetDeclForUID (lldb::user_id_t uid) override;
+ lldb_private::CompilerDeclContext
+ GetDeclContextContainingUID(lldb::user_id_t uid) override;
- lldb_private::CompilerDeclContext
- GetDeclContextForUID (lldb::user_id_t uid) override;
+ void
+ ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override;
- lldb_private::CompilerDeclContext
- GetDeclContextContainingUID (lldb::user_id_t uid) override;
-
- void
- ParseDeclsForContext (lldb_private::CompilerDeclContext decl_ctx) override;
-
+ uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr,
+ uint32_t resolve_scope,
+ lldb_private::SymbolContext &sc) override;
- uint32_t
- ResolveSymbolContext (const lldb_private::Address& so_addr,
- uint32_t resolve_scope,
- lldb_private::SymbolContext& sc) override;
+ uint32_t
+ ResolveSymbolContext(const lldb_private::FileSpec &file_spec, uint32_t line,
+ bool check_inlines, uint32_t resolve_scope,
+ lldb_private::SymbolContextList &sc_list) override;
- uint32_t
- ResolveSymbolContext (const lldb_private::FileSpec& file_spec,
- uint32_t line,
- bool check_inlines,
- uint32_t resolve_scope,
- lldb_private::SymbolContextList& sc_list) override;
+ uint32_t
+ FindGlobalVariables(const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ bool append, uint32_t max_matches,
+ lldb_private::VariableList &variables) override;
- uint32_t
- FindGlobalVariables (const lldb_private::ConstString &name,
- const lldb_private::CompilerDeclContext *parent_decl_ctx,
- bool append,
- uint32_t max_matches,
- lldb_private::VariableList& variables) override;
+ uint32_t FindGlobalVariables(const lldb_private::RegularExpression &regex,
+ bool append, uint32_t max_matches,
+ lldb_private::VariableList &variables) override;
- uint32_t
- FindGlobalVariables (const lldb_private::RegularExpression& regex,
- bool append,
- uint32_t max_matches,
- lldb_private::VariableList& variables) override;
+ uint32_t
+ FindFunctions(const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ uint32_t name_type_mask, bool include_inlines, bool append,
+ lldb_private::SymbolContextList &sc_list) override;
- uint32_t
- FindFunctions (const lldb_private::ConstString &name,
- const lldb_private::CompilerDeclContext *parent_decl_ctx,
- uint32_t name_type_mask,
- bool include_inlines,
- bool append,
- lldb_private::SymbolContextList& sc_list) override;
-
- uint32_t
- FindFunctions (const lldb_private::RegularExpression& regex,
- bool include_inlines,
- bool append,
- lldb_private::SymbolContextList& sc_list) override;
-
- void
- GetMangledNamesForFunction (const std::string &scope_qualified_name,
- std::vector<lldb_private::ConstString> &mangled_names) override;
-
- uint32_t
- FindTypes (const lldb_private::SymbolContext& sc,
- const lldb_private::ConstString &name,
- const lldb_private::CompilerDeclContext *parent_decl_ctx,
- bool append,
- uint32_t max_matches,
- llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
- lldb_private::TypeMap& types) override;
-
- size_t
- FindTypes (const std::vector<lldb_private::CompilerContext> &context,
- bool append,
- lldb_private::TypeMap& types) override;
+ uint32_t FindFunctions(const lldb_private::RegularExpression &regex,
+ bool include_inlines, bool append,
+ lldb_private::SymbolContextList &sc_list) override;
- lldb_private::TypeList *
- GetTypeList () override;
+ void GetMangledNamesForFunction(
+ const std::string &scope_qualified_name,
+ std::vector<lldb_private::ConstString> &mangled_names) override;
- size_t
- GetTypes (lldb_private::SymbolContextScope *sc_scope,
- uint32_t type_mask,
- lldb_private::TypeList &type_list) override;
+ uint32_t
+ FindTypes(const lldb_private::SymbolContext &sc,
+ const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ bool append, uint32_t max_matches,
+ llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
+ lldb_private::TypeMap &types) override;
- lldb_private::TypeSystem *
- GetTypeSystemForLanguage (lldb::LanguageType language) override;
-
- lldb_private::CompilerDeclContext
- FindNamespace (const lldb_private::SymbolContext& sc,
- const lldb_private::ConstString &name,
- const lldb_private::CompilerDeclContext *parent_decl_ctx) override;
+ size_t FindTypes(const std::vector<lldb_private::CompilerContext> &context,
+ bool append, lldb_private::TypeMap &types) override;
+ lldb_private::TypeList *GetTypeList() override;
- //------------------------------------------------------------------
- // PluginInterface protocol
- //------------------------------------------------------------------
- lldb_private::ConstString
- GetPluginName() override;
-
- uint32_t
- GetPluginVersion() override;
-
- const lldb_private::DWARFDataExtractor& get_debug_abbrev_data ();
- const lldb_private::DWARFDataExtractor& get_debug_addr_data ();
- const lldb_private::DWARFDataExtractor& get_debug_aranges_data ();
- const lldb_private::DWARFDataExtractor& get_debug_frame_data ();
- const lldb_private::DWARFDataExtractor& get_debug_info_data ();
- const lldb_private::DWARFDataExtractor& get_debug_line_data ();
- const lldb_private::DWARFDataExtractor& get_debug_macro_data ();
- const lldb_private::DWARFDataExtractor& get_debug_loc_data ();
- const lldb_private::DWARFDataExtractor& get_debug_ranges_data ();
- const lldb_private::DWARFDataExtractor& get_debug_str_data ();
- const lldb_private::DWARFDataExtractor& get_debug_str_offsets_data ();
- const lldb_private::DWARFDataExtractor& get_apple_names_data ();
- const lldb_private::DWARFDataExtractor& get_apple_types_data ();
- const lldb_private::DWARFDataExtractor& get_apple_namespaces_data ();
- const lldb_private::DWARFDataExtractor& get_apple_objc_data ();
-
-
- DWARFDebugAbbrev*
- DebugAbbrev();
-
- const DWARFDebugAbbrev*
- DebugAbbrev() const;
-
- DWARFDebugInfo*
- DebugInfo();
-
- const DWARFDebugInfo*
- DebugInfo() const;
-
- DWARFDebugRanges*
- DebugRanges();
-
- const DWARFDebugRanges*
- DebugRanges() const;
-
- static bool
- SupportedVersion(uint16_t version);
+ size_t GetTypes(lldb_private::SymbolContextScope *sc_scope,
+ uint32_t type_mask,
+ lldb_private::TypeList &type_list) override;
- DWARFDIE
- GetDeclContextDIEContainingDIE (const DWARFDIE &die);
+ lldb_private::TypeSystem *
+ GetTypeSystemForLanguage(lldb::LanguageType language) override;
- bool
- HasForwardDeclForClangType (const lldb_private::CompilerType &compiler_type);
+ lldb_private::CompilerDeclContext FindNamespace(
+ const lldb_private::SymbolContext &sc,
+ const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx) override;
- lldb_private::CompileUnit*
- GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu,
- uint32_t cu_idx = UINT32_MAX);
+ //------------------------------------------------------------------
+ // PluginInterface protocol
+ //------------------------------------------------------------------
+ lldb_private::ConstString GetPluginName() override;
- size_t
- GetObjCMethodDIEOffsets (lldb_private::ConstString class_name,
- DIEArray &method_die_offsets);
+ uint32_t GetPluginVersion() override;
- bool
- Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu);
+ const lldb_private::DWARFDataExtractor &get_debug_abbrev_data();
+ const lldb_private::DWARFDataExtractor &get_debug_addr_data();
+ const lldb_private::DWARFDataExtractor &get_debug_aranges_data();
+ const lldb_private::DWARFDataExtractor &get_debug_frame_data();
+ const lldb_private::DWARFDataExtractor &get_debug_info_data();
+ const lldb_private::DWARFDataExtractor &get_debug_line_data();
+ const lldb_private::DWARFDataExtractor &get_debug_macro_data();
+ const lldb_private::DWARFDataExtractor &get_debug_loc_data();
+ const lldb_private::DWARFDataExtractor &get_debug_ranges_data();
+ const lldb_private::DWARFDataExtractor &get_debug_str_data();
+ const lldb_private::DWARFDataExtractor &get_debug_str_offsets_data();
+ const lldb_private::DWARFDataExtractor &get_apple_names_data();
+ const lldb_private::DWARFDataExtractor &get_apple_types_data();
+ const lldb_private::DWARFDataExtractor &get_apple_namespaces_data();
+ const lldb_private::DWARFDataExtractor &get_apple_objc_data();
- lldb_private::DebugMacrosSP
- ParseDebugMacros(lldb::offset_t *offset);
+ DWARFDebugAbbrev *DebugAbbrev();
- static DWARFDIE
- GetParentSymbolContextDIE(const DWARFDIE &die);
+ const DWARFDebugAbbrev *DebugAbbrev() const;
- virtual lldb::CompUnitSP
- ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx);
+ DWARFDebugInfo *DebugInfo();
- virtual lldb_private::DWARFExpression::LocationListFormat
- GetLocationListFormat() const;
+ const DWARFDebugInfo *DebugInfo() const;
- lldb::ModuleSP
- GetDWOModule (lldb_private::ConstString name);
+ DWARFDebugRanges *DebugRanges();
- virtual DWARFDIE
- GetDIE(const DIERef &die_ref);
+ const DWARFDebugRanges *DebugRanges() const;
- virtual std::unique_ptr<SymbolFileDWARFDwo>
- GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die);
+ static bool SupportedVersion(uint16_t version);
+
+ DWARFDIE
+ GetDeclContextDIEContainingDIE(const DWARFDIE &die);
+
+ bool
+ HasForwardDeclForClangType(const lldb_private::CompilerType &compiler_type);
+
+ lldb_private::CompileUnit *
+ GetCompUnitForDWARFCompUnit(DWARFCompileUnit *dwarf_cu,
+ uint32_t cu_idx = UINT32_MAX);
+
+ size_t GetObjCMethodDIEOffsets(lldb_private::ConstString class_name,
+ DIEArray &method_die_offsets);
+
+ bool Supports_DW_AT_APPLE_objc_complete_type(DWARFCompileUnit *cu);
+
+ lldb_private::DebugMacrosSP ParseDebugMacros(lldb::offset_t *offset);
+
+ static DWARFDIE GetParentSymbolContextDIE(const DWARFDIE &die);
+
+ virtual lldb::CompUnitSP ParseCompileUnit(DWARFCompileUnit *dwarf_cu,
+ uint32_t cu_idx);
+
+ virtual lldb_private::DWARFExpression::LocationListFormat
+ GetLocationListFormat() const;
+
+ lldb::ModuleSP GetDWOModule(lldb_private::ConstString name);
+
+ virtual DWARFDIE GetDIE(const DIERef &die_ref);
+
+ virtual std::unique_ptr<SymbolFileDWARFDwo>
+ GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu,
+ const DWARFDebugInfoEntry &cu_die);
protected:
- typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr;
- typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP;
- typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::opaque_compiler_type_t> DIEToClangType;
- typedef llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> ClangTypeToDIE;
-
- struct DWARFDataSegment
- {
- std::once_flag m_flag;
- lldb_private::DWARFDataExtractor m_data;
- };
-
- DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
-
- const lldb_private::DWARFDataExtractor&
- GetCachedSectionData (lldb::SectionType sect_type, DWARFDataSegment& data_segment);
-
- virtual void
- LoadSectionData (lldb::SectionType sect_type, lldb_private::DWARFDataExtractor& data);
-
- bool
- DeclContextMatchesThisSymbolFile (const lldb_private::CompilerDeclContext *decl_ctx);
-
- bool
- DIEInDeclContext (const lldb_private::CompilerDeclContext *parent_decl_ctx,
- const DWARFDIE &die);
-
- virtual DWARFCompileUnit*
- GetDWARFCompileUnit (lldb_private::CompileUnit *comp_unit);
-
- DWARFCompileUnit*
- GetNextUnparsedDWARFCompileUnit (DWARFCompileUnit* prev_cu);
-
- bool
- GetFunction (const DWARFDIE &die,
- lldb_private::SymbolContext& sc);
-
- lldb_private::Function *
- ParseCompileUnitFunction (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die);
-
- size_t
- ParseFunctionBlocks (const lldb_private::SymbolContext& sc,
- lldb_private::Block *parent_block,
- const DWARFDIE &die,
- lldb::addr_t subprogram_low_pc,
- uint32_t depth);
-
- size_t
- ParseTypes (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die,
- bool parse_siblings,
- bool parse_children);
-
- lldb::TypeSP
- ParseType (const lldb_private::SymbolContext& sc,
- const DWARFDIE &die,
- bool *type_is_new);
-
- lldb_private::Type *
- ResolveTypeUID(const DWARFDIE &die, bool assert_not_being_parsed);
-
- lldb_private::Type *
- ResolveTypeUID(const DIERef &die_ref);
-
- lldb::VariableSP
- ParseVariableDIE(const lldb_private::SymbolContext& sc,
- const DWARFDIE &die,
- const lldb::addr_t func_low_pc);
-
- size_t
- 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 (const DWARFDIE &die);
-
- // Given a die_offset, figure out the symbol context representing that die.
- bool
- ResolveFunction (const DIERef& die_ref,
- bool include_inlines,
- lldb_private::SymbolContextList& sc_list);
+ typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *>
+ DIEToTypePtr;
+ typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP>
+ DIEToVariableSP;
+ typedef llvm::DenseMap<const DWARFDebugInfoEntry *,
+ lldb::opaque_compiler_type_t>
+ DIEToClangType;
+ typedef llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> ClangTypeToDIE;
+
+ struct DWARFDataSegment {
+ std::once_flag m_flag;
+ lldb_private::DWARFDataExtractor m_data;
+ };
+
+ DISALLOW_COPY_AND_ASSIGN(SymbolFileDWARF);
- bool
- ResolveFunction (const DWARFDIE &die,
+ const lldb_private::DWARFDataExtractor &
+ GetCachedSectionData(lldb::SectionType sect_type,
+ DWARFDataSegment &data_segment);
+
+ virtual void LoadSectionData(lldb::SectionType sect_type,
+ lldb_private::DWARFDataExtractor &data);
+
+ bool DeclContextMatchesThisSymbolFile(
+ const lldb_private::CompilerDeclContext *decl_ctx);
+
+ bool
+ DIEInDeclContext(const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ const DWARFDIE &die);
+
+ virtual DWARFCompileUnit *
+ GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit);
+
+ DWARFCompileUnit *GetNextUnparsedDWARFCompileUnit(DWARFCompileUnit *prev_cu);
+
+ bool GetFunction(const DWARFDIE &die, lldb_private::SymbolContext &sc);
+
+ lldb_private::Function *
+ ParseCompileUnitFunction(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die);
+
+ size_t ParseFunctionBlocks(const lldb_private::SymbolContext &sc,
+ lldb_private::Block *parent_block,
+ const DWARFDIE &die,
+ lldb::addr_t subprogram_low_pc, uint32_t depth);
+
+ size_t ParseTypes(const lldb_private::SymbolContext &sc, const DWARFDIE &die,
+ bool parse_siblings, bool parse_children);
+
+ lldb::TypeSP ParseType(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die, bool *type_is_new);
+
+ lldb_private::Type *ResolveTypeUID(const DWARFDIE &die,
+ bool assert_not_being_parsed);
+
+ lldb_private::Type *ResolveTypeUID(const DIERef &die_ref);
+
+ lldb::VariableSP ParseVariableDIE(const lldb_private::SymbolContext &sc,
+ const DWARFDIE &die,
+ const lldb::addr_t func_low_pc);
+
+ size_t 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(const DWARFDIE &die);
+
+ // Given a die_offset, figure out the symbol context representing that die.
+ bool ResolveFunction(const DIERef &die_ref, bool include_inlines,
+ lldb_private::SymbolContextList &sc_list);
+
+ bool ResolveFunction(const DWARFDIE &die, bool include_inlines,
+ lldb_private::SymbolContextList &sc_list);
+
+ void FindFunctions(const lldb_private::ConstString &name,
+ const NameToDIE &name_to_die, bool include_inlines,
+ lldb_private::SymbolContextList &sc_list);
+
+ void FindFunctions(const lldb_private::RegularExpression &regex,
+ const NameToDIE &name_to_die, bool include_inlines,
+ lldb_private::SymbolContextList &sc_list);
+
+ void FindFunctions(const lldb_private::RegularExpression &regex,
+ const DWARFMappedHash::MemoryTable &memory_table,
bool include_inlines,
- lldb_private::SymbolContextList& sc_list);
-
- void
- FindFunctions(const lldb_private::ConstString &name,
- const NameToDIE &name_to_die,
- bool include_inlines,
- lldb_private::SymbolContextList& sc_list);
-
- void
- FindFunctions (const lldb_private::RegularExpression &regex,
- const NameToDIE &name_to_die,
- bool include_inlines,
- lldb_private::SymbolContextList& sc_list);
-
- void
- FindFunctions (const lldb_private::RegularExpression &regex,
- const DWARFMappedHash::MemoryTable &memory_table,
- bool include_inlines,
- lldb_private::SymbolContextList& sc_list);
-
- virtual lldb::TypeSP
- FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx);
-
- lldb::TypeSP
- FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
- const lldb_private::ConstString &type_name,
- bool must_be_implementation);
-
- lldb::TypeSP
- FindCompleteObjCDefinitionType (const lldb_private::ConstString &type_name,
- bool header_definition_ok);
-
- lldb_private::Symbol *
- GetObjCClassSymbol (const lldb_private::ConstString &objc_class_name);
-
- void
- ParseFunctions (const DIEArray &die_offsets,
- bool include_inlines,
- lldb_private::SymbolContextList& sc_list);
-
- lldb::TypeSP
- GetTypeForDIE (const DWARFDIE &die, bool resolve_function_context = false);
-
- void
- Index();
-
- void
- DumpIndexes();
-
- void
- SetDebugMapModule (const lldb::ModuleSP &module_sp)
- {
- m_debug_map_module_wp = module_sp;
- }
-
- SymbolFileDWARFDebugMap *
- GetDebugMapSymfile ();
-
- DWARFDIE
- FindBlockContainingSpecification (const DIERef& func_die_ref, dw_offset_t spec_block_die_offset);
-
- DWARFDIE
- FindBlockContainingSpecification (const DWARFDIE &die, dw_offset_t spec_block_die_offset);
-
- virtual UniqueDWARFASTTypeMap &
- GetUniqueDWARFASTTypeMap ();
-
- bool
- DIEDeclContextsMatch (const DWARFDIE &die1,
- const DWARFDIE &die2);
-
- bool
- ClassContainsSelector (const DWARFDIE &class_die,
- const lldb_private::ConstString &selector);
-
- bool
- FixupAddress (lldb_private::Address &addr);
-
- typedef std::set<lldb_private::Type *> TypeSet;
-
- typedef std::map<lldb_private::ConstString, lldb::ModuleSP> ExternalTypeModuleMap;
-
- void
- GetTypes (const DWARFDIE &die,
- dw_offset_t min_die_offset,
- dw_offset_t max_die_offset,
- uint32_t type_mask,
- TypeSet &type_set);
-
- typedef lldb_private::RangeDataVector<lldb::addr_t, lldb::addr_t, lldb_private::Variable *> GlobalVariableMap;
-
- GlobalVariableMap &
- GetGlobalAranges();
-
- void
- UpdateExternalModuleListIfNeeded();
-
- virtual DIEToTypePtr&
- GetDIEToType() { return m_die_to_type; }
-
- virtual DIEToVariableSP&
- GetDIEToVariable() { return m_die_to_variable_sp; }
-
- virtual DIEToClangType&
- GetForwardDeclDieToClangType() { return m_forward_decl_die_to_clang_type; }
-
- virtual ClangTypeToDIE&
- GetForwardDeclClangTypeToDie() { return m_forward_decl_clang_type_to_die; }
-
- lldb::ModuleWP m_debug_map_module_wp;
- SymbolFileDWARFDebugMap * m_debug_map_symfile;
- lldb_private::DWARFDataExtractor m_dwarf_data;
-
- DWARFDataSegment m_data_debug_abbrev;
- DWARFDataSegment m_data_debug_addr;
- DWARFDataSegment m_data_debug_aranges;
- DWARFDataSegment m_data_debug_frame;
- DWARFDataSegment m_data_debug_info;
- DWARFDataSegment m_data_debug_line;
- DWARFDataSegment m_data_debug_macro;
- DWARFDataSegment m_data_debug_loc;
- DWARFDataSegment m_data_debug_ranges;
- DWARFDataSegment m_data_debug_str;
- DWARFDataSegment m_data_debug_str_offsets;
- DWARFDataSegment m_data_apple_names;
- DWARFDataSegment m_data_apple_types;
- DWARFDataSegment m_data_apple_namespaces;
- DWARFDataSegment m_data_apple_objc;
-
- // The unique pointer items below are generated on demand if and when someone accesses
- // them through a non const version of this class.
- std::unique_ptr<DWARFDebugAbbrev> m_abbr;
- std::unique_ptr<DWARFDebugInfo> m_info;
- std::unique_ptr<DWARFDebugLine> m_line;
- std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_names_ap;
- std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_types_ap;
- std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_namespaces_ap;
- std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_objc_ap;
- std::unique_ptr<GlobalVariableMap> m_global_aranges_ap;
-
- typedef std::unordered_map<lldb::offset_t, lldb_private::DebugMacrosSP> DebugMacrosMap;
- DebugMacrosMap m_debug_macros_map;
-
- ExternalTypeModuleMap m_external_type_modules;
- NameToDIE m_function_basename_index; // All concrete functions
- NameToDIE m_function_fullname_index; // All concrete functions
- NameToDIE m_function_method_index; // All inlined functions
- NameToDIE m_function_selector_index; // All method names for functions of classes
- NameToDIE m_objc_class_selectors_index; // Given a class name, find all selectors for the class
- NameToDIE m_global_index; // Global and static variables
- NameToDIE m_type_index; // All type DIE offsets
- NameToDIE m_namespace_index; // All type DIE offsets
- bool m_indexed:1,
- m_using_apple_tables:1,
- m_fetched_external_modules:1;
- lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
-
- typedef std::shared_ptr<std::set<DIERef> > DIERefSetSP;
- typedef std::unordered_map<std::string, DIERefSetSP> NameToOffsetMap;
- NameToOffsetMap m_function_scope_qualified_name_map;
- std::unique_ptr<DWARFDebugRanges> m_ranges;
- UniqueDWARFASTTypeMap m_unique_ast_type_map;
- DIEToTypePtr m_die_to_type;
- DIEToVariableSP m_die_to_variable_sp;
- DIEToClangType m_forward_decl_die_to_clang_type;
- ClangTypeToDIE m_forward_decl_clang_type_to_die;
+ lldb_private::SymbolContextList &sc_list);
+
+ virtual lldb::TypeSP
+ FindDefinitionTypeForDWARFDeclContext(const DWARFDeclContext &die_decl_ctx);
+
+ lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE(
+ const DWARFDIE &die, const lldb_private::ConstString &type_name,
+ bool must_be_implementation);
+
+ lldb::TypeSP
+ FindCompleteObjCDefinitionType(const lldb_private::ConstString &type_name,
+ bool header_definition_ok);
+
+ lldb_private::Symbol *
+ GetObjCClassSymbol(const lldb_private::ConstString &objc_class_name);
+
+ void ParseFunctions(const DIEArray &die_offsets, bool include_inlines,
+ lldb_private::SymbolContextList &sc_list);
+
+ lldb::TypeSP GetTypeForDIE(const DWARFDIE &die,
+ bool resolve_function_context = false);
+
+ void Index();
+
+ void DumpIndexes();
+
+ void SetDebugMapModule(const lldb::ModuleSP &module_sp) {
+ m_debug_map_module_wp = module_sp;
+ }
+
+ SymbolFileDWARFDebugMap *GetDebugMapSymfile();
+
+ DWARFDIE
+ FindBlockContainingSpecification(const DIERef &func_die_ref,
+ dw_offset_t spec_block_die_offset);
+
+ DWARFDIE
+ FindBlockContainingSpecification(const DWARFDIE &die,
+ dw_offset_t spec_block_die_offset);
+
+ virtual UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap();
+
+ bool DIEDeclContextsMatch(const DWARFDIE &die1, const DWARFDIE &die2);
+
+ bool ClassContainsSelector(const DWARFDIE &class_die,
+ const lldb_private::ConstString &selector);
+
+ bool FixupAddress(lldb_private::Address &addr);
+
+ typedef std::set<lldb_private::Type *> TypeSet;
+
+ typedef std::map<lldb_private::ConstString, lldb::ModuleSP>
+ ExternalTypeModuleMap;
+
+ void GetTypes(const DWARFDIE &die, dw_offset_t min_die_offset,
+ dw_offset_t max_die_offset, uint32_t type_mask,
+ TypeSet &type_set);
+
+ typedef lldb_private::RangeDataVector<lldb::addr_t, lldb::addr_t,
+ lldb_private::Variable *>
+ GlobalVariableMap;
+
+ GlobalVariableMap &GetGlobalAranges();
+
+ void UpdateExternalModuleListIfNeeded();
+
+ virtual DIEToTypePtr &GetDIEToType() { return m_die_to_type; }
+
+ virtual DIEToVariableSP &GetDIEToVariable() { return m_die_to_variable_sp; }
+
+ virtual DIEToClangType &GetForwardDeclDieToClangType() {
+ return m_forward_decl_die_to_clang_type;
+ }
+
+ virtual ClangTypeToDIE &GetForwardDeclClangTypeToDie() {
+ return m_forward_decl_clang_type_to_die;
+ }
+
+ lldb::ModuleWP m_debug_map_module_wp;
+ SymbolFileDWARFDebugMap *m_debug_map_symfile;
+ lldb_private::DWARFDataExtractor m_dwarf_data;
+
+ DWARFDataSegment m_data_debug_abbrev;
+ DWARFDataSegment m_data_debug_addr;
+ DWARFDataSegment m_data_debug_aranges;
+ DWARFDataSegment m_data_debug_frame;
+ DWARFDataSegment m_data_debug_info;
+ DWARFDataSegment m_data_debug_line;
+ DWARFDataSegment m_data_debug_macro;
+ DWARFDataSegment m_data_debug_loc;
+ DWARFDataSegment m_data_debug_ranges;
+ DWARFDataSegment m_data_debug_str;
+ DWARFDataSegment m_data_debug_str_offsets;
+ DWARFDataSegment m_data_apple_names;
+ DWARFDataSegment m_data_apple_types;
+ DWARFDataSegment m_data_apple_namespaces;
+ DWARFDataSegment m_data_apple_objc;
+
+ // The unique pointer items below are generated on demand if and when someone
+ // accesses
+ // them through a non const version of this class.
+ std::unique_ptr<DWARFDebugAbbrev> m_abbr;
+ std::unique_ptr<DWARFDebugInfo> m_info;
+ std::unique_ptr<DWARFDebugLine> m_line;
+ std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_names_ap;
+ std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_types_ap;
+ std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_namespaces_ap;
+ std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_objc_ap;
+ std::unique_ptr<GlobalVariableMap> m_global_aranges_ap;
+
+ typedef std::unordered_map<lldb::offset_t, lldb_private::DebugMacrosSP>
+ DebugMacrosMap;
+ DebugMacrosMap m_debug_macros_map;
+
+ ExternalTypeModuleMap m_external_type_modules;
+ NameToDIE m_function_basename_index; // All concrete functions
+ NameToDIE m_function_fullname_index; // All concrete functions
+ NameToDIE m_function_method_index; // All inlined functions
+ NameToDIE
+ m_function_selector_index; // All method names for functions of classes
+ NameToDIE m_objc_class_selectors_index; // Given a class name, find all
+ // selectors for the class
+ NameToDIE m_global_index; // Global and static variables
+ NameToDIE m_type_index; // All type DIE offsets
+ NameToDIE m_namespace_index; // All type DIE offsets
+ bool m_indexed : 1, m_using_apple_tables : 1, m_fetched_external_modules : 1;
+ lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
+
+ typedef std::shared_ptr<std::set<DIERef>> DIERefSetSP;
+ typedef std::unordered_map<std::string, DIERefSetSP> NameToOffsetMap;
+ NameToOffsetMap m_function_scope_qualified_name_map;
+ std::unique_ptr<DWARFDebugRanges> m_ranges;
+ UniqueDWARFASTTypeMap m_unique_ast_type_map;
+ DIEToTypePtr m_die_to_type;
+ DIEToVariableSP m_die_to_variable_sp;
+ DIEToClangType m_forward_decl_die_to_clang_type;
+ ClangTypeToDIE m_forward_decl_clang_type_to_die;
};
-#endif // SymbolFileDWARF_SymbolFileDWARF_h_
+#endif // SymbolFileDWARF_SymbolFileDWARF_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 39354fcdf6f..3933a2b862d 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -15,10 +15,10 @@
#include "DWARFDebugAranges.h"
-#include "lldb/Core/RangeMap.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleList.h"
#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/RangeMap.h"
#include "lldb/Core/RegularExpression.h"
#include "lldb/Core/Section.h"
@@ -41,1550 +41,1401 @@
using namespace lldb;
using namespace lldb_private;
-// Subclass lldb_private::Module so we can intercept the "Module::GetObjectFile()"
-// (so we can fixup the object file sections) and also for "Module::GetSymbolVendor()"
+// Subclass lldb_private::Module so we can intercept the
+// "Module::GetObjectFile()"
+// (so we can fixup the object file sections) and also for
+// "Module::GetSymbolVendor()"
// (so we can fixup the symbol file id.
const SymbolFileDWARFDebugMap::FileRangeMap &
-SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap(SymbolFileDWARFDebugMap *exe_symfile)
-{
- if (file_range_map_valid)
- return file_range_map;
-
- file_range_map_valid = true;
-
- Module *oso_module = exe_symfile->GetModuleByCompUnitInfo (this);
- if (!oso_module)
- return file_range_map;
-
- ObjectFile *oso_objfile = oso_module->GetObjectFile();
- if (!oso_objfile)
- return file_range_map;
-
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
- if (log)
- {
- ConstString object_name (oso_module->GetObjectName());
- log->Printf("%p: SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap ('%s')",
- static_cast<void*>(this),
- oso_module->GetSpecificationDescription().c_str());
- }
-
- std::vector<SymbolFileDWARFDebugMap::CompileUnitInfo *> cu_infos;
- if (exe_symfile->GetCompUnitInfosForModule(oso_module, cu_infos))
- {
- for (auto comp_unit_info : cu_infos)
- {
- Symtab *exe_symtab = exe_symfile->GetObjectFile()->GetSymtab();
- ModuleSP oso_module_sp (oso_objfile->GetModule());
- Symtab *oso_symtab = oso_objfile->GetSymtab();
-
- ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
- //SectionList *oso_sections = oso_objfile->Sections();
- // Now we need to make sections that map from zero based object
- // file addresses to where things ended up in the main executable.
-
- assert (comp_unit_info->first_symbol_index != UINT32_MAX);
- // End index is one past the last valid symbol index
- const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1;
- for (uint32_t idx = comp_unit_info->first_symbol_index + 2; // Skip the N_SO and N_OSO
- idx < oso_end_idx;
- ++idx)
- {
- Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
- if (exe_symbol)
- {
- if (exe_symbol->IsDebug() == false)
- continue;
-
- switch (exe_symbol->GetType())
- {
- default:
- break;
-
- case eSymbolTypeCode:
- {
- // For each N_FUN, or function that we run into in the debug map
- // we make a new section that we add to the sections found in the
- // .o file. This new section has the file address set to what the
- // addresses are in the .o file, and the load address is adjusted
- // to match where it ended up in the final executable! We do this
- // before we parse any dwarf info so that when it goes get parsed
- // all section/offset addresses that get registered will resolve
- // correctly to the new addresses in the main executable.
-
- // First we find the original symbol in the .o file's symbol table
- Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown, Mangled::ePreferMangled),
- eSymbolTypeCode,
- Symtab::eDebugNo,
- Symtab::eVisibilityAny);
- if (oso_fun_symbol)
- {
- // Add the inverse OSO file address to debug map entry mapping
- exe_symfile->AddOSOFileRange (this,
- exe_symbol->GetAddressRef().GetFileAddress(),
- exe_symbol->GetByteSize(),
- oso_fun_symbol->GetAddressRef().GetFileAddress(),
- oso_fun_symbol->GetByteSize());
-
- }
- }
- break;
-
- case eSymbolTypeData:
- {
- // For each N_GSYM we remap the address for the global by making
- // a new section that we add to the sections found in the .o file.
- // This new section has the file address set to what the
- // addresses are in the .o file, and the load address is adjusted
- // to match where it ended up in the final executable! We do this
- // before we parse any dwarf info so that when it goes get parsed
- // all section/offset addresses that get registered will resolve
- // correctly to the new addresses in the main executable. We
- // initially set the section size to be 1 byte, but will need to
- // fix up these addresses further after all globals have been
- // parsed to span the gaps, or we can find the global variable
- // sizes from the DWARF info as we are parsing.
-
- // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
- Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown, Mangled::ePreferMangled),
- eSymbolTypeData,
- Symtab::eDebugNo,
- Symtab::eVisibilityAny);
- if (exe_symbol && oso_gsym_symbol &&
- exe_symbol->ValueIsAddress() &&
- oso_gsym_symbol->ValueIsAddress())
- {
- // Add the inverse OSO file address to debug map entry mapping
- exe_symfile->AddOSOFileRange (this,
- exe_symbol->GetAddressRef().GetFileAddress(),
- exe_symbol->GetByteSize(),
- oso_gsym_symbol->GetAddressRef().GetFileAddress(),
- oso_gsym_symbol->GetByteSize());
- }
- }
- break;
- }
- }
- }
-
- exe_symfile->FinalizeOSOFileRanges (this);
- // We don't need the symbols anymore for the .o files
- oso_objfile->ClearSymtab();
- }
- }
+SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap(
+ SymbolFileDWARFDebugMap *exe_symfile) {
+ if (file_range_map_valid)
return file_range_map;
-}
-class DebugMapModule : public Module
-{
-public:
- DebugMapModule (const ModuleSP &exe_module_sp,
- uint32_t cu_idx,
- const FileSpec& file_spec,
- const ArchSpec& arch,
- const ConstString *object_name,
- off_t object_offset,
- const TimeValue *object_mod_time_ptr) :
- Module (file_spec, arch, object_name, object_offset, object_mod_time_ptr),
- m_exe_module_wp (exe_module_sp),
- m_cu_idx (cu_idx)
- {
- }
+ file_range_map_valid = true;
- ~DebugMapModule() override = default;
-
- SymbolVendor*
- GetSymbolVendor(bool can_create = true, lldb_private::Stream *feedback_strm = NULL) override
- {
- // Scope for locker
- if (m_symfile_ap.get() || can_create == false)
- return m_symfile_ap.get();
-
- ModuleSP exe_module_sp (m_exe_module_wp.lock());
- if (exe_module_sp)
- {
- // Now get the object file outside of a locking scope
- ObjectFile *oso_objfile = GetObjectFile ();
- if (oso_objfile)
- {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- SymbolVendor* symbol_vendor = Module::GetSymbolVendor(can_create, feedback_strm);
- if (symbol_vendor)
- {
- // Set a pointer to this class to set our OSO DWARF file know
- // that the DWARF is being used along with a debug map and that
- // it will have the remapped sections that we do below.
- SymbolFileDWARF *oso_symfile = SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF(symbol_vendor->GetSymbolFile());
-
- if (!oso_symfile)
- return NULL;
-
- ObjectFile *exe_objfile = exe_module_sp->GetObjectFile();
- SymbolVendor *exe_sym_vendor = exe_module_sp->GetSymbolVendor();
-
- if (exe_objfile && exe_sym_vendor)
- {
- oso_symfile->SetDebugMapModule(exe_module_sp);
- // Set the ID of the symbol file DWARF to the index of the OSO
- // shifted left by 32 bits to provide a unique prefix for any
- // UserID's that get created in the symbol file.
- oso_symfile->SetID (((uint64_t)m_cu_idx + 1ull) << 32ull);
- }
- return symbol_vendor;
- }
- }
- }
- return NULL;
- }
+ Module *oso_module = exe_symfile->GetModuleByCompUnitInfo(this);
+ if (!oso_module)
+ return file_range_map;
-protected:
- ModuleWP m_exe_module_wp;
- const uint32_t m_cu_idx;
-};
+ ObjectFile *oso_objfile = oso_module->GetObjectFile();
+ if (!oso_objfile)
+ return file_range_map;
-void
-SymbolFileDWARFDebugMap::Initialize()
-{
- PluginManager::RegisterPlugin (GetPluginNameStatic(),
- GetPluginDescriptionStatic(),
- CreateInstance);
-}
-
-void
-SymbolFileDWARFDebugMap::Terminate()
-{
- PluginManager::UnregisterPlugin (CreateInstance);
-}
-
-lldb_private::ConstString
-SymbolFileDWARFDebugMap::GetPluginNameStatic()
-{
- static ConstString g_name("dwarf-debugmap");
- return g_name;
-}
-
-const char *
-SymbolFileDWARFDebugMap::GetPluginDescriptionStatic()
-{
- return "DWARF and DWARF3 debug symbol file reader (debug map).";
-}
-
-SymbolFile*
-SymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file)
-{
- return new SymbolFileDWARFDebugMap (obj_file);
-}
-
-SymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) :
- SymbolFile(ofile),
- m_flags(),
- m_compile_unit_infos(),
- m_func_indexes(),
- m_glob_indexes(),
- m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate)
-{
-}
-
-SymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap()
-{
-}
-
-void
-SymbolFileDWARFDebugMap::InitializeObject()
-{
-}
-
-void
-SymbolFileDWARFDebugMap::InitOSO()
-{
- if (m_flags.test(kHaveInitializedOSOs))
- return;
-
- m_flags.set(kHaveInitializedOSOs);
-
- // If the object file has been stripped, there is no sense in looking further
- // as all of the debug symbols for the debug map will not be available
- if (m_obj_file->IsStripped())
- return;
-
- // Also make sure the file type is some sort of executable. Core files, debug
- // info files (dSYM), object files (.o files), and stub libraries all can
- switch (m_obj_file->GetType())
- {
- case ObjectFile::eTypeInvalid:
- case ObjectFile::eTypeCoreFile:
- case ObjectFile::eTypeDebugInfo:
- case ObjectFile::eTypeObjectFile:
- case ObjectFile::eTypeStubLibrary:
- case ObjectFile::eTypeUnknown:
- case ObjectFile::eTypeJIT:
- return;
-
- case ObjectFile::eTypeExecutable:
- case ObjectFile::eTypeDynamicLinker:
- case ObjectFile::eTypeSharedLibrary:
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
+ if (log) {
+ ConstString object_name(oso_module->GetObjectName());
+ log->Printf(
+ "%p: SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap ('%s')",
+ static_cast<void *>(this),
+ oso_module->GetSpecificationDescription().c_str());
+ }
+
+ std::vector<SymbolFileDWARFDebugMap::CompileUnitInfo *> cu_infos;
+ if (exe_symfile->GetCompUnitInfosForModule(oso_module, cu_infos)) {
+ for (auto comp_unit_info : cu_infos) {
+ Symtab *exe_symtab = exe_symfile->GetObjectFile()->GetSymtab();
+ ModuleSP oso_module_sp(oso_objfile->GetModule());
+ Symtab *oso_symtab = oso_objfile->GetSymtab();
+
+ /// const uint32_t fun_resolve_flags = SymbolContext::Module |
+ /// eSymbolContextCompUnit | eSymbolContextFunction;
+ // SectionList *oso_sections = oso_objfile->Sections();
+ // Now we need to make sections that map from zero based object
+ // file addresses to where things ended up in the main executable.
+
+ assert(comp_unit_info->first_symbol_index != UINT32_MAX);
+ // End index is one past the last valid symbol index
+ const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1;
+ for (uint32_t idx = comp_unit_info->first_symbol_index +
+ 2; // Skip the N_SO and N_OSO
+ idx < oso_end_idx;
+ ++idx) {
+ Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
+ if (exe_symbol) {
+ if (exe_symbol->IsDebug() == false)
+ continue;
+
+ switch (exe_symbol->GetType()) {
+ default:
break;
- }
- // In order to get the abilities of this plug-in, we look at the list of
- // N_OSO entries (object files) from the symbol table and make sure that
- // these files exist and also contain valid DWARF. If we get any of that
- // then we return the abilities of the first N_OSO's DWARF.
-
- Symtab* symtab = m_obj_file->GetSymtab();
- if (symtab)
- {
- Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
-
- std::vector<uint32_t> oso_indexes;
- // When a mach-o symbol is encoded, the n_type field is encoded in bits
- // 23:16, and the n_desc field is encoded in bits 15:0.
- //
- // To find all N_OSO entries that are part of the DWARF + debug map
- // we find only object file symbols with the flags value as follows:
- // bits 23:16 == 0x66 (N_OSO)
- // bits 15: 0 == 0x0001 (specifies this is a debug map object file)
- const uint32_t k_oso_symbol_flags_value = 0x660001u;
-
- const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithTypeAndFlagsValue(eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes);
-
- if (oso_index_count > 0)
- {
- symtab->AppendSymbolIndexesWithType (eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes);
- symtab->AppendSymbolIndexesWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, m_glob_indexes);
-
- symtab->SortSymbolIndexesByValue(m_func_indexes, true);
- symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
-
- for (uint32_t sym_idx : m_func_indexes)
- {
- const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
- lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
- lldb::addr_t byte_size = symbol->GetByteSize();
- DebugMap::Entry debug_map_entry(file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
- m_debug_map.Append(debug_map_entry);
- }
- for (uint32_t sym_idx : m_glob_indexes)
- {
- const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
- lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
- lldb::addr_t byte_size = symbol->GetByteSize();
- DebugMap::Entry debug_map_entry(file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
- m_debug_map.Append(debug_map_entry);
+ case eSymbolTypeCode: {
+ // For each N_FUN, or function that we run into in the debug map
+ // we make a new section that we add to the sections found in the
+ // .o file. This new section has the file address set to what the
+ // addresses are in the .o file, and the load address is adjusted
+ // to match where it ended up in the final executable! We do this
+ // before we parse any dwarf info so that when it goes get parsed
+ // all section/offset addresses that get registered will resolve
+ // correctly to the new addresses in the main executable.
+
+ // First we find the original symbol in the .o file's symbol table
+ Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(
+ exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown,
+ Mangled::ePreferMangled),
+ eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
+ if (oso_fun_symbol) {
+ // Add the inverse OSO file address to debug map entry mapping
+ exe_symfile->AddOSOFileRange(
+ this, exe_symbol->GetAddressRef().GetFileAddress(),
+ exe_symbol->GetByteSize(),
+ oso_fun_symbol->GetAddressRef().GetFileAddress(),
+ oso_fun_symbol->GetByteSize());
}
- m_debug_map.Sort();
-
- m_compile_unit_infos.resize(oso_index_count);
-
- for (uint32_t i=0; i<oso_index_count; ++i)
- {
- const uint32_t so_idx = oso_indexes[i] - 1;
- const uint32_t oso_idx = oso_indexes[i];
- const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx);
- const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx);
- if (so_symbol &&
- oso_symbol &&
- so_symbol->GetType() == eSymbolTypeSourceFile &&
- oso_symbol->GetType() == eSymbolTypeObjectFile)
- {
- m_compile_unit_infos[i].so_file.SetFile(so_symbol->GetName().AsCString(), false);
- m_compile_unit_infos[i].oso_path = oso_symbol->GetName();
- TimeValue oso_mod_time;
- oso_mod_time.OffsetWithSeconds(oso_symbol->GetIntegerValue(0));
- m_compile_unit_infos[i].oso_mod_time = oso_mod_time;
- uint32_t sibling_idx = so_symbol->GetSiblingIndex();
- // The sibling index can't be less that or equal to the current index "i"
- if (sibling_idx == UINT32_MAX)
- {
- m_obj_file->GetModule()->ReportError ("N_SO in symbol with UID %u has invalid sibling in debug map, please file a bug and attach the binary listed in this error", so_symbol->GetID());
- }
- else
- {
- const Symbol* last_symbol = symtab->SymbolAtIndex (sibling_idx - 1);
- m_compile_unit_infos[i].first_symbol_index = so_idx;
- m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1;
- m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
- m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
-
- if (log)
- log->Printf("Initialized OSO 0x%8.8x: file=%s", i, oso_symbol->GetName().GetCString());
- }
- }
- else
- {
- if (oso_symbol == NULL)
- m_obj_file->GetModule()->ReportError ("N_OSO symbol[%u] can't be found, please file a bug and attach the binary listed in this error", oso_idx);
- else if (so_symbol == NULL)
- m_obj_file->GetModule()->ReportError ("N_SO not found for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", oso_idx);
- else if (so_symbol->GetType() != eSymbolTypeSourceFile)
- m_obj_file->GetModule()->ReportError ("N_SO has incorrect symbol type (%u) for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", so_symbol->GetType(), oso_idx);
- else if (oso_symbol->GetType() != eSymbolTypeSourceFile)
- m_obj_file->GetModule()->ReportError ("N_OSO has incorrect symbol type (%u) for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", oso_symbol->GetType(), oso_idx);
- }
+ } break;
+
+ case eSymbolTypeData: {
+ // For each N_GSYM we remap the address for the global by making
+ // a new section that we add to the sections found in the .o file.
+ // This new section has the file address set to what the
+ // addresses are in the .o file, and the load address is adjusted
+ // to match where it ended up in the final executable! We do this
+ // before we parse any dwarf info so that when it goes get parsed
+ // all section/offset addresses that get registered will resolve
+ // correctly to the new addresses in the main executable. We
+ // initially set the section size to be 1 byte, but will need to
+ // fix up these addresses further after all globals have been
+ // parsed to span the gaps, or we can find the global variable
+ // sizes from the DWARF info as we are parsing.
+
+ // Next we find the non-stab entry that corresponds to the N_GSYM in
+ // the .o file
+ Symbol *oso_gsym_symbol =
+ oso_symtab->FindFirstSymbolWithNameAndType(
+ exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown,
+ Mangled::ePreferMangled),
+ eSymbolTypeData, Symtab::eDebugNo, Symtab::eVisibilityAny);
+ if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() &&
+ oso_gsym_symbol->ValueIsAddress()) {
+ // Add the inverse OSO file address to debug map entry mapping
+ exe_symfile->AddOSOFileRange(
+ this, exe_symbol->GetAddressRef().GetFileAddress(),
+ exe_symbol->GetByteSize(),
+ oso_gsym_symbol->GetAddressRef().GetFileAddress(),
+ oso_gsym_symbol->GetByteSize());
}
+ } break;
+ }
}
+ }
+
+ exe_symfile->FinalizeOSOFileRanges(this);
+ // We don't need the symbols anymore for the .o files
+ oso_objfile->ClearSymtab();
}
+ }
+ return file_range_map;
}
-Module *
-SymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx)
-{
- const uint32_t cu_count = GetNumCompileUnits();
- if (oso_idx < cu_count)
- return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
+class DebugMapModule : public Module {
+public:
+ DebugMapModule(const ModuleSP &exe_module_sp, uint32_t cu_idx,
+ const FileSpec &file_spec, const ArchSpec &arch,
+ const ConstString *object_name, off_t object_offset,
+ const TimeValue *object_mod_time_ptr)
+ : Module(file_spec, arch, object_name, object_offset,
+ object_mod_time_ptr),
+ m_exe_module_wp(exe_module_sp), m_cu_idx(cu_idx) {}
+
+ ~DebugMapModule() override = default;
+
+ SymbolVendor *
+ GetSymbolVendor(bool can_create = true,
+ lldb_private::Stream *feedback_strm = NULL) override {
+ // Scope for locker
+ if (m_symfile_ap.get() || can_create == false)
+ return m_symfile_ap.get();
+
+ ModuleSP exe_module_sp(m_exe_module_wp.lock());
+ if (exe_module_sp) {
+ // Now get the object file outside of a locking scope
+ ObjectFile *oso_objfile = GetObjectFile();
+ if (oso_objfile) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ SymbolVendor *symbol_vendor =
+ Module::GetSymbolVendor(can_create, feedback_strm);
+ if (symbol_vendor) {
+ // Set a pointer to this class to set our OSO DWARF file know
+ // that the DWARF is being used along with a debug map and that
+ // it will have the remapped sections that we do below.
+ SymbolFileDWARF *oso_symfile =
+ SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF(
+ symbol_vendor->GetSymbolFile());
+
+ if (!oso_symfile)
+ return NULL;
+
+ ObjectFile *exe_objfile = exe_module_sp->GetObjectFile();
+ SymbolVendor *exe_sym_vendor = exe_module_sp->GetSymbolVendor();
+
+ if (exe_objfile && exe_sym_vendor) {
+ oso_symfile->SetDebugMapModule(exe_module_sp);
+ // Set the ID of the symbol file DWARF to the index of the OSO
+ // shifted left by 32 bits to provide a unique prefix for any
+ // UserID's that get created in the symbol file.
+ oso_symfile->SetID(((uint64_t)m_cu_idx + 1ull) << 32ull);
+ }
+ return symbol_vendor;
+ }
+ }
+ }
return NULL;
-}
+ }
-Module *
-SymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info)
-{
- if (!comp_unit_info->oso_sp)
- {
- auto pos = m_oso_map.find (comp_unit_info->oso_path);
- if (pos != m_oso_map.end())
- {
- comp_unit_info->oso_sp = pos->second;
- }
- else
- {
- ObjectFile *obj_file = GetObjectFile();
- comp_unit_info->oso_sp.reset (new OSOInfo());
- m_oso_map[comp_unit_info->oso_path] = comp_unit_info->oso_sp;
- const char *oso_path = comp_unit_info->oso_path.GetCString();
- FileSpec oso_file (oso_path, false);
- ConstString oso_object;
- if (oso_file.Exists())
- {
- TimeValue oso_mod_time (oso_file.GetModificationTime());
- if (oso_mod_time != comp_unit_info->oso_mod_time)
- {
- obj_file->GetModule()->ReportError ("debug map object file '%s' has changed (actual time is 0x%" PRIx64 ", debug map time is 0x%" PRIx64 ") since this executable was linked, file will be ignored",
- oso_file.GetPath().c_str(),
- oso_mod_time.GetAsSecondsSinceJan1_1970(),
- comp_unit_info->oso_mod_time.GetAsSecondsSinceJan1_1970());
- return NULL;
- }
+protected:
+ ModuleWP m_exe_module_wp;
+ const uint32_t m_cu_idx;
+};
- }
- else
- {
- const bool must_exist = true;
-
- if (!ObjectFile::SplitArchivePathWithObject (oso_path,
- oso_file,
- oso_object,
- must_exist))
- {
- return NULL;
- }
- }
- // Always create a new module for .o files. Why? Because we
- // use the debug map, to add new sections to each .o file and
- // even though a .o file might not have changed, the sections
- // that get added to the .o file can change.
- ArchSpec oso_arch;
- // Only adopt the architecture from the module (not the vendor or OS)
- // since .o files for "i386-apple-ios" will historically show up as "i386-apple-macosx"
- // due to the lack of a LC_VERSION_MIN_MACOSX or LC_VERSION_MIN_IPHONEOS
- // load command...
- oso_arch.SetTriple(m_obj_file->GetModule()->GetArchitecture().GetTriple().getArchName().str().c_str());
- comp_unit_info->oso_sp->module_sp.reset (new DebugMapModule (obj_file->GetModule(),
- GetCompUnitInfoIndex(comp_unit_info),
- oso_file,
- oso_arch,
- oso_object ? &oso_object : NULL,
- 0,
- oso_object ? &comp_unit_info->oso_mod_time : NULL));
+void SymbolFileDWARFDebugMap::Initialize() {
+ PluginManager::RegisterPlugin(GetPluginNameStatic(),
+ GetPluginDescriptionStatic(), CreateInstance);
+}
+
+void SymbolFileDWARFDebugMap::Terminate() {
+ PluginManager::UnregisterPlugin(CreateInstance);
+}
+
+lldb_private::ConstString SymbolFileDWARFDebugMap::GetPluginNameStatic() {
+ static ConstString g_name("dwarf-debugmap");
+ return g_name;
+}
+
+const char *SymbolFileDWARFDebugMap::GetPluginDescriptionStatic() {
+ return "DWARF and DWARF3 debug symbol file reader (debug map).";
+}
+
+SymbolFile *SymbolFileDWARFDebugMap::CreateInstance(ObjectFile *obj_file) {
+ return new SymbolFileDWARFDebugMap(obj_file);
+}
+
+SymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap(ObjectFile *ofile)
+ : SymbolFile(ofile), m_flags(), m_compile_unit_infos(), m_func_indexes(),
+ m_glob_indexes(),
+ m_supports_DW_AT_APPLE_objc_complete_type(eLazyBoolCalculate) {}
+
+SymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap() {}
+
+void SymbolFileDWARFDebugMap::InitializeObject() {}
+
+void SymbolFileDWARFDebugMap::InitOSO() {
+ if (m_flags.test(kHaveInitializedOSOs))
+ return;
+
+ m_flags.set(kHaveInitializedOSOs);
+
+ // If the object file has been stripped, there is no sense in looking further
+ // as all of the debug symbols for the debug map will not be available
+ if (m_obj_file->IsStripped())
+ return;
+
+ // Also make sure the file type is some sort of executable. Core files, debug
+ // info files (dSYM), object files (.o files), and stub libraries all can
+ switch (m_obj_file->GetType()) {
+ case ObjectFile::eTypeInvalid:
+ case ObjectFile::eTypeCoreFile:
+ case ObjectFile::eTypeDebugInfo:
+ case ObjectFile::eTypeObjectFile:
+ case ObjectFile::eTypeStubLibrary:
+ case ObjectFile::eTypeUnknown:
+ case ObjectFile::eTypeJIT:
+ return;
+
+ case ObjectFile::eTypeExecutable:
+ case ObjectFile::eTypeDynamicLinker:
+ case ObjectFile::eTypeSharedLibrary:
+ break;
+ }
+
+ // In order to get the abilities of this plug-in, we look at the list of
+ // N_OSO entries (object files) from the symbol table and make sure that
+ // these files exist and also contain valid DWARF. If we get any of that
+ // then we return the abilities of the first N_OSO's DWARF.
+
+ Symtab *symtab = m_obj_file->GetSymtab();
+ if (symtab) {
+ Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
+
+ std::vector<uint32_t> oso_indexes;
+ // When a mach-o symbol is encoded, the n_type field is encoded in bits
+ // 23:16, and the n_desc field is encoded in bits 15:0.
+ //
+ // To find all N_OSO entries that are part of the DWARF + debug map
+ // we find only object file symbols with the flags value as follows:
+ // bits 23:16 == 0x66 (N_OSO)
+ // bits 15: 0 == 0x0001 (specifies this is a debug map object file)
+ const uint32_t k_oso_symbol_flags_value = 0x660001u;
+
+ const uint32_t oso_index_count =
+ symtab->AppendSymbolIndexesWithTypeAndFlagsValue(
+ eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes);
+
+ if (oso_index_count > 0) {
+ symtab->AppendSymbolIndexesWithType(eSymbolTypeCode, Symtab::eDebugYes,
+ Symtab::eVisibilityAny,
+ m_func_indexes);
+ symtab->AppendSymbolIndexesWithType(eSymbolTypeData, Symtab::eDebugYes,
+ Symtab::eVisibilityAny,
+ m_glob_indexes);
+
+ symtab->SortSymbolIndexesByValue(m_func_indexes, true);
+ symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
+
+ for (uint32_t sym_idx : m_func_indexes) {
+ const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
+ lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
+ lldb::addr_t byte_size = symbol->GetByteSize();
+ DebugMap::Entry debug_map_entry(
+ file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
+ m_debug_map.Append(debug_map_entry);
+ }
+ for (uint32_t sym_idx : m_glob_indexes) {
+ const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
+ lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
+ lldb::addr_t byte_size = symbol->GetByteSize();
+ DebugMap::Entry debug_map_entry(
+ file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
+ m_debug_map.Append(debug_map_entry);
+ }
+ m_debug_map.Sort();
+
+ m_compile_unit_infos.resize(oso_index_count);
+
+ for (uint32_t i = 0; i < oso_index_count; ++i) {
+ const uint32_t so_idx = oso_indexes[i] - 1;
+ const uint32_t oso_idx = oso_indexes[i];
+ const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx);
+ const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx);
+ if (so_symbol && oso_symbol &&
+ so_symbol->GetType() == eSymbolTypeSourceFile &&
+ oso_symbol->GetType() == eSymbolTypeObjectFile) {
+ m_compile_unit_infos[i].so_file.SetFile(
+ so_symbol->GetName().AsCString(), false);
+ m_compile_unit_infos[i].oso_path = oso_symbol->GetName();
+ TimeValue oso_mod_time;
+ oso_mod_time.OffsetWithSeconds(oso_symbol->GetIntegerValue(0));
+ m_compile_unit_infos[i].oso_mod_time = oso_mod_time;
+ uint32_t sibling_idx = so_symbol->GetSiblingIndex();
+ // The sibling index can't be less that or equal to the current index
+ // "i"
+ if (sibling_idx == UINT32_MAX) {
+ m_obj_file->GetModule()->ReportError(
+ "N_SO in symbol with UID %u has invalid sibling in debug map, "
+ "please file a bug and attach the binary listed in this error",
+ so_symbol->GetID());
+ } else {
+ const Symbol *last_symbol = symtab->SymbolAtIndex(sibling_idx - 1);
+ m_compile_unit_infos[i].first_symbol_index = so_idx;
+ m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1;
+ m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
+ m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
+
+ if (log)
+ log->Printf("Initialized OSO 0x%8.8x: file=%s", i,
+ oso_symbol->GetName().GetCString());
+ }
+ } else {
+ if (oso_symbol == NULL)
+ m_obj_file->GetModule()->ReportError(
+ "N_OSO symbol[%u] can't be found, please file a bug and attach "
+ "the binary listed in this error",
+ oso_idx);
+ else if (so_symbol == NULL)
+ m_obj_file->GetModule()->ReportError(
+ "N_SO not found for N_OSO symbol[%u], please file a bug and "
+ "attach the binary listed in this error",
+ oso_idx);
+ else if (so_symbol->GetType() != eSymbolTypeSourceFile)
+ m_obj_file->GetModule()->ReportError(
+ "N_SO has incorrect symbol type (%u) for N_OSO symbol[%u], "
+ "please file a bug and attach the binary listed in this error",
+ so_symbol->GetType(), oso_idx);
+ else if (oso_symbol->GetType() != eSymbolTypeSourceFile)
+ m_obj_file->GetModule()->ReportError(
+ "N_OSO has incorrect symbol type (%u) for N_OSO symbol[%u], "
+ "please file a bug and attach the binary listed in this error",
+ oso_symbol->GetType(), oso_idx);
}
+ }
}
- if (comp_unit_info->oso_sp)
- return comp_unit_info->oso_sp->module_sp.get();
- return NULL;
-}
+ }
+}
+
+Module *SymbolFileDWARFDebugMap::GetModuleByOSOIndex(uint32_t oso_idx) {
+ const uint32_t cu_count = GetNumCompileUnits();
+ if (oso_idx < cu_count)
+ return GetModuleByCompUnitInfo(&m_compile_unit_infos[oso_idx]);
+ return NULL;
+}
+
+Module *SymbolFileDWARFDebugMap::GetModuleByCompUnitInfo(
+ CompileUnitInfo *comp_unit_info) {
+ if (!comp_unit_info->oso_sp) {
+ auto pos = m_oso_map.find(comp_unit_info->oso_path);
+ if (pos != m_oso_map.end()) {
+ comp_unit_info->oso_sp = pos->second;
+ } else {
+ ObjectFile *obj_file = GetObjectFile();
+ comp_unit_info->oso_sp.reset(new OSOInfo());
+ m_oso_map[comp_unit_info->oso_path] = comp_unit_info->oso_sp;
+ const char *oso_path = comp_unit_info->oso_path.GetCString();
+ FileSpec oso_file(oso_path, false);
+ ConstString oso_object;
+ if (oso_file.Exists()) {
+ TimeValue oso_mod_time(oso_file.GetModificationTime());
+ if (oso_mod_time != comp_unit_info->oso_mod_time) {
+ obj_file->GetModule()->ReportError(
+ "debug map object file '%s' has changed (actual time is "
+ "0x%" PRIx64 ", debug map time is 0x%" PRIx64
+ ") since this executable was linked, file will be ignored",
+ oso_file.GetPath().c_str(),
+ oso_mod_time.GetAsSecondsSinceJan1_1970(),
+ comp_unit_info->oso_mod_time.GetAsSecondsSinceJan1_1970());
+ return NULL;
+ }
+
+ } else {
+ const bool must_exist = true;
-bool
-SymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec)
-{
- if (oso_idx < m_compile_unit_infos.size())
- {
- if (m_compile_unit_infos[oso_idx].so_file)
- {
- file_spec = m_compile_unit_infos[oso_idx].so_file;
- return true;
+ if (!ObjectFile::SplitArchivePathWithObject(oso_path, oso_file,
+ oso_object, must_exist)) {
+ return NULL;
}
+ }
+ // Always create a new module for .o files. Why? Because we
+ // use the debug map, to add new sections to each .o file and
+ // even though a .o file might not have changed, the sections
+ // that get added to the .o file can change.
+ ArchSpec oso_arch;
+ // Only adopt the architecture from the module (not the vendor or OS)
+ // since .o files for "i386-apple-ios" will historically show up as
+ // "i386-apple-macosx"
+ // due to the lack of a LC_VERSION_MIN_MACOSX or LC_VERSION_MIN_IPHONEOS
+ // load command...
+ oso_arch.SetTriple(m_obj_file->GetModule()
+ ->GetArchitecture()
+ .GetTriple()
+ .getArchName()
+ .str()
+ .c_str());
+ comp_unit_info->oso_sp->module_sp.reset(new DebugMapModule(
+ obj_file->GetModule(), GetCompUnitInfoIndex(comp_unit_info), oso_file,
+ oso_arch, oso_object ? &oso_object : NULL, 0,
+ oso_object ? &comp_unit_info->oso_mod_time : NULL));
}
- return false;
+ }
+ if (comp_unit_info->oso_sp)
+ return comp_unit_info->oso_sp->module_sp.get();
+ return NULL;
+}
+
+bool SymbolFileDWARFDebugMap::GetFileSpecForSO(uint32_t oso_idx,
+ FileSpec &file_spec) {
+ if (oso_idx < m_compile_unit_infos.size()) {
+ if (m_compile_unit_infos[oso_idx].so_file) {
+ file_spec = m_compile_unit_infos[oso_idx].so_file;
+ return true;
+ }
+ }
+ return false;
}
-ObjectFile *
-SymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx)
-{
- Module *oso_module = GetModuleByOSOIndex (oso_idx);
- if (oso_module)
- return oso_module->GetObjectFile();
- return NULL;
+ObjectFile *SymbolFileDWARFDebugMap::GetObjectFileByOSOIndex(uint32_t oso_idx) {
+ Module *oso_module = GetModuleByOSOIndex(oso_idx);
+ if (oso_module)
+ return oso_module->GetObjectFile();
+ return NULL;
}
SymbolFileDWARF *
-SymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc)
-{
- CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc);
- if (comp_unit_info)
- return GetSymbolFileByCompUnitInfo (comp_unit_info);
- return NULL;
+SymbolFileDWARFDebugMap::GetSymbolFile(const SymbolContext &sc) {
+ CompileUnitInfo *comp_unit_info = GetCompUnitInfo(sc);
+ if (comp_unit_info)
+ return GetSymbolFileByCompUnitInfo(comp_unit_info);
+ return NULL;
}
-ObjectFile *
-SymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
-{
- Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
- if (oso_module)
- return oso_module->GetObjectFile();
- return NULL;
+ObjectFile *SymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo(
+ CompileUnitInfo *comp_unit_info) {
+ Module *oso_module = GetModuleByCompUnitInfo(comp_unit_info);
+ if (oso_module)
+ return oso_module->GetObjectFile();
+ return NULL;
}
-uint32_t
-SymbolFileDWARFDebugMap::GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info)
-{
- if (!m_compile_unit_infos.empty())
- {
- const CompileUnitInfo *first_comp_unit_info = &m_compile_unit_infos.front();
- const CompileUnitInfo *last_comp_unit_info = &m_compile_unit_infos.back();
- if (first_comp_unit_info <= comp_unit_info && comp_unit_info <= last_comp_unit_info)
- return comp_unit_info - first_comp_unit_info;
- }
- return UINT32_MAX;
-}
-
-SymbolFileDWARF *
-SymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx)
-{
- if (oso_idx < m_compile_unit_infos.size())
- return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
- return NULL;
+uint32_t SymbolFileDWARFDebugMap::GetCompUnitInfoIndex(
+ const CompileUnitInfo *comp_unit_info) {
+ if (!m_compile_unit_infos.empty()) {
+ const CompileUnitInfo *first_comp_unit_info = &m_compile_unit_infos.front();
+ const CompileUnitInfo *last_comp_unit_info = &m_compile_unit_infos.back();
+ if (first_comp_unit_info <= comp_unit_info &&
+ comp_unit_info <= last_comp_unit_info)
+ return comp_unit_info - first_comp_unit_info;
+ }
+ return UINT32_MAX;
}
SymbolFileDWARF *
-SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF (SymbolFile *sym_file)
-{
- if (sym_file && sym_file->GetPluginName() == SymbolFileDWARF::GetPluginNameStatic())
- return (SymbolFileDWARF *)sym_file;
- return NULL;
+SymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex(uint32_t oso_idx) {
+ if (oso_idx < m_compile_unit_infos.size())
+ return GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[oso_idx]);
+ return NULL;
}
SymbolFileDWARF *
-SymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
-{
- Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
- if (oso_module)
- {
- SymbolVendor *sym_vendor = oso_module->GetSymbolVendor();
- if (sym_vendor)
- return GetSymbolFileAsSymbolFileDWARF (sym_vendor->GetSymbolFile());
+SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF(SymbolFile *sym_file) {
+ if (sym_file &&
+ sym_file->GetPluginName() == SymbolFileDWARF::GetPluginNameStatic())
+ return (SymbolFileDWARF *)sym_file;
+ return NULL;
+}
+
+SymbolFileDWARF *SymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo(
+ CompileUnitInfo *comp_unit_info) {
+ Module *oso_module = GetModuleByCompUnitInfo(comp_unit_info);
+ if (oso_module) {
+ SymbolVendor *sym_vendor = oso_module->GetSymbolVendor();
+ if (sym_vendor)
+ return GetSymbolFileAsSymbolFileDWARF(sym_vendor->GetSymbolFile());
+ }
+ return NULL;
+}
+
+uint32_t SymbolFileDWARFDebugMap::CalculateAbilities() {
+ // In order to get the abilities of this plug-in, we look at the list of
+ // N_OSO entries (object files) from the symbol table and make sure that
+ // these files exist and also contain valid DWARF. If we get any of that
+ // then we return the abilities of the first N_OSO's DWARF.
+
+ const uint32_t oso_index_count = GetNumCompileUnits();
+ if (oso_index_count > 0) {
+ InitOSO();
+ if (!m_compile_unit_infos.empty()) {
+ return SymbolFile::CompileUnits | SymbolFile::Functions |
+ SymbolFile::Blocks | SymbolFile::GlobalVariables |
+ SymbolFile::LocalVariables | SymbolFile::VariableTypes |
+ SymbolFile::LineTables;
}
- return NULL;
-}
-
-uint32_t
-SymbolFileDWARFDebugMap::CalculateAbilities ()
-{
- // In order to get the abilities of this plug-in, we look at the list of
- // N_OSO entries (object files) from the symbol table and make sure that
- // these files exist and also contain valid DWARF. If we get any of that
- // then we return the abilities of the first N_OSO's DWARF.
-
- const uint32_t oso_index_count = GetNumCompileUnits();
- if (oso_index_count > 0)
- {
- InitOSO();
- if (!m_compile_unit_infos.empty())
- {
- return SymbolFile::CompileUnits |
- SymbolFile::Functions |
- SymbolFile::Blocks |
- SymbolFile::GlobalVariables |
- SymbolFile::LocalVariables |
- SymbolFile::VariableTypes |
- SymbolFile::LineTables ;
- }
- }
- return 0;
-}
-
-uint32_t
-SymbolFileDWARFDebugMap::GetNumCompileUnits()
-{
- InitOSO ();
- return m_compile_unit_infos.size();
-}
-
-CompUnitSP
-SymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx)
-{
- CompUnitSP comp_unit_sp;
- const uint32_t cu_count = GetNumCompileUnits();
-
- if (cu_idx < cu_count)
- {
- Module *oso_module = GetModuleByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
- if (oso_module)
- {
- FileSpec so_file_spec;
- if (GetFileSpecForSO (cu_idx, so_file_spec))
- {
- // User zero as the ID to match the compile unit at offset
- // zero in each .o file since each .o file can only have
- // one compile unit for now.
- lldb::user_id_t cu_id = 0;
- m_compile_unit_infos[cu_idx].compile_unit_sp.reset(new CompileUnit(
- m_obj_file->GetModule(), NULL, so_file_spec, cu_id, eLanguageTypeUnknown, eLazyBoolCalculate));
-
- if (m_compile_unit_infos[cu_idx].compile_unit_sp)
- {
- // Let our symbol vendor know about this compile unit
- m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (cu_idx, m_compile_unit_infos[cu_idx].compile_unit_sp);
- }
- }
+ }
+ return 0;
+}
+
+uint32_t SymbolFileDWARFDebugMap::GetNumCompileUnits() {
+ InitOSO();
+ return m_compile_unit_infos.size();
+}
+
+CompUnitSP SymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx) {
+ CompUnitSP comp_unit_sp;
+ const uint32_t cu_count = GetNumCompileUnits();
+
+ if (cu_idx < cu_count) {
+ Module *oso_module = GetModuleByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
+ if (oso_module) {
+ FileSpec so_file_spec;
+ if (GetFileSpecForSO(cu_idx, so_file_spec)) {
+ // User zero as the ID to match the compile unit at offset
+ // zero in each .o file since each .o file can only have
+ // one compile unit for now.
+ lldb::user_id_t cu_id = 0;
+ m_compile_unit_infos[cu_idx].compile_unit_sp.reset(
+ new CompileUnit(m_obj_file->GetModule(), NULL, so_file_spec, cu_id,
+ eLanguageTypeUnknown, eLazyBoolCalculate));
+
+ if (m_compile_unit_infos[cu_idx].compile_unit_sp) {
+ // Let our symbol vendor know about this compile unit
+ m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(
+ cu_idx, m_compile_unit_infos[cu_idx].compile_unit_sp);
}
- comp_unit_sp = m_compile_unit_infos[cu_idx].compile_unit_sp;
+ }
}
+ comp_unit_sp = m_compile_unit_infos[cu_idx].compile_unit_sp;
+ }
- return comp_unit_sp;
+ return comp_unit_sp;
}
SymbolFileDWARFDebugMap::CompileUnitInfo *
-SymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc)
-{
- const uint32_t cu_count = GetNumCompileUnits();
- for (uint32_t i=0; i<cu_count; ++i)
- {
- if (sc.comp_unit == m_compile_unit_infos[i].compile_unit_sp.get())
- return &m_compile_unit_infos[i];
- }
- return NULL;
-}
-
-size_t
-SymbolFileDWARFDebugMap::GetCompUnitInfosForModule (const lldb_private::Module *module, std::vector<CompileUnitInfo *>& cu_infos)
-{
- const uint32_t cu_count = GetNumCompileUnits();
- for (uint32_t i=0; i<cu_count; ++i)
- {
- if (module == GetModuleByCompUnitInfo (&m_compile_unit_infos[i]))
- cu_infos.push_back (&m_compile_unit_infos[i]);
- }
- return cu_infos.size();
+SymbolFileDWARFDebugMap::GetCompUnitInfo(const SymbolContext &sc) {
+ const uint32_t cu_count = GetNumCompileUnits();
+ for (uint32_t i = 0; i < cu_count; ++i) {
+ if (sc.comp_unit == m_compile_unit_infos[i].compile_unit_sp.get())
+ return &m_compile_unit_infos[i];
+ }
+ return NULL;
+}
+
+size_t SymbolFileDWARFDebugMap::GetCompUnitInfosForModule(
+ const lldb_private::Module *module,
+ std::vector<CompileUnitInfo *> &cu_infos) {
+ const uint32_t cu_count = GetNumCompileUnits();
+ for (uint32_t i = 0; i < cu_count; ++i) {
+ if (module == GetModuleByCompUnitInfo(&m_compile_unit_infos[i]))
+ cu_infos.push_back(&m_compile_unit_infos[i]);
+ }
+ return cu_infos.size();
}
lldb::LanguageType
-SymbolFileDWARFDebugMap::ParseCompileUnitLanguage (const SymbolContext& sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseCompileUnitLanguage (sc);
- return eLanguageTypeUnknown;
+SymbolFileDWARFDebugMap::ParseCompileUnitLanguage(const SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseCompileUnitLanguage(sc);
+ return eLanguageTypeUnknown;
}
size_t
-SymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseCompileUnitFunctions (sc);
- return 0;
+SymbolFileDWARFDebugMap::ParseCompileUnitFunctions(const SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseCompileUnitFunctions(sc);
+ return 0;
}
-bool
-SymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseCompileUnitLineTable (sc);
- return false;
+bool SymbolFileDWARFDebugMap::ParseCompileUnitLineTable(
+ const SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseCompileUnitLineTable(sc);
+ return false;
}
-bool
-SymbolFileDWARFDebugMap::ParseCompileUnitDebugMacros (const SymbolContext& sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseCompileUnitDebugMacros (sc);
- return false;
+bool SymbolFileDWARFDebugMap::ParseCompileUnitDebugMacros(
+ const SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseCompileUnitDebugMacros(sc);
+ return false;
}
-bool
-SymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files);
- return false;
+bool SymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles(
+ const SymbolContext &sc, FileSpecList &support_files) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseCompileUnitSupportFiles(sc, support_files);
+ return false;
}
-bool
-SymbolFileDWARFDebugMap::ParseCompileUnitIsOptimized(const lldb_private::SymbolContext &sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
- if (oso_dwarf)
- return oso_dwarf->ParseCompileUnitIsOptimized(sc);
- return false;
+bool SymbolFileDWARFDebugMap::ParseCompileUnitIsOptimized(
+ const lldb_private::SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseCompileUnitIsOptimized(sc);
+ return false;
}
-bool
-SymbolFileDWARFDebugMap::ParseImportedModules(const SymbolContext &sc, std::vector<ConstString> &imported_modules)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseImportedModules(sc, imported_modules);
- return false;
+bool SymbolFileDWARFDebugMap::ParseImportedModules(
+ const SymbolContext &sc, std::vector<ConstString> &imported_modules) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseImportedModules(sc, imported_modules);
+ return false;
}
-size_t
-SymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseFunctionBlocks (sc);
- return 0;
+size_t SymbolFileDWARFDebugMap::ParseFunctionBlocks(const SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseFunctionBlocks(sc);
+ return 0;
}
-size_t
-SymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseTypes (sc);
- return 0;
+size_t SymbolFileDWARFDebugMap::ParseTypes(const SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseTypes(sc);
+ return 0;
}
size_t
-SymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc)
-{
- SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->ParseVariablesForContext (sc);
- return 0;
+SymbolFileDWARFDebugMap::ParseVariablesForContext(const SymbolContext &sc) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->ParseVariablesForContext(sc);
+ return 0;
}
-Type*
-SymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid)
-{
- const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
- SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
- if (oso_dwarf)
- return oso_dwarf->ResolveTypeUID (type_uid);
- return NULL;
+Type *SymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid) {
+ const uint64_t oso_idx = GetOSOIndexFromUserID(type_uid);
+ SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
+ if (oso_dwarf)
+ return oso_dwarf->ResolveTypeUID(type_uid);
+ return NULL;
}
-bool
-SymbolFileDWARFDebugMap::CompleteType (CompilerType& compiler_type)
-{
- bool success = false;
- if (compiler_type)
- {
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- if (oso_dwarf->HasForwardDeclForClangType (compiler_type))
- {
- oso_dwarf->CompleteType (compiler_type);
- success = true;
- return true;
+bool SymbolFileDWARFDebugMap::CompleteType(CompilerType &compiler_type) {
+ bool success = false;
+ if (compiler_type) {
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ if (oso_dwarf->HasForwardDeclForClangType(compiler_type)) {
+ oso_dwarf->CompleteType(compiler_type);
+ success = true;
+ return true;
+ }
+ return false;
+ });
+ }
+ return success;
+}
+
+uint32_t SymbolFileDWARFDebugMap::ResolveSymbolContext(
+ const Address &exe_so_addr, uint32_t resolve_scope, SymbolContext &sc) {
+ uint32_t resolved_flags = 0;
+ Symtab *symtab = m_obj_file->GetSymtab();
+ if (symtab) {
+ const addr_t exe_file_addr = exe_so_addr.GetFileAddress();
+
+ const DebugMap::Entry *debug_map_entry =
+ m_debug_map.FindEntryThatContains(exe_file_addr);
+ if (debug_map_entry) {
+
+ sc.symbol =
+ symtab->SymbolAtIndex(debug_map_entry->data.GetExeSymbolIndex());
+
+ if (sc.symbol != NULL) {
+ resolved_flags |= eSymbolContextSymbol;
+
+ uint32_t oso_idx = 0;
+ CompileUnitInfo *comp_unit_info =
+ GetCompileUnitInfoForSymbolWithID(sc.symbol->GetID(), &oso_idx);
+ if (comp_unit_info) {
+ comp_unit_info->GetFileRangeMap(this);
+ Module *oso_module = GetModuleByCompUnitInfo(comp_unit_info);
+ if (oso_module) {
+ lldb::addr_t oso_file_addr =
+ exe_file_addr - debug_map_entry->GetRangeBase() +
+ debug_map_entry->data.GetOSOFileAddress();
+ Address oso_so_addr;
+ if (oso_module->ResolveFileAddress(oso_file_addr, oso_so_addr)) {
+ resolved_flags |=
+ oso_module->GetSymbolVendor()->ResolveSymbolContext(
+ oso_so_addr, resolve_scope, sc);
}
- return false;
- });
+ }
+ }
+ }
+ }
+ }
+ return resolved_flags;
+}
+
+uint32_t SymbolFileDWARFDebugMap::ResolveSymbolContext(
+ const FileSpec &file_spec, uint32_t line, bool check_inlines,
+ uint32_t resolve_scope, SymbolContextList &sc_list) {
+ const uint32_t initial = sc_list.GetSize();
+ const uint32_t cu_count = GetNumCompileUnits();
+
+ for (uint32_t i = 0; i < cu_count; ++i) {
+ // If we are checking for inlines, then we need to look through all
+ // compile units no matter if "file_spec" matches.
+ bool resolve = check_inlines;
+
+ if (!resolve) {
+ FileSpec so_file_spec;
+ if (GetFileSpecForSO(i, so_file_spec)) {
+ // Match the full path if the incoming file_spec has a directory (not
+ // just a basename)
+ const bool full_match = (bool)file_spec.GetDirectory();
+ resolve = FileSpec::Equal(file_spec, so_file_spec, full_match);
+ }
}
- return success;
+ if (resolve) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(i);
+ if (oso_dwarf)
+ oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines,
+ resolve_scope, sc_list);
+ }
+ }
+ return sc_list.GetSize() - initial;
}
-uint32_t
-SymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc)
-{
- uint32_t resolved_flags = 0;
- Symtab* symtab = m_obj_file->GetSymtab();
- if (symtab)
- {
- const addr_t exe_file_addr = exe_so_addr.GetFileAddress();
-
- const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains (exe_file_addr);
- if (debug_map_entry)
- {
-
- sc.symbol = symtab->SymbolAtIndex(debug_map_entry->data.GetExeSymbolIndex());
-
- if (sc.symbol != NULL)
- {
- resolved_flags |= eSymbolContextSymbol;
-
- uint32_t oso_idx = 0;
- CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithID (sc.symbol->GetID(), &oso_idx);
- if (comp_unit_info)
- {
- comp_unit_info->GetFileRangeMap(this);
- Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
- if (oso_module)
- {
- lldb::addr_t oso_file_addr = exe_file_addr - debug_map_entry->GetRangeBase() + debug_map_entry->data.GetOSOFileAddress();
- Address oso_so_addr;
- if (oso_module->ResolveFileAddress(oso_file_addr, oso_so_addr))
- {
- resolved_flags |= oso_module->GetSymbolVendor()->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
- }
- }
- }
- }
- }
+uint32_t SymbolFileDWARFDebugMap::PrivateFindGlobalVariables(
+ const ConstString &name, const CompilerDeclContext *parent_decl_ctx,
+ const std::vector<uint32_t>
+ &indexes, // Indexes into the symbol table that match "name"
+ uint32_t max_matches,
+ VariableList &variables) {
+ const uint32_t original_size = variables.GetSize();
+ const size_t match_count = indexes.size();
+ for (size_t i = 0; i < match_count; ++i) {
+ uint32_t oso_idx;
+ CompileUnitInfo *comp_unit_info =
+ GetCompileUnitInfoForSymbolWithIndex(indexes[i], &oso_idx);
+ if (comp_unit_info) {
+ SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
+ if (oso_dwarf) {
+ if (oso_dwarf->FindGlobalVariables(name, parent_decl_ctx, true,
+ max_matches, variables))
+ if (variables.GetSize() > max_matches)
+ break;
+ }
}
- return resolved_flags;
+ }
+ return variables.GetSize() - original_size;
}
-uint32_t
-SymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
-{
- const uint32_t initial = sc_list.GetSize();
- const uint32_t cu_count = GetNumCompileUnits();
+uint32_t SymbolFileDWARFDebugMap::FindGlobalVariables(
+ const ConstString &name, const CompilerDeclContext *parent_decl_ctx,
+ bool append, uint32_t max_matches, VariableList &variables) {
- for (uint32_t i=0; i<cu_count; ++i)
- {
- // If we are checking for inlines, then we need to look through all
- // compile units no matter if "file_spec" matches.
- bool resolve = check_inlines;
-
- if (!resolve)
- {
- FileSpec so_file_spec;
- if (GetFileSpecForSO (i, so_file_spec))
- {
- // Match the full path if the incoming file_spec has a directory (not just a basename)
- const bool full_match = (bool)file_spec.GetDirectory();
- resolve = FileSpec::Equal (file_spec, so_file_spec, full_match);
- }
- }
- if (resolve)
- {
- SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i);
- if (oso_dwarf)
- oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list);
- }
- }
- return sc_list.GetSize() - initial;
-}
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ variables.Clear();
-uint32_t
-SymbolFileDWARFDebugMap::PrivateFindGlobalVariables
-(
- const ConstString &name,
- const CompilerDeclContext *parent_decl_ctx,
- const std::vector<uint32_t> &indexes, // Indexes into the symbol table that match "name"
- uint32_t max_matches,
- VariableList& variables
-)
-{
- const uint32_t original_size = variables.GetSize();
- const size_t match_count = indexes.size();
- for (size_t i=0; i<match_count; ++i)
- {
- uint32_t oso_idx;
- CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx);
- if (comp_unit_info)
- {
- SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
- if (oso_dwarf)
- {
- if (oso_dwarf->FindGlobalVariables(name, parent_decl_ctx, true, max_matches, variables))
- if (variables.GetSize() > max_matches)
- break;
- }
- }
+ // Remember how many variables are in the list before we search in case
+ // we are appending the results to a variable list.
+ const uint32_t original_size = variables.GetSize();
+
+ uint32_t total_matches = 0;
+
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ const uint32_t oso_matches = oso_dwarf->FindGlobalVariables(
+ name, parent_decl_ctx, true, max_matches, variables);
+ if (oso_matches > 0) {
+ total_matches += oso_matches;
+
+ // Are we getting all matches?
+ if (max_matches == UINT32_MAX)
+ return false; // Yep, continue getting everything
+
+ // If we have found enough matches, lets get out
+ if (max_matches >= total_matches)
+ return true;
+
+ // Update the max matches for any subsequent calls to find globals
+ // in any other object files with DWARF
+ max_matches -= oso_matches;
}
- return variables.GetSize() - original_size;
-}
-uint32_t
-SymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name,
- const CompilerDeclContext *parent_decl_ctx,
- bool append,
- uint32_t max_matches,
- VariableList& variables)
-{
-
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- variables.Clear();
-
- // Remember how many variables are in the list before we search in case
- // we are appending the results to a variable list.
- const uint32_t original_size = variables.GetSize();
-
- uint32_t total_matches = 0;
-
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (name,
- parent_decl_ctx,
- true,
- max_matches,
- variables);
- if (oso_matches > 0)
- {
- total_matches += oso_matches;
-
- // Are we getting all matches?
- if (max_matches == UINT32_MAX)
- return false; // Yep, continue getting everything
-
- // If we have found enough matches, lets get out
- if (max_matches >= total_matches)
- return true;
-
- // Update the max matches for any subsequent calls to find globals
- // in any other object files with DWARF
- max_matches -= oso_matches;
- }
-
- return false;
- });
+ return false;
+ });
- // Return the number of variable that were appended to the list
- return variables.GetSize() - original_size;
+ // Return the number of variable that were appended to the list
+ return variables.GetSize() - original_size;
}
uint32_t
-SymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
-{
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- variables.Clear();
+SymbolFileDWARFDebugMap::FindGlobalVariables(const RegularExpression &regex,
+ bool append, uint32_t max_matches,
+ VariableList &variables) {
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ variables.Clear();
+
+ // Remember how many variables are in the list before we search in case
+ // we are appending the results to a variable list.
+ const uint32_t original_size = variables.GetSize();
+
+ uint32_t total_matches = 0;
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ const uint32_t oso_matches =
+ oso_dwarf->FindGlobalVariables(regex, true, max_matches, variables);
+ if (oso_matches > 0) {
+ total_matches += oso_matches;
+
+ // Are we getting all matches?
+ if (max_matches == UINT32_MAX)
+ return false; // Yep, continue getting everything
+
+ // If we have found enough matches, lets get out
+ if (max_matches >= total_matches)
+ return true;
- // Remember how many variables are in the list before we search in case
- // we are appending the results to a variable list.
- const uint32_t original_size = variables.GetSize();
+ // Update the max matches for any subsequent calls to find globals
+ // in any other object files with DWARF
+ max_matches -= oso_matches;
+ }
- uint32_t total_matches = 0;
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (regex,
- true,
- max_matches,
- variables);
- if (oso_matches > 0)
- {
- total_matches += oso_matches;
-
- // Are we getting all matches?
- if (max_matches == UINT32_MAX)
- return false; // Yep, continue getting everything
-
- // If we have found enough matches, lets get out
- if (max_matches >= total_matches)
- return true;
-
- // Update the max matches for any subsequent calls to find globals
- // in any other object files with DWARF
- max_matches -= oso_matches;
- }
-
- return false;
- });
-
- // Return the number of variable that were appended to the list
- return variables.GetSize() - original_size;
+ return false;
+ });
+
+ // Return the number of variable that were appended to the list
+ return variables.GetSize() - original_size;
}
-int
-SymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
-{
- const uint32_t symbol_idx = *symbol_idx_ptr;
+int SymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex(
+ uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) {
+ const uint32_t symbol_idx = *symbol_idx_ptr;
- if (symbol_idx < comp_unit_info->first_symbol_index)
- return -1;
+ if (symbol_idx < comp_unit_info->first_symbol_index)
+ return -1;
- if (symbol_idx <= comp_unit_info->last_symbol_index)
- return 0;
+ if (symbol_idx <= comp_unit_info->last_symbol_index)
+ return 0;
- return 1;
+ return 1;
}
-int
-SymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
-{
- const user_id_t symbol_id = *symbol_idx_ptr;
+int SymbolFileDWARFDebugMap::SymbolContainsSymbolWithID(
+ user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) {
+ const user_id_t symbol_id = *symbol_idx_ptr;
- if (symbol_id < comp_unit_info->first_symbol_id)
- return -1;
+ if (symbol_id < comp_unit_info->first_symbol_id)
+ return -1;
- if (symbol_id <= comp_unit_info->last_symbol_id)
- return 0;
+ if (symbol_id <= comp_unit_info->last_symbol_id)
+ return 0;
- return 1;
+ return 1;
}
-SymbolFileDWARFDebugMap::CompileUnitInfo*
-SymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr)
-{
- const uint32_t oso_index_count = m_compile_unit_infos.size();
- CompileUnitInfo *comp_unit_info = NULL;
- if (oso_index_count)
- {
- comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx,
- &m_compile_unit_infos[0],
- m_compile_unit_infos.size(),
- sizeof(CompileUnitInfo),
- (ComparisonFunction)SymbolContainsSymbolWithIndex);
- }
+SymbolFileDWARFDebugMap::CompileUnitInfo *
+SymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex(
+ uint32_t symbol_idx, uint32_t *oso_idx_ptr) {
+ const uint32_t oso_index_count = m_compile_unit_infos.size();
+ CompileUnitInfo *comp_unit_info = NULL;
+ if (oso_index_count) {
+ comp_unit_info = (CompileUnitInfo *)bsearch(
+ &symbol_idx, &m_compile_unit_infos[0], m_compile_unit_infos.size(),
+ sizeof(CompileUnitInfo),
+ (ComparisonFunction)SymbolContainsSymbolWithIndex);
+ }
+
+ if (oso_idx_ptr) {
+ if (comp_unit_info != NULL)
+ *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
+ else
+ *oso_idx_ptr = UINT32_MAX;
+ }
+ return comp_unit_info;
+}
- if (oso_idx_ptr)
- {
- if (comp_unit_info != NULL)
- *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
- else
- *oso_idx_ptr = UINT32_MAX;
+SymbolFileDWARFDebugMap::CompileUnitInfo *
+SymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID(
+ user_id_t symbol_id, uint32_t *oso_idx_ptr) {
+ const uint32_t oso_index_count = m_compile_unit_infos.size();
+ CompileUnitInfo *comp_unit_info = NULL;
+ if (oso_index_count) {
+ comp_unit_info = (CompileUnitInfo *)::bsearch(
+ &symbol_id, &m_compile_unit_infos[0], m_compile_unit_infos.size(),
+ sizeof(CompileUnitInfo),
+ (ComparisonFunction)SymbolContainsSymbolWithID);
+ }
+
+ if (oso_idx_ptr) {
+ if (comp_unit_info != NULL)
+ *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
+ else
+ *oso_idx_ptr = UINT32_MAX;
+ }
+ return comp_unit_info;
+}
+
+static void RemoveFunctionsWithModuleNotEqualTo(const ModuleSP &module_sp,
+ SymbolContextList &sc_list,
+ uint32_t start_idx) {
+ // We found functions in .o files. Not all functions in the .o files
+ // will have made it into the final output file. The ones that did
+ // make it into the final output file will have a section whose module
+ // matches the module from the ObjectFile for this SymbolFile. When
+ // the modules don't match, then we have something that was in a
+ // .o file, but doesn't map to anything in the final executable.
+ uint32_t i = start_idx;
+ while (i < sc_list.GetSize()) {
+ SymbolContext sc;
+ sc_list.GetContextAtIndex(i, sc);
+ if (sc.function) {
+ const SectionSP section_sp(
+ sc.function->GetAddressRange().GetBaseAddress().GetSection());
+ if (section_sp->GetModule() != module_sp) {
+ sc_list.RemoveContextAtIndex(i);
+ continue;
+ }
}
- return comp_unit_info;
-}
-
-SymbolFileDWARFDebugMap::CompileUnitInfo*
-SymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID (user_id_t symbol_id, uint32_t *oso_idx_ptr)
-{
- const uint32_t oso_index_count = m_compile_unit_infos.size();
- CompileUnitInfo *comp_unit_info = NULL;
- if (oso_index_count)
- {
- comp_unit_info = (CompileUnitInfo*)::bsearch (&symbol_id,
- &m_compile_unit_infos[0],
- m_compile_unit_infos.size(),
- sizeof(CompileUnitInfo),
- (ComparisonFunction)SymbolContainsSymbolWithID);
+ ++i;
+ }
+}
+
+uint32_t SymbolFileDWARFDebugMap::FindFunctions(
+ const ConstString &name, const CompilerDeclContext *parent_decl_ctx,
+ uint32_t name_type_mask, bool include_inlines, bool append,
+ SymbolContextList &sc_list) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
+ name.GetCString());
+
+ uint32_t initial_size = 0;
+ if (append)
+ initial_size = sc_list.GetSize();
+ else
+ sc_list.Clear();
+
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ uint32_t sc_idx = sc_list.GetSize();
+ if (oso_dwarf->FindFunctions(name, parent_decl_ctx, name_type_mask,
+ include_inlines, true, sc_list)) {
+ RemoveFunctionsWithModuleNotEqualTo(m_obj_file->GetModule(), sc_list,
+ sc_idx);
}
+ return false;
+ });
- if (oso_idx_ptr)
- {
- if (comp_unit_info != NULL)
- *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
- else
- *oso_idx_ptr = UINT32_MAX;
- }
- return comp_unit_info;
-}
-
-static void
-RemoveFunctionsWithModuleNotEqualTo (const ModuleSP &module_sp, SymbolContextList &sc_list, uint32_t start_idx)
-{
- // We found functions in .o files. Not all functions in the .o files
- // will have made it into the final output file. The ones that did
- // make it into the final output file will have a section whose module
- // matches the module from the ObjectFile for this SymbolFile. When
- // the modules don't match, then we have something that was in a
- // .o file, but doesn't map to anything in the final executable.
- uint32_t i=start_idx;
- while (i < sc_list.GetSize())
- {
- SymbolContext sc;
- sc_list.GetContextAtIndex(i, sc);
- if (sc.function)
- {
- const SectionSP section_sp (sc.function->GetAddressRange().GetBaseAddress().GetSection());
- if (section_sp->GetModule() != module_sp)
- {
- sc_list.RemoveContextAtIndex(i);
- continue;
- }
- }
- ++i;
- }
+ return sc_list.GetSize() - initial_size;
}
-uint32_t
-SymbolFileDWARFDebugMap::FindFunctions(const ConstString &name,
- const CompilerDeclContext *parent_decl_ctx,
- uint32_t name_type_mask,
- bool include_inlines,
- bool append,
- SymbolContextList& sc_list)
-{
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
- name.GetCString());
-
- uint32_t initial_size = 0;
- if (append)
- initial_size = sc_list.GetSize();
- else
- sc_list.Clear();
+uint32_t SymbolFileDWARFDebugMap::FindFunctions(const RegularExpression &regex,
+ bool include_inlines,
+ bool append,
+ SymbolContextList &sc_list) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')",
+ regex.GetText());
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- uint32_t sc_idx = sc_list.GetSize();
- if (oso_dwarf->FindFunctions(name, parent_decl_ctx, name_type_mask, include_inlines, true, sc_list))
- {
- RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
- }
- return false;
- });
+ uint32_t initial_size = 0;
+ if (append)
+ initial_size = sc_list.GetSize();
+ else
+ sc_list.Clear();
- return sc_list.GetSize() - initial_size;
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ uint32_t sc_idx = sc_list.GetSize();
+
+ if (oso_dwarf->FindFunctions(regex, include_inlines, true, sc_list)) {
+ RemoveFunctionsWithModuleNotEqualTo(m_obj_file->GetModule(), sc_list,
+ sc_idx);
+ }
+ return false;
+ });
+
+ return sc_list.GetSize() - initial_size;
}
-uint32_t
-SymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list)
-{
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')",
- regex.GetText());
-
- uint32_t initial_size = 0;
- if (append)
- initial_size = sc_list.GetSize();
- else
- sc_list.Clear();
+size_t SymbolFileDWARFDebugMap::GetTypes(SymbolContextScope *sc_scope,
+ uint32_t type_mask,
+ TypeList &type_list) {
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "SymbolFileDWARFDebugMap::GetTypes (type_mask = 0x%8.8x)",
+ type_mask);
+ uint32_t initial_size = type_list.GetSize();
+ SymbolFileDWARF *oso_dwarf = NULL;
+ if (sc_scope) {
+ SymbolContext sc;
+ sc_scope->CalculateSymbolContext(&sc);
+
+ CompileUnitInfo *cu_info = GetCompUnitInfo(sc);
+ if (cu_info) {
+ oso_dwarf = GetSymbolFileByCompUnitInfo(cu_info);
+ if (oso_dwarf)
+ oso_dwarf->GetTypes(sc_scope, type_mask, type_list);
+ }
+ } else {
ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- uint32_t sc_idx = sc_list.GetSize();
-
- if (oso_dwarf->FindFunctions(regex, include_inlines, true, sc_list))
- {
- RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
- }
- return false;
+ oso_dwarf->GetTypes(sc_scope, type_mask, type_list);
+ return false;
});
-
- return sc_list.GetSize() - initial_size;
+ }
+ return type_list.GetSize() - initial_size;
}
-size_t
-SymbolFileDWARFDebugMap::GetTypes (SymbolContextScope *sc_scope,
- uint32_t type_mask,
- TypeList &type_list)
-{
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "SymbolFileDWARFDebugMap::GetTypes (type_mask = 0x%8.8x)",
- type_mask);
-
- uint32_t initial_size = type_list.GetSize();
- SymbolFileDWARF *oso_dwarf = NULL;
- if (sc_scope)
- {
- SymbolContext sc;
- sc_scope->CalculateSymbolContext(&sc);
-
- CompileUnitInfo *cu_info = GetCompUnitInfo (sc);
- if (cu_info)
- {
- oso_dwarf = GetSymbolFileByCompUnitInfo (cu_info);
- if (oso_dwarf)
- oso_dwarf->GetTypes (sc_scope, type_mask, type_list);
- }
- }
- else
- {
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- oso_dwarf->GetTypes (sc_scope, type_mask, type_list);
- return false;
- });
- }
- return type_list.GetSize() - initial_size;
+TypeSP SymbolFileDWARFDebugMap::FindDefinitionTypeForDWARFDeclContext(
+ const DWARFDeclContext &die_decl_ctx) {
+ TypeSP type_sp;
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ type_sp = oso_dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx);
+ return ((bool)type_sp);
+ });
+ return type_sp;
}
-TypeSP
-SymbolFileDWARFDebugMap::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx)
-{
- TypeSP type_sp;
+bool SymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type(
+ SymbolFileDWARF *skip_dwarf_oso) {
+ if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate) {
+ m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- type_sp = oso_dwarf->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
- return ((bool)type_sp);
+ if (skip_dwarf_oso != oso_dwarf &&
+ oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(NULL)) {
+ m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
+ return true;
+ }
+ return false;
});
- return type_sp;
-}
-
-bool
-SymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso)
-{
- if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate)
- {
- m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- if (skip_dwarf_oso != oso_dwarf && oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(NULL))
- {
- m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
- return true;
- }
- return false;
- });
- }
- return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
-}
-
-TypeSP
-SymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
- const ConstString &type_name,
- bool must_be_implementation)
-{
- // If we have a debug map, we will have an Objective C symbol whose name is
- // the type name and whose type is eSymbolTypeObjCClass. If we can find that
- // symbol and find its containing parent, we can locate the .o file that will
- // contain the implementation definition since it will be scoped inside the N_SO
- // and we can then locate the SymbolFileDWARF that corresponds to that N_SO.
- SymbolFileDWARF *oso_dwarf = NULL;
- TypeSP type_sp;
- ObjectFile *module_objfile = m_obj_file->GetModule()->GetObjectFile();
- if (module_objfile)
- {
- Symtab *symtab = module_objfile->GetSymtab();
- if (symtab)
- {
- Symbol *objc_class_symbol = symtab->FindFirstSymbolWithNameAndType(type_name, eSymbolTypeObjCClass, Symtab::eDebugAny, Symtab::eVisibilityAny);
- if (objc_class_symbol)
- {
- // Get the N_SO symbol that contains the objective C class symbol as this
- // should be the .o file that contains the real definition...
- const Symbol *source_file_symbol = symtab->GetParent(objc_class_symbol);
-
- if (source_file_symbol && source_file_symbol->GetType() == eSymbolTypeSourceFile)
- {
- const uint32_t source_file_symbol_idx = symtab->GetIndexForSymbol(source_file_symbol);
- if (source_file_symbol_idx != UINT32_MAX)
- {
- CompileUnitInfo *compile_unit_info = GetCompileUnitInfoForSymbolWithIndex (source_file_symbol_idx, NULL);
- if (compile_unit_info)
- {
- oso_dwarf = GetSymbolFileByCompUnitInfo (compile_unit_info);
- if (oso_dwarf)
- {
- TypeSP type_sp (oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name, must_be_implementation));
- if (type_sp)
- {
- return type_sp;
- }
- }
- }
- }
+ }
+ return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
+}
+
+TypeSP SymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE(
+ const DWARFDIE &die, const ConstString &type_name,
+ bool must_be_implementation) {
+ // If we have a debug map, we will have an Objective C symbol whose name is
+ // the type name and whose type is eSymbolTypeObjCClass. If we can find that
+ // symbol and find its containing parent, we can locate the .o file that will
+ // contain the implementation definition since it will be scoped inside the
+ // N_SO
+ // and we can then locate the SymbolFileDWARF that corresponds to that N_SO.
+ SymbolFileDWARF *oso_dwarf = NULL;
+ TypeSP type_sp;
+ ObjectFile *module_objfile = m_obj_file->GetModule()->GetObjectFile();
+ if (module_objfile) {
+ Symtab *symtab = module_objfile->GetSymtab();
+ if (symtab) {
+ Symbol *objc_class_symbol = symtab->FindFirstSymbolWithNameAndType(
+ type_name, eSymbolTypeObjCClass, Symtab::eDebugAny,
+ Symtab::eVisibilityAny);
+ if (objc_class_symbol) {
+ // Get the N_SO symbol that contains the objective C class symbol as
+ // this
+ // should be the .o file that contains the real definition...
+ const Symbol *source_file_symbol = symtab->GetParent(objc_class_symbol);
+
+ if (source_file_symbol &&
+ source_file_symbol->GetType() == eSymbolTypeSourceFile) {
+ const uint32_t source_file_symbol_idx =
+ symtab->GetIndexForSymbol(source_file_symbol);
+ if (source_file_symbol_idx != UINT32_MAX) {
+ CompileUnitInfo *compile_unit_info =
+ GetCompileUnitInfoForSymbolWithIndex(source_file_symbol_idx,
+ NULL);
+ if (compile_unit_info) {
+ oso_dwarf = GetSymbolFileByCompUnitInfo(compile_unit_info);
+ if (oso_dwarf) {
+ TypeSP type_sp(oso_dwarf->FindCompleteObjCDefinitionTypeForDIE(
+ die, type_name, must_be_implementation));
+ if (type_sp) {
+ return type_sp;
}
+ }
}
+ }
}
+ }
}
+ }
+
+ // Only search all .o files for the definition if we don't need the
+ // implementation
+ // because otherwise, with a valid debug map we should have the ObjC class
+ // symbol and
+ // the code above should have found it.
+ if (must_be_implementation == false) {
+ TypeSP type_sp;
- // Only search all .o files for the definition if we don't need the implementation
- // because otherwise, with a valid debug map we should have the ObjC class symbol and
- // the code above should have found it.
- if (must_be_implementation == false)
- {
- TypeSP type_sp;
-
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name, must_be_implementation);
- return (bool)type_sp;
- });
-
- return type_sp;
- }
- return TypeSP();
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE(
+ die, type_name, must_be_implementation);
+ return (bool)type_sp;
+ });
+
+ return type_sp;
+ }
+ return TypeSP();
}
-uint32_t
-SymbolFileDWARFDebugMap::FindTypes
-(
- const SymbolContext& sc,
- const ConstString &name,
- const CompilerDeclContext *parent_decl_ctx,
- bool append,
+uint32_t SymbolFileDWARFDebugMap::FindTypes(
+ const SymbolContext &sc, const ConstString &name,
+ const CompilerDeclContext *parent_decl_ctx, bool append,
uint32_t max_matches,
llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
- TypeMap& types
-)
-{
- if (!append)
- types.Clear();
-
- const uint32_t initial_types_size = types.GetSize();
- SymbolFileDWARF *oso_dwarf;
-
- if (sc.comp_unit)
- {
- oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- return oso_dwarf->FindTypes (sc, name, parent_decl_ctx, append, max_matches, searched_symbol_files, types);
- }
- else
- {
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- oso_dwarf->FindTypes (sc, name, parent_decl_ctx, append, max_matches, searched_symbol_files, types);
- if (types.GetSize() >= max_matches)
- return true;
- else
- return false;
- });
- }
+ TypeMap &types) {
+ if (!append)
+ types.Clear();
+
+ const uint32_t initial_types_size = types.GetSize();
+ SymbolFileDWARF *oso_dwarf;
- return types.GetSize() - initial_types_size;
+ if (sc.comp_unit) {
+ oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ return oso_dwarf->FindTypes(sc, name, parent_decl_ctx, append,
+ max_matches, searched_symbol_files, types);
+ } else {
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ oso_dwarf->FindTypes(sc, name, parent_decl_ctx, append, max_matches,
+ searched_symbol_files, types);
+ if (types.GetSize() >= max_matches)
+ return true;
+ else
+ return false;
+ });
+ }
+
+ return types.GetSize() - initial_types_size;
}
//
-//uint32_t
-//SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types)
+// uint32_t
+// SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const
+// RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding
+// encoding, lldb::user_id_t udt_uid, TypeList& types)
//{
// SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
// if (oso_dwarf)
-// return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types);
+// return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding,
+// udt_uid, types);
// return 0;
//}
+CompilerDeclContext SymbolFileDWARFDebugMap::FindNamespace(
+ const lldb_private::SymbolContext &sc,
+ const lldb_private::ConstString &name,
+ const CompilerDeclContext *parent_decl_ctx) {
+ CompilerDeclContext matching_namespace;
+ SymbolFileDWARF *oso_dwarf;
-CompilerDeclContext
-SymbolFileDWARFDebugMap::FindNamespace (const lldb_private::SymbolContext& sc,
- const lldb_private::ConstString &name,
- const CompilerDeclContext *parent_decl_ctx)
-{
- CompilerDeclContext matching_namespace;
- SymbolFileDWARF *oso_dwarf;
-
- if (sc.comp_unit)
- {
- oso_dwarf = GetSymbolFile (sc);
- if (oso_dwarf)
- matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_decl_ctx);
- }
- else
- {
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_decl_ctx);
+ if (sc.comp_unit) {
+ oso_dwarf = GetSymbolFile(sc);
+ if (oso_dwarf)
+ matching_namespace = oso_dwarf->FindNamespace(sc, name, parent_decl_ctx);
+ } else {
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ matching_namespace = oso_dwarf->FindNamespace(sc, name, parent_decl_ctx);
- return (bool)matching_namespace;
- });
- }
+ return (bool)matching_namespace;
+ });
+ }
- return matching_namespace;
+ return matching_namespace;
}
//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
-lldb_private::ConstString
-SymbolFileDWARFDebugMap::GetPluginName()
-{
- return GetPluginNameStatic();
+lldb_private::ConstString SymbolFileDWARFDebugMap::GetPluginName() {
+ return GetPluginNameStatic();
}
-uint32_t
-SymbolFileDWARFDebugMap::GetPluginVersion()
-{
- return 1;
-}
+uint32_t SymbolFileDWARFDebugMap::GetPluginVersion() { return 1; }
lldb::CompUnitSP
-SymbolFileDWARFDebugMap::GetCompileUnit (SymbolFileDWARF *oso_dwarf)
-{
- if (oso_dwarf)
- {
- const uint32_t cu_count = GetNumCompileUnits();
- for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
- {
- SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
- if (oso_symfile == oso_dwarf)
- {
- if (!m_compile_unit_infos[cu_idx].compile_unit_sp)
- m_compile_unit_infos[cu_idx].compile_unit_sp = ParseCompileUnitAtIndex (cu_idx);
-
- return m_compile_unit_infos[cu_idx].compile_unit_sp;
- }
- }
+SymbolFileDWARFDebugMap::GetCompileUnit(SymbolFileDWARF *oso_dwarf) {
+ if (oso_dwarf) {
+ const uint32_t cu_count = GetNumCompileUnits();
+ for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) {
+ SymbolFileDWARF *oso_symfile =
+ GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
+ if (oso_symfile == oso_dwarf) {
+ if (!m_compile_unit_infos[cu_idx].compile_unit_sp)
+ m_compile_unit_infos[cu_idx].compile_unit_sp =
+ ParseCompileUnitAtIndex(cu_idx);
+
+ return m_compile_unit_infos[cu_idx].compile_unit_sp;
+ }
}
- assert(!"this shouldn't happen");
- return lldb::CompUnitSP();
+ }
+ assert(!"this shouldn't happen");
+ return lldb::CompUnitSP();
}
SymbolFileDWARFDebugMap::CompileUnitInfo *
-SymbolFileDWARFDebugMap::GetCompileUnitInfo (SymbolFileDWARF *oso_dwarf)
-{
- if (oso_dwarf)
- {
- const uint32_t cu_count = GetNumCompileUnits();
- for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
- {
- SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
- if (oso_symfile == oso_dwarf)
- {
- return &m_compile_unit_infos[cu_idx];
- }
- }
+SymbolFileDWARFDebugMap::GetCompileUnitInfo(SymbolFileDWARF *oso_dwarf) {
+ if (oso_dwarf) {
+ const uint32_t cu_count = GetNumCompileUnits();
+ for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) {
+ SymbolFileDWARF *oso_symfile =
+ GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
+ if (oso_symfile == oso_dwarf) {
+ return &m_compile_unit_infos[cu_idx];
+ }
}
- return NULL;
+ }
+ return NULL;
}
-void
-SymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp)
-{
- if (oso_dwarf)
- {
- const uint32_t cu_count = GetNumCompileUnits();
- for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
- {
- SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
- if (oso_symfile == oso_dwarf)
- {
- if (m_compile_unit_infos[cu_idx].compile_unit_sp)
- {
- assert (m_compile_unit_infos[cu_idx].compile_unit_sp.get() == cu_sp.get());
- }
- else
- {
- m_compile_unit_infos[cu_idx].compile_unit_sp = cu_sp;
- m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
- }
- }
+void SymbolFileDWARFDebugMap::SetCompileUnit(SymbolFileDWARF *oso_dwarf,
+ const CompUnitSP &cu_sp) {
+ if (oso_dwarf) {
+ const uint32_t cu_count = GetNumCompileUnits();
+ for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) {
+ SymbolFileDWARF *oso_symfile =
+ GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
+ if (oso_symfile == oso_dwarf) {
+ if (m_compile_unit_infos[cu_idx].compile_unit_sp) {
+ assert(m_compile_unit_infos[cu_idx].compile_unit_sp.get() ==
+ cu_sp.get());
+ } else {
+ m_compile_unit_infos[cu_idx].compile_unit_sp = cu_sp;
+ m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(
+ cu_idx, cu_sp);
}
+ }
}
+ }
}
CompilerDeclContext
-SymbolFileDWARFDebugMap::GetDeclContextForUID (lldb::user_id_t type_uid)
-{
- const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
- SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
- if (oso_dwarf)
- return oso_dwarf->GetDeclContextForUID (type_uid);
- return CompilerDeclContext();
+SymbolFileDWARFDebugMap::GetDeclContextForUID(lldb::user_id_t type_uid) {
+ const uint64_t oso_idx = GetOSOIndexFromUserID(type_uid);
+ SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
+ if (oso_dwarf)
+ return oso_dwarf->GetDeclContextForUID(type_uid);
+ return CompilerDeclContext();
}
CompilerDeclContext
-SymbolFileDWARFDebugMap::GetDeclContextContainingUID (lldb::user_id_t type_uid)
-{
- const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
- SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
- if (oso_dwarf)
- return oso_dwarf->GetDeclContextContainingUID (type_uid);
- return CompilerDeclContext();
-}
-
-void
-SymbolFileDWARFDebugMap::ParseDeclsForContext (lldb_private::CompilerDeclContext decl_ctx)
-{
- ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
- oso_dwarf->ParseDeclsForContext (decl_ctx);
- return true; // Keep iterating
- });
-}
-
-bool
-SymbolFileDWARFDebugMap::AddOSOFileRange (CompileUnitInfo *cu_info,
- lldb::addr_t exe_file_addr,
- lldb::addr_t exe_byte_size,
- lldb::addr_t oso_file_addr,
- lldb::addr_t oso_byte_size)
-{
- const uint32_t debug_map_idx = m_debug_map.FindEntryIndexThatContains(exe_file_addr);
- if (debug_map_idx != UINT32_MAX)
- {
- DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(exe_file_addr);
- debug_map_entry->data.SetOSOFileAddress(oso_file_addr);
- addr_t range_size = std::min<addr_t>(exe_byte_size, oso_byte_size);
- if (range_size == 0)
- {
- range_size = std::max<addr_t>(exe_byte_size, oso_byte_size);
- if (range_size == 0)
- range_size = 1;
- }
- cu_info->file_range_map.Append(FileRangeMap::Entry(oso_file_addr, range_size, exe_file_addr));
- return true;
+SymbolFileDWARFDebugMap::GetDeclContextContainingUID(lldb::user_id_t type_uid) {
+ const uint64_t oso_idx = GetOSOIndexFromUserID(type_uid);
+ SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
+ if (oso_dwarf)
+ return oso_dwarf->GetDeclContextContainingUID(type_uid);
+ return CompilerDeclContext();
+}
+
+void SymbolFileDWARFDebugMap::ParseDeclsForContext(
+ lldb_private::CompilerDeclContext decl_ctx) {
+ ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+ oso_dwarf->ParseDeclsForContext(decl_ctx);
+ return true; // Keep iterating
+ });
+}
+
+bool SymbolFileDWARFDebugMap::AddOSOFileRange(CompileUnitInfo *cu_info,
+ lldb::addr_t exe_file_addr,
+ lldb::addr_t exe_byte_size,
+ lldb::addr_t oso_file_addr,
+ lldb::addr_t oso_byte_size) {
+ const uint32_t debug_map_idx =
+ m_debug_map.FindEntryIndexThatContains(exe_file_addr);
+ if (debug_map_idx != UINT32_MAX) {
+ DebugMap::Entry *debug_map_entry =
+ m_debug_map.FindEntryThatContains(exe_file_addr);
+ debug_map_entry->data.SetOSOFileAddress(oso_file_addr);
+ addr_t range_size = std::min<addr_t>(exe_byte_size, oso_byte_size);
+ if (range_size == 0) {
+ range_size = std::max<addr_t>(exe_byte_size, oso_byte_size);
+ if (range_size == 0)
+ range_size = 1;
}
- return false;
+ cu_info->file_range_map.Append(
+ FileRangeMap::Entry(oso_file_addr, range_size, exe_file_addr));
+ return true;
+ }
+ return false;
}
-void
-SymbolFileDWARFDebugMap::FinalizeOSOFileRanges (CompileUnitInfo *cu_info)
-{
- cu_info->file_range_map.Sort();
+void SymbolFileDWARFDebugMap::FinalizeOSOFileRanges(CompileUnitInfo *cu_info) {
+ cu_info->file_range_map.Sort();
#if defined(DEBUG_OSO_DMAP)
- const FileRangeMap &oso_file_range_map = cu_info->GetFileRangeMap(this);
- const size_t n = oso_file_range_map.GetSize();
- printf ("SymbolFileDWARFDebugMap::FinalizeOSOFileRanges (cu_info = %p) %s\n",
- cu_info,
- cu_info->oso_sp->module_sp->GetFileSpec().GetPath().c_str());
- for (size_t i=0; i<n; ++i)
- {
- const FileRangeMap::Entry &entry = oso_file_range_map.GetEntryRef(i);
- printf ("oso [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ") ==> exe [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n",
- entry.GetRangeBase(), entry.GetRangeEnd(),
- entry.data, entry.data + entry.GetByteSize());
- }
+ const FileRangeMap &oso_file_range_map = cu_info->GetFileRangeMap(this);
+ const size_t n = oso_file_range_map.GetSize();
+ printf("SymbolFileDWARFDebugMap::FinalizeOSOFileRanges (cu_info = %p) %s\n",
+ cu_info, cu_info->oso_sp->module_sp->GetFileSpec().GetPath().c_str());
+ for (size_t i = 0; i < n; ++i) {
+ const FileRangeMap::Entry &entry = oso_file_range_map.GetEntryRef(i);
+ printf("oso [0x%16.16" PRIx64 " - 0x%16.16" PRIx64
+ ") ==> exe [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n",
+ entry.GetRangeBase(), entry.GetRangeEnd(), entry.data,
+ entry.data + entry.GetByteSize());
+ }
#endif
}
lldb::addr_t
-SymbolFileDWARFDebugMap::LinkOSOFileAddress (SymbolFileDWARF *oso_symfile, lldb::addr_t oso_file_addr)
-{
- CompileUnitInfo *cu_info = GetCompileUnitInfo (oso_symfile);
- if (cu_info)
- {
- const FileRangeMap::Entry *oso_range_entry = cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
- if (oso_range_entry)
- {
- const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(oso_range_entry->data);
- if (debug_map_entry)
- {
- const lldb::addr_t offset = oso_file_addr - oso_range_entry->GetRangeBase();
- const lldb::addr_t exe_file_addr = debug_map_entry->GetRangeBase() + offset;
- return exe_file_addr;
- }
- }
+SymbolFileDWARFDebugMap::LinkOSOFileAddress(SymbolFileDWARF *oso_symfile,
+ lldb::addr_t oso_file_addr) {
+ CompileUnitInfo *cu_info = GetCompileUnitInfo(oso_symfile);
+ if (cu_info) {
+ const FileRangeMap::Entry *oso_range_entry =
+ cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
+ if (oso_range_entry) {
+ const DebugMap::Entry *debug_map_entry =
+ m_debug_map.FindEntryThatContains(oso_range_entry->data);
+ if (debug_map_entry) {
+ const lldb::addr_t offset =
+ oso_file_addr - oso_range_entry->GetRangeBase();
+ const lldb::addr_t exe_file_addr =
+ debug_map_entry->GetRangeBase() + offset;
+ return exe_file_addr;
+ }
}
- return LLDB_INVALID_ADDRESS;
-}
-
-bool
-SymbolFileDWARFDebugMap::LinkOSOAddress (Address &addr)
-{
- // Make sure this address hasn't been fixed already
- Module *exe_module = GetObjectFile()->GetModule().get();
- Module *addr_module = addr.GetModule().get();
- if (addr_module == exe_module)
- return true; // Address is already in terms of the main executable module
-
- CompileUnitInfo *cu_info = GetCompileUnitInfo (GetSymbolFileAsSymbolFileDWARF(addr_module->GetSymbolVendor()->GetSymbolFile()));
- if (cu_info)
- {
- const lldb::addr_t oso_file_addr = addr.GetFileAddress();
- const FileRangeMap::Entry *oso_range_entry = cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
- if (oso_range_entry)
- {
- const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(oso_range_entry->data);
- if (debug_map_entry)
- {
- const lldb::addr_t offset = oso_file_addr - oso_range_entry->GetRangeBase();
- const lldb::addr_t exe_file_addr = debug_map_entry->GetRangeBase() + offset;
- return exe_module->ResolveFileAddress(exe_file_addr, addr);
- }
- }
+ }
+ return LLDB_INVALID_ADDRESS;
+}
+
+bool SymbolFileDWARFDebugMap::LinkOSOAddress(Address &addr) {
+ // Make sure this address hasn't been fixed already
+ Module *exe_module = GetObjectFile()->GetModule().get();
+ Module *addr_module = addr.GetModule().get();
+ if (addr_module == exe_module)
+ return true; // Address is already in terms of the main executable module
+
+ CompileUnitInfo *cu_info = GetCompileUnitInfo(GetSymbolFileAsSymbolFileDWARF(
+ addr_module->GetSymbolVendor()->GetSymbolFile()));
+ if (cu_info) {
+ const lldb::addr_t oso_file_addr = addr.GetFileAddress();
+ const FileRangeMap::Entry *oso_range_entry =
+ cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
+ if (oso_range_entry) {
+ const DebugMap::Entry *debug_map_entry =
+ m_debug_map.FindEntryThatContains(oso_range_entry->data);
+ if (debug_map_entry) {
+ const lldb::addr_t offset =
+ oso_file_addr - oso_range_entry->GetRangeBase();
+ const lldb::addr_t exe_file_addr =
+ debug_map_entry->GetRangeBase() + offset;
+ return exe_module->ResolveFileAddress(exe_file_addr, addr);
+ }
}
- return true;
+ }
+ return true;
}
-LineTable *
-SymbolFileDWARFDebugMap::LinkOSOLineTable (SymbolFileDWARF *oso_dwarf, LineTable *line_table)
-{
- CompileUnitInfo *cu_info = GetCompileUnitInfo (oso_dwarf);
- if (cu_info)
- return line_table->LinkLineTable(cu_info->GetFileRangeMap(this));
- return NULL;
+LineTable *SymbolFileDWARFDebugMap::LinkOSOLineTable(SymbolFileDWARF *oso_dwarf,
+ LineTable *line_table) {
+ CompileUnitInfo *cu_info = GetCompileUnitInfo(oso_dwarf);
+ if (cu_info)
+ return line_table->LinkLineTable(cu_info->GetFileRangeMap(this));
+ return NULL;
}
size_t
-SymbolFileDWARFDebugMap::AddOSOARanges (SymbolFileDWARF* dwarf2Data, DWARFDebugAranges* debug_aranges)
-{
- size_t num_line_entries_added = 0;
- if (debug_aranges && dwarf2Data)
- {
- CompileUnitInfo *compile_unit_info = GetCompileUnitInfo(dwarf2Data);
- if (compile_unit_info)
- {
- const FileRangeMap &file_range_map = compile_unit_info->GetFileRangeMap(this);
- for (size_t idx = 0;
- idx < file_range_map.GetSize();
- idx++)
- {
- const FileRangeMap::Entry* entry = file_range_map.GetEntryAtIndex(idx);
- if (entry)
- {
- debug_aranges->AppendRange(dwarf2Data->GetID(), entry->GetRangeBase(), entry->GetRangeEnd());
- num_line_entries_added++;
- }
- }
+SymbolFileDWARFDebugMap::AddOSOARanges(SymbolFileDWARF *dwarf2Data,
+ DWARFDebugAranges *debug_aranges) {
+ size_t num_line_entries_added = 0;
+ if (debug_aranges && dwarf2Data) {
+ CompileUnitInfo *compile_unit_info = GetCompileUnitInfo(dwarf2Data);
+ if (compile_unit_info) {
+ const FileRangeMap &file_range_map =
+ compile_unit_info->GetFileRangeMap(this);
+ for (size_t idx = 0; idx < file_range_map.GetSize(); idx++) {
+ const FileRangeMap::Entry *entry = file_range_map.GetEntryAtIndex(idx);
+ if (entry) {
+ debug_aranges->AppendRange(dwarf2Data->GetID(), entry->GetRangeBase(),
+ entry->GetRangeEnd());
+ num_line_entries_added++;
}
+ }
}
- return num_line_entries_added;
+ }
+ return num_line_entries_added;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
index fcf02975a58..ffc9fed353a 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -10,9 +10,8 @@
#ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_
#define SymbolFileDWARF_SymbolFileDWARFDebugMap_h_
-
-#include <vector>
#include <bitset>
+#include <vector>
#include "lldb/Core/RangeMap.h"
#include "lldb/Symbol/SymbolFile.h"
@@ -23,398 +22,355 @@ class SymbolFileDWARF;
class DWARFDebugAranges;
class DWARFDeclContext;
-class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile
-{
+class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile {
public:
-
- //------------------------------------------------------------------
- // Static Functions
- //------------------------------------------------------------------
- static void
- Initialize();
-
- static void
- Terminate();
-
- static lldb_private::ConstString
- GetPluginNameStatic();
-
- static const char *
- GetPluginDescriptionStatic();
-
- static lldb_private::SymbolFile *
- CreateInstance (lldb_private::ObjectFile* obj_file);
-
- //------------------------------------------------------------------
- // Constructors and Destructors
- //------------------------------------------------------------------
- SymbolFileDWARFDebugMap (lldb_private::ObjectFile* ofile);
- ~SymbolFileDWARFDebugMap () override;
-
- uint32_t CalculateAbilities () override;
- void InitializeObject() override;
-
- //------------------------------------------------------------------
- // Compile Unit function calls
- //------------------------------------------------------------------
- uint32_t GetNumCompileUnits () override;
- lldb::CompUnitSP ParseCompileUnitAtIndex (uint32_t index) override;
-
- lldb::LanguageType ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc) override;
- size_t ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc) override;
- bool ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc) override;
- bool ParseCompileUnitDebugMacros (const lldb_private::SymbolContext& sc) override;
- bool ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList &support_files) override;
- bool
- ParseCompileUnitIsOptimized(const lldb_private::SymbolContext &sc) override;
- bool ParseImportedModules (const lldb_private::SymbolContext &sc, std::vector<lldb_private::ConstString> &imported_modules) override;
- size_t ParseFunctionBlocks (const lldb_private::SymbolContext& sc) override;
- size_t ParseTypes (const lldb_private::SymbolContext& sc) override;
- size_t ParseVariablesForContext (const lldb_private::SymbolContext& sc) override;
-
- lldb_private::Type* ResolveTypeUID (lldb::user_id_t type_uid) override;
- lldb_private::CompilerDeclContext GetDeclContextForUID (lldb::user_id_t uid) override;
- lldb_private::CompilerDeclContext GetDeclContextContainingUID (lldb::user_id_t uid) override;
- void ParseDeclsForContext (lldb_private::CompilerDeclContext decl_ctx) override;
-
- bool CompleteType (lldb_private::CompilerType& compiler_type) override;
- uint32_t ResolveSymbolContext (const lldb_private::Address& so_addr, uint32_t resolve_scope, lldb_private::SymbolContext& sc) override;
- uint32_t ResolveSymbolContext (const lldb_private::FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, lldb_private::SymbolContextList& sc_list) override;
- uint32_t FindGlobalVariables (const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, lldb_private::VariableList& variables) override;
- uint32_t FindGlobalVariables (const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables) override;
- uint32_t FindFunctions (const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list) override;
- uint32_t FindFunctions (const lldb_private::RegularExpression& regex, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list) override;
- uint32_t FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, lldb_private::TypeMap& types) override;
- lldb_private::CompilerDeclContext
- FindNamespace (const lldb_private::SymbolContext& sc,
- const lldb_private::ConstString &name,
- const lldb_private::CompilerDeclContext *parent_decl_ctx) override;
- size_t GetTypes (lldb_private::SymbolContextScope *sc_scope,
- uint32_t type_mask,
- lldb_private::TypeList &type_list) override;
-
- //------------------------------------------------------------------
- // PluginInterface protocol
- //------------------------------------------------------------------
- lldb_private::ConstString
- GetPluginName() override;
-
- uint32_t
- GetPluginVersion() override;
+ //------------------------------------------------------------------
+ // Static Functions
+ //------------------------------------------------------------------
+ static void Initialize();
+
+ static void Terminate();
+
+ static lldb_private::ConstString GetPluginNameStatic();
+
+ static const char *GetPluginDescriptionStatic();
+
+ static lldb_private::SymbolFile *
+ CreateInstance(lldb_private::ObjectFile *obj_file);
+
+ //------------------------------------------------------------------
+ // Constructors and Destructors
+ //------------------------------------------------------------------
+ SymbolFileDWARFDebugMap(lldb_private::ObjectFile *ofile);
+ ~SymbolFileDWARFDebugMap() override;
+
+ uint32_t CalculateAbilities() override;
+ void InitializeObject() override;
+
+ //------------------------------------------------------------------
+ // Compile Unit function calls
+ //------------------------------------------------------------------
+ uint32_t GetNumCompileUnits() override;
+ lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
+
+ lldb::LanguageType
+ ParseCompileUnitLanguage(const lldb_private::SymbolContext &sc) override;
+ size_t
+ ParseCompileUnitFunctions(const lldb_private::SymbolContext &sc) override;
+ bool
+ ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc) override;
+ bool
+ ParseCompileUnitDebugMacros(const lldb_private::SymbolContext &sc) override;
+ bool ParseCompileUnitSupportFiles(
+ const lldb_private::SymbolContext &sc,
+ lldb_private::FileSpecList &support_files) override;
+ bool
+ ParseCompileUnitIsOptimized(const lldb_private::SymbolContext &sc) override;
+ bool ParseImportedModules(
+ const lldb_private::SymbolContext &sc,
+ std::vector<lldb_private::ConstString> &imported_modules) override;
+ size_t ParseFunctionBlocks(const lldb_private::SymbolContext &sc) override;
+ size_t ParseTypes(const lldb_private::SymbolContext &sc) override;
+ size_t
+ ParseVariablesForContext(const lldb_private::SymbolContext &sc) override;
+
+ lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override;
+ lldb_private::CompilerDeclContext
+ GetDeclContextForUID(lldb::user_id_t uid) override;
+ lldb_private::CompilerDeclContext
+ GetDeclContextContainingUID(lldb::user_id_t uid) override;
+ void
+ ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override;
+
+ bool CompleteType(lldb_private::CompilerType &compiler_type) override;
+ uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr,
+ uint32_t resolve_scope,
+ lldb_private::SymbolContext &sc) override;
+ uint32_t
+ ResolveSymbolContext(const lldb_private::FileSpec &file_spec, uint32_t line,
+ bool check_inlines, uint32_t resolve_scope,
+ lldb_private::SymbolContextList &sc_list) override;
+ uint32_t
+ FindGlobalVariables(const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ bool append, uint32_t max_matches,
+ lldb_private::VariableList &variables) override;
+ uint32_t FindGlobalVariables(const lldb_private::RegularExpression &regex,
+ bool append, uint32_t max_matches,
+ lldb_private::VariableList &variables) override;
+ uint32_t
+ FindFunctions(const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ uint32_t name_type_mask, bool include_inlines, bool append,
+ lldb_private::SymbolContextList &sc_list) override;
+ uint32_t FindFunctions(const lldb_private::RegularExpression &regex,
+ bool include_inlines, bool append,
+ lldb_private::SymbolContextList &sc_list) override;
+ uint32_t
+ FindTypes(const lldb_private::SymbolContext &sc,
+ const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ bool append, uint32_t max_matches,
+ llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
+ lldb_private::TypeMap &types) override;
+ lldb_private::CompilerDeclContext FindNamespace(
+ const lldb_private::SymbolContext &sc,
+ const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx) override;
+ size_t GetTypes(lldb_private::SymbolContextScope *sc_scope,
+ uint32_t type_mask,
+ lldb_private::TypeList &type_list) override;
+
+ //------------------------------------------------------------------
+ // PluginInterface protocol
+ //------------------------------------------------------------------
+ lldb_private::ConstString GetPluginName() override;
+
+ uint32_t GetPluginVersion() override;
protected:
- enum
- {
- kHaveInitializedOSOs = (1 << 0),
- kNumFlags
- };
-
- friend class DebugMapModule;
- friend struct DIERef;
- friend class DWARFASTParserClang;
- friend class DWARFCompileUnit;
- friend class SymbolFileDWARF;
- struct OSOInfo
- {
- lldb::ModuleSP module_sp;
-
- OSOInfo() :
- module_sp ()
- {
- }
- };
-
- typedef std::shared_ptr<OSOInfo> OSOInfoSP;
-
- typedef lldb_private::RangeDataVector<lldb::addr_t, lldb::addr_t, lldb::addr_t> FileRangeMap;
-
- //------------------------------------------------------------------
- // Class specific types
- //------------------------------------------------------------------
- struct CompileUnitInfo
- {
- lldb_private::FileSpec so_file;
- lldb_private::ConstString oso_path;
- lldb_private::TimeValue oso_mod_time;
- OSOInfoSP oso_sp;
- lldb::CompUnitSP compile_unit_sp;
- uint32_t first_symbol_index;
- uint32_t last_symbol_index;
- uint32_t first_symbol_id;
- uint32_t last_symbol_id;
- FileRangeMap file_range_map;
- bool file_range_map_valid;
-
-
- CompileUnitInfo() :
- so_file (),
- oso_path (),
- oso_mod_time (),
- oso_sp (),
- compile_unit_sp (),
- first_symbol_index (UINT32_MAX),
- last_symbol_index (UINT32_MAX),
- first_symbol_id (UINT32_MAX),
- last_symbol_id (UINT32_MAX),
- file_range_map (),
- file_range_map_valid (false)
- {
- }
-
- const FileRangeMap &
- GetFileRangeMap(SymbolFileDWARFDebugMap *exe_symfile);
- };
-
- //------------------------------------------------------------------
- // Protected Member Functions
- //------------------------------------------------------------------
- void
- InitOSO ();
-
- static uint32_t
- GetOSOIndexFromUserID (lldb::user_id_t uid)
- {
- return (uint32_t)((uid >> 32ull) - 1ull);
- }
-
- static SymbolFileDWARF *
- GetSymbolFileAsSymbolFileDWARF (SymbolFile *sym_file);
-
- bool
- GetFileSpecForSO (uint32_t oso_idx, lldb_private::FileSpec &file_spec);
-
- CompileUnitInfo *
- GetCompUnitInfo (const lldb_private::SymbolContext& sc);
-
- size_t
- GetCompUnitInfosForModule (const lldb_private::Module *oso_module,
- std::vector<CompileUnitInfo *>& cu_infos);
-
- lldb_private::Module *
- GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info);
-
- lldb_private::Module *
- GetModuleByOSOIndex (uint32_t oso_idx);
-
- lldb_private::ObjectFile *
- GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info);
-
- lldb_private::ObjectFile *
- GetObjectFileByOSOIndex (uint32_t oso_idx);
-
- uint32_t
- GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info);
-
- SymbolFileDWARF *
- GetSymbolFile (const lldb_private::SymbolContext& sc);
-
- SymbolFileDWARF *
- GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info);
-
- SymbolFileDWARF *
- GetSymbolFileByOSOIndex (uint32_t oso_idx);
-
- // If closure returns "false", iteration continues. If it returns
- // "true", iteration terminates.
- void
- ForEachSymbolFile (std::function<bool (SymbolFileDWARF *)> closure)
- {
- for (uint32_t oso_idx = 0, num_oso_idxs = m_compile_unit_infos.size();
- oso_idx < num_oso_idxs;
- ++oso_idx)
- {
- if (SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx))
- {
- if (closure(oso_dwarf))
- return;
- }
- }
+ enum { kHaveInitializedOSOs = (1 << 0), kNumFlags };
+
+ friend class DebugMapModule;
+ friend struct DIERef;
+ friend class DWARFASTParserClang;
+ friend class DWARFCompileUnit;
+ friend class SymbolFileDWARF;
+ struct OSOInfo {
+ lldb::ModuleSP module_sp;
+
+ OSOInfo() : module_sp() {}
+ };
+
+ typedef std::shared_ptr<OSOInfo> OSOInfoSP;
+
+ typedef lldb_private::RangeDataVector<lldb::addr_t, lldb::addr_t,
+ lldb::addr_t>
+ FileRangeMap;
+
+ //------------------------------------------------------------------
+ // Class specific types
+ //------------------------------------------------------------------
+ struct CompileUnitInfo {
+ lldb_private::FileSpec so_file;
+ lldb_private::ConstString oso_path;
+ lldb_private::TimeValue oso_mod_time;
+ OSOInfoSP oso_sp;
+ lldb::CompUnitSP compile_unit_sp;
+ uint32_t first_symbol_index;
+ uint32_t last_symbol_index;
+ uint32_t first_symbol_id;
+ uint32_t last_symbol_id;
+ FileRangeMap file_range_map;
+ bool file_range_map_valid;
+
+ CompileUnitInfo()
+ : so_file(), oso_path(), oso_mod_time(), oso_sp(), compile_unit_sp(),
+ first_symbol_index(UINT32_MAX), last_symbol_index(UINT32_MAX),
+ first_symbol_id(UINT32_MAX), last_symbol_id(UINT32_MAX),
+ file_range_map(), file_range_map_valid(false) {}
+
+ const FileRangeMap &GetFileRangeMap(SymbolFileDWARFDebugMap *exe_symfile);
+ };
+
+ //------------------------------------------------------------------
+ // Protected Member Functions
+ //------------------------------------------------------------------
+ void InitOSO();
+
+ static uint32_t GetOSOIndexFromUserID(lldb::user_id_t uid) {
+ return (uint32_t)((uid >> 32ull) - 1ull);
+ }
+
+ static SymbolFileDWARF *GetSymbolFileAsSymbolFileDWARF(SymbolFile *sym_file);
+
+ bool GetFileSpecForSO(uint32_t oso_idx, lldb_private::FileSpec &file_spec);
+
+ CompileUnitInfo *GetCompUnitInfo(const lldb_private::SymbolContext &sc);
+
+ size_t GetCompUnitInfosForModule(const lldb_private::Module *oso_module,
+ std::vector<CompileUnitInfo *> &cu_infos);
+
+ lldb_private::Module *
+ GetModuleByCompUnitInfo(CompileUnitInfo *comp_unit_info);
+
+ lldb_private::Module *GetModuleByOSOIndex(uint32_t oso_idx);
+
+ lldb_private::ObjectFile *
+ GetObjectFileByCompUnitInfo(CompileUnitInfo *comp_unit_info);
+
+ lldb_private::ObjectFile *GetObjectFileByOSOIndex(uint32_t oso_idx);
+
+ uint32_t GetCompUnitInfoIndex(const CompileUnitInfo *comp_unit_info);
+
+ SymbolFileDWARF *GetSymbolFile(const lldb_private::SymbolContext &sc);
+
+ SymbolFileDWARF *GetSymbolFileByCompUnitInfo(CompileUnitInfo *comp_unit_info);
+
+ SymbolFileDWARF *GetSymbolFileByOSOIndex(uint32_t oso_idx);
+
+ // If closure returns "false", iteration continues. If it returns
+ // "true", iteration terminates.
+ void ForEachSymbolFile(std::function<bool(SymbolFileDWARF *)> closure) {
+ for (uint32_t oso_idx = 0, num_oso_idxs = m_compile_unit_infos.size();
+ oso_idx < num_oso_idxs; ++oso_idx) {
+ if (SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx)) {
+ if (closure(oso_dwarf))
+ return;
+ }
}
+ }
+
+ CompileUnitInfo *GetCompileUnitInfoForSymbolWithIndex(uint32_t symbol_idx,
+ uint32_t *oso_idx_ptr);
- CompileUnitInfo *
- GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr);
-
- CompileUnitInfo *
- GetCompileUnitInfoForSymbolWithID (lldb::user_id_t symbol_id, uint32_t *oso_idx_ptr);
+ CompileUnitInfo *GetCompileUnitInfoForSymbolWithID(lldb::user_id_t symbol_id,
+ uint32_t *oso_idx_ptr);
- static int
- SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info);
+ static int
+ SymbolContainsSymbolWithIndex(uint32_t *symbol_idx_ptr,
+ const CompileUnitInfo *comp_unit_info);
- static int
- SymbolContainsSymbolWithID (lldb::user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info);
+ static int SymbolContainsSymbolWithID(lldb::user_id_t *symbol_idx_ptr,
+ const CompileUnitInfo *comp_unit_info);
- uint32_t
- PrivateFindGlobalVariables (const lldb_private::ConstString &name,
- const lldb_private::CompilerDeclContext *parent_decl_ctx,
- const std::vector<uint32_t> &name_symbol_indexes,
- uint32_t max_matches,
- lldb_private::VariableList& variables);
+ uint32_t PrivateFindGlobalVariables(
+ const lldb_private::ConstString &name,
+ const lldb_private::CompilerDeclContext *parent_decl_ctx,
+ const std::vector<uint32_t> &name_symbol_indexes, uint32_t max_matches,
+ lldb_private::VariableList &variables);
+ void SetCompileUnit(SymbolFileDWARF *oso_dwarf,
+ const lldb::CompUnitSP &cu_sp);
- void
- SetCompileUnit (SymbolFileDWARF *oso_dwarf, const lldb::CompUnitSP &cu_sp);
+ lldb::CompUnitSP GetCompileUnit(SymbolFileDWARF *oso_dwarf);
- lldb::CompUnitSP
- GetCompileUnit (SymbolFileDWARF *oso_dwarf);
-
- CompileUnitInfo *
- GetCompileUnitInfo (SymbolFileDWARF *oso_dwarf);
+ CompileUnitInfo *GetCompileUnitInfo(SymbolFileDWARF *oso_dwarf);
- lldb::TypeSP
- FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx);
+ lldb::TypeSP
+ FindDefinitionTypeForDWARFDeclContext(const DWARFDeclContext &die_decl_ctx);
- bool
- Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso);
+ bool Supports_DW_AT_APPLE_objc_complete_type(SymbolFileDWARF *skip_dwarf_oso);
- lldb::TypeSP
- FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die,
- const lldb_private::ConstString &type_name,
- bool must_be_implementation);
-
+ lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE(
+ const DWARFDIE &die, const lldb_private::ConstString &type_name,
+ bool must_be_implementation);
- UniqueDWARFASTTypeMap &
- GetUniqueDWARFASTTypeMap ()
- {
- return m_unique_ast_type_map;
+ UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap() {
+ return m_unique_ast_type_map;
+ }
+
+ //------------------------------------------------------------------
+ // OSOEntry
+ //------------------------------------------------------------------
+ class OSOEntry {
+ public:
+ OSOEntry()
+ : m_exe_sym_idx(UINT32_MAX), m_oso_file_addr(LLDB_INVALID_ADDRESS) {}
+
+ OSOEntry(uint32_t exe_sym_idx, lldb::addr_t oso_file_addr)
+ : m_exe_sym_idx(exe_sym_idx), m_oso_file_addr(oso_file_addr) {}
+
+ uint32_t GetExeSymbolIndex() const { return m_exe_sym_idx; }
+
+ bool operator<(const OSOEntry &rhs) const {
+ return m_exe_sym_idx < rhs.m_exe_sym_idx;
}
-
-
- //------------------------------------------------------------------
- // OSOEntry
- //------------------------------------------------------------------
- class OSOEntry
- {
- public:
-
- OSOEntry () :
- m_exe_sym_idx (UINT32_MAX),
- m_oso_file_addr (LLDB_INVALID_ADDRESS)
- {
- }
-
- OSOEntry (uint32_t exe_sym_idx,
- lldb::addr_t oso_file_addr) :
- m_exe_sym_idx (exe_sym_idx),
- m_oso_file_addr (oso_file_addr)
- {
- }
-
- uint32_t
- GetExeSymbolIndex () const
- {
- return m_exe_sym_idx;
- }
-
- bool
- operator < (const OSOEntry &rhs) const
- {
- return m_exe_sym_idx < rhs.m_exe_sym_idx;
- }
-
- lldb::addr_t
- GetOSOFileAddress () const
- {
- return m_oso_file_addr;
- }
-
- void
- SetOSOFileAddress (lldb::addr_t oso_file_addr)
- {
- m_oso_file_addr = oso_file_addr;
- }
- protected:
- uint32_t m_exe_sym_idx;
- lldb::addr_t m_oso_file_addr;
- };
-
- typedef lldb_private::RangeDataVector<lldb::addr_t, lldb::addr_t, OSOEntry> DebugMap;
-
- //------------------------------------------------------------------
- // Member Variables
- //------------------------------------------------------------------
- std::bitset<kNumFlags> m_flags;
- std::vector<CompileUnitInfo> m_compile_unit_infos;
- std::vector<uint32_t> m_func_indexes; // Sorted by address
- std::vector<uint32_t> m_glob_indexes;
- std::map<lldb_private::ConstString, OSOInfoSP> m_oso_map;
- UniqueDWARFASTTypeMap m_unique_ast_type_map;
- lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
- DebugMap m_debug_map;
-
- //------------------------------------------------------------------
- // When an object file from the debug map gets parsed in
- // SymbolFileDWARF, it needs to tell the debug map about the object
- // files addresses by calling this function once for each N_FUN,
- // N_GSYM and N_STSYM and after all entries in the debug map have
- // been matched up, FinalizeOSOFileRanges() should be called.
- //------------------------------------------------------------------
- bool
- AddOSOFileRange (CompileUnitInfo *cu_info,
- lldb::addr_t exe_file_addr,
- lldb::addr_t exe_byte_size,
- lldb::addr_t oso_file_addr,
- lldb::addr_t oso_byte_size);
-
- //------------------------------------------------------------------
- // Called after calling AddOSOFileRange() for each object file debug
- // map entry to finalize the info for the unlinked compile unit.
- //------------------------------------------------------------------
- void
- FinalizeOSOFileRanges (CompileUnitInfo *cu_info);
-
- //------------------------------------------------------------------
- /// Convert \a addr from a .o file address, to an executable address.
- ///
- /// @param[in] addr
- /// A section offset address from a .o file
- ///
- /// @return
- /// Returns true if \a addr was converted to be an executable
- /// section/offset address, false otherwise.
- //------------------------------------------------------------------
- bool
- LinkOSOAddress (lldb_private::Address &addr);
-
- //------------------------------------------------------------------
- /// Convert a .o file "file address" to an executable "file address".
- ///
- /// @param[in] oso_symfile
- /// The DWARF symbol file that contains \a oso_file_addr
- ///
- /// @param[in] oso_file_addr
- /// A .o file "file address" to convert.
- ///
- /// @return
- /// LLDB_INVALID_ADDRESS if \a oso_file_addr is not in the
- /// linked executable, otherwise a valid "file address" from the
- /// linked executable that contains the debug map.
- //------------------------------------------------------------------
- lldb::addr_t
- LinkOSOFileAddress (SymbolFileDWARF *oso_symfile, lldb::addr_t oso_file_addr);
-
- //------------------------------------------------------------------
- /// Given a line table full of lines with "file addresses" that are
- /// for a .o file represented by \a oso_symfile, link a new line table
- /// and return it.
- ///
- /// @param[in] oso_symfile
- /// The DWARF symbol file that produced the \a line_table
- ///
- /// @param[in] addr
- /// A section offset address from a .o file
- ///
- /// @return
- /// Returns a valid line table full of linked addresses, or NULL
- /// if none of the line table addresses exist in the main
- /// executable.
- //------------------------------------------------------------------
- lldb_private::LineTable *
- LinkOSOLineTable (SymbolFileDWARF *oso_symfile,
- lldb_private::LineTable *line_table);
-
- size_t
- AddOSOARanges (SymbolFileDWARF* dwarf2Data,
- DWARFDebugAranges* debug_aranges);
+
+ lldb::addr_t GetOSOFileAddress() const { return m_oso_file_addr; }
+
+ void SetOSOFileAddress(lldb::addr_t oso_file_addr) {
+ m_oso_file_addr = oso_file_addr;
+ }
+
+ protected:
+ uint32_t m_exe_sym_idx;
+ lldb::addr_t m_oso_file_addr;
+ };
+
+ typedef lldb_private::RangeDataVector<lldb::addr_t, lldb::addr_t, OSOEntry>
+ DebugMap;
+
+ //------------------------------------------------------------------
+ // Member Variables
+ //------------------------------------------------------------------
+ std::bitset<kNumFlags> m_flags;
+ std::vector<CompileUnitInfo> m_compile_unit_infos;
+ std::vector<uint32_t> m_func_indexes; // Sorted by address
+ std::vector<uint32_t> m_glob_indexes;
+ std::map<lldb_private::ConstString, OSOInfoSP> m_oso_map;
+ UniqueDWARFASTTypeMap m_unique_ast_type_map;
+ lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
+ DebugMap m_debug_map;
+
+ //------------------------------------------------------------------
+ // When an object file from the debug map gets parsed in
+ // SymbolFileDWARF, it needs to tell the debug map about the object
+ // files addresses by calling this function once for each N_FUN,
+ // N_GSYM and N_STSYM and after all entries in the debug map have
+ // been matched up, FinalizeOSOFileRanges() should be called.
+ //------------------------------------------------------------------
+ bool AddOSOFileRange(CompileUnitInfo *cu_info, lldb::addr_t exe_file_addr,
+ lldb::addr_t exe_byte_size, lldb::addr_t oso_file_addr,
+ lldb::addr_t oso_byte_size);
+
+ //------------------------------------------------------------------
+ // Called after calling AddOSOFileRange() for each object file debug
+ // map entry to finalize the info for the unlinked compile unit.
+ //------------------------------------------------------------------
+ void FinalizeOSOFileRanges(CompileUnitInfo *cu_info);
+
+ //------------------------------------------------------------------
+ /// Convert \a addr from a .o file address, to an executable address.
+ ///
+ /// @param[in] addr
+ /// A section offset address from a .o file
+ ///
+ /// @return
+ /// Returns true if \a addr was converted to be an executable
+ /// section/offset address, false otherwise.
+ //------------------------------------------------------------------
+ bool LinkOSOAddress(lldb_private::Address &addr);
+
+ //------------------------------------------------------------------
+ /// Convert a .o file "file address" to an executable "file address".
+ ///
+ /// @param[in] oso_symfile
+ /// The DWARF symbol file that contains \a oso_file_addr
+ ///
+ /// @param[in] oso_file_addr
+ /// A .o file "file address" to convert.
+ ///
+ /// @return
+ /// LLDB_INVALID_ADDRESS if \a oso_file_addr is not in the
+ /// linked executable, otherwise a valid "file address" from the
+ /// linked executable that contains the debug map.
+ //------------------------------------------------------------------
+ lldb::addr_t LinkOSOFileAddress(SymbolFileDWARF *oso_symfile,
+ lldb::addr_t oso_file_addr);
+
+ //------------------------------------------------------------------
+ /// Given a line table full of lines with "file addresses" that are
+ /// for a .o file represented by \a oso_symfile, link a new line table
+ /// and return it.
+ ///
+ /// @param[in] oso_symfile
+ /// The DWARF symbol file that produced the \a line_table
+ ///
+ /// @param[in] addr
+ /// A section offset address from a .o file
+ ///
+ /// @return
+ /// Returns a valid line table full of linked addresses, or NULL
+ /// if none of the line table addresses exist in the main
+ /// executable.
+ //------------------------------------------------------------------
+ lldb_private::LineTable *
+ LinkOSOLineTable(SymbolFileDWARF *oso_symfile,
+ lldb_private::LineTable *line_table);
+
+ size_t AddOSOARanges(SymbolFileDWARF *dwarf2Data,
+ DWARFDebugAranges *debug_aranges);
};
#endif // #ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
index 14603aa460c..c14ebd1628b 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
@@ -20,120 +20,103 @@
using namespace lldb;
using namespace lldb_private;
-SymbolFileDWARFDwo::SymbolFileDWARFDwo(ObjectFileSP objfile, DWARFCompileUnit* dwarf_cu) :
- SymbolFileDWARF(objfile.get()),
- m_obj_file_sp(objfile),
- m_base_dwarf_cu(dwarf_cu)
-{
- SetID(((lldb::user_id_t)dwarf_cu->GetOffset())<<32);
+SymbolFileDWARFDwo::SymbolFileDWARFDwo(ObjectFileSP objfile,
+ DWARFCompileUnit *dwarf_cu)
+ : SymbolFileDWARF(objfile.get()), m_obj_file_sp(objfile),
+ m_base_dwarf_cu(dwarf_cu) {
+ SetID(((lldb::user_id_t)dwarf_cu->GetOffset()) << 32);
}
-void
-SymbolFileDWARFDwo::LoadSectionData (lldb::SectionType sect_type, DWARFDataExtractor& data)
-{
- const SectionList* section_list = m_obj_file->GetSectionList(false /* update_module_section_list */);
- if (section_list)
- {
- SectionSP section_sp (section_list->FindSectionByType(sect_type, true));
- if (section_sp)
- {
- // See if we memory mapped the DWARF segment?
- if (m_dwarf_data.GetByteSize())
- {
- data.SetData(m_dwarf_data, section_sp->GetOffset(), section_sp->GetFileSize());
- return;
- }
-
- if (m_obj_file->ReadSectionData(section_sp.get(), data) != 0)
- return;
-
- data.Clear();
- }
+void SymbolFileDWARFDwo::LoadSectionData(lldb::SectionType sect_type,
+ DWARFDataExtractor &data) {
+ const SectionList *section_list =
+ m_obj_file->GetSectionList(false /* update_module_section_list */);
+ if (section_list) {
+ SectionSP section_sp(section_list->FindSectionByType(sect_type, true));
+ if (section_sp) {
+ // See if we memory mapped the DWARF segment?
+ if (m_dwarf_data.GetByteSize()) {
+ data.SetData(m_dwarf_data, section_sp->GetOffset(),
+ section_sp->GetFileSize());
+ return;
+ }
+
+ if (m_obj_file->ReadSectionData(section_sp.get(), data) != 0)
+ return;
+
+ data.Clear();
}
+ }
- SymbolFileDWARF::LoadSectionData(sect_type, data);
+ SymbolFileDWARF::LoadSectionData(sect_type, data);
}
lldb::CompUnitSP
-SymbolFileDWARFDwo::ParseCompileUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
-{
- assert(GetCompileUnit() == dwarf_cu && "SymbolFileDWARFDwo::ParseCompileUnit called with incompatible compile unit");
- return GetBaseSymbolFile()->ParseCompileUnit(m_base_dwarf_cu, UINT32_MAX);
+SymbolFileDWARFDwo::ParseCompileUnit(DWARFCompileUnit *dwarf_cu,
+ uint32_t cu_idx) {
+ assert(GetCompileUnit() == dwarf_cu && "SymbolFileDWARFDwo::ParseCompileUnit "
+ "called with incompatible compile "
+ "unit");
+ return GetBaseSymbolFile()->ParseCompileUnit(m_base_dwarf_cu, UINT32_MAX);
}
-DWARFCompileUnit*
-SymbolFileDWARFDwo::GetCompileUnit()
-{
- // Only dwo files with 1 compile unit is supported
- if (GetNumCompileUnits() == 1)
- return DebugInfo()->GetCompileUnitAtIndex(0);
- else
- return nullptr;
+DWARFCompileUnit *SymbolFileDWARFDwo::GetCompileUnit() {
+ // Only dwo files with 1 compile unit is supported
+ if (GetNumCompileUnits() == 1)
+ return DebugInfo()->GetCompileUnitAtIndex(0);
+ else
+ return nullptr;
}
-DWARFCompileUnit*
-SymbolFileDWARFDwo::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit)
-{
- return GetCompileUnit();
+DWARFCompileUnit *
+SymbolFileDWARFDwo::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) {
+ return GetCompileUnit();
}
-SymbolFileDWARF::DIEToTypePtr&
-SymbolFileDWARFDwo::GetDIEToType()
-{
- return GetBaseSymbolFile()->GetDIEToType();
+SymbolFileDWARF::DIEToTypePtr &SymbolFileDWARFDwo::GetDIEToType() {
+ return GetBaseSymbolFile()->GetDIEToType();
}
-SymbolFileDWARF::DIEToVariableSP&
-SymbolFileDWARFDwo::GetDIEToVariable()
-{
- return GetBaseSymbolFile()->GetDIEToVariable();
+SymbolFileDWARF::DIEToVariableSP &SymbolFileDWARFDwo::GetDIEToVariable() {
+ return GetBaseSymbolFile()->GetDIEToVariable();
}
-SymbolFileDWARF::DIEToClangType&
-SymbolFileDWARFDwo::GetForwardDeclDieToClangType()
-{
- return GetBaseSymbolFile()->GetForwardDeclDieToClangType();
+SymbolFileDWARF::DIEToClangType &
+SymbolFileDWARFDwo::GetForwardDeclDieToClangType() {
+ return GetBaseSymbolFile()->GetForwardDeclDieToClangType();
}
-SymbolFileDWARF::ClangTypeToDIE&
-SymbolFileDWARFDwo::GetForwardDeclClangTypeToDie()
-{
- return GetBaseSymbolFile()->GetForwardDeclClangTypeToDie();
+SymbolFileDWARF::ClangTypeToDIE &
+SymbolFileDWARFDwo::GetForwardDeclClangTypeToDie() {
+ return GetBaseSymbolFile()->GetForwardDeclClangTypeToDie();
}
-UniqueDWARFASTTypeMap&
-SymbolFileDWARFDwo::GetUniqueDWARFASTTypeMap()
-{
- return GetBaseSymbolFile()->GetUniqueDWARFASTTypeMap();
+UniqueDWARFASTTypeMap &SymbolFileDWARFDwo::GetUniqueDWARFASTTypeMap() {
+ return GetBaseSymbolFile()->GetUniqueDWARFASTTypeMap();
}
-lldb::TypeSP
-SymbolFileDWARFDwo::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx)
-{
- return GetBaseSymbolFile()->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx);
+lldb::TypeSP SymbolFileDWARFDwo::FindDefinitionTypeForDWARFDeclContext(
+ const DWARFDeclContext &die_decl_ctx) {
+ return GetBaseSymbolFile()->FindDefinitionTypeForDWARFDeclContext(
+ die_decl_ctx);
}
-SymbolFileDWARF*
-SymbolFileDWARFDwo::GetBaseSymbolFile()
-{
- return m_base_dwarf_cu->GetSymbolFileDWARF();
+SymbolFileDWARF *SymbolFileDWARFDwo::GetBaseSymbolFile() {
+ return m_base_dwarf_cu->GetSymbolFileDWARF();
}
DWARFExpression::LocationListFormat
-SymbolFileDWARFDwo::GetLocationListFormat() const
-{
- return DWARFExpression::SplitDwarfLocationList;
+SymbolFileDWARFDwo::GetLocationListFormat() const {
+ return DWARFExpression::SplitDwarfLocationList;
}
-TypeSystem*
-SymbolFileDWARFDwo::GetTypeSystemForLanguage(LanguageType language)
-{
- return GetBaseSymbolFile()->GetTypeSystemForLanguage(language);
+TypeSystem *
+SymbolFileDWARFDwo::GetTypeSystemForLanguage(LanguageType language) {
+ return GetBaseSymbolFile()->GetTypeSystemForLanguage(language);
}
DWARFDIE
-SymbolFileDWARFDwo::GetDIE(const DIERef &die_ref)
-{
- lldbassert(m_base_dwarf_cu->GetOffset() == die_ref.cu_offset);
- return DebugInfo()->GetDIEForDIEOffset(die_ref.die_offset);
+SymbolFileDWARFDwo::GetDIE(const DIERef &die_ref) {
+ lldbassert(m_base_dwarf_cu->GetOffset() == die_ref.cu_offset);
+ return DebugInfo()->GetDIEForDIEOffset(die_ref.die_offset);
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
index 9391a282494..8cd67a2b242 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
@@ -16,64 +16,56 @@
// Project includes
#include "SymbolFileDWARF.h"
-class SymbolFileDWARFDwo : public SymbolFileDWARF
-{
+class SymbolFileDWARFDwo : public SymbolFileDWARF {
public:
- SymbolFileDWARFDwo(lldb::ObjectFileSP objfile, DWARFCompileUnit* dwarf_cu);
+ SymbolFileDWARFDwo(lldb::ObjectFileSP objfile, DWARFCompileUnit *dwarf_cu);
- ~SymbolFileDWARFDwo() override = default;
-
- lldb::CompUnitSP
- ParseCompileUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) override;
+ ~SymbolFileDWARFDwo() override = default;
- DWARFCompileUnit*
- GetCompileUnit();
+ lldb::CompUnitSP ParseCompileUnit(DWARFCompileUnit *dwarf_cu,
+ uint32_t cu_idx) override;
- DWARFCompileUnit*
- GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) override;
+ DWARFCompileUnit *GetCompileUnit();
- lldb_private::DWARFExpression::LocationListFormat
- GetLocationListFormat() const override;
+ DWARFCompileUnit *
+ GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) override;
- lldb_private::TypeSystem*
- GetTypeSystemForLanguage(lldb::LanguageType language) override;
+ lldb_private::DWARFExpression::LocationListFormat
+ GetLocationListFormat() const override;
- DWARFDIE
- GetDIE(const DIERef &die_ref) override;
+ lldb_private::TypeSystem *
+ GetTypeSystemForLanguage(lldb::LanguageType language) override;
- std::unique_ptr<SymbolFileDWARFDwo>
- GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die) override
- {
- return nullptr;
- }
+ DWARFDIE
+ GetDIE(const DIERef &die_ref) override;
+
+ std::unique_ptr<SymbolFileDWARFDwo>
+ GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu,
+ const DWARFDebugInfoEntry &cu_die) override {
+ return nullptr;
+ }
protected:
- void
- LoadSectionData (lldb::SectionType sect_type, lldb_private::DWARFDataExtractor& data) override;
+ void LoadSectionData(lldb::SectionType sect_type,
+ lldb_private::DWARFDataExtractor &data) override;
+
+ DIEToTypePtr &GetDIEToType() override;
- DIEToTypePtr&
- GetDIEToType() override;
+ DIEToVariableSP &GetDIEToVariable() override;
- DIEToVariableSP&
- GetDIEToVariable() override;
-
- DIEToClangType&
- GetForwardDeclDieToClangType() override;
+ DIEToClangType &GetForwardDeclDieToClangType() override;
- ClangTypeToDIE&
- GetForwardDeclClangTypeToDie() override;
+ ClangTypeToDIE &GetForwardDeclClangTypeToDie() override;
- UniqueDWARFASTTypeMap&
- GetUniqueDWARFASTTypeMap() override;
+ UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap() override;
- lldb::TypeSP
- FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx) override;
+ lldb::TypeSP FindDefinitionTypeForDWARFDeclContext(
+ const DWARFDeclContext &die_decl_ctx) override;
- SymbolFileDWARF*
- GetBaseSymbolFile();
+ SymbolFileDWARF *GetBaseSymbolFile();
- lldb::ObjectFileSP m_obj_file_sp;
- DWARFCompileUnit* m_base_dwarf_cu;
+ lldb::ObjectFileSP m_obj_file_sp;
+ DWARFCompileUnit *m_base_dwarf_cu;
};
#endif // SymbolFileDWARFDwo_SymbolFileDWARFDwo_h_
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp b/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
index 2ca407b9e48..8697e08dbf8 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
@@ -15,73 +15,63 @@
// Project includes
#include "lldb/Symbol/Declaration.h"
-bool
-UniqueDWARFASTTypeList::Find (const DWARFDIE &die,
- const lldb_private::Declaration &decl,
- const int32_t byte_size,
- UniqueDWARFASTType &entry) const
-{
- for (const UniqueDWARFASTType &udt : m_collection)
- {
- // Make sure the tags match
- if (udt.m_die.Tag() == die.Tag())
- {
- // Validate byte sizes of both types only if both are valid.
- if (udt.m_byte_size < 0 || byte_size < 0 || udt.m_byte_size == byte_size)
- {
- // Make sure the file and line match
- if (udt.m_declaration == decl)
+bool UniqueDWARFASTTypeList::Find(const DWARFDIE &die,
+ const lldb_private::Declaration &decl,
+ const int32_t byte_size,
+ UniqueDWARFASTType &entry) const {
+ for (const UniqueDWARFASTType &udt : m_collection) {
+ // Make sure the tags match
+ if (udt.m_die.Tag() == die.Tag()) {
+ // Validate byte sizes of both types only if both are valid.
+ if (udt.m_byte_size < 0 || byte_size < 0 ||
+ udt.m_byte_size == byte_size) {
+ // Make sure the file and line match
+ 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.
+ 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 && parent_pos_die) {
+ 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) {
+ 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();
+ if (parent_arg_die_name ==
+ NULL) // Anonymous (i.e. no-name) struct
{
- // The type has the same name, and was defined on the same
- // file and line. Now verify all of the parent DIEs match.
- 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 && parent_pos_die)
- {
- 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)
- {
- 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();
- if (parent_arg_die_name == NULL) // Anonymous (i.e. no-name) struct
- {
- match = false;
- }
- else
- {
- 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;
- }
- }
- break;
-
- case DW_TAG_compile_unit:
- done = true;
- break;
- }
- }
- parent_arg_die = parent_arg_die.GetParent();
- parent_pos_die = parent_pos_die.GetParent();
- }
-
- if (match)
- {
- entry = udt;
- return true;
- }
+ match = false;
+ } else {
+ 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;
}
+ } break;
+
+ case DW_TAG_compile_unit:
+ done = true;
+ break;
+ }
}
+ parent_arg_die = parent_arg_die.GetParent();
+ parent_pos_die = parent_pos_die.GetParent();
+ }
+
+ if (match) {
+ entry = udt;
+ return true;
+ }
}
+ }
}
- return false;
+ }
+ return false;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h b/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h
index b7b18efd876..5d51044cbe1 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.h
@@ -18,139 +18,93 @@
#include "llvm/ADT/DenseMap.h"
// Project includes
-#include "lldb/Symbol/Declaration.h"
#include "DWARFDIE.h"
+#include "lldb/Symbol/Declaration.h"
-class UniqueDWARFASTType
-{
+class UniqueDWARFASTType {
public:
- //------------------------------------------------------------------
- // Constructors and Destructors
- //------------------------------------------------------------------
- UniqueDWARFASTType () :
- m_type_sp (),
- m_die (),
- m_declaration (),
- m_byte_size (-1) // Set to negative value to make sure we have a valid value
- {
- }
+ //------------------------------------------------------------------
+ // Constructors and Destructors
+ //------------------------------------------------------------------
+ UniqueDWARFASTType()
+ : m_type_sp(), 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,
- const DWARFDIE &die,
- const lldb_private::Declaration &decl,
- int32_t byte_size) :
- m_type_sp (type_sp),
- m_die (die),
- m_declaration (decl),
- m_byte_size (byte_size)
- {
- }
-
- UniqueDWARFASTType (const UniqueDWARFASTType &rhs) :
- m_type_sp (rhs.m_type_sp),
- m_die (rhs.m_die),
- m_declaration (rhs.m_declaration),
- m_byte_size (rhs.m_byte_size)
- {
- }
+ UniqueDWARFASTType(lldb::TypeSP &type_sp, const DWARFDIE &die,
+ const lldb_private::Declaration &decl, int32_t byte_size)
+ : m_type_sp(type_sp), m_die(die), m_declaration(decl),
+ m_byte_size(byte_size) {}
- ~UniqueDWARFASTType()
- {
- }
+ UniqueDWARFASTType(const UniqueDWARFASTType &rhs)
+ : m_type_sp(rhs.m_type_sp), m_die(rhs.m_die),
+ m_declaration(rhs.m_declaration), m_byte_size(rhs.m_byte_size) {}
+
+ ~UniqueDWARFASTType() {}
- UniqueDWARFASTType &
- operator= (const UniqueDWARFASTType &rhs)
- {
- if (this != &rhs)
- {
- m_type_sp = rhs.m_type_sp;
- m_die = rhs.m_die;
- m_declaration = rhs.m_declaration;
- m_byte_size = rhs.m_byte_size;
- }
- return *this;
+ UniqueDWARFASTType &operator=(const UniqueDWARFASTType &rhs) {
+ if (this != &rhs) {
+ m_type_sp = rhs.m_type_sp;
+ m_die = rhs.m_die;
+ m_declaration = rhs.m_declaration;
+ m_byte_size = rhs.m_byte_size;
}
+ return *this;
+ }
- lldb::TypeSP m_type_sp;
- DWARFDIE m_die;
- lldb_private::Declaration m_declaration;
- int32_t m_byte_size;
+ lldb::TypeSP m_type_sp;
+ DWARFDIE m_die;
+ lldb_private::Declaration m_declaration;
+ int32_t m_byte_size;
};
-class UniqueDWARFASTTypeList
-{
+class UniqueDWARFASTTypeList {
public:
- UniqueDWARFASTTypeList () :
- m_collection()
- {
- }
-
- ~UniqueDWARFASTTypeList ()
- {
- }
-
- uint32_t
- GetSize()
- {
- return (uint32_t)m_collection.size();
- }
-
- void
- Append (const UniqueDWARFASTType &entry)
- {
- m_collection.push_back (entry);
- }
-
- bool
- Find (const DWARFDIE &die,
- const lldb_private::Declaration &decl,
- const int32_t byte_size,
- UniqueDWARFASTType &entry) const;
-
+ UniqueDWARFASTTypeList() : m_collection() {}
+
+ ~UniqueDWARFASTTypeList() {}
+
+ uint32_t GetSize() { return (uint32_t)m_collection.size(); }
+
+ void Append(const UniqueDWARFASTType &entry) {
+ m_collection.push_back(entry);
+ }
+
+ bool Find(const DWARFDIE &die, const lldb_private::Declaration &decl,
+ const int32_t byte_size, UniqueDWARFASTType &entry) const;
+
protected:
- typedef std::vector<UniqueDWARFASTType> collection;
- collection m_collection;
+ typedef std::vector<UniqueDWARFASTType> collection;
+ collection m_collection;
};
-class UniqueDWARFASTTypeMap
-{
+class UniqueDWARFASTTypeMap {
public:
- UniqueDWARFASTTypeMap () :
- m_collection ()
- {
- }
-
- ~UniqueDWARFASTTypeMap ()
- {
- }
+ UniqueDWARFASTTypeMap() : m_collection() {}
- void
- Insert (const lldb_private::ConstString &name,
- const UniqueDWARFASTType &entry)
- {
- m_collection[name.GetCString()].Append (entry);
- }
+ ~UniqueDWARFASTTypeMap() {}
+
+ void Insert(const lldb_private::ConstString &name,
+ const UniqueDWARFASTType &entry) {
+ m_collection[name.GetCString()].Append(entry);
+ }
- bool
- Find (const lldb_private::ConstString &name,
- const DWARFDIE &die,
- const lldb_private::Declaration &decl,
- const int32_t byte_size,
- UniqueDWARFASTType &entry) const
- {
- const char *unique_name_cstr = name.GetCString();
- collection::const_iterator pos = m_collection.find (unique_name_cstr);
- if (pos != m_collection.end())
- {
- return pos->second.Find (die, decl, byte_size, entry);
- }
- return false;
+ bool Find(const lldb_private::ConstString &name, const DWARFDIE &die,
+ const lldb_private::Declaration &decl, const int32_t byte_size,
+ UniqueDWARFASTType &entry) const {
+ const char *unique_name_cstr = name.GetCString();
+ collection::const_iterator pos = m_collection.find(unique_name_cstr);
+ if (pos != m_collection.end()) {
+ return pos->second.Find(die, decl, byte_size, entry);
}
+ return false;
+ }
protected:
- // A unique name string should be used
- typedef llvm::DenseMap<const char *, UniqueDWARFASTTypeList> collection;
- collection m_collection;
+ // A unique name string should be used
+ typedef llvm::DenseMap<const char *, UniqueDWARFASTTypeList> collection;
+ collection m_collection;
};
-#endif // lldb_UniqueDWARFASTType_h_
+#endif // lldb_UniqueDWARFASTType_h_
OpenPOWER on IntegriCloud