diff options
111 files changed, 1457 insertions, 813 deletions
diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py index 2700cd8cbf7..752700f9b2a 100755 --- a/lldb/examples/python/crashlog.py +++ b/lldb/examples/python/crashlog.py @@ -587,6 +587,14 @@ def SymbolicateCrashLog(crash_log, options): print 'error: no images in crash log' return + if options.dump_image_list: + print "Binary Images:" + for image in crash_log.images: + if options.verbose: + print image.debug_dump() + else: + print image + target = crash_log.create_target () if not target: return @@ -678,11 +686,6 @@ def SymbolicateCrashLog(crash_log, options): print frame print - if options.dump_image_list: - print "Binary Images:" - for image in crash_log.images: - print image - def CreateSymbolicateCrashLogOptions(command_name, description, add_interactive_options): usage = "usage: %prog [options] <FILE> [FILE ...]" option_parser = optparse.OptionParser(description=description, prog='crashlog',usage=usage) diff --git a/lldb/examples/python/symbolication.py b/lldb/examples/python/symbolication.py index 3ac6acc0efd..fd4e500d668 100755 --- a/lldb/examples/python/symbolication.py +++ b/lldb/examples/python/symbolication.py @@ -214,7 +214,21 @@ class Image: def dump(self, prefix): print "%s%s" % (prefix, self) - + + def debug_dump(self): + print 'path = "%s"' % (self.path) + print 'resolved_path = "%s"' % (self.resolved_path) + print 'resolved = %i' % (self.resolved) + print 'unavailable = %i' % (self.unavailable) + print 'uuid = %s' % (self.uuid) + print 'section_infos = %s' % (self.section_infos) + print 'identifier = "%s"' % (self.identifier) + print 'version = %s' % (self.version) + print 'arch = %s' % (self.arch) + print 'module = %s' % (self.module) + print 'symfile = "%s"' % (self.symfile) + print 'slide = %i (0x%x)' % (self.slide, self.slide) + def __str__(self): s = "%s %s %s" % (self.get_uuid(), self.version, self.get_resolved_path()) for section_info in self.section_infos: diff --git a/lldb/include/lldb/Core/FileLineResolver.h b/lldb/include/lldb/Core/FileLineResolver.h index 50b9fb37990..e1928f1b063 100644 --- a/lldb/include/lldb/Core/FileLineResolver.h +++ b/lldb/include/lldb/Core/FileLineResolver.h @@ -12,6 +12,7 @@ // Project includes #include "lldb/Core/AddressResolver.h" +#include "lldb/Symbol/SymbolContext.h" namespace lldb_private { diff --git a/lldb/include/lldb/Core/Language.h b/lldb/include/lldb/Core/Language.h index 711fc63b1a0..670c6aa695e 100644 --- a/lldb/include/lldb/Core/Language.h +++ b/lldb/include/lldb/Core/Language.h @@ -74,7 +74,7 @@ public: /// The enumeration value that describes the programming /// language that an object is associated with. //------------------------------------------------------------------ - lldb::LanguageType + virtual lldb::LanguageType GetLanguage() const; //------------------------------------------------------------------ diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index c2f47756da1..9059435dc17 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -11,270 +11,16 @@ #define liblldb_Module_h_ #include "lldb/Core/ArchSpec.h" -#include "lldb/Core/Section.h" #include "lldb/Core/UUID.h" -#include "lldb/Symbol/ObjectFile.h" +#include "lldb/Host/FileSpec.h" #include "lldb/Host/Mutex.h" #include "lldb/Host/TimeValue.h" #include "lldb/Symbol/ClangASTContext.h" -#include "lldb/Symbol/CompileUnit.h" -#include "lldb/Symbol/SymbolContext.h" -#include "lldb/Symbol/Symtab.h" -#include "lldb/Symbol/TypeList.h" +#include "lldb/Symbol/SymbolContextScope.h" #include "lldb/Target/PathMappingList.h" - namespace lldb_private { -class ModuleSpec -{ -public: - ModuleSpec () : - m_file (), - m_platform_file (), - m_symbol_file (), - m_arch (), - m_uuid (), - m_object_name (), - m_object_offset (0), - m_source_mappings () - { - } - - ModuleSpec (const FileSpec &file_spec) : - m_file (file_spec), - m_platform_file (), - m_symbol_file (), - m_arch (), - m_uuid (), - m_object_name (), - m_object_offset (0), - m_source_mappings () - { - } - - ModuleSpec (const FileSpec &file_spec, const ArchSpec &arch) : - m_file (file_spec), - m_platform_file (), - m_symbol_file (), - m_arch (arch), - m_uuid (), - m_object_name (), - m_object_offset (0), - m_source_mappings () - { - } - - ModuleSpec (const ModuleSpec &rhs) : - m_file (rhs.m_file), - m_platform_file (rhs.m_platform_file), - m_symbol_file (rhs.m_symbol_file), - m_arch (rhs.m_arch), - m_uuid (rhs.m_uuid), - m_object_name (rhs.m_object_name), - m_object_offset (rhs.m_object_offset), - m_source_mappings (rhs.m_source_mappings) - { - } - - ModuleSpec & - operator = (const ModuleSpec &rhs) - { - if (this != &rhs) - { - m_file = rhs.m_file; - m_platform_file = rhs.m_platform_file; - m_symbol_file = rhs.m_symbol_file; - m_arch = rhs.m_arch; - m_uuid = rhs.m_uuid; - m_object_name = rhs.m_object_name; - m_object_offset = rhs.m_object_offset; - m_source_mappings = rhs.m_source_mappings; - } - return *this; - } - - FileSpec * - GetFileSpecPtr () - { - if (m_file) - return &m_file; - return NULL; - } - - const FileSpec * - GetFileSpecPtr () const - { - if (m_file) - return &m_file; - return NULL; - } - - FileSpec & - GetFileSpec () - { - return m_file; - } - const FileSpec & - GetFileSpec () const - { - return m_file; - } - - FileSpec * - GetPlatformFileSpecPtr () - { - if (m_platform_file) - return &m_platform_file; - return NULL; - } - - const FileSpec * - GetPlatformFileSpecPtr () const - { - if (m_platform_file) - return &m_platform_file; - return NULL; - } - - FileSpec & - GetPlatformFileSpec () - { - return m_platform_file; - } - - const FileSpec & - GetPlatformFileSpec () const - { - return m_platform_file; - } - - FileSpec * - GetSymbolFileSpecPtr () - { - if (m_symbol_file) - return &m_symbol_file; - return NULL; - } - - const FileSpec * - GetSymbolFileSpecPtr () const - { - if (m_symbol_file) - return &m_symbol_file; - return NULL; - } - - FileSpec & - GetSymbolFileSpec () - { - return m_symbol_file; - } - - const FileSpec & - GetSymbolFileSpec () const - { - return m_symbol_file; - } - - - ArchSpec * - GetArchitecturePtr () - { - if (m_arch.IsValid()) - return &m_arch; - return NULL; - } - - const ArchSpec * - GetArchitecturePtr () const - { - if (m_arch.IsValid()) - return &m_arch; - return NULL; - } - - ArchSpec & - GetArchitecture () - { - return m_arch; - } - - const ArchSpec & - GetArchitecture () const - { - return m_arch; - } - - UUID * - GetUUIDPtr () - { - if (m_uuid.IsValid()) - return &m_uuid; - return NULL; - } - - const UUID * - GetUUIDPtr () const - { - if (m_uuid.IsValid()) - return &m_uuid; - return NULL; - } - - UUID & - GetUUID () - { - return m_uuid; - } - - const UUID & - GetUUID () const - { - return m_uuid; - } - - ConstString & - GetObjectName () - { - return m_object_name; - } - - const ConstString & - GetObjectName () const - { - return m_object_name; - } - - uint64_t - GetObjectOffset () const - { - return m_object_offset; - } - - void - SetObjectOffset (uint64_t object_offset) - { - m_object_offset = object_offset; - } - - PathMappingList & - GetSourceMappingList () const - { - return m_source_mappings; - } - -protected: - FileSpec m_file; - FileSpec m_platform_file; - FileSpec m_symbol_file; - ArchSpec m_arch; - UUID m_uuid; - ConstString m_object_name; - uint64_t m_object_offset; - mutable PathMappingList m_source_mappings; -}; - //---------------------------------------------------------------------- /// @class Module Module.h "lldb/Core/Module.h" /// @brief A class that describes an executable image and its associated @@ -299,9 +45,6 @@ class Module : public SymbolContextScope { public: - friend class ModuleList; - friend bool ObjectFile::SetModulesArchitecture (const ArchSpec &new_arch); - // Static functions that can track the lifetime of moodule objects. // This is handy because we might have Module objects that are in // shared pointers that aren't in the global module list (from @@ -826,7 +569,7 @@ public: /// returned. The returned pointer is owned by this object and /// remains valid as long as the object is around. //------------------------------------------------------------------ - ObjectFile * + virtual ObjectFile * GetObjectFile (); // Load an object file from memory. @@ -848,7 +591,7 @@ public: /// will be returned. The returned pointer is owned by this /// object and remains valid as long as the object is around. //------------------------------------------------------------------ - SymbolVendor* + virtual SymbolVendor* GetSymbolVendor(bool can_create = true); //------------------------------------------------------------------ @@ -1179,6 +922,10 @@ protected: bool SetArchitecture (const ArchSpec &new_arch); + + friend class ModuleList; + friend class ObjectFile; + private: uint32_t diff --git a/lldb/include/lldb/Core/ModuleSpec.h b/lldb/include/lldb/Core/ModuleSpec.h new file mode 100644 index 00000000000..9446c76e17e --- /dev/null +++ b/lldb/include/lldb/Core/ModuleSpec.h @@ -0,0 +1,271 @@ +//===-- ModuleSpec.h --------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ModuleSpec_h_ +#define liblldb_ModuleSpec_h_ + +#include "lldb/Core/ArchSpec.h" +#include "lldb/Core/UUID.h" +#include "lldb/Host/FileSpec.h" +#include "lldb/Target/PathMappingList.h" + +namespace lldb_private { + +class ModuleSpec +{ +public: + ModuleSpec () : + m_file (), + m_platform_file (), + m_symbol_file (), + m_arch (), + m_uuid (), + m_object_name (), + m_object_offset (0), + m_source_mappings () + { + } + + ModuleSpec (const FileSpec &file_spec) : + m_file (file_spec), + m_platform_file (), + m_symbol_file (), + m_arch (), + m_uuid (), + m_object_name (), + m_object_offset (0), + m_source_mappings () + { + } + + ModuleSpec (const FileSpec &file_spec, const ArchSpec &arch) : + m_file (file_spec), + m_platform_file (), + m_symbol_file (), + m_arch (arch), + m_uuid (), + m_object_name (), + m_object_offset (0), + m_source_mappings () + { + } + + ModuleSpec (const ModuleSpec &rhs) : + m_file (rhs.m_file), + m_platform_file (rhs.m_platform_file), + m_symbol_file (rhs.m_symbol_file), + m_arch (rhs.m_arch), + m_uuid (rhs.m_uuid), + m_object_name (rhs.m_object_name), + m_object_offset (rhs.m_object_offset), + m_source_mappings (rhs.m_source_mappings) + { + } + + ModuleSpec & + operator = (const ModuleSpec &rhs) + { + if (this != &rhs) + { + m_file = rhs.m_file; + m_platform_file = rhs.m_platform_file; + m_symbol_file = rhs.m_symbol_file; + m_arch = rhs.m_arch; + m_uuid = rhs.m_uuid; + m_object_name = rhs.m_object_name; + m_object_offset = rhs.m_object_offset; + m_source_mappings = rhs.m_source_mappings; + } + return *this; + } + + FileSpec * + GetFileSpecPtr () + { + if (m_file) + return &m_file; + return NULL; + } + + const FileSpec * + GetFileSpecPtr () const + { + if (m_file) + return &m_file; + return NULL; + } + + FileSpec & + GetFileSpec () + { + return m_file; + } + const FileSpec & + GetFileSpec () const + { + return m_file; + } + + FileSpec * + GetPlatformFileSpecPtr () + { + if (m_platform_file) + return &m_platform_file; + return NULL; + } + + const FileSpec * + GetPlatformFileSpecPtr () const + { + if (m_platform_file) + return &m_platform_file; + return NULL; + } + + FileSpec & + GetPlatformFileSpec () + { + return m_platform_file; + } + + const FileSpec & + GetPlatformFileSpec () const + { + return m_platform_file; + } + + FileSpec * + GetSymbolFileSpecPtr () + { + if (m_symbol_file) + return &m_symbol_file; + return NULL; + } + + const FileSpec * + GetSymbolFileSpecPtr () const + { + if (m_symbol_file) + return &m_symbol_file; + return NULL; + } + + FileSpec & + GetSymbolFileSpec () + { + return m_symbol_file; + } + + const FileSpec & + GetSymbolFileSpec () const + { + return m_symbol_file; + } + + + ArchSpec * + GetArchitecturePtr () + { + if (m_arch.IsValid()) + return &m_arch; + return NULL; + } + + const ArchSpec * + GetArchitecturePtr () const + { + if (m_arch.IsValid()) + return &m_arch; + return NULL; + } + + ArchSpec & + GetArchitecture () + { + return m_arch; + } + + const ArchSpec & + GetArchitecture () const + { + return m_arch; + } + + UUID * + GetUUIDPtr () + { + if (m_uuid.IsValid()) + return &m_uuid; + return NULL; + } + + const UUID * + GetUUIDPtr () const + { + if (m_uuid.IsValid()) + return &m_uuid; + return NULL; + } + + UUID & + GetUUID () + { + return m_uuid; + } + + const UUID & + GetUUID () const + { + return m_uuid; + } + + ConstString & + GetObjectName () + { + return m_object_name; + } + + const ConstString & + GetObjectName () const + { + return m_object_name; + } + + uint64_t + GetObjectOffset () const + { + return m_object_offset; + } + + void + SetObjectOffset (uint64_t object_offset) + { + m_object_offset = object_offset; + } + + PathMappingList & + GetSourceMappingList () const + { + return m_source_mappings; + } + +protected: + FileSpec m_file; + FileSpec m_platform_file; + FileSpec m_symbol_file; + ArchSpec m_arch; + UUID m_uuid; + ConstString m_object_name; + uint64_t m_object_offset; + mutable PathMappingList m_source_mappings; +}; + +} // namespace lldb_private + +#endif // liblldb_ModuleSpec_h_ diff --git a/lldb/include/lldb/Core/SearchFilter.h b/lldb/include/lldb/Core/SearchFilter.h index 20db97e5556..70eee2e5746 100644 --- a/lldb/include/lldb/Core/SearchFilter.h +++ b/lldb/include/lldb/Core/SearchFilter.h @@ -15,11 +15,7 @@ // Other libraries and framework includes // Project includes #include "lldb/lldb-private.h" -#include "lldb/Core/Stream.h" -#include "lldb/Host/FileSpec.h" -#include "lldb/Core/Address.h" -#include "lldb/Symbol/SymbolContext.h" -#include "lldb/Core/Module.h" +#include "lldb/Core/FileSpecList.h" namespace lldb_private { diff --git a/lldb/include/lldb/Host/FileSpec.h b/lldb/include/lldb/Host/FileSpec.h index 3ff405e0489..0419651b004 100644 --- a/lldb/include/lldb/Host/FileSpec.h +++ b/lldb/include/lldb/Host/FileSpec.h @@ -330,6 +330,18 @@ public: const ConstString & GetFilename () const; + //------------------------------------------------------------------ + /// Returns true if the filespec represents an implementation source + /// file (files with a ".c", ".cpp", ".m", ".mm" (many more) + /// extension). + /// + /// @return + /// \b true if the filespec represents an implementation source + /// file, \b false otherwise. + //------------------------------------------------------------------ + bool + IsSourceImplementationFile () const; + TimeValue GetModificationTime () const; diff --git a/lldb/include/lldb/Interpreter/CommandCompletions.h b/lldb/include/lldb/Interpreter/CommandCompletions.h index c7e7a8933a4..ff2bbd593fe 100644 --- a/lldb/include/lldb/Interpreter/CommandCompletions.h +++ b/lldb/include/lldb/Interpreter/CommandCompletions.h @@ -12,6 +12,8 @@ // C Includes // C++ Includes +#include <set> + // Other libraries and framework includes // Project includes #include "lldb/lldb-private.h" diff --git a/lldb/include/lldb/Symbol/CompileUnit.h b/lldb/include/lldb/Symbol/CompileUnit.h index 31295498c00..2f209dd55cc 100644 --- a/lldb/include/lldb/Symbol/CompileUnit.h +++ b/lldb/include/lldb/Symbol/CompileUnit.h @@ -10,9 +10,9 @@ #ifndef liblldb_CompUnit_h_ #define liblldb_CompUnit_h_ +#include "lldb/lldb-enumerations.h" #include "lldb/Symbol/Function.h" #include "lldb/Core/FileSpecList.h" -#include "lldb/Core/Language.h" #include "lldb/Core/ModuleChild.h" #include "lldb/Core/Stream.h" #include "lldb/Core/UserID.h" @@ -36,7 +36,6 @@ class CompileUnit : public ModuleChild, public FileSpec, public UserID, - public Language, public SymbolContextScope { public: @@ -143,6 +142,15 @@ public: virtual void DumpSymbolContext(Stream *s); + lldb::LanguageType + GetLanguage(); + + void + SetLanguage(lldb::LanguageType language) + { + m_flags.Set(flagsParsedLanguage); + m_language = language; + } void GetDescription(Stream *s, lldb::DescriptionLevel level) const; @@ -388,6 +396,7 @@ public: protected: void *m_user_data; ///< User data for the SymbolFile parser to store information into. + lldb::LanguageType m_language; ///< The programming language enumeration value. Flags m_flags; ///< Compile unit flags that help with partial parsing. std::vector<lldb::FunctionSP> m_functions; ///< The sparsely populated list of shared pointers to functions ///< that gets populated as functions get partially parsed. @@ -398,10 +407,11 @@ protected: private: enum { - flagsParsedAllFunctions = (1 << 0), ///< Have we already parsed all our functions - flagsParsedVariables = (1 << 1), ///< Have we already parsed globals and statics? - flagsParsedSupportFiles = (1 << 2), ///< Have we already parsed the support files for this compile unit? - flagsParsedLineTable = (1 << 3) ///< Have we parsed the line table already? + flagsParsedAllFunctions = (1u << 0), ///< Have we already parsed all our functions + flagsParsedVariables = (1u << 1), ///< Have we already parsed globals and statics? + flagsParsedSupportFiles = (1u << 2), ///< Have we already parsed the support files for this compile unit? + flagsParsedLineTable = (1u << 3), ///< Have we parsed the line table already? + flagsParsedLanguage = (1u << 4) ///< Have we parsed the line table already? }; DISALLOW_COPY_AND_ASSIGN (CompileUnit); diff --git a/lldb/include/lldb/Symbol/ObjectFile.h b/lldb/include/lldb/Symbol/ObjectFile.h index 3144096ff28..4466e0232d6 100644 --- a/lldb/include/lldb/Symbol/ObjectFile.h +++ b/lldb/include/lldb/Symbol/ObjectFile.h @@ -175,6 +175,37 @@ public: lldb::addr_t header_addr, lldb::DataBufferSP &file_data_sp); + + //------------------------------------------------------------------ + /// Split a path into a file path with object name. + /// + /// For paths like "/tmp/foo.a(bar.o)" we often need to split a path + /// up into the actual path name and into the object name so we can + /// make a valid object file from it. + /// + /// @param[in] path_with_object + /// A path that might contain an archive path with a .o file + /// specified in parens in the basename of the path. + /// + /// @param[out] archive_file + /// If \b true is returned, \a file_spec will be filled in with + /// the path to the archive. + /// + /// @param[out] archive_object + /// If \b true is returned, \a object will be filled in with + /// the name of the object inside the archive. + /// + /// @return + /// \b true if the path matches the pattern of archive + object + /// and \a archive_file and \a archive_object are modified, + /// \b false otherwise and \a archive_file and \a archive_object + /// are guaranteed to be remain unchanged. + //------------------------------------------------------------------ + static bool + SplitArchivePathWithObject (const char *path_with_object, + lldb_private::FileSpec &archive_file, + lldb_private::ConstString &archive_object); + //------------------------------------------------------------------ /// Gets the address size in bytes for the current object file. /// diff --git a/lldb/include/lldb/Symbol/Symbol.h b/lldb/include/lldb/Symbol/Symbol.h index 3cb83c2cd7a..9043fe2503c 100644 --- a/lldb/include/lldb/Symbol/Symbol.h +++ b/lldb/include/lldb/Symbol/Symbol.h @@ -91,7 +91,7 @@ public: } const ConstString & - GetName () + GetName () const { return m_mangled.GetName(); } diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 13d02bd6dae..bac886aa9f5 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -120,6 +120,7 @@ public: virtual uint32_t GetNumCompileUnits() = 0; virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) = 0; + virtual lldb::LanguageType ParseCompileUnitLanguage (const SymbolContext& sc) = 0; virtual size_t ParseCompileUnitFunctions (const SymbolContext& sc) = 0; virtual bool ParseCompileUnitLineTable (const SymbolContext& sc) = 0; virtual bool ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files) = 0; diff --git a/lldb/include/lldb/Symbol/SymbolVendor.h b/lldb/include/lldb/Symbol/SymbolVendor.h index 9c2e989b097..de9f35c6538 100644 --- a/lldb/include/lldb/Symbol/SymbolVendor.h +++ b/lldb/include/lldb/Symbol/SymbolVendor.h @@ -62,6 +62,9 @@ public: virtual void Dump(Stream *s); + virtual lldb::LanguageType + ParseCompileUnitLanguage (const SymbolContext& sc); + virtual size_t ParseCompileUnitFunctions (const SymbolContext& sc); diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h index 4a81a780776..4252529b00c 100644 --- a/lldb/include/lldb/Target/Target.h +++ b/lldb/include/lldb/Target/Target.h @@ -19,6 +19,7 @@ #include "lldb/Breakpoint/BreakpointList.h" #include "lldb/Breakpoint/BreakpointLocationCollection.h" #include "lldb/Breakpoint/WatchpointList.h" +#include "lldb/Core/ArchSpec.h" #include "lldb/Core/Broadcaster.h" #include "lldb/Core/Event.h" #include "lldb/Core/ModuleList.h" @@ -39,6 +40,14 @@ namespace lldb_private { extern OptionEnumValueElement g_dynamic_value_types[]; +typedef enum InlineStrategy +{ + eInlineBreakpointsNever = 0, + eInlineBreakpointsHeaders, + eInlineBreakpointsAlways +} InlineStrategy; + + //---------------------------------------------------------------------- // TargetProperties //---------------------------------------------------------------------- @@ -71,6 +80,9 @@ public: void SetDisableSTDIO (bool b); + InlineStrategy + GetInlineStrategy () const; + bool GetRunArguments (Args &args) const; @@ -312,7 +324,7 @@ public: CreateBreakpoint (const FileSpecList *containingModules, const FileSpec &file, uint32_t line_no, - bool check_inlines, + LazyBool check_inlines = eLazyBoolCalculate, LazyBool skip_prologue = eLazyBoolCalculate, bool internal = false); diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 75bcda70686..139d67f198e 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -78,6 +78,7 @@ 260CC65215D0440D002BF2E0 /* OptionValueString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260CC64515D0440D002BF2E0 /* OptionValueString.cpp */; }; 260CC65315D0440D002BF2E0 /* OptionValueUInt64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260CC64615D0440D002BF2E0 /* OptionValueUInt64.cpp */; }; 260CC65415D0440D002BF2E0 /* OptionValueUUID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260CC64715D0440D002BF2E0 /* OptionValueUUID.cpp */; }; + 260D9B2715EC369500960137 /* ModuleSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 260D9B2615EC369500960137 /* ModuleSpec.h */; }; 260E07C6136FA69E00CF21D3 /* OptionGroupUUID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260E07C5136FA69E00CF21D3 /* OptionGroupUUID.cpp */; }; 260E07C8136FAB9200CF21D3 /* OptionGroupFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260E07C7136FAB9200CF21D3 /* OptionGroupFile.cpp */; }; 261744781168585B005ADD65 /* SBType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 261744771168585B005ADD65 /* SBType.cpp */; }; @@ -802,6 +803,7 @@ 260CC64515D0440D002BF2E0 /* OptionValueString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionValueString.cpp; path = source/Interpreter/OptionValueString.cpp; sourceTree = "<group>"; }; 260CC64615D0440D002BF2E0 /* OptionValueUInt64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionValueUInt64.cpp; path = source/Interpreter/OptionValueUInt64.cpp; sourceTree = "<group>"; }; 260CC64715D0440D002BF2E0 /* OptionValueUUID.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionValueUUID.cpp; path = source/Interpreter/OptionValueUUID.cpp; sourceTree = "<group>"; }; + 260D9B2615EC369500960137 /* ModuleSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ModuleSpec.h; path = include/lldb/Core/ModuleSpec.h; sourceTree = "<group>"; }; 260E07C3136FA68900CF21D3 /* OptionGroupUUID.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionGroupUUID.h; path = include/lldb/Interpreter/OptionGroupUUID.h; sourceTree = "<group>"; }; 260E07C5136FA69E00CF21D3 /* OptionGroupUUID.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionGroupUUID.cpp; path = source/Interpreter/OptionGroupUUID.cpp; sourceTree = "<group>"; }; 260E07C7136FAB9200CF21D3 /* OptionGroupFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionGroupFile.cpp; path = source/Interpreter/OptionGroupFile.cpp; sourceTree = "<group>"; }; @@ -2511,6 +2513,7 @@ 26BC7E8210F1B85900F91463 /* ModuleChild.cpp */, 26BC7D6C10F1B77400F91463 /* ModuleList.h */, 26BC7E8310F1B85900F91463 /* ModuleList.cpp */, + 260D9B2615EC369500960137 /* ModuleSpec.h */, 26651A15133BF9CC005B64B7 /* Opcode.h */, 26651A17133BF9DF005B64B7 /* Opcode.cpp */, 266DFE9813FD658300D0C574 /* OperatingSystem.h */, @@ -3388,6 +3391,7 @@ 26491E3B15E1DB8600CBFFC2 /* OptionValueRegex.h in Headers */, 2697A39515E404BA003E682C /* OptionValueArch.h in Headers */, 2698699D15E6CBD0002415FF /* OperatingSystemPython.h in Headers */, + 260D9B2715EC369500960137 /* ModuleSpec.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/lldb/source/API/SBFrame.cpp b/lldb/source/API/SBFrame.cpp index ceab3b72bdb..ca451918c39 100644 --- a/lldb/source/API/SBFrame.cpp +++ b/lldb/source/API/SBFrame.cpp @@ -24,6 +24,8 @@ #include "lldb/Expression/ClangUserExpression.h" #include "lldb/Host/Host.h" #include "lldb/Symbol/Block.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Symbol/Variable.h" diff --git a/lldb/source/API/SBInstruction.cpp b/lldb/source/API/SBInstruction.cpp index fa9058be7b8..2334cc0d124 100644 --- a/lldb/source/API/SBInstruction.cpp +++ b/lldb/source/API/SBInstruction.cpp @@ -17,6 +17,7 @@ #include "lldb/Core/ArchSpec.h" #include "lldb/Core/DataBufferHeap.h" +#include "lldb/Core/DataExtractor.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/EmulateInstruction.h" #include "lldb/Core/StreamFile.h" diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index 463669fe22c..44ac2d3b1e8 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -15,10 +15,13 @@ #include "lldb/API/SBSymbolContextList.h" #include "lldb/Core/Module.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Section.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/ValueObjectList.h" #include "lldb/Core/ValueObjectVariable.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolVendor.h" +#include "lldb/Symbol/Symtab.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp index e5569040c40..7130e334825 100644 --- a/lldb/source/API/SBProcess.cpp +++ b/lldb/source/API/SBProcess.cpp @@ -15,6 +15,7 @@ #include "lldb/Interpreter/Args.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/State.h" #include "lldb/Core/Stream.h" #include "lldb/Core/StreamFile.h" diff --git a/lldb/source/API/SBSection.cpp b/lldb/source/API/SBSection.cpp index 06a08d865f4..0f55f0169f3 100644 --- a/lldb/source/API/SBSection.cpp +++ b/lldb/source/API/SBSection.cpp @@ -16,6 +16,7 @@ #include "lldb/Core/Module.h" #include "lldb/Core/Section.h" #include "lldb/Core/StreamString.h" +#include "lldb/Symbol/ObjectFile.h" using namespace lldb; diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp index 7635a364901..df02778e184 100644 --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -31,14 +31,18 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/SearchFilter.h" +#include "lldb/Core/Section.h" #include "lldb/Core/STLUtils.h" #include "lldb/Core/ValueObjectList.h" #include "lldb/Core/ValueObjectVariable.h" #include "lldb/Host/FileSpec.h" #include "lldb/Host/Host.h" #include "lldb/Interpreter/Args.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/LanguageRuntime.h" @@ -1182,9 +1186,9 @@ SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t l { Mutex::Locker api_locker (target_sp->GetAPIMutex()); - const bool check_inlines = true; - const bool internal = false; + const LazyBool check_inlines = eLazyBoolCalculate; const LazyBool skip_prologue = eLazyBoolCalculate; + const bool internal = false; *sb_bp = target_sp->CreateBreakpoint (NULL, *sb_file_spec, line, check_inlines, skip_prologue, internal); } diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp index 3521e903d15..21f24a28993 100644 --- a/lldb/source/API/SBValue.cpp +++ b/lldb/source/API/SBValue.cpp @@ -21,6 +21,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" #include "lldb/Core/Scalar.h" +#include "lldb/Core/Section.h" #include "lldb/Core/Stream.h" #include "lldb/Core/StreamFile.h" #include "lldb/Core/Value.h" diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp index 5acfa9d39aa..095924fc359 100644 --- a/lldb/source/Breakpoint/Breakpoint.cpp +++ b/lldb/source/Breakpoint/Breakpoint.cpp @@ -22,6 +22,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/ModuleList.h" #include "lldb/Core/SearchFilter.h" +#include "lldb/Core/Section.h" #include "lldb/Core/Stream.h" #include "lldb/Core/StreamString.h" #include "lldb/Symbol/SymbolContext.h" diff --git a/lldb/source/Breakpoint/BreakpointID.cpp b/lldb/source/Breakpoint/BreakpointID.cpp index 691e5c07523..6180e4d856b 100644 --- a/lldb/source/Breakpoint/BreakpointID.cpp +++ b/lldb/source/Breakpoint/BreakpointID.cpp @@ -15,6 +15,7 @@ #include "lldb/Breakpoint/BreakpointID.h" #include "lldb/Breakpoint/Breakpoint.h" +#include "lldb/Core/Stream.h" using namespace lldb; using namespace lldb_private; diff --git a/lldb/source/Breakpoint/BreakpointLocation.cpp b/lldb/source/Breakpoint/BreakpointLocation.cpp index c0ae1c56b24..96ccce37ee6 100644 --- a/lldb/source/Breakpoint/BreakpointLocation.cpp +++ b/lldb/source/Breakpoint/BreakpointLocation.cpp @@ -13,16 +13,18 @@ // Other libraries and framework includes // Project includes +#include "lldb/lldb-private-log.h" #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Breakpoint/BreakpointID.h" #include "lldb/Breakpoint/StoppointCallbackContext.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/StreamString.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/Target/Target.h" -#include "lldb/Target/ThreadPlan.h" #include "lldb/Target/Process.h" -#include "lldb/Core/StreamString.h" -#include "lldb/lldb-private-log.h" #include "lldb/Target/Thread.h" #include "lldb/Target/ThreadSpec.h" diff --git a/lldb/source/Breakpoint/BreakpointLocationList.cpp b/lldb/source/Breakpoint/BreakpointLocationList.cpp index 250815890ec..8329912b11b 100644 --- a/lldb/source/Breakpoint/BreakpointLocationList.cpp +++ b/lldb/source/Breakpoint/BreakpointLocationList.cpp @@ -14,8 +14,7 @@ // Project includes #include "lldb/Breakpoint/BreakpointLocationList.h" #include "lldb/Breakpoint/BreakpointLocation.h" -#include "lldb/Core/ModuleList.h" -#include "lldb/Target/Target.h" +#include "lldb/Core/Section.h" using namespace lldb; using namespace lldb_private; diff --git a/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp b/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp index f1b8ac55cc1..45d54e73f3d 100644 --- a/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp +++ b/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp @@ -15,8 +15,10 @@ // Project includes #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/StreamString.h" -#include "lldb/Target/Target.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/Function.h" #include "lldb/lldb-private-log.h" using namespace lldb; diff --git a/lldb/source/Breakpoint/BreakpointResolverFileRegex.cpp b/lldb/source/Breakpoint/BreakpointResolverFileRegex.cpp index e4b596af55e..0f627a094eb 100644 --- a/lldb/source/Breakpoint/BreakpointResolverFileRegex.cpp +++ b/lldb/source/Breakpoint/BreakpointResolverFileRegex.cpp @@ -17,6 +17,7 @@ #include "lldb/Core/SourceManager.h" #include "lldb/Core/Log.h" #include "lldb/Core/StreamString.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Target/Target.h" #include "lldb/lldb-private-log.h" diff --git a/lldb/source/Breakpoint/BreakpointResolverName.cpp b/lldb/source/Breakpoint/BreakpointResolverName.cpp index 83d99f66ac0..86a536cf2c6 100644 --- a/lldb/source/Breakpoint/BreakpointResolverName.cpp +++ b/lldb/source/Breakpoint/BreakpointResolverName.cpp @@ -15,9 +15,13 @@ // Project includes #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/StreamString.h" #include "lldb/Symbol/ClangNamespaceDecl.h" -#include "lldb/Target/Target.h" +#include "lldb/Symbol/Block.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/Symbol.h" +#include "lldb/Symbol/SymbolContext.h" using namespace lldb; using namespace lldb_private; diff --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp index adeebe311e5..ab782d6bfd0 100644 --- a/lldb/source/Commands/CommandCompletions.cpp +++ b/lldb/source/Commands/CommandCompletions.cpp @@ -21,9 +21,11 @@ #include "lldb/Host/FileSpec.h" #include "lldb/Core/FileSpecList.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Module.h" #include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Target/Target.h" #include "lldb/Utility/CleanUp.h" diff --git a/lldb/source/Commands/CommandObjectArgs.cpp b/lldb/source/Commands/CommandObjectArgs.cpp index f9d6d02fa02..da5496123b1 100644 --- a/lldb/source/Commands/CommandObjectArgs.cpp +++ b/lldb/source/Commands/CommandObjectArgs.cpp @@ -14,13 +14,14 @@ // Other libraries and framework includes // Project includes #include "lldb/Interpreter/Args.h" +#include "lldb/Core/Debugger.h" +#include "lldb/Core/Module.h" #include "lldb/Core/Value.h" #include "lldb/Expression/ClangExpression.h" #include "lldb/Expression/ClangExpressionVariable.h" #include "lldb/Expression/ClangFunction.h" #include "lldb/Host/Host.h" #include "lldb/Interpreter/CommandInterpreter.h" -#include "lldb/Core/Debugger.h" #include "lldb/Interpreter/CommandReturnObject.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/Variable.h" diff --git a/lldb/source/Commands/CommandObjectBreakpoint.cpp b/lldb/source/Commands/CommandObjectBreakpoint.cpp index 6228333cdd6..95d533da5f5 100644 --- a/lldb/source/Commands/CommandObjectBreakpoint.cpp +++ b/lldb/source/Commands/CommandObjectBreakpoint.cpp @@ -91,7 +91,6 @@ public: m_filenames (), m_line_num (0), m_column (0), - m_check_inlines (true), m_func_names (), m_func_name_type_mask (eFunctionNameTypeNone), m_func_regexp (), @@ -104,7 +103,7 @@ public: m_thread_name(), m_queue_name(), m_catch_bp (false), - m_throw_bp (false), + m_throw_bp (true), m_language (eLanguageTypeUnknown), m_skip_prologue (eLazyBoolCalculate) { @@ -285,18 +284,19 @@ public: m_line_num = 0; m_column = 0; m_func_names.clear(); - m_func_name_type_mask = 0; + m_func_name_type_mask = eFunctionNameTypeNone; m_func_regexp.clear(); - m_load_addr = LLDB_INVALID_ADDRESS; + m_source_text_regexp.clear(); m_modules.Clear(); + m_load_addr = LLDB_INVALID_ADDRESS; m_ignore_count = 0; m_thread_id = LLDB_INVALID_THREAD_ID; m_thread_index = UINT32_MAX; m_thread_name.clear(); m_queue_name.clear(); - m_language = eLanguageTypeUnknown; m_catch_bp = false; m_throw_bp = true; + m_language = eLanguageTypeUnknown; m_skip_prologue = eLazyBoolCalculate; } @@ -316,7 +316,6 @@ public: FileSpecList m_filenames; uint32_t m_line_num; uint32_t m_column; - bool m_check_inlines; std::vector<std::string> m_func_names; uint32_t m_func_name_type_mask; std::string m_func_regexp; @@ -398,11 +397,14 @@ protected: } else file = m_options.m_filenames.GetFileSpecAtIndex(0); - + + // Only check for inline functions if + LazyBool check_inlines = eLazyBoolCalculate; + bp = target->CreateBreakpoint (&(m_options.m_modules), file, m_options.m_line_num, - m_options.m_check_inlines, + check_inlines, m_options.m_skip_prologue, internal).get(); } diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp index 5247743f6ad..38cfe322ddc 100644 --- a/lldb/source/Commands/CommandObjectDisassemble.cpp +++ b/lldb/source/Commands/CommandObjectDisassemble.cpp @@ -14,16 +14,17 @@ // Other libraries and framework includes // Project includes #include "lldb/Core/AddressRange.h" +#include "lldb/Core/Disassembler.h" +#include "lldb/Core/SourceManager.h" #include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" -#include "lldb/Core/Disassembler.h" #include "lldb/Interpreter/Options.h" -#include "lldb/Core/SourceManager.h" -#include "lldb/Target/StackFrame.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/Symbol.h" #include "lldb/Target/Process.h" +#include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" #define DEFAULT_DISASM_BYTE_SIZE 32 diff --git a/lldb/source/Commands/CommandObjectDisassemble.h b/lldb/source/Commands/CommandObjectDisassemble.h index e99edaccd5d..7587c0a97ca 100644 --- a/lldb/source/Commands/CommandObjectDisassemble.h +++ b/lldb/source/Commands/CommandObjectDisassemble.h @@ -14,6 +14,7 @@ // C++ Includes // Other libraries and framework includes // Project includes +#include "lldb/Core/ArchSpec.h" #include "lldb/Interpreter/CommandObject.h" #include "lldb/Interpreter/Options.h" diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp index 0874f01cf8c..ef1709f120b 100644 --- a/lldb/source/Commands/CommandObjectMemory.cpp +++ b/lldb/source/Commands/CommandObjectMemory.cpp @@ -16,6 +16,7 @@ #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Debugger.h" +#include "lldb/Core/Module.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/ValueObjectMemory.h" #include "lldb/Interpreter/Args.h" @@ -26,7 +27,7 @@ #include "lldb/Interpreter/OptionGroupOutputFile.h" #include "lldb/Interpreter/OptionGroupValueObjectDisplay.h" #include "lldb/Interpreter/OptionValueString.h" -#include "lldb/Symbol/ClangNamespaceDecl.h" +#include "lldb/Symbol/TypeList.h" #include "lldb/Target/Process.h" #include "lldb/Target/StackFrame.h" diff --git a/lldb/source/Commands/CommandObjectPlatform.cpp b/lldb/source/Commands/CommandObjectPlatform.cpp index 82de22a2cfb..64c05afc062 100644 --- a/lldb/source/Commands/CommandObjectPlatform.cpp +++ b/lldb/source/Commands/CommandObjectPlatform.cpp @@ -15,6 +15,7 @@ // Project includes #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Debugger.h" +#include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" #include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/CommandInterpreter.h" diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index c6b059aa0e6..e744b58dc5b 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -17,6 +17,7 @@ #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Breakpoint/BreakpointSite.h" #include "lldb/Core/State.h" +#include "lldb/Core/Module.h" #include "lldb/Host/Host.h" #include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/Options.h" diff --git a/lldb/source/Commands/CommandObjectSource.cpp b/lldb/source/Commands/CommandObjectSource.cpp index ec58e94d445..c4ccf2a2167 100644 --- a/lldb/source/Commands/CommandObjectSource.cpp +++ b/lldb/source/Commands/CommandObjectSource.cpp @@ -16,10 +16,13 @@ #include "lldb/Interpreter/Args.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/FileLineResolver.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/SourceManager.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" #include "lldb/Host/FileSpec.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/Function.h" #include "lldb/Target/Process.h" #include "lldb/Target/TargetList.h" #include "lldb/Interpreter/CommandCompletions.h" diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index cc83190cd49..15523b31f2e 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -18,6 +18,8 @@ #include "lldb/Interpreter/Args.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/InputReader.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/Section.h" #include "lldb/Core/State.h" #include "lldb/Core/Timer.h" @@ -34,6 +36,7 @@ #include "lldb/Interpreter/OptionGroupUInt64.h" #include "lldb/Interpreter/OptionGroupUUID.h" #include "lldb/Interpreter/OptionGroupValueObjectDisplay.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/FuncUnwinders.h" #include "lldb/Symbol/LineTable.h" #include "lldb/Symbol/ObjectFile.h" diff --git a/lldb/source/Commands/CommandObjectThread.cpp b/lldb/source/Commands/CommandObjectThread.cpp index f8deebc9ee1..7cb8273cf39 100644 --- a/lldb/source/Commands/CommandObjectThread.cpp +++ b/lldb/source/Commands/CommandObjectThread.cpp @@ -13,15 +13,16 @@ // C++ Includes // Other libraries and framework includes // Project includes -#include "lldb/Interpreter/Options.h" #include "lldb/Core/State.h" #include "lldb/Core/SourceManager.h" - #include "lldb/Host/Host.h" - #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" - +#include "lldb/Interpreter/Options.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/LineTable.h" +#include "lldb/Symbol/LineEntry.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/Target.h" @@ -31,8 +32,7 @@ #include "lldb/Target/ThreadPlanStepOut.h" #include "lldb/Target/ThreadPlanStepRange.h" #include "lldb/Target/ThreadPlanStepInRange.h" -#include "lldb/Symbol/LineTable.h" -#include "lldb/Symbol/LineEntry.h" + using namespace lldb; using namespace lldb_private; diff --git a/lldb/source/Core/Address.cpp b/lldb/source/Core/Address.cpp index d9ff36ecd40..2edd52f39b6 100644 --- a/lldb/source/Core/Address.cpp +++ b/lldb/source/Core/Address.cpp @@ -10,7 +10,9 @@ #include "lldb/Core/Address.h" #include "lldb/Core/Module.h" #include "lldb/Core/Section.h" +#include "lldb/Symbol/Block.h" #include "lldb/Symbol/ObjectFile.h" +#include "lldb/Symbol/Type.h" #include "lldb/Symbol/Variable.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/ExecutionContext.h" diff --git a/lldb/source/Core/AddressResolverFileLine.cpp b/lldb/source/Core/AddressResolverFileLine.cpp index 0da1feb51fc..9300f90dbc4 100644 --- a/lldb/source/Core/AddressResolverFileLine.cpp +++ b/lldb/source/Core/AddressResolverFileLine.cpp @@ -12,6 +12,8 @@ // Project includes #include "lldb/Core/Log.h" #include "lldb/Core/StreamString.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/SymbolContext.h" #include "lldb/lldb-private-log.h" using namespace lldb; diff --git a/lldb/source/Core/AddressResolverName.cpp b/lldb/source/Core/AddressResolverName.cpp index f1874202fec..3e7c373998b 100644 --- a/lldb/source/Core/AddressResolverName.cpp +++ b/lldb/source/Core/AddressResolverName.cpp @@ -11,8 +11,12 @@ // Project includes #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/StreamString.h" #include "lldb/Symbol/ClangNamespaceDecl.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/SymbolContext.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/lldb-private-log.h" using namespace lldb; diff --git a/lldb/source/Core/ConstString.cpp b/lldb/source/Core/ConstString.cpp index 720514bd52c..d82bc61fa91 100644 --- a/lldb/source/Core/ConstString.cpp +++ b/lldb/source/Core/ConstString.cpp @@ -100,6 +100,18 @@ public: } const char * + GetConstCStringWithStringRef (const llvm::StringRef &string_ref) + { + if (string_ref.data()) + { + Mutex::Locker locker (m_mutex); + StringPoolEntryType& entry = m_string_map.GetOrCreateValue (string_ref, (StringPoolValueType)NULL); + return entry.getKeyData(); + } + return NULL; + } + + const char * GetConstCStringAndSetMangledCounterPart (const char *demangled_cstr, const char *mangled_ccstr) { if (demangled_cstr) diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 23fbbadbace..57f63e8f454 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -19,6 +19,7 @@ #include "lldb/Core/DataVisualization.h" #include "lldb/Core/FormatManager.h" #include "lldb/Core/InputReader.h" +#include "lldb/Core/Module.h" #include "lldb/Core/RegisterValue.h" #include "lldb/Core/State.h" #include "lldb/Core/StreamAsynchronousIO.h" @@ -31,6 +32,10 @@ #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/OptionValueSInt64.h" #include "lldb/Interpreter/OptionValueString.h" +#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/TargetList.h" #include "lldb/Target/Process.h" diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index 6b6b6eeeddc..124fc4ac194 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -29,6 +29,7 @@ #include "lldb/Interpreter/OptionValueString.h" #include "lldb/Interpreter/OptionValueUInt64.h" #include "lldb/Symbol/ClangNamespaceDecl.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" diff --git a/lldb/source/Core/FileLineResolver.cpp b/lldb/source/Core/FileLineResolver.cpp index 8d68df2929b..59a875cf68b 100644 --- a/lldb/source/Core/FileLineResolver.cpp +++ b/lldb/source/Core/FileLineResolver.cpp @@ -13,6 +13,7 @@ #include "lldb/lldb-private-log.h" #include "lldb/Core/Log.h" #include "lldb/Core/StreamString.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/LineTable.h" using namespace lldb; diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index b3fac25a7c4..781853088f1 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -12,11 +12,14 @@ #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Log.h" #include "lldb/Core/ModuleList.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/RegularExpression.h" +#include "lldb/Core/Section.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/Timer.h" #include "lldb/Host/Host.h" #include "lldb/lldb-private-log.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/SymbolVendor.h" diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index 5507428c53e..657ee693457 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -15,6 +15,7 @@ // Project includes #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Host/Host.h" #include "lldb/Host/Symbols.h" #include "lldb/Symbol/ClangNamespaceDecl.h" diff --git a/lldb/source/Core/SearchFilter.cpp b/lldb/source/Core/SearchFilter.cpp index 9256899f196..60f7dbbe2a7 100644 --- a/lldb/source/Core/SearchFilter.cpp +++ b/lldb/source/Core/SearchFilter.cpp @@ -14,6 +14,8 @@ #include "lldb/lldb-private.h" #include "lldb/Core/SearchFilter.h" +#include "lldb/Core/Module.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Target/Target.h" using namespace lldb; @@ -368,26 +370,25 @@ SearchFilterByModule::ModulePasses (const ModuleSP &module_sp) bool SearchFilterByModule::ModulePasses (const FileSpec &spec) { - if (FileSpec::Compare(spec, m_module_spec, false) == 0) - return true; - else - return false; + // Do a full match only if "spec" has a directory + const bool full_match = spec.GetDirectory(); + return FileSpec::Equal(spec, m_module_spec, full_match); } bool -SearchFilterByModule::SymbolContextPasses -( - const SymbolContext &context, - lldb::SymbolContextItem scope - ) +SearchFilterByModule::SymbolContextPasses (const SymbolContext &sc, + lldb::SymbolContextItem scope) { - if (!(scope & eSymbolContextModule)) - return false; - - if (context.module_sp && FileSpec::Compare (context.module_sp->GetFileSpec(), m_module_spec, false) == 0) - return true; - else - return false; + if (scope & eSymbolContextModule) + { + if (sc.module_sp) + { + // Match the full path only if "m_module_spec" has a directory + const bool full_match = m_module_spec.GetDirectory(); + return FileSpec::Equal (sc.module_sp->GetFileSpec(), m_module_spec, full_match); + } + } + return false; } bool @@ -434,7 +435,8 @@ SearchFilterByModule::Search (Searcher &searcher) for (size_t i = 0; i < num_modules; i++) { Module* module = target_modules.GetModulePointerAtIndexUnlocked(i); - if (FileSpec::Compare (m_module_spec, module->GetFileSpec(), false) == 0) + const bool full_match = m_module_spec.GetDirectory(); + if (FileSpec::Equal (m_module_spec, module->GetFileSpec(), full_match)) { SymbolContext matchingContext(m_target_sp, module->shared_from_this()); Searcher::CallbackReturn shouldContinue; @@ -723,7 +725,7 @@ SearchFilterByModuleListAndCU::SymbolContextPasses return false; if (!(scope & eSymbolContextCompUnit)) return false; - if (context.comp_unit && m_cu_spec_list.FindFileIndex(0, static_cast<FileSpec>(context.comp_unit), false) == UINT32_MAX) + if (context.comp_unit && m_cu_spec_list.FindFileIndex(0, context.comp_unit, false) == UINT32_MAX) return false; return true; } @@ -745,7 +747,7 @@ SearchFilterByModuleListAndCU::CompUnitPasses (FileSpec &fileSpec) bool SearchFilterByModuleListAndCU::CompUnitPasses (CompileUnit &compUnit) { - return m_cu_spec_list.FindFileIndex(0, static_cast<FileSpec>(compUnit), false) != UINT32_MAX; + return m_cu_spec_list.FindFileIndex(0, compUnit, false) != UINT32_MAX; } void diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp index 849c8243e1a..a967b358cb7 100644 --- a/lldb/source/Core/SourceManager.cpp +++ b/lldb/source/Core/SourceManager.cpp @@ -15,8 +15,11 @@ // Project includes #include "lldb/Core/DataBuffer.h" #include "lldb/Core/Debugger.h" +#include "lldb/Core/Module.h" #include "lldb/Core/Stream.h" #include "lldb/Symbol/ClangNamespaceDecl.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 8016bab3d2e..ed370e66c12 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -22,6 +22,7 @@ #include "lldb/Core/DataVisualization.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/ValueObjectChild.h" #include "lldb/Core/ValueObjectConstResult.h" diff --git a/lldb/source/Core/ValueObjectVariable.cpp b/lldb/source/Core/ValueObjectVariable.cpp index d71ec97ce3c..20a4af078ee 100644 --- a/lldb/source/Core/ValueObjectVariable.cpp +++ b/lldb/source/Core/ValueObjectVariable.cpp @@ -18,6 +18,7 @@ #include "lldb/Core/ValueObjectList.h" #include "lldb/Core/Value.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/SymbolContextScope.h" diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp index 605747adb56..f94eb9c8e6c 100644 --- a/lldb/source/Expression/ClangASTSource.cpp +++ b/lldb/source/Expression/ClangASTSource.cpp @@ -17,6 +17,7 @@ #include "lldb/Expression/ClangASTSource.h" #include "lldb/Expression/ClangExpression.h" #include "lldb/Symbol/ClangNamespaceDecl.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/Expression/ClangUserExpression.cpp b/lldb/source/Expression/ClangUserExpression.cpp index 5e673c05ec9..194f5ab87b6 100644 --- a/lldb/source/Expression/ClangUserExpression.cpp +++ b/lldb/source/Expression/ClangUserExpression.cpp @@ -30,6 +30,7 @@ #include "lldb/Expression/ClangUserExpression.h" #include "lldb/Expression/ExpressionSourceCode.h" #include "lldb/Host/Host.h" +#include "lldb/Symbol/Block.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" diff --git a/lldb/source/Host/common/FileSpec.cpp b/lldb/source/Host/common/FileSpec.cpp index 2a6e339a322..0faa274a47f 100644 --- a/lldb/source/Host/common/FileSpec.cpp +++ b/lldb/source/Host/common/FileSpec.cpp @@ -28,6 +28,7 @@ #include "lldb/Host/FileSpec.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/DataBufferMemoryMap.h" +#include "lldb/Core/RegularExpression.h" #include "lldb/Core/Stream.h" #include "lldb/Host/Host.h" #include "lldb/Utility/CleanUp.h" @@ -702,15 +703,14 @@ FileSpec::GetPath(char *path, size_t path_max_len) const ConstString FileSpec::GetFileNameExtension () const { - const char *filename = m_filename.GetCString(); - if (filename == NULL) - return ConstString(); - - const char* dot_pos = strrchr(filename, '.'); - if (dot_pos == NULL) - return ConstString(); - - return ConstString(dot_pos+1); + if (m_filename) + { + const char *filename = m_filename.GetCString(); + const char* dot_pos = strrchr(filename, '.'); + if (dot_pos && dot_pos[1] != '\0') + return ConstString(dot_pos+1); + } + return ConstString(); } ConstString @@ -944,3 +944,26 @@ FileSpec::EnumerateDirectory return eEnumerateDirectoryResultNext; } +//------------------------------------------------------------------ +/// Returns true if the filespec represents an implementation source +/// file (files with a ".c", ".cpp", ".m", ".mm" (many more) +/// extension). +/// +/// @return +/// \b true if the filespec represents an implementation source +/// file, \b false otherwise. +//------------------------------------------------------------------ +bool +FileSpec::IsSourceImplementationFile () const +{ + ConstString extension (GetFileNameExtension()); + if (extension) + { + static RegularExpression g_source_file_regex ("^(c|m|mm|cpp|c\\+\\+|cxx|cc|cp|s|asm|f|f77|f90|f95|f03|for|ftn|fpp|ada|adb|ads)$", + REG_EXTENDED | REG_ICASE); + return g_source_file_regex.Execute (extension.GetCString()); + } + return false; +} + + diff --git a/lldb/source/Host/macosx/Symbols.cpp b/lldb/source/Host/macosx/Symbols.cpp index 9274decda0e..eb7341d6dad 100644 --- a/lldb/source/Host/macosx/Symbols.cpp +++ b/lldb/source/Host/macosx/Symbols.cpp @@ -22,6 +22,7 @@ #include "lldb/Core/DataBuffer.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/Timer.h" #include "lldb/Core/UUID.h" diff --git a/lldb/source/Interpreter/OptionValue.cpp b/lldb/source/Interpreter/OptionValue.cpp index 564fec8bc28..1f6b03ddac1 100644 --- a/lldb/source/Interpreter/OptionValue.cpp +++ b/lldb/source/Interpreter/OptionValue.cpp @@ -347,7 +347,7 @@ OptionValue::GetEnumerationValue (int64_t fail_value) const { const OptionValueEnumeration *option_value = GetAsEnumeration(); if (option_value) - option_value->GetCurrentValue(); + return option_value->GetCurrentValue(); return fail_value; } diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp index cb4f97f1de8..8c263d617ba 100644 --- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp +++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp @@ -14,6 +14,7 @@ #include "lldb/Core/Address.h" #include "lldb/Core/DataExtractor.h" +#include "lldb/Core/Module.h" #include "lldb/Core/Stream.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Target/ExecutionContext.h" diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp index fb7272de966..5edd3684108 100644 --- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp +++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp @@ -13,7 +13,9 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Section.h" #include "lldb/Core/State.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/ObjCLanguageRuntime.h" @@ -302,6 +304,31 @@ DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule ( return is_loaded; } +uint32_t +DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetAddressByteSize () +{ + if (module_sp) + return module_sp->GetArchitecture().GetAddressByteSize(); + return 0; +} + +lldb::ByteOrder +DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetByteOrder() +{ + if (module_sp) + return module_sp->GetArchitecture().GetByteOrder(); + return lldb::endian::InlHostByteOrder(); +} + +lldb_private::ArchSpec +DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetArchitecture () const +{ + if (module_sp) + return module_sp->GetArchitecture(); + return lldb_private::ArchSpec (); +} + + //---------------------------------------------------------------------- // Load the kernel module and initialize the "m_kernel" member. Return // true _only_ if the kernel is loaded the first time through (subsequent @@ -826,3 +853,25 @@ DynamicLoaderDarwinKernel::GetPluginVersion() return 1; } +lldb::ByteOrder +DynamicLoaderDarwinKernel::GetByteOrderFromMagic (uint32_t magic) +{ + switch (magic) + { + case llvm::MachO::HeaderMagic32: + case llvm::MachO::HeaderMagic64: + return lldb::endian::InlHostByteOrder(); + + case llvm::MachO::HeaderMagic32Swapped: + case llvm::MachO::HeaderMagic64Swapped: + if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) + return lldb::eByteOrderLittle; + else + return lldb::eByteOrderBig; + + default: + break; + } + return lldb::eByteOrderInvalid; +} + diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h index 005f5ea3903..9a6f90f7984 100644 --- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h +++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h @@ -119,26 +119,8 @@ protected: } static lldb::ByteOrder - GetByteOrderFromMagic (uint32_t magic) - { - switch (magic) - { - case llvm::MachO::HeaderMagic32: - case llvm::MachO::HeaderMagic64: - return lldb::endian::InlHostByteOrder(); - - case llvm::MachO::HeaderMagic32Swapped: - case llvm::MachO::HeaderMagic64Swapped: - if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) - return lldb::eByteOrderLittle; - else - return lldb::eByteOrderBig; - - default: - break; - } - return lldb::eByteOrderInvalid; - } + GetByteOrderFromMagic (uint32_t magic); + enum { KERNEL_MODULE_MAX_NAME = 64u, @@ -229,28 +211,13 @@ protected: } uint32_t - GetAddressByteSize () - { - if (module_sp) - return module_sp->GetArchitecture().GetAddressByteSize(); - return 0; - } + GetAddressByteSize (); lldb::ByteOrder - GetByteOrder() - { - if (module_sp) - return module_sp->GetArchitecture().GetByteOrder(); - return lldb::endian::InlHostByteOrder(); - } + GetByteOrder(); lldb_private::ArchSpec - GetArchitecture () const - { - if (module_sp) - return module_sp->GetArchitecture(); - return lldb_private::ArchSpec (); - } + GetArchitecture () const; void PutToLog (lldb_private::Log *log) const; diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp index bc87588f0ea..5504c64b673 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp @@ -15,8 +15,11 @@ #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Section.h" #include "lldb/Core/State.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/RegisterContext.h" @@ -1771,3 +1774,50 @@ DynamicLoaderMacOSXDYLD::GetPluginVersion() return 1; } +uint32_t +DynamicLoaderMacOSXDYLD::AddrByteSize() +{ + switch (m_dyld.header.magic) + { + case llvm::MachO::HeaderMagic32: + case llvm::MachO::HeaderMagic32Swapped: + return 4; + + case llvm::MachO::HeaderMagic64: + case llvm::MachO::HeaderMagic64Swapped: + return 8; + + default: + break; + } + return 0; +} + +lldb::ByteOrder +DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic (uint32_t magic) +{ + switch (magic) + { + case llvm::MachO::HeaderMagic32: + case llvm::MachO::HeaderMagic64: + return lldb::endian::InlHostByteOrder(); + + case llvm::MachO::HeaderMagic32Swapped: + case llvm::MachO::HeaderMagic64Swapped: + if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) + return lldb::eByteOrderLittle; + else + return lldb::eByteOrderBig; + + default: + break; + } + return lldb::eByteOrderInvalid; +} + +lldb::ByteOrder +DynamicLoaderMacOSXDYLD::DYLDImageInfo::GetByteOrder() +{ + return DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic(header.magic); +} + diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h index 9e7ec751f1c..f7e9ac5665a 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h @@ -118,45 +118,10 @@ protected: lldb::user_id_t break_loc_id); uint32_t - AddrByteSize() - { - switch (m_dyld.header.magic) - { - case llvm::MachO::HeaderMagic32: - case llvm::MachO::HeaderMagic32Swapped: - return 4; - - case llvm::MachO::HeaderMagic64: - case llvm::MachO::HeaderMagic64Swapped: - return 8; - - default: - break; - } - return 0; - } + AddrByteSize(); static lldb::ByteOrder - GetByteOrderFromMagic (uint32_t magic) - { - switch (magic) - { - case llvm::MachO::HeaderMagic32: - case llvm::MachO::HeaderMagic64: - return lldb::endian::InlHostByteOrder(); - - case llvm::MachO::HeaderMagic32Swapped: - case llvm::MachO::HeaderMagic64Swapped: - if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) - return lldb::eByteOrderLittle; - else - return lldb::eByteOrderBig; - - default: - break; - } - return lldb::eByteOrderInvalid; - } + GetByteOrderFromMagic (uint32_t magic); bool ReadMachHeader (lldb::addr_t addr, @@ -269,26 +234,7 @@ protected: } lldb::ByteOrder - GetByteOrder() - { - switch (header.magic) - { - case llvm::MachO::HeaderMagic32: // MH_MAGIC - case llvm::MachO::HeaderMagic64: // MH_MAGIC_64 - return lldb::endian::InlHostByteOrder(); - - case llvm::MachO::HeaderMagic32Swapped: // MH_CIGAM - case llvm::MachO::HeaderMagic64Swapped: // MH_CIGAM_64 - if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderLittle) - return lldb::eByteOrderBig; - else - return lldb::eByteOrderLittle; - default: - assert (!"invalid header.magic value"); - break; - } - return lldb::endian::InlHostByteOrder(); - } + GetByteOrder(); lldb_private::ArchSpec GetArchitecture () const diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp index ee643327c5b..404f4b1927b 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp @@ -13,6 +13,7 @@ #include "lldb/Core/ArchSpec.h" #include "lldb/Core/Error.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp index b863f11e097..251590fac16 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -12,6 +12,10 @@ // Other libraries and framework includes #include "lldb/Core/PluginManager.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" +#include "lldb/Core/Section.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" diff --git a/lldb/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp b/lldb/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp index ef79001fe76..9b15ea8e49c 100644 --- a/lldb/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp +++ b/lldb/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp @@ -9,6 +9,8 @@ #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Section.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Target.h" #include "DynamicLoaderStatic.h" diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp index 1797ef20abc..aaa3cd34f77 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp @@ -19,6 +19,8 @@ #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectMemory.h" #include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/Symbol.h" +#include "lldb/Symbol/TypeList.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/StopInfo.h" diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp index f00d947e774..1e0bf4d881f 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp @@ -25,11 +25,13 @@ #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/Scalar.h" +#include "lldb/Core/Section.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/ValueObjectConstResult.h" #include "lldb/Expression/ClangFunction.h" #include "lldb/Expression/ClangUtilityFunction.h" #include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp index 00c90c6eacd..fba909b8701 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp @@ -10,6 +10,7 @@ #include "AppleObjCSymbolVendor.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp index 4578801a0b3..d84bccd69b6 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp @@ -26,6 +26,7 @@ #include "lldb/Expression/ClangUtilityFunction.h" #include "lldb/Host/FileSpec.h" #include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" diff --git a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp index 1d9158ac93c..db4e25146de 100644 --- a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp +++ b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp @@ -15,7 +15,6 @@ #include "lldb/Core/ArchSpec.h" #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" -#include "lldb/Core/RegularExpression.h" #include "lldb/Core/Timer.h" #include "lldb/Host/Mutex.h" #include "lldb/Symbol/ObjectFile.h" diff --git a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp index 45d3cdc55e0..a5babca7947 100644 --- a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp +++ b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp @@ -18,6 +18,8 @@ // Project includes #include "lldb/Core/Error.h" #include "lldb/Core/Debugger.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Host/Host.h" diff --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp index c4dd4a8044f..74de15a7eb2 100644 --- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp +++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp @@ -20,6 +20,7 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleList.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/StreamString.h" #include "lldb/Host/FileSpec.h" diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp index 3bdff311379..dc5658ba703 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp @@ -16,7 +16,10 @@ #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/Error.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Host/Host.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Target.h" using namespace lldb; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp index 7b1a7274046..c22c1ab5969 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp @@ -18,6 +18,7 @@ #include "lldb/Core/Error.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleList.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/StreamString.h" #include "lldb/Host/FileSpec.h" diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp index 5dfa11bffc1..6e63bd2b062 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp @@ -18,6 +18,7 @@ #include "lldb/Core/Error.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleList.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/StreamString.h" #include "lldb/Host/FileSpec.h" diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp index 3c08a147246..948ce9fec36 100644 --- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp +++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp @@ -16,8 +16,10 @@ #include "lldb/Core/ConnectionFileDescriptor.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Module.h" #include "lldb/Core/State.h" #include "lldb/Host/Host.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" diff --git a/lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp b/lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp index a68f7d38def..4d634f421e7 100644 --- a/lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp +++ b/lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp @@ -10,6 +10,7 @@ #include "InferiorCallPOSIX.h" #include "lldb/Core/StreamFile.h" #include "lldb/Core/ValueObject.h" +#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp index cbc98d845b1..d811fee9366 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp @@ -13,13 +13,15 @@ #include "lldb/Core/AddressRange.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/RegisterValue.h" #include "lldb/Core/Value.h" +#include "lldb/Expression/DWARFExpression.h" #include "lldb/Symbol/FuncUnwinders.h" #include "lldb/Symbol/Function.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/Symbol.h" -#include "lldb/Expression/DWARFExpression.h" #include "lldb/Target/ABI.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" diff --git a/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp b/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp index 90913b961d5..ffce985c26b 100644 --- a/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp +++ b/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp @@ -12,6 +12,9 @@ // Other libraries and framework includes // Project includes #include "lldb/Core/ArchSpec.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/Symbol.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 7045f2ba050..26104e5f15a 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -31,6 +31,7 @@ #include "lldb/Host/FileSpec.h" #include "lldb/Core/InputReader.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/State.h" #include "lldb/Core/StreamFile.h" diff --git a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp index e9fe81e8b53..d82b6a72436 100644 --- a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp +++ b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp @@ -18,8 +18,12 @@ // Other libraries and framework includes #include "lldb/Core/Debugger.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" +#include "lldb/Core/Section.h" #include "lldb/Core/State.h" #include "lldb/Host/Host.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" @@ -452,3 +456,8 @@ ProcessMachCore::GetImageInfoAddress() } +lldb_private::ObjectFile * +ProcessMachCore::GetCoreObjectFile () +{ + return m_core_module_sp->GetObjectFile(); +} diff --git a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h index e20276f1da2..e5564a9dda3 100644 --- a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h +++ b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h @@ -121,10 +121,7 @@ protected: lldb_private::ThreadList &new_thread_list); lldb_private::ObjectFile * - GetCoreObjectFile () - { - return m_core_module_sp->GetObjectFile(); - } + GetCoreObjectFile (); private: bool GetDynamicLoaderAddress (lldb::addr_t addr); diff --git a/lldb/source/Plugins/Process/mach-core/ThreadMachCore.cpp b/lldb/source/Plugins/Process/mach-core/ThreadMachCore.cpp index c0eefe125b1..3568dc76b54 100644 --- a/lldb/source/Plugins/Process/mach-core/ThreadMachCore.cpp +++ b/lldb/source/Plugins/Process/mach-core/ThreadMachCore.cpp @@ -16,6 +16,7 @@ #include "lldb/Core/DataExtractor.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/State.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/StopInfo.h" diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index bce6c2f8134..954f13b87d8 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -229,7 +229,7 @@ SymbolFileDWARF::CreateInstance (ObjectFile* obj_file) TypeList * SymbolFileDWARF::GetTypeList () { - if (m_debug_map_symfile) + if (GetDebugMapSymfile ()) return m_debug_map_symfile->GetTypeList(); return m_obj_file->GetModule()->GetTypeList(); @@ -263,6 +263,7 @@ GetParentSymbolContextDIE(const DWARFDebugInfoEntry *child_die) 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_clang_tu_decl (NULL), m_flags(), @@ -321,7 +322,7 @@ GetDWARFMachOSegmentName () UniqueDWARFASTTypeMap & SymbolFileDWARF::GetUniqueDWARFASTTypeMap () { - if (m_debug_map_symfile) + if (GetDebugMapSymfile ()) return m_debug_map_symfile->GetUniqueDWARFASTTypeMap (); return m_unique_ast_type_map; } @@ -329,7 +330,7 @@ SymbolFileDWARF::GetUniqueDWARFASTTypeMap () ClangASTContext & SymbolFileDWARF::GetClangASTContext () { - if (m_debug_map_symfile) + if (GetDebugMapSymfile ()) return m_debug_map_symfile->GetClangASTContext (); ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext(); @@ -659,11 +660,27 @@ SymbolFileDWARF::DebugInfo() const } DWARFCompileUnit* -SymbolFileDWARF::GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid) +SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) { DWARFDebugInfo* info = DebugInfo(); - if (info && UserIDMatches(cu_uid)) - return info->GetCompileUnit((dw_offset_t)cu_uid).get(); + if (info) + { + if (GetDebugMapSymfile ()) + { + // The debug map symbol file made the compile units for this DWARF + // file which is .o file with DWARF in it, and we should have + // only 1 compile unit which is at offset zero in the DWARF. + // TODO: modify to support LTO .o files where each .o file might + // have multiple DW_TAG_compile_unit tags. + return info->GetCompileUnit(0).get(); + } + else + { + // Just a normal DWARF file whose user ID for the compile unit is + // the DWARF offset itself + return info->GetCompileUnit((dw_offset_t)comp_unit->GetID()).get(); + } + } return NULL; } @@ -704,59 +721,58 @@ SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) } else { - ModuleSP module_sp (m_obj_file->GetModule()); - if (module_sp) + if (GetDebugMapSymfile ()) + { + // Let the debug map create the compile unit + cu_sp = m_debug_map_symfile->GetCompileUnit(this); + dwarf_cu->SetUserData(cu_sp.get()); + } + else { - const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly (); - if (cu_die) + ModuleSP module_sp (m_obj_file->GetModule()); + if (module_sp) { - const char * cu_die_name = cu_die->GetName(this, dwarf_cu); - const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL); - LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0); - if (cu_die_name) + const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly (); + if (cu_die) { - std::string ramapped_file; - FileSpec cu_file_spec; - - if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0') - { - // 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 (module_sp->RemapSourceFile(cu_die_name, ramapped_file)) - cu_file_spec.SetFile (ramapped_file.c_str(), false); - else - cu_file_spec.SetFile (cu_die_name, false); - } - else + const char * cu_die_name = cu_die->GetName(this, dwarf_cu); + const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL); + LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0); + if (cu_die_name) { - std::string fullpath(cu_comp_dir); - if (*fullpath.rbegin() != '/') - fullpath += '/'; - fullpath += cu_die_name; - if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file)) - cu_file_spec.SetFile (ramapped_file.c_str(), false); - else - cu_file_spec.SetFile (fullpath.c_str(), false); - } + std::string ramapped_file; + FileSpec cu_file_spec; - cu_sp.reset(new CompileUnit (module_sp, - dwarf_cu, - cu_file_spec, - MakeUserID(dwarf_cu->GetOffset()), - cu_language)); - if (cu_sp) - { - dwarf_cu->SetUserData(cu_sp.get()); - - if (m_debug_map_symfile) + if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0') { - // Let the symbol file register the compile unit with - // the symbol vendor using its compile unit index - // when we are doing DWARF in .o files + debug map - m_debug_map_symfile->SetCompileUnit(this, cu_sp); + // 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 (module_sp->RemapSourceFile(cu_die_name, ramapped_file)) + cu_file_spec.SetFile (ramapped_file.c_str(), false); + else + cu_file_spec.SetFile (cu_die_name, false); } else { + std::string fullpath(cu_comp_dir); + if (*fullpath.rbegin() != '/') + fullpath += '/'; + fullpath += cu_die_name; + if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file)) + cu_file_spec.SetFile (ramapped_file.c_str(), false); + else + cu_file_spec.SetFile (fullpath.c_str(), false); + } + + cu_sp.reset(new CompileUnit (module_sp, + dwarf_cu, + cu_file_spec, + MakeUserID(dwarf_cu->GetOffset()), + cu_language)); + if (cu_sp) + { + 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); @@ -897,18 +913,33 @@ SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, DWARFCompile return NULL; } +lldb::LanguageType +SymbolFileDWARF::ParseCompileUnitLanguage (const SymbolContext& sc) +{ + assert (sc.comp_unit); + DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); + if (dwarf_cu) + { + const DWARFDebugInfoEntry *die = dwarf_cu->GetCompileUnitDIEOnly(); + const uint32_t language = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0); + if (language) + return (lldb::LanguageType)language; + } + return eLanguageTypeUnknown; +} + size_t SymbolFileDWARF::ParseCompileUnitFunctions(const SymbolContext &sc) { assert (sc.comp_unit); size_t functions_added = 0; - DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); + DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); if (dwarf_cu) { DWARFDIECollection function_dies; - const size_t num_funtions = dwarf_cu->AppendDIEsWithTag (DW_TAG_subprogram, 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_funtions; ++func_idx) + for (func_idx = 0; func_idx < num_functions; ++func_idx) { const DWARFDebugInfoEntry *die = function_dies.GetDIEPtrAtIndex(func_idx); if (sc.comp_unit->FindFunctionByUID (MakeUserID(die->GetOffset())).get() == NULL) @@ -926,7 +957,7 @@ bool SymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files) { assert (sc.comp_unit); - DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); + DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); assert (dwarf_cu); const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly(); @@ -1129,7 +1160,7 @@ SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc) if (sc.comp_unit->GetLineTable() != NULL) return true; - DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); + DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); if (dwarf_cu) { const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly(); @@ -1146,7 +1177,7 @@ SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc) m_obj_file->GetSectionList(), 0, 0, - m_debug_map_symfile != NULL, + GetDebugMapSymfile () != NULL, false, DWARFDebugLine::Row(), SectionSP(), @@ -2462,7 +2493,8 @@ SymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line, for (cu_idx = 0; (dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx) { CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx); - bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Compare(file_spec, *dc_cu, false) == 0; + const bool full_match = 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()); @@ -4339,7 +4371,7 @@ SymbolFileDWARF::Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu) } } } - if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo && m_debug_map_symfile) + 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; @@ -5399,7 +5431,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, // know it is false), so the real definition is in here somewhere type_sp = FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true); - if (!type_sp && m_debug_map_symfile) + if (!type_sp && GetDebugMapSymfile ()) { // We weren't able to find a full declaration in // this DWARF, see if we have a declaration anywhere @@ -5453,7 +5485,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, //type_sp = FindDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str); type_sp = FindDefinitionTypeForDWARFDeclContext (die_decl_ctx); - if (!type_sp && m_debug_map_symfile) + if (!type_sp && GetDebugMapSymfile ()) { // We weren't able to find a full declaration in // this DWARF, see if we have a declaration anywhere @@ -6333,7 +6365,7 @@ SymbolFileDWARF::ParseFunctionBlocks (const SymbolContext &sc) { assert(sc.comp_unit && sc.function); size_t functions_added = 0; - DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); + DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); if (dwarf_cu) { dw_offset_t function_die_offset = sc.function->GetID(); @@ -6354,7 +6386,7 @@ 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 = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); + DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); if (dwarf_cu) { if (sc.function) @@ -6619,7 +6651,7 @@ SymbolFileDWARF::ParseVariableDIE { scope = eValueTypeVariableGlobal; - if (m_debug_map_symfile) + if (GetDebugMapSymfile ()) { // When leaving the DWARF in the .o files on darwin, // when we have a global variable that wasn't initialized, @@ -7153,4 +7185,20 @@ SymbolFileDWARF::LayoutRecordType (const clang::RecordDecl *record_decl, } +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; +} + diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index f8f0846c2f0..64f7fc4e38d 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -43,6 +43,7 @@ //---------------------------------------------------------------------- // Forward Declarations for this DWARF plugin //---------------------------------------------------------------------- +class DebugMapModule; class DWARFAbbreviationDeclaration; class DWARFAbbreviationDeclarationSet; class DWARFileUnit; @@ -62,7 +63,7 @@ class SymbolFileDWARF : public lldb_private::SymbolFile, public lldb_private::Us { public: friend class SymbolFileDWARFDebugMap; - + friend class DebugMapModule; //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ @@ -95,6 +96,7 @@ public: virtual uint32_t GetNumCompileUnits(); virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index); + virtual lldb::LanguageType ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc); virtual size_t ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc); virtual bool ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc); virtual bool ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList& support_files); @@ -301,7 +303,7 @@ protected: DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF); lldb::CompUnitSP ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx); - DWARFCompileUnit* GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid); + DWARFCompileUnit* GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit); DWARFCompileUnit* GetNextUnparsedDWARFCompileUnit(DWARFCompileUnit* prev_cu); lldb_private::CompileUnit* GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx = UINT32_MAX); bool GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc); @@ -440,10 +442,13 @@ protected: void DumpIndexes(); - void SetDebugMapSymfile (SymbolFileDWARFDebugMap *debug_map_symfile) + void SetDebugMapModule (const lldb::ModuleSP &module_sp) { - m_debug_map_symfile = debug_map_symfile; + m_debug_map_module_wp = module_sp; } + + SymbolFileDWARFDebugMap * + GetDebugMapSymfile (); const DWARFDebugInfoEntry * FindBlockContainingSpecification (dw_offset_t func_die_offset, @@ -532,6 +537,7 @@ protected: DWARFCompileUnit* dst_cu, const DWARFDebugInfoEntry *dst_class_die); + lldb::ModuleWP m_debug_map_module_wp; SymbolFileDWARFDebugMap * m_debug_map_symfile; clang::TranslationUnitDecl * m_clang_tu_decl; lldb_private::Flags m_flags; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 0ed6843823b..4e1b41c74aa 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -13,10 +13,14 @@ #include "lldb/Core/ModuleList.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/RegularExpression.h" +#include "lldb/Core/Section.h" +#if defined(DEBUG_OSO_DMAP) #include "lldb/Core/StreamFile.h" +#endif #include "lldb/Core/Timer.h" #include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/VariableList.h" @@ -27,6 +31,248 @@ 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()" +// (so we can fixup the symbol file id. + +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) : + Module (file_spec, arch, object_name, object_offset), + m_exe_module_wp (exe_module_sp), + m_cu_idx (cu_idx) + { + } + + virtual ObjectFile * + GetObjectFile () + { + Mutex::Locker locker (m_mutex); + if (m_did_load_objfile == false) + { + ModuleSP exe_module_sp (m_exe_module_wp.lock()); + if (exe_module_sp) + { + ObjectFile *exe_objfile = exe_module_sp->GetObjectFile(); + ObjectFile *oso_objfile = Module::GetObjectFile(); + SymbolVendor *exe_sym_vendor = exe_module_sp->GetSymbolVendor(); + + if (exe_objfile && oso_objfile && exe_sym_vendor) + { + SymbolFileDWARFDebugMap *exe_symfile = (SymbolFileDWARFDebugMap *)exe_sym_vendor->GetSymbolFile(); + if (exe_symfile) + { + SymbolFileDWARFDebugMap::CompileUnitInfo *comp_unit_info = exe_symfile->GetCompUnitInfo (this); + if (comp_unit_info) + { + // 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. + //comp_unit_info->exe_sections_sp.reset(new SectionList); + + Symtab *exe_symtab = exe_objfile->GetSymtab(); + ModuleSP oso_module_sp (oso_objfile->GetModule()); + Symtab *oso_symtab = oso_objfile->GetSymtab(); + //#define DEBUG_OSO_DMAP // Do not check in with this defined... +#if defined(DEBUG_OSO_DMAP) + StreamFile s(stdout); + s << "OSO symtab:\n"; + oso_symtab->Dump(&s, NULL); + s << "OSO sections before:\n"; + oso_objfile->GetSectionList()->Dump(&s, NULL, true); +#endif + + ///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 eneded 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; + uint32_t sect_id = 0x10000; + 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(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny); + if (oso_fun_symbol) + { + // If we found the symbol, then we + SectionSP exe_fun_section (exe_symbol->GetAddress().GetSection()); + SectionSP oso_fun_section (oso_fun_symbol->GetAddress().GetSection()); + if (oso_fun_section) + { + // Now we create a section that we will add as a child of the + // section in which the .o symbol (the N_FUN) exists. + + // We use the exe_symbol size because the one in the .o file + // will just be a symbol with no size, and the exe_symbol + // size will reflect any size changes (ppc has been known to + // shrink function sizes when it gets rid of jump islands that + // aren't needed anymore). + SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddress().GetSection(), + oso_module_sp, // Module (the .o file) + sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs + exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated! + eSectionTypeDebug, + oso_fun_symbol->GetAddress().GetOffset(), // File VM address offset in the current section + exe_symbol->GetByteSize(), // File size (we need the size from the executable) + 0, 0, 0)); + + oso_fun_section_sp->SetLinkedLocation (exe_fun_section, + exe_symbol->GetAddress().GetFileAddress() - exe_fun_section->GetFileAddress()); + oso_fun_section->GetChildren().AddSection(oso_fun_section_sp); + } + } + } + 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(), + eSymbolTypeData, + Symtab::eDebugNo, + Symtab::eVisibilityAny); + + if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() && oso_gsym_symbol->ValueIsAddress()) + { + // If we found the symbol, then we + SectionSP exe_gsym_section (exe_symbol->GetAddress().GetSection()); + SectionSP oso_gsym_section (oso_gsym_symbol->GetAddress().GetSection()); + if (oso_gsym_section) + { + SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddress().GetSection(), + oso_module_sp, // Module (the .o file) + sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs + exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated! + eSectionTypeDebug, + oso_gsym_symbol->GetAddress().GetOffset(), // File VM address offset in the current section + 1, // We don't know the size of the global, just do the main address for now. + 0, 0, 0)); + + oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section, + exe_symbol->GetAddress().GetFileAddress() - exe_gsym_section->GetFileAddress()); + oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp); + } + } + } + break; + } + } + } + oso_objfile->GetSectionList()->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches +#if defined(DEBUG_OSO_DMAP) + s << "OSO sections after:\n"; + oso_objfile->GetSectionList()->Dump(&s, NULL, true); +#endif + } + } + } + } + } + return m_objfile_sp.get(); + } + + virtual SymbolVendor* + GetSymbolVendor(bool can_create = true) + { + // 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) + { + Mutex::Locker locker (m_mutex); + SymbolVendor* symbol_vendor = Module::GetSymbolVendor(can_create); + if (symbol_vendor) + { + // Set a 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 = (SymbolFileDWARF *)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) + { + if (oso_symfile->GetNumCompileUnits() == 1) + { + 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); + } + else + { + oso_symfile->SetID (UINT64_MAX); + } + } + return symbol_vendor; + } + } + } + return NULL; + } + +protected: + ModuleWP m_exe_module_wp; + const uint32_t m_cu_idx; +}; + void SymbolFileDWARFDebugMap::Initialize() { @@ -93,7 +339,7 @@ SymbolFileDWARFDebugMap::InitializeObject() void -SymbolFileDWARFDebugMap::InitOSO () +SymbolFileDWARFDebugMap::InitOSO() { if (m_flags.test(kHaveInitializedOSOs)) return; @@ -110,9 +356,10 @@ SymbolFileDWARFDebugMap::InitOSO () LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP)); std::vector<uint32_t> oso_indexes; +#if defined(DEBUG_OSO_DMAP) // StreamFile s(stdout); // symtab->Dump(&s, NULL, eSortOrderNone); - +#endif // 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. // @@ -138,24 +385,30 @@ SymbolFileDWARFDebugMap::InitOSO () for (uint32_t i=0; i<oso_index_count; ++i) { - m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1); - if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0) - m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2); - m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]); - uint32_t sibling_idx = m_compile_unit_infos[i].so_symbol->GetSiblingIndex(); + const Symbol *so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1); + const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]); + assert (so_symbol); + assert (oso_symbol); + assert (so_symbol->GetType() == eSymbolTypeSourceFile); + assert (oso_symbol->GetType() == eSymbolTypeObjectFile); + m_compile_unit_infos[i].so_file.SetFile(so_symbol->GetName().AsCString(), true); + m_compile_unit_infos[i].oso_file.SetFile(oso_symbol->GetName().AsCString(), true); + 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 <= i) { - 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", m_compile_unit_infos[i].so_symbol->GetID()); + 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 { - m_compile_unit_infos[i].last_symbol = symtab->SymbolAtIndex (sibling_idx - 1); - m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].so_symbol); - m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].last_symbol); + const Symbol* last_symbol = symtab->SymbolAtIndex (sibling_idx - 1); + m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(so_symbol); + m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(last_symbol); + 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, m_compile_unit_infos[i].oso_symbol->GetName().GetCString()); + log->Printf("Initialized OSO 0x%8.8x: file=%s", i, oso_symbol->GetName().GetCString()); } } } @@ -176,19 +429,33 @@ SymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_inf { if (comp_unit_info->oso_module_sp.get() == NULL && comp_unit_info->symbol_file_supported) { - Symbol *oso_symbol = comp_unit_info->oso_symbol; - if (oso_symbol) + if (!comp_unit_info->oso_file.Exists()) { - FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString(), true); - // 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. - comp_unit_info->oso_module_sp.reset (new Module (oso_file_spec, - m_obj_file->GetModule()->GetArchitecture(), - NULL, - 0)); + char path[PATH_MAX*2]; + comp_unit_info->oso_file.GetPath(path, sizeof(path)); + if (ObjectFile::SplitArchivePathWithObject (path, + comp_unit_info->oso_file, + comp_unit_info->oso_object)) + { + comp_unit_info->oso_file.GetPath(path, sizeof(path)); + //printf ("resolved archive '%s' and object '%s'\n", path, comp_unit_info->oso_object.GetCString()); + } + else + { + comp_unit_info->symbol_file_supported = false; + return false; + } } + // 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. + comp_unit_info->oso_module_sp.reset (new DebugMapModule (GetObjectFile()->GetModule(), + GetCompUnitInfoIndex(comp_unit_info), + comp_unit_info->oso_file, + m_obj_file->GetModule()->GetArchitecture(), + comp_unit_info->oso_object ? &comp_unit_info->oso_object : NULL, + 0)); } return comp_unit_info->oso_module_sp.get(); } @@ -199,19 +466,11 @@ 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) + if (m_compile_unit_infos[oso_idx].so_file) { - - if (m_compile_unit_infos[oso_idx].so_symbol == NULL) - return false; - - std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString()); - if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile) - so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString(); - m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str(), true); + file_spec = m_compile_unit_infos[oso_idx].so_file; + return true; } - file_spec = m_compile_unit_infos[oso_idx].so_file; - return true; } return false; } @@ -270,182 +529,13 @@ SymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx) SymbolFileDWARF * SymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) { - if (comp_unit_info->oso_symbol_vendor == NULL && comp_unit_info->symbol_file_supported) + Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info); + if (oso_module) { - ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info); - - if (oso_objfile) - { - comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor(); -// SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile); -// comp_unit_info->oso_dwarf_sp.reset (oso_dwarf); - if (comp_unit_info->oso_symbol_vendor) - { - // Set a 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 = (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile(); - - if (!oso_symfile) - return NULL; - - if (oso_symfile->GetNumCompileUnits() != 1) - { - oso_symfile->GetObjectFile()->GetModule()->ReportError ("DWARF for object file '%s' contains multiple translation units!", - oso_symfile->GetObjectFile()->GetFileSpec().GetFilename().AsCString()); - comp_unit_info->symbol_file_supported = false; - comp_unit_info->oso_module_sp.reset(); - comp_unit_info->oso_compile_unit_sp.reset(); - comp_unit_info->oso_symbol_vendor = NULL; - return NULL; - } - - oso_symfile->SetDebugMapSymfile(this); - // 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)GetCompUnitInfoIndex(comp_unit_info) + 1ull) << 32ull); - comp_unit_info->debug_map_sections_sp.reset(new SectionList); - - Symtab *exe_symtab = m_obj_file->GetSymtab(); - ModuleSP oso_module_sp (oso_objfile->GetModule()); - Symtab *oso_symtab = oso_objfile->GetSymtab(); -//#define DEBUG_OSO_DMAP // Do not check in with this defined... -#if defined(DEBUG_OSO_DMAP) - StreamFile s(stdout); - s << "OSO symtab:\n"; - oso_symtab->Dump(&s, NULL); - s << "OSO sections before:\n"; - oso_objfile->GetSectionList()->Dump(&s, NULL, true); -#endif - - ///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 eneded up in the main executable. - uint32_t oso_start_idx = exe_symtab->GetIndexForSymbol (comp_unit_info->oso_symbol); - assert (oso_start_idx != UINT32_MAX); - oso_start_idx += 1; - const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex(); - uint32_t sect_id = 0x10000; - for (uint32_t idx = oso_start_idx; 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(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny); - if (oso_fun_symbol) - { - // If we found the symbol, then we - SectionSP exe_fun_section (exe_symbol->GetAddress().GetSection()); - SectionSP oso_fun_section (oso_fun_symbol->GetAddress().GetSection()); - if (oso_fun_section) - { - // Now we create a section that we will add as a child of the - // section in which the .o symbol (the N_FUN) exists. - - // We use the exe_symbol size because the one in the .o file - // will just be a symbol with no size, and the exe_symbol - // size will reflect any size changes (ppc has been known to - // shrink function sizes when it gets rid of jump islands that - // aren't needed anymore). - SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddress().GetSection(), - oso_module_sp, // Module (the .o file) - sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs - exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated! - eSectionTypeDebug, - oso_fun_symbol->GetAddress().GetOffset(), // File VM address offset in the current section - exe_symbol->GetByteSize(), // File size (we need the size from the executable) - 0, 0, 0)); - - oso_fun_section_sp->SetLinkedLocation (exe_fun_section, - exe_symbol->GetAddress().GetFileAddress() - exe_fun_section->GetFileAddress()); - oso_fun_section->GetChildren().AddSection(oso_fun_section_sp); - comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp); - } - } - } - 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(), - eSymbolTypeData, - Symtab::eDebugNo, - Symtab::eVisibilityAny); - - if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() && oso_gsym_symbol->ValueIsAddress()) - { - // If we found the symbol, then we - SectionSP exe_gsym_section (exe_symbol->GetAddress().GetSection()); - SectionSP oso_gsym_section (oso_gsym_symbol->GetAddress().GetSection()); - if (oso_gsym_section) - { - SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddress().GetSection(), - oso_module_sp, // Module (the .o file) - sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs - exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated! - eSectionTypeDebug, - oso_gsym_symbol->GetAddress().GetOffset(), // File VM address offset in the current section - 1, // We don't know the size of the global, just do the main address for now. - 0, 0, 0)); - - oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section, - exe_symbol->GetAddress().GetFileAddress() - exe_gsym_section->GetFileAddress()); - oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp); - comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp); - } - } - } - break; - } - } - } - oso_objfile->GetSectionList()->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches - comp_unit_info->debug_map_sections_sp->Finalize(); -#if defined(DEBUG_OSO_DMAP) - s << "OSO sections after:\n"; - oso_objfile->GetSectionList()->Dump(&s, NULL, true); -#endif - } - } + SymbolVendor *sym_vendor = oso_module->GetSymbolVendor(); + if (sym_vendor) + return (SymbolFileDWARF *)sym_vendor->GetSymbolFile(); } - if (comp_unit_info->oso_symbol_vendor) - return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile(); return NULL; } @@ -468,16 +558,19 @@ SymbolFileDWARFDebugMap::CalculateAbilities () SymbolFile::VariableTypes | SymbolFile::LineTables; - for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx) - { - SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); - if (oso_dwarf) - { - uint32_t oso_abilities = oso_dwarf->GetAbilities(); - if ((oso_abilities & dwarf_abilities) == dwarf_abilities) - return oso_abilities; - } - } + InitOSO(); + if (!m_compile_unit_infos.empty()) + return dwarf_abilities; +// for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx) +// { +// SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); +// if (oso_dwarf) +// { +// uint32_t oso_abilities = oso_dwarf->GetAbilities(); +// if ((oso_abilities & dwarf_abilities) == dwarf_abilities) +// return oso_abilities; +// } +// } } return 0; } @@ -501,30 +594,34 @@ SymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx) if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL && m_compile_unit_infos[cu_idx].symbol_file_supported) { - SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx); - if (oso_dwarf) + FileSpec so_file_spec; + if (GetFileSpecForSO (cu_idx, so_file_spec)) { - // There is only one compile unit for N_OSO entry right now, so - // it will always exist at index zero. - m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0); - } + Module *oso_module = GetModuleByOSOIndex (cu_idx); + if (oso_module) + { + // 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].oso_compile_unit_sp.reset (new CompileUnit (oso_module->shared_from_this(), + NULL, + so_file_spec, + cu_id, + eLanguageTypeUnknown)); + } - if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL) - { - // We weren't able to get the DWARF for this N_OSO entry (the - // .o file may be missing or not at the specified path), make - // one up as best we can from the debug map. We set the uid - // of the compile unit to the symbol index with the MSBit set - // so that it doesn't collide with any uid values from the DWARF - Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol; - if (so_symbol) + if (!m_compile_unit_infos[cu_idx].oso_compile_unit_sp) { m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(), NULL, - so_symbol->GetMangled().GetName().AsCString(), + so_file_spec, cu_idx, eLanguageTypeUnknown)); - + } + + if (m_compile_unit_infos[cu_idx].oso_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].oso_compile_unit_sp); @@ -549,6 +646,28 @@ SymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc) return NULL; } + +SymbolFileDWARFDebugMap::CompileUnitInfo * +SymbolFileDWARFDebugMap::GetCompUnitInfo (const lldb_private::Module *module) +{ + const uint32_t cu_count = GetNumCompileUnits(); + for (uint32_t i=0; i<cu_count; ++i) + { + if (module == m_compile_unit_infos[i].oso_module_sp.get()) + return &m_compile_unit_infos[i]; + } + return NULL; +} + +lldb::LanguageType +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) { @@ -602,7 +721,7 @@ SymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc) { SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); if (oso_dwarf) - return oso_dwarf->ParseTypes (sc); + return oso_dwarf->ParseVariablesForContext (sc); return 0; } @@ -669,24 +788,31 @@ SymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint3 uint32_t SymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) { - uint32_t initial = sc_list.GetSize(); + const uint32_t initial = sc_list.GetSize(); const uint32_t cu_count = GetNumCompileUnits(); - FileSpec so_file_spec; for (uint32_t i=0; i<cu_count; ++i) { - if (GetFileSpecForSO (i, so_file_spec)) + // 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) { - // By passing false to the comparison we will be able to match - // and files given a filename only. If both file_spec and - // so_file_spec have directories, we will still do a full match. - if (FileSpec::Compare (file_spec, so_file_spec, false) == 0) + FileSpec so_file_spec; + if (GetFileSpecForSO (i, so_file_spec)) { - SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i); - if (oso_dwarf) - oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list); + // Match the full path if the incoming file_spec has a directory (not just a basename) + const bool full_match = 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; } @@ -825,10 +951,10 @@ SymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, { const user_id_t symbol_id = *symbol_idx_ptr; - if (symbol_id < comp_unit_info->so_symbol->GetID()) + if (symbol_id < comp_unit_info->first_symbol_id) return -1; - if (symbol_id <= comp_unit_info->last_symbol->GetID()) + if (symbol_id <= comp_unit_info->last_symbol_id) return 0; return 1; @@ -1113,23 +1239,49 @@ SymbolFileDWARFDebugMap::GetPluginVersion() return 1; } -void -SymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp) +lldb::CompUnitSP +SymbolFileDWARFDebugMap::GetCompileUnit (SymbolFileDWARF *oso_dwarf) { - const uint32_t cu_count = GetNumCompileUnits(); - for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx) + if (oso_dwarf) { - if (m_compile_unit_infos[cu_idx].oso_symbol_vendor && - m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetSymbolFile() == oso_dwarf) + const uint32_t cu_count = GetNumCompileUnits(); + for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx) { - if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp) + SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]); + if (oso_symfile == oso_dwarf) { - assert (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == cu_sp.get()); + if (!m_compile_unit_infos[cu_idx].oso_compile_unit_sp) + m_compile_unit_infos[cu_idx].oso_compile_unit_sp = ParseCompileUnitAtIndex (cu_idx); + + return m_compile_unit_infos[cu_idx].oso_compile_unit_sp; } - else + } + } + assert(!"this shouldn't happen"); + return lldb::CompUnitSP(); +} + + +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) { - m_compile_unit_infos[cu_idx].oso_compile_unit_sp = cu_sp; - m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp); + if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp) + { + assert (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == cu_sp.get()); + } + else + { + m_compile_unit_infos[cu_idx].oso_compile_unit_sp = cu_sp; + m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp); + } } } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index d7b69e0b23e..ecc6f67a686 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -24,10 +24,12 @@ class SymbolFileDWARF; class DWARFCompileUnit; class DWARFDebugInfoEntry; class DWARFDeclContext; +class DebugMapModule; class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile { public: + //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ @@ -62,6 +64,7 @@ public: virtual uint32_t GetNumCompileUnits (); virtual lldb::CompUnitSP ParseCompileUnitAtIndex (uint32_t index); + virtual lldb::LanguageType ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc); virtual size_t ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc); virtual bool ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc); virtual bool ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList &support_files); @@ -125,39 +128,41 @@ protected: }; friend class SymbolFileDWARF; - + friend class DebugMapModule; //------------------------------------------------------------------ // Class specific types //------------------------------------------------------------------ struct CompileUnitInfo { lldb_private::FileSpec so_file; - lldb_private::Symbol *so_symbol; - lldb_private::Symbol *oso_symbol; - lldb_private::Symbol *last_symbol; + lldb_private::FileSpec oso_file; + lldb_private::ConstString oso_object; // for archives this will be the .o file in the "oso_file" +// lldb_private::Symbol *so_symbol; +// lldb_private::Symbol *oso_symbol; +// lldb_private::Symbol *last_symbol; uint32_t first_symbol_index; uint32_t last_symbol_index; + uint32_t first_symbol_id; + uint32_t last_symbol_id; lldb::ModuleSP oso_module_sp; lldb::CompUnitSP oso_compile_unit_sp; - lldb_private::SymbolVendor *oso_symbol_vendor; - std::vector<uint32_t> function_indexes; - std::vector<uint32_t> static_indexes; - STD_SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp; +// SymbolFileDWARF *oso_symfile; bool symbol_file_supported; CompileUnitInfo() : so_file (), - so_symbol (NULL), - oso_symbol (NULL), - last_symbol (NULL), + oso_file (), + oso_object (), +// so_symbol (NULL), +// oso_symbol (NULL), +// last_symbol (NULL), first_symbol_index (UINT32_MAX), last_symbol_index (UINT32_MAX), + first_symbol_id (UINT32_MAX), + last_symbol_id (UINT32_MAX), oso_module_sp (), oso_compile_unit_sp (), - oso_symbol_vendor (NULL), - function_indexes (), - static_indexes (), - debug_map_sections_sp (), +// oso_symfile (NULL), symbol_file_supported (true) { } @@ -180,6 +185,9 @@ protected: CompileUnitInfo * GetCompUnitInfo (const lldb_private::SymbolContext& sc); + CompileUnitInfo * + GetCompUnitInfo (const lldb_private::Module *oso_module); + lldb_private::Module * GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info); @@ -227,6 +235,9 @@ protected: void SetCompileUnit (SymbolFileDWARF *oso_dwarf, const lldb::CompUnitSP &cu_sp); + lldb::CompUnitSP + GetCompileUnit (SymbolFileDWARF *oso_dwarf); + lldb::TypeSP FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx); diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp index 5404ab0f8fd..1e1a0f203f3 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp @@ -12,13 +12,14 @@ #include "lldb/Core/PluginManager.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/Timer.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/ObjectFile.h" -#include "lldb/Symbol/Symtab.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/Symbol.h" -#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/SymbolContext.h" -#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/Symtab.h" +#include "lldb/Symbol/TypeList.h" using namespace lldb; using namespace lldb_private; @@ -157,6 +158,13 @@ SymbolFileSymtab::ParseCompileUnitAtIndex(uint32_t idx) return cu_sp; } +lldb::LanguageType +SymbolFileSymtab::ParseCompileUnitLanguage (const SymbolContext& sc) +{ + return eLanguageTypeUnknown; +} + + size_t SymbolFileSymtab::ParseCompileUnitFunctions (const SymbolContext &sc) { diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h index bb40f128416..3c90b112d80 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h @@ -54,6 +54,9 @@ public: virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index); + virtual lldb::LanguageType + ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc); + virtual size_t ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc); diff --git a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp index 4dc1d0ae8ac..53acf8d6cea 100644 --- a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp +++ b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp @@ -16,6 +16,7 @@ #include <AvailabilityMacros.h> #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/Section.h" #include "lldb/Core/StreamString.h" diff --git a/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp b/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp index 1a2b2244fdc..1a176471189 100644 --- a/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp +++ b/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp @@ -14,6 +14,7 @@ #include "lldb/Core/Address.h" #include "lldb/Core/ArchSpec.h" #include "lldb/Core/DataBufferHeap.h" +#include "lldb/Core/DataExtractor.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/Error.h" #include "lldb/Core/Log.h" diff --git a/lldb/source/Symbol/CompileUnit.cpp b/lldb/source/Symbol/CompileUnit.cpp index ac57d88a3ae..fbcf45b72fe 100644 --- a/lldb/source/Symbol/CompileUnit.cpp +++ b/lldb/source/Symbol/CompileUnit.cpp @@ -8,8 +8,9 @@ //===----------------------------------------------------------------------===// #include "lldb/Symbol/CompileUnit.h" -#include "lldb/Symbol/LineTable.h" #include "lldb/Core/Module.h" +#include "lldb/Core/Language.h" +#include "lldb/Symbol/LineTable.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/VariableList.h" @@ -20,14 +21,16 @@ CompileUnit::CompileUnit (const lldb::ModuleSP &module_sp, void *user_data, cons ModuleChild(module_sp), FileSpec (pathname, false), UserID(cu_sym_id), - Language (language), m_user_data (user_data), + m_language (language), m_flags (0), m_functions (), m_support_files (), m_line_table_ap (), m_variables() { + if (language != eLanguageTypeUnknown) + m_flags.Set(flagsParsedLanguage); assert(module_sp); } @@ -35,14 +38,16 @@ CompileUnit::CompileUnit (const lldb::ModuleSP &module_sp, void *user_data, cons ModuleChild(module_sp), FileSpec (fspec), UserID(cu_sym_id), - Language (language), m_user_data (user_data), + m_language (language), m_flags (0), m_functions (), m_support_files (), m_line_table_ap (), m_variables() { + if (language != eLanguageTypeUnknown) + m_flags.Set(flagsParsedLanguage); assert(module_sp); } @@ -80,7 +85,8 @@ CompileUnit::DumpSymbolContext(Stream *s) void CompileUnit::GetDescription(Stream *s, lldb::DescriptionLevel level) const { - *s << "id = " << (const UserID&)*this << ", file = \"" << (const FileSpec&)*this << "\", language = \"" << (const Language&)*this << '"'; + Language language(m_language); + *s << "id = " << (const UserID&)*this << ", file = \"" << (const FileSpec&)*this << "\", language = \"" << language << '"'; } @@ -208,6 +214,26 @@ CompileUnit::FindFunctionByUID (lldb::user_id_t func_uid) } +lldb::LanguageType +CompileUnit::GetLanguage() +{ + if (m_language == eLanguageTypeUnknown) + { + if (m_flags.IsClear(flagsParsedLanguage)) + { + m_flags.Set(flagsParsedLanguage); + SymbolVendor* symbol_vendor = GetModule()->GetSymbolVendor(); + if (symbol_vendor) + { + SymbolContext sc; + CalculateSymbolContext(&sc); + m_language = symbol_vendor->ParseCompileUnitLanguage(sc); + } + } + } + return m_language; +} + LineTable* CompileUnit::GetLineTable() { @@ -298,7 +324,8 @@ CompileUnit::ResolveSymbolContext // "file_spec" has an empty directory, then only compare the basenames // when finding file indexes std::vector<uint32_t> file_indexes; - bool file_spec_matches_cu_file_spec = FileSpec::Equal(file_spec, *this, !file_spec.GetDirectory().IsEmpty()); + const bool full_match = file_spec.GetDirectory(); + bool file_spec_matches_cu_file_spec = FileSpec::Equal(file_spec, *this, full_match); // If we are not looking for inlined functions and our file spec doesn't // match then we are done... diff --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp index 7469b10e2ae..a26ddceb9a6 100644 --- a/lldb/source/Symbol/ObjectFile.cpp +++ b/lldb/source/Symbol/ObjectFile.cpp @@ -15,11 +15,13 @@ #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/RegularExpression.h" +#include "lldb/Core/Section.h" #include "lldb/Core/Timer.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/ObjectContainer.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Target/Process.h" +#include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h" using namespace lldb; using namespace lldb_private; @@ -39,7 +41,7 @@ ObjectFile::FindPlugin (const lldb::ModuleSP &module_sp, const FileSpec* file, a if (file) { // Memory map the entire file contents - if (!file_data_sp) + if (!file_data_sp && file_size > 0) { assert (file_offset == 0); file_data_sp = file->MemoryMapFileContents(file_offset, file_size); @@ -51,22 +53,15 @@ ObjectFile::FindPlugin (const lldb::ModuleSP &module_sp, const FileSpec* file, a char path_with_object[PATH_MAX*2]; module_sp->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object)); - RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$"); - if (g_object_regex.Execute (path_with_object, 2)) + FileSpec archive_file; + ConstString archive_object; + if (ObjectFile::SplitArchivePathWithObject (path_with_object, archive_file, archive_object)) { - FileSpec archive_file; - std::string path; - std::string object; - if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) && - g_object_regex.GetMatchAtIndex (path_with_object, 2, object)) + file_size = archive_file.GetByteSize(); + if (file_size > 0) { - archive_file.SetFile (path.c_str(), false); - file_size = archive_file.GetByteSize(); - if (file_size > 0) - { - module_sp->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str())); - file_data_sp = archive_file.MemoryMapFileContents(file_offset, file_size); - } + module_sp->SetFileSpecAndObjectName (archive_file, archive_object); + file_data_sp = archive_file.MemoryMapFileContents(file_offset, file_size); } } } @@ -455,3 +450,23 @@ ObjectFile::MemoryMapSectionData (const Section *section, DataExtractor& section return 0; } + +bool +ObjectFile::SplitArchivePathWithObject (const char *path_with_object, FileSpec &archive_file, ConstString &archive_object) +{ + RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$"); + if (g_object_regex.Execute (path_with_object, 2)) + { + std::string path; + std::string obj; + if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) && + g_object_regex.GetMatchAtIndex (path_with_object, 2, obj)) + { + archive_file.SetFile (path.c_str(), false); + archive_object.SetCString(obj.c_str()); + return true; + } + } + return false; +} + diff --git a/lldb/source/Symbol/Symbol.cpp b/lldb/source/Symbol/Symbol.cpp index 6f9d6d571c0..3a8a333cb75 100644 --- a/lldb/source/Symbol/Symbol.cpp +++ b/lldb/source/Symbol/Symbol.cpp @@ -12,6 +12,8 @@ #include "lldb/Core/Module.h" #include "lldb/Core/Section.h" #include "lldb/Core/Stream.h" +#include "lldb/Symbol/ObjectFile.h" +#include "lldb/Symbol/Symtab.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index b2bb97fd30b..f0b5380e708 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -11,6 +11,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Host/Host.h" #include "lldb/Interpreter/Args.h" #include "lldb/Symbol/Block.h" diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp index 7443eae98c9..32b02857cf7 100644 --- a/lldb/source/Symbol/SymbolVendor.cpp +++ b/lldb/source/Symbol/SymbolVendor.cpp @@ -15,6 +15,8 @@ // Project includes #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Stream.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolFile.h" @@ -150,6 +152,20 @@ SymbolVendor::GetNumCompileUnits() return m_compile_units.size(); } +lldb::LanguageType +SymbolVendor::ParseCompileUnitLanguage (const SymbolContext& sc) +{ + ModuleSP module_sp(GetModule()); + if (module_sp) + { + lldb_private::Mutex::Locker locker(module_sp->GetMutex()); + if (m_sym_file_ap.get()) + return m_sym_file_ap->ParseCompileUnitLanguage(sc); + } + return eLanguageTypeUnknown; +} + + size_t SymbolVendor::ParseCompileUnitFunctions (const SymbolContext &sc) { diff --git a/lldb/source/Symbol/Variable.cpp b/lldb/source/Symbol/Variable.cpp index df008737e6d..8172875f8a3 100644 --- a/lldb/source/Symbol/Variable.cpp +++ b/lldb/source/Symbol/Variable.cpp @@ -9,6 +9,7 @@ #include "lldb/Symbol/Variable.h" +#include "lldb/Core/Module.h" #include "lldb/Core/Stream.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/ValueObject.h" diff --git a/lldb/source/Symbol/VariableList.cpp b/lldb/source/Symbol/VariableList.cpp index ad47c6017ff..251fea82c4d 100644 --- a/lldb/source/Symbol/VariableList.cpp +++ b/lldb/source/Symbol/VariableList.cpp @@ -52,9 +52,12 @@ VariableList::AddVariableIfUnique (const lldb::VariableSP &var_sp) void VariableList::AddVariables(VariableList *variable_list) { - std::copy( variable_list->m_variables.begin(), // source begin - variable_list->m_variables.end(), // source end - back_inserter(m_variables)); // destination + if (variable_list) + { + std::copy(variable_list->m_variables.begin(), // source begin + variable_list->m_variables.end(), // source end + back_inserter(m_variables)); // destination + } } void diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp index db51729ee99..c41db3c7eb5 100644 --- a/lldb/source/Target/ObjCLanguageRuntime.cpp +++ b/lldb/source/Target/ObjCLanguageRuntime.cpp @@ -9,10 +9,12 @@ #include "clang/AST/Type.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/ValueObject.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/Type.h" +#include "lldb/Symbol/TypeList.h" #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index 3fcd9dfe174..666daaa651d 100644 --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -16,6 +16,7 @@ #include "lldb/Breakpoint/BreakpointIDList.h" #include "lldb/Core/Error.h" #include "lldb/Core/Log.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Host/FileSpec.h" #include "lldb/Host/Host.h" diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 454cf3a51e6..b16a37de3d1 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -18,6 +18,7 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/InputReader.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/State.h" #include "lldb/Expression/ClangUserExpression.h" diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index 6099ed2f890..614223d97ff 100644 --- a/lldb/source/Target/StackFrame.cpp +++ b/lldb/source/Target/StackFrame.cpp @@ -19,7 +19,10 @@ #include "lldb/Core/Value.h" #include "lldb/Core/ValueObjectVariable.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/Function.h" +#include "lldb/Symbol/Symbol.h" +#include "lldb/Symbol/SymbolContextScope.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 289944fe6ff..2298a1fa3a0 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -22,6 +22,9 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/Event.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" +#include "lldb/Core/Section.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/Timer.h" #include "lldb/Core/ValueObject.h" @@ -226,9 +229,9 @@ Target::GetBreakpointByID (break_id_t break_id) BreakpointSP Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules, - const FileSpecList *source_file_spec_list, - RegularExpression &source_regex, - bool internal) + const FileSpecList *source_file_spec_list, + RegularExpression &source_regex, + bool internal) { SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list)); BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex)); @@ -240,13 +243,37 @@ BreakpointSP Target::CreateBreakpoint (const FileSpecList *containingModules, const FileSpec &file, uint32_t line_no, - bool check_inlines, + LazyBool check_inlines, LazyBool skip_prologue, bool internal) { SearchFilterSP filter_sp(GetSearchFilterForModuleList (containingModules)); - BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, file, line_no, check_inlines, + if (check_inlines == eLazyBoolCalculate) + { + const InlineStrategy inline_strategy = GetInlineStrategy(); + switch (inline_strategy) + { + case eInlineBreakpointsNever: + check_inlines = eLazyBoolNo; + break; + + case eInlineBreakpointsHeaders: + if (file.IsSourceImplementationFile()) + check_inlines = eLazyBoolNo; + else + check_inlines = eLazyBoolYes; + break; + + case eInlineBreakpointsAlways: + check_inlines = eLazyBoolYes; + break; + } + } + BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, + file, + line_no, + check_inlines, skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); return CreateBreakpoint (filter_sp, resolver_sp, internal); } @@ -2092,6 +2119,15 @@ lldb_private::g_dynamic_value_types[] = { 0, NULL, NULL } }; +static OptionEnumValueElement +g_inline_breakpoint_enums[] = +{ + { eInlineBreakpointsNever, "never", "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."}, + { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."}, + { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."}, + { 0, NULL, NULL } +}; + static PropertyDefinition g_properties[] = { @@ -2117,6 +2153,13 @@ g_properties[] = { "error-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." }, { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" }, { "disable-stdio" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" }, + { "inline-breakpoint-strategy" , OptionValue::eTypeEnum , false, eInlineBreakpointsHeaders , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. " + "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. " + "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. " + "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. " + "Always checking for inlined breakpoint locations can be expensive (memory and time), so we try to minimize the " + "times we look for inlined locations. This setting allows you to control exactly which strategy is used when settings " + "file and line breakpoints." }, { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL } }; enum @@ -2138,7 +2181,8 @@ enum ePropertyOutputPath, ePropertyErrorPath, ePropertyDisableASLR, - ePropertyDisableSTDIO + ePropertyDisableSTDIO, + ePropertyInlineStrategy }; @@ -2314,6 +2358,13 @@ TargetProperties::SetDisableSTDIO (bool b) m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); } +InlineStrategy +TargetProperties::GetInlineStrategy () const +{ + const uint32_t idx = ePropertyInlineStrategy; + return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); +} + bool TargetProperties::GetRunArguments (Args &args) const { diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index 850179aa4fc..94f0d7e285c 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -14,6 +14,7 @@ #include "lldb/Core/Broadcaster.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/Event.h" +#include "lldb/Core/Module.h" #include "lldb/Core/State.h" #include "lldb/Core/Timer.h" #include "lldb/Host/Host.h" diff --git a/lldb/source/Target/ThreadPlanCallFunction.cpp b/lldb/source/Target/ThreadPlanCallFunction.cpp index c7ee7996b0a..0491d34a26d 100644 --- a/lldb/source/Target/ThreadPlanCallFunction.cpp +++ b/lldb/source/Target/ThreadPlanCallFunction.cpp @@ -19,7 +19,9 @@ #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Core/Address.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/Stream.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/LanguageRuntime.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp index 44ede3ad700..4e628e7d0b0 100644 --- a/lldb/source/Target/ThreadPlanStepOut.cpp +++ b/lldb/source/Target/ThreadPlanStepOut.cpp @@ -18,6 +18,9 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Value.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Symbol/Block.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/Type.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/StopInfo.h" diff --git a/lldb/source/Target/ThreadPlanTracer.cpp b/lldb/source/Target/ThreadPlanTracer.cpp index 5ae17913f50..87e5e1964fb 100644 --- a/lldb/source/Target/ThreadPlanTracer.cpp +++ b/lldb/source/Target/ThreadPlanTracer.cpp @@ -19,6 +19,7 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" #include "lldb/Core/State.h" #include "lldb/Core/Value.h" #include "lldb/Symbol/TypeList.h" diff --git a/lldb/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py b/lldb/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py index 3faa6380948..b4eeb02bda2 100644 --- a/lldb/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py +++ b/lldb/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py @@ -37,9 +37,20 @@ class InlinedBreakpointsTestCase(TestBase): exe = os.path.join(os.getcwd(), "a.out") self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) + # Set a breakpoint and fail because it is in an inlined source implemenation file self.expect("breakpoint set -f basic_type.cpp -l %d" % self.line, BREAKPOINT_CREATED, - startstr = "Breakpoint created: 1: file ='basic_type.cpp', line = %d, locations = 1" % + startstr = "Breakpoint created: 1: file ='basic_type.cpp', line = %d, locations = 0 (pending)" % self.line) + + # Now enable breakpoints in implementation files and see the breakpoint set succeed + self.runCmd('settings set target.inline-breakpoint-strategy always') + # And add hooks to restore the settings during tearDown(). + self.addTearDownHook( + lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers")) + + self.expect("breakpoint set -f basic_type.cpp -l %d" % self.line, + BREAKPOINT_CREATED, + startstr = "Breakpoint created: 2: file ='basic_type.cpp', line = %d, locations = 1" % self.line) self.runCmd("run", RUN_SUCCEEDED) diff --git a/lldb/test/types/AbstractBase.py b/lldb/test/types/AbstractBase.py index b48d07410e6..2580d574c70 100644 --- a/lldb/test/types/AbstractBase.py +++ b/lldb/test/types/AbstractBase.py @@ -107,6 +107,13 @@ class GenericTester(TestBase): gl.append((var, val)) #print "golden list:", gl + # This test uses a #include of a the "basic_type.cpp" so we need to enable + # always setting inlined breakpoints. + self.runCmd('settings set target.inline-breakpoint-strategy always') + # And add hooks to restore the settings during tearDown(). + self.addTearDownHook( + lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers")) + # Bring the program to the point where we can issue a series of # 'frame variable -T' command. if blockCaptured: @@ -184,6 +191,13 @@ class GenericTester(TestBase): gl.append((var, val)) #print "golden list:", gl + # This test uses a #include of a the "basic_type.cpp" so we need to enable + # always setting inlined breakpoints. + self.runCmd('settings set target.inline-breakpoint-strategy always') + # And add hooks to restore the settings during tearDown(). + self.addTearDownHook( + lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers")) + # Bring the program to the point where we can issue a series of # 'expr' command. if blockCaptured: |