summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
Diffstat (limited to 'lldb')
-rw-r--r--lldb/include/lldb/Core/Address.h3
-rw-r--r--lldb/include/lldb/Core/ArchSpec.h3
-rw-r--r--lldb/include/lldb/Core/Debugger.h41
-rw-r--r--lldb/include/lldb/Host/Host.h5
-rw-r--r--lldb/include/lldb/Interpreter/Args.h3
-rw-r--r--lldb/include/lldb/Symbol/ObjectFile.h17
-rw-r--r--lldb/include/lldb/Target/Platform.h167
-rw-r--r--lldb/include/lldb/Target/Process.h4
-rw-r--r--lldb/include/lldb/Target/Target.h10
-rw-r--r--lldb/include/lldb/lldb-enumerations.h15
-rw-r--r--lldb/include/lldb/lldb-forward.h1
-rw-r--r--lldb/lldb.xcodeproj/project.pbxproj22
-rw-r--r--lldb/source/Breakpoint/Breakpoint.cpp2
-rw-r--r--lldb/source/Breakpoint/BreakpointLocationList.cpp2
-rw-r--r--lldb/source/Breakpoint/BreakpointSiteList.cpp2
-rw-r--r--lldb/source/Commands/CommandObjectFrame.cpp20
-rw-r--r--lldb/source/Commands/CommandObjectPlatform.cpp306
-rw-r--r--lldb/source/Commands/CommandObjectPlatform.h45
-rw-r--r--lldb/source/Commands/CommandObjectProcess.cpp4
-rw-r--r--lldb/source/Core/Address.cpp13
-rw-r--r--lldb/source/Core/ArchSpec.cpp6
-rw-r--r--lldb/source/Core/Debugger.cpp43
-rw-r--r--lldb/source/Core/PluginManager.cpp192
-rw-r--r--lldb/source/Host/macosx/Host.mm45
-rw-r--r--lldb/source/Interpreter/Args.cpp41
-rw-r--r--lldb/source/Interpreter/CommandInterpreter.cpp2
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp34
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h1
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp103
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h3
-rw-r--r--lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp117
-rw-r--r--lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h18
-rw-r--r--lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp613
-rw-r--r--lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h123
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp48
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h6
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp49
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h6
-rw-r--r--lldb/source/Symbol/ObjectFile.cpp85
-rw-r--r--lldb/source/Target/Platform.cpp190
-rw-r--r--lldb/source/Target/Process.cpp14
-rw-r--r--lldb/source/Target/Target.cpp33
-rw-r--r--lldb/source/Target/TargetList.cpp8
-rw-r--r--lldb/source/lldb.cpp3
44 files changed, 2086 insertions, 382 deletions
diff --git a/lldb/include/lldb/Core/Address.h b/lldb/include/lldb/Core/Address.h
index 01f036216c6..c26e80e2c0c 100644
--- a/lldb/include/lldb/Core/Address.h
+++ b/lldb/include/lldb/Core/Address.h
@@ -246,6 +246,9 @@ public:
DumpStyle fallback_style = DumpStyleInvalid,
uint32_t addr_byte_size = UINT32_MAX) const;
+ lldb::AddressClass
+ GetAddressClass () const;
+
//------------------------------------------------------------------
/// Get the file address.
///
diff --git a/lldb/include/lldb/Core/ArchSpec.h b/lldb/include/lldb/Core/ArchSpec.h
index 69fff9fb2fa..98413c0eab9 100644
--- a/lldb/include/lldb/Core/ArchSpec.h
+++ b/lldb/include/lldb/Core/ArchSpec.h
@@ -43,6 +43,9 @@ public:
eCore_arm_armv5t,
eCore_arm_armv6,
eCore_arm_armv7,
+ eCore_arm_armv7f,
+ eCore_arm_armv7k,
+ eCore_arm_armv7s,
eCore_arm_xscale,
eCore_ppc_generic,
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index 06e5b90b9dc..de0a91d0f59 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -24,6 +24,7 @@
#include "lldb/Core/UserID.h"
#include "lldb/Core/UserSettingsController.h"
#include "lldb/Target/ExecutionContext.h"
+#include "lldb/Target/Platform.h"
#include "lldb/Target/TargetList.h"
namespace lldb_private {
@@ -320,16 +321,29 @@ public:
}
CommandInterpreter &
- GetCommandInterpreter ();
+ GetCommandInterpreter ()
+ {
+ assert (m_command_interpreter_ap.get());
+ return *m_command_interpreter_ap;
+ }
Listener &
- GetListener ();
+ GetListener ()
+ {
+ return m_listener;
+ }
SourceManager &
- GetSourceManager ();
+ GetSourceManager ()
+ {
+ return m_source_manager;
+ }
lldb::TargetSP
- GetSelectedTarget ();
+ GetSelectedTarget ()
+ {
+ return m_target_list.GetSelectedTarget ();
+ }
ExecutionContext
GetSelectedExecutionContext();
@@ -344,8 +358,17 @@ public:
/// @return
/// A global shared target list.
//------------------------------------------------------------------
- TargetList&
- GetTargetList ();
+ TargetList &
+ GetTargetList ()
+ {
+ return m_target_list;
+ }
+
+ PlatformList &
+ GetPlatformList ()
+ {
+ return m_platform_list;
+ }
void
DispatchInputInterrupt ();
@@ -410,13 +433,17 @@ protected:
CheckIfTopInputReaderIsDone ();
void
- DisconnectInput();
+ DisconnectInput()
+ {
+ m_input_comm.Clear ();
+ }
Communication m_input_comm;
StreamFile m_input_file;
StreamFile m_output_file;
StreamFile m_error_file;
TargetList m_target_list;
+ PlatformList m_platform_list;
Listener m_listener;
SourceManager m_source_manager;
std::auto_ptr<CommandInterpreter> m_command_interpreter_ap;
diff --git a/lldb/include/lldb/Host/Host.h b/lldb/include/lldb/Host/Host.h
index a1c85fe4250..cbb573df82a 100644
--- a/lldb/include/lldb/Host/Host.h
+++ b/lldb/include/lldb/Host/Host.h
@@ -96,6 +96,11 @@ public:
static lldb::ByteOrder
GetByteOrder ();
+ static bool
+ GetOSVersion (uint32_t &major,
+ uint32_t &minor,
+ uint32_t &update);
+
//------------------------------------------------------------------
/// Gets the host architecture.
///
diff --git a/lldb/include/lldb/Interpreter/Args.h b/lldb/include/lldb/Interpreter/Args.h
index 1f1b92b924a..5e5dafc0a2c 100644
--- a/lldb/include/lldb/Interpreter/Args.h
+++ b/lldb/include/lldb/Interpreter/Args.h
@@ -357,6 +357,9 @@ public:
static Error
StringToFormat (const char *s, lldb::Format &format);
+ static const char *
+ StringToVersion (const char *s, uint32_t &major, uint32_t &minor, uint32_t &update);
+
// This one isn't really relevant to Arguments per se, but we're using the Args as a
// general strings container, so...
void
diff --git a/lldb/include/lldb/Symbol/ObjectFile.h b/lldb/include/lldb/Symbol/ObjectFile.h
index 5631bfc35dd..2b011525d0d 100644
--- a/lldb/include/lldb/Symbol/ObjectFile.h
+++ b/lldb/include/lldb/Symbol/ObjectFile.h
@@ -143,6 +143,23 @@ public:
GetAddressByteSize () const = 0;
//------------------------------------------------------------------
+ /// Get the address type given a file address in an object file.
+ ///
+ /// Many binary file formats know what kinds
+ /// This is primarily for ARM binaries, though it can be applied to
+ /// any executable file format that supports different opcode types
+ /// within the same binary. ARM binaries support having both ARM and
+ /// Thumb within the same executable container. We need to be able
+ /// to get
+ /// @return
+ /// The size of an address in bytes for the currently selected
+ /// architecture (and object for archives). Returns zero if no
+ /// architecture or object has been selected.
+ //------------------------------------------------------------------
+ virtual lldb::AddressClass
+ GetAddressClass (lldb::addr_t file_addr);
+
+ //------------------------------------------------------------------
/// Extract the dependent modules from an object file.
///
/// If an object file has information about which other images it
diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h
index f878666a887..5ac7b3d519a 100644
--- a/lldb/include/lldb/Target/Platform.h
+++ b/lldb/include/lldb/Target/Platform.h
@@ -58,44 +58,19 @@ namespace lldb_private {
static void
SetDefaultPlatform (const lldb::PlatformSP &platform_sp);
- //------------------------------------------------------------------
- /// Select the active platform.
- ///
- /// In order to debug remotely, other platform's can be remotely
- /// connected to and set as the selected platform for any subsequent
- /// debugging. This allows connection to remote targets and allows
- /// the ability to discover process info, launch and attach to remote
- /// processes.
- //------------------------------------------------------------------
static lldb::PlatformSP
- GetSelectedPlatform ();
-
- static void
- SetSelectedPlatform (const lldb::PlatformSP &platform_sp);
-
- //------------------------------------------------------------------
- /// Connect to a remote platform
- ///
- /// When connecting to a remote platform, the name of that platform
- /// (the short plug-in name) is required, along with a URL that the
- /// platform plug-in can use to remotely attach.
- //------------------------------------------------------------------
- static lldb::PlatformSP
- ConnectRemote (const char *platform_name,
- const char *remote_connect_url,
- Error &error);
+ Create (const char *platform_name, Error &error);
static uint32_t
GetNumConnectedRemotePlatforms ();
static lldb::PlatformSP
GetConnectedRemotePlatformAtIndex (uint32_t idx);
-
//------------------------------------------------------------------
/// Default Constructor
//------------------------------------------------------------------
- Platform ();
+ Platform (bool is_host_platform);
//------------------------------------------------------------------
/// Destructor.
@@ -130,6 +105,44 @@ namespace lldb_private {
const ArchSpec &arch,
lldb::ModuleSP &module_sp);
+ bool
+ GetOSVersion (uint32_t &major,
+ uint32_t &minor,
+ uint32_t &update);
+
+ bool
+ SetOSVersion (uint32_t major,
+ uint32_t minor,
+ uint32_t update);
+
+ virtual const char *
+ GetDescription () = 0;
+
+ //------------------------------------------------------------------
+ /// Report the current status for this platform.
+ ///
+ /// The returned string usually involves returning the OS version
+ /// (if available), and any SDK directory that might be being used
+ /// for local file caching, and if connected a quick blurb about
+ /// what this platform is connected to.
+ //------------------------------------------------------------------
+ virtual void
+ GetStatus (Stream &strm) = 0;
+
+ //------------------------------------------------------------------
+ // Subclasses must be able to fetch the current OS version
+ //
+ // Remote classes must be connected for this to succeed. Local
+ // subclasses don't need to override this function as it will just
+ // call the Host::GetOSVersion().
+ //------------------------------------------------------------------
+protected:
+ virtual bool
+ FetchRemoteOSVersion ()
+ {
+ return false;
+ }
+
//------------------------------------------------------------------
/// Locate a file for a platform.
///
@@ -149,6 +162,7 @@ namespace lldb_private {
/// @return
/// An error object.
//------------------------------------------------------------------
+public:
virtual Error
GetFile (const FileSpec &platform_file, FileSpec &local_file);
@@ -176,6 +190,10 @@ namespace lldb_private {
virtual bool
GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) = 0;
+ virtual size_t
+ GetSoftwareBreakpointTrapOpcode (Target &target,
+ BreakpointSite *bp_site) = 0;
+
//------------------------------------------------------------------
/// Launch a new process.
///
@@ -291,10 +309,57 @@ namespace lldb_private {
return m_remote_url;
}
- protected:
+ bool
+ IsHost () const
+ {
+ return m_is_host; // Is this the default host platform?
+ }
+
+ bool
+ IsRemote () const
+ {
+ return !m_is_host;
+ }
- std::string m_remote_url;
+ bool
+ IsConnected () const
+ {
+ return m_is_connected;
+ }
+ const ArchSpec &
+ GetSystemArchitecture();
+
+ void
+ SetSystemArchitecture (const ArchSpec &arch)
+ {
+ m_system_arch = arch;
+ if (IsHost())
+ m_os_version_set_while_connected = m_system_arch.IsValid();
+ }
+
+ // Remote Platform subclasses need to override this function
+ virtual ArchSpec
+ FetchRemoteSystemArchitecture ()
+ {
+ return ArchSpec(); // Return an invalid architecture
+ }
+
+ protected:
+ bool m_is_host;
+ bool m_is_connected;
+ // Set to true when we are able to actually set the OS version while
+ // being connected. For remote platforms, we might set the version ahead
+ // of time before we actually connect and this version might change when
+ // we actually connect to a remote platform. For the host platform this
+ // will be set to the once we call Host::GetOSVersion().
+ bool m_os_version_set_while_connected;
+ bool m_system_arch_set_while_connected;
+ std::string m_remote_url;
+ uint32_t m_major_os_version;
+ uint32_t m_minor_os_version;
+ uint32_t m_update_os_version;
+ ArchSpec m_system_arch; // The architecture of the kernel or the remote platform
private:
DISALLOW_COPY_AND_ASSIGN (Platform);
};
@@ -314,10 +379,12 @@ namespace lldb_private {
}
void
- Append (const lldb::PlatformSP &platform_sp)
+ Append (const lldb::PlatformSP &platform_sp, bool set_selected)
{
Mutex::Locker locker (m_mutex);
m_platforms.push_back (platform_sp);
+ if (set_selected)
+ m_selected_platform_sp = m_platforms.back();
}
size_t
@@ -339,10 +406,50 @@ namespace lldb_private {
return platform_sp;
}
+ //------------------------------------------------------------------
+ /// Select the active platform.
+ ///
+ /// In order to debug remotely, other platform's can be remotely
+ /// connected to and set as the selected platform for any subsequent
+ /// debugging. This allows connection to remote targets and allows
+ /// the ability to discover process info, launch and attach to remote
+ /// processes.
+ //------------------------------------------------------------------
+ lldb::PlatformSP
+ GetSelectedPlatform ()
+ {
+ Mutex::Locker locker (m_mutex);
+ if (!m_selected_platform_sp && !m_platforms.empty())
+ m_selected_platform_sp = m_platforms.front();
+
+ return m_selected_platform_sp;
+ }
+
+ void
+ SetSelectedPlatform (const lldb::PlatformSP &platform_sp)
+ {
+ if (platform_sp)
+ {
+ Mutex::Locker locker (m_mutex);
+ const size_t num_platforms = m_platforms.size();
+ for (size_t idx=0; idx<num_platforms; ++idx)
+ {
+ if (m_platforms[idx].get() == platform_sp.get())
+ {
+ m_selected_platform_sp = m_platforms[idx];
+ return;
+ }
+ }
+ m_platforms.push_back (platform_sp);
+ m_selected_platform_sp = m_platforms.back();
+ }
+ }
+
protected:
typedef std::vector<lldb::PlatformSP> collection;
mutable Mutex m_mutex;
collection m_platforms;
+ lldb::PlatformSP m_selected_platform_sp;
private:
DISALLOW_COPY_AND_ASSIGN (PlatformList);
diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h
index f995c56c648..f5797d0b686 100644
--- a/lldb/include/lldb/Target/Process.h
+++ b/lldb/include/lldb/Target/Process.h
@@ -1726,8 +1726,8 @@ public:
//----------------------------------------------------------------------
// Process Breakpoints
//----------------------------------------------------------------------
- virtual size_t
- GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) = 0;
+ size_t
+ GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site);
virtual Error
EnableBreakpoint (BreakpointSite *bp_site) = 0;
diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index df3f02bc4b3..497308578f7 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -101,7 +101,6 @@ public:
m_execution_os_type = execution_os_type;
}
-
protected:
void
@@ -175,7 +174,7 @@ private:
///
/// @see TargetList::CreateTarget(const FileSpec*, const ArchSpec*)
//------------------------------------------------------------------
- Target(Debugger &debugger);
+ Target(Debugger &debugger, const lldb::PlatformSP &platform_sp);
public:
~Target();
@@ -641,6 +640,12 @@ public:
return (*pos).second;
}
+ lldb::PlatformSP
+ GetPlatform ()
+ {
+ return m_platform_sp;
+ }
+
//------------------------------------------------------------------
// Target::SettingsController
//------------------------------------------------------------------
@@ -694,6 +699,7 @@ protected:
// Member variables.
//------------------------------------------------------------------
Debugger & m_debugger;
+ lldb::PlatformSP m_platform_sp; ///< The platform for this target.
Mutex m_mutex; ///< An API mutex that is used by the lldb::SB* classes make the SB interface thread safe
ArchSpec m_arch_spec;
ModuleList m_images; ///< The list of images for this process (shared libraries and anything dynamically loaded).
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h
index d4454b74bb0..08f31c34d8c 100644
--- a/lldb/include/lldb/lldb-enumerations.h
+++ b/lldb/include/lldb/lldb-enumerations.h
@@ -77,6 +77,21 @@ typedef enum AddressType
eAddressTypeHost ///< Address is an address in the process that is running this code
} AddressType;
+ //----------------------------------------------------------------------
+ // Address Types
+ //----------------------------------------------------------------------
+typedef enum AddressClass
+{
+ eAddressClassInvalid,
+ eAddressClassUnknown,
+ eAddressClassCode,
+ eAddressClassCodeAlternateISA,
+ eAddressClassData,
+ eAddressClassDataConst,
+ eAddressClassDebug,
+ eAddressClassRuntime
+} AddressClass;
+
//----------------------------------------------------------------------
// Byte ordering definitions
//----------------------------------------------------------------------
diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h
index 9e916c916c0..3d23afafef7 100644
--- a/lldb/include/lldb/lldb-forward.h
+++ b/lldb/include/lldb/lldb-forward.h
@@ -65,7 +65,6 @@ class DWARFExpression;
class DataBuffer;
class DataExtractor;
class Debugger;
-class Debugger;
class Declaration;
class Disassembler;
class DynamicLoader;
diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj
index 702964cfc9c..535dfa09fda 100644
--- a/lldb/lldb.xcodeproj/project.pbxproj
+++ b/lldb/lldb.xcodeproj/project.pbxproj
@@ -80,6 +80,10 @@
266A42D6128E3FFB0090CF7C /* ClangNamespaceDecl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266A42D5128E3FFB0090CF7C /* ClangNamespaceDecl.cpp */; };
266A42D8128E40040090CF7C /* ClangNamespaceDecl.h in Headers */ = {isa = PBXBuildFile; fileRef = 266A42D7128E40040090CF7C /* ClangNamespaceDecl.h */; };
266F5CBC12FC846200DFCE33 /* Config.h in Headers */ = {isa = PBXBuildFile; fileRef = 266F5CBB12FC846200DFCE33 /* Config.h */; };
+ 2675F7001332BE690067997B /* PlatformRemoteiOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2675F6FE1332BE690067997B /* PlatformRemoteiOS.cpp */; };
+ 2675F7011332BE690067997B /* PlatformRemoteiOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 2675F6FF1332BE690067997B /* PlatformRemoteiOS.h */; };
+ 26879CE61333F5750012C1F8 /* CommandObjectPlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 26879CE51333F5750012C1F8 /* CommandObjectPlatform.h */; };
+ 26879CE81333F58B0012C1F8 /* CommandObjectPlatform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26879CE71333F58B0012C1F8 /* CommandObjectPlatform.cpp */; };
268A683F1321B53B000E3FB8 /* DynamicLoaderStatic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268A683D1321B53B000E3FB8 /* DynamicLoaderStatic.cpp */; };
268A68401321B53B000E3FB8 /* DynamicLoaderStatic.h in Headers */ = {isa = PBXBuildFile; fileRef = 268A683E1321B53B000E3FB8 /* DynamicLoaderStatic.h */; };
268DA872130095D000C9483A /* Terminal.h in Headers */ = {isa = PBXBuildFile; fileRef = 268DA871130095D000C9483A /* Terminal.h */; };
@@ -611,12 +615,16 @@
266F5CBB12FC846200DFCE33 /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Config.h; path = include/lldb/Host/Config.h; sourceTree = "<group>"; };
2672D8461189055500FF4019 /* CommandObjectFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CommandObjectFrame.cpp; path = source/Commands/CommandObjectFrame.cpp; sourceTree = "<group>"; };
2672D8471189055500FF4019 /* CommandObjectFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommandObjectFrame.h; path = source/Commands/CommandObjectFrame.h; sourceTree = "<group>"; };
+ 2675F6FE1332BE690067997B /* PlatformRemoteiOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlatformRemoteiOS.cpp; sourceTree = "<group>"; };
+ 2675F6FF1332BE690067997B /* PlatformRemoteiOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformRemoteiOS.h; sourceTree = "<group>"; };
2676A093119C93C8008A98EF /* StringExtractorGDBRemote.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringExtractorGDBRemote.cpp; path = source/Utility/StringExtractorGDBRemote.cpp; sourceTree = "<group>"; };
2676A094119C93C8008A98EF /* StringExtractorGDBRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StringExtractorGDBRemote.h; path = source/Utility/StringExtractorGDBRemote.h; sourceTree = "<group>"; };
2682F16A115EDA0D00CCFF99 /* PseudoTerminal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PseudoTerminal.cpp; path = source/Utility/PseudoTerminal.cpp; sourceTree = "<group>"; };
2682F16B115EDA0D00CCFF99 /* PseudoTerminal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PseudoTerminal.h; path = include/lldb/Utility/PseudoTerminal.h; sourceTree = "<group>"; };
2682F284115EF3A700CCFF99 /* SBError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBError.cpp; path = source/API/SBError.cpp; sourceTree = "<group>"; };
2682F286115EF3BD00CCFF99 /* SBError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBError.h; path = include/lldb/API/SBError.h; sourceTree = "<group>"; };
+ 26879CE51333F5750012C1F8 /* CommandObjectPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommandObjectPlatform.h; path = source/Commands/CommandObjectPlatform.h; sourceTree = "<group>"; };
+ 26879CE71333F58B0012C1F8 /* CommandObjectPlatform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CommandObjectPlatform.cpp; path = source/Commands/CommandObjectPlatform.cpp; sourceTree = "<group>"; };
2689B0A4113EE3CD00A4AEDB /* Symbols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Symbols.h; path = include/lldb/Host/Symbols.h; sourceTree = "<group>"; };
2689B0B5113EE47E00A4AEDB /* Symbols.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Symbols.cpp; path = source/Host/macosx/Symbols.cpp; sourceTree = "<group>"; };
268A683D1321B53B000E3FB8 /* DynamicLoaderStatic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynamicLoaderStatic.cpp; sourceTree = "<group>"; };
@@ -1935,6 +1943,8 @@
264AD83711095BA600E0B039 /* CommandObjectLog.cpp */,
26BC7D1D10F1B76300F91463 /* CommandObjectMemory.h */,
26BC7E3610F1B84700F91463 /* CommandObjectMemory.cpp */,
+ 26879CE51333F5750012C1F8 /* CommandObjectPlatform.h */,
+ 26879CE71333F58B0012C1F8 /* CommandObjectPlatform.cpp */,
26BC7D1F10F1B76300F91463 /* CommandObjectProcess.h */,
26BC7E3810F1B84700F91463 /* CommandObjectProcess.cpp */,
26BC7D2010F1B76300F91463 /* CommandObjectQuit.h */,
@@ -2169,6 +2179,8 @@
children = (
26C5577B132575AD008FD8FE /* PlatformMacOSX.cpp */,
26C5577C132575AD008FD8FE /* PlatformMacOSX.h */,
+ 2675F6FE1332BE690067997B /* PlatformRemoteiOS.cpp */,
+ 2675F6FF1332BE690067997B /* PlatformRemoteiOS.h */,
);
path = MacOSX;
sourceTree = "<group>";
@@ -2415,6 +2427,8 @@
264A43BC1320B3B4005B4096 /* Platform.h in Headers */,
268A68401321B53B000E3FB8 /* DynamicLoaderStatic.h in Headers */,
26C557811325781D008FD8FE /* PlatformMacOSX.h in Headers */,
+ 2675F7011332BE690067997B /* PlatformRemoteiOS.h in Headers */,
+ 26879CE61333F5750012C1F8 /* CommandObjectPlatform.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2924,6 +2938,8 @@
264A43BE1320BCEB005B4096 /* Platform.cpp in Sources */,
268A683F1321B53B000E3FB8 /* DynamicLoaderStatic.cpp in Sources */,
26C557801325781A008FD8FE /* PlatformMacOSX.cpp in Sources */,
+ 2675F7001332BE690067997B /* PlatformRemoteiOS.cpp in Sources */,
+ 26879CE81333F58B0012C1F8 /* CommandObjectPlatform.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -3104,7 +3120,7 @@
"$(LLVM_BUILD_DIR)",
);
LLVM_BUILD_DIR = "$(SRCROOT)/llvm";
- LLVM_CONFIGURATION = Release;
+ LLVM_CONFIGURATION = "Debug+Asserts";
OTHER_CFLAGS = (
"-DFOR_DYLD=0",
"-DSUPPORT_REMOTE_UNWINDING",
@@ -3161,7 +3177,7 @@
"$(LLVM_BUILD_DIR)",
);
LLVM_BUILD_DIR = "$(SRCROOT)/llvm";
- LLVM_CONFIGURATION = Release;
+ LLVM_CONFIGURATION = "Debug+Asserts";
OTHER_CFLAGS = (
"-DFOR_DYLD=0",
"-DSUPPORT_REMOTE_UNWINDING",
@@ -3284,7 +3300,7 @@
"$(LLVM_BUILD_DIR)",
);
LLVM_BUILD_DIR = "$(DERIVED_FILE_DIR)/llvm.build";
- LLVM_CONFIGURATION = Release;
+ LLVM_CONFIGURATION = "Debug+Asserts";
OTHER_CFLAGS = (
"-DFOR_DYLD=0",
"-DSUPPORT_REMOTE_UNWINDING",
diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp
index 7f404585429..0709c187b1d 100644
--- a/lldb/source/Breakpoint/Breakpoint.cpp
+++ b/lldb/source/Breakpoint/Breakpoint.cpp
@@ -412,7 +412,7 @@ Breakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_l
// Verbose mode does a debug dump of the breakpoint
Dump (s);
s->EOL ();
- s->Indent();
+ //s->Indent();
GetOptions()->GetDescription(s, level);
break;
diff --git a/lldb/source/Breakpoint/BreakpointLocationList.cpp b/lldb/source/Breakpoint/BreakpointLocationList.cpp
index b4fcc586612..89742a60901 100644
--- a/lldb/source/Breakpoint/BreakpointLocationList.cpp
+++ b/lldb/source/Breakpoint/BreakpointLocationList.cpp
@@ -133,7 +133,7 @@ void
BreakpointLocationList::Dump (Stream *s) const
{
s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
- s->Indent();
+ //s->Indent();
Mutex::Locker locker (m_mutex);
s->Printf("BreakpointLocationList with %zu BreakpointLocations:\n", m_locations.size());
s->IndentMore();
diff --git a/lldb/source/Breakpoint/BreakpointSiteList.cpp b/lldb/source/Breakpoint/BreakpointSiteList.cpp
index 155c8a7d7bc..f3f10f06ed7 100644
--- a/lldb/source/Breakpoint/BreakpointSiteList.cpp
+++ b/lldb/source/Breakpoint/BreakpointSiteList.cpp
@@ -168,7 +168,7 @@ void
BreakpointSiteList::Dump (Stream *s) const
{
s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
- s->Indent();
+ //s->Indent();
s->Printf("BreakpointSiteList with %u BreakpointSites:\n", (uint32_t)m_bp_site_list.size());
s->IndentMore();
collection::const_iterator pos;
diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp
index 1616eccf145..0bc30f43e40 100644
--- a/lldb/source/Commands/CommandObjectFrame.cpp
+++ b/lldb/source/Commands/CommandObjectFrame.cpp
@@ -319,7 +319,8 @@ public:
case 'L': show_location= true; break;
case 'c': show_decl = true; break;
case 'D': debug = true; break;
- case 'f': flat_output = true; break;
+ case 'f': error = Args::StringToFormat(option_arg, format); break;
+ case 'F': flat_output = true; break;
case 'd':
max_depth = Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success);
if (!success)
@@ -367,6 +368,7 @@ public:
flat_output = false;
max_depth = UINT32_MAX;
ptr_depth = 0;
+ format = eFormatDefault;
globals.clear();
}
@@ -393,6 +395,7 @@ public:
flat_output:1;
uint32_t max_depth; // The depth to print when dumping concrete (not pointers) aggreate values
uint32_t ptr_depth; // The default depth that is dumped when we find pointers
+ lldb::Format format; // The format to use when dumping variables or children of variables
std::vector<ConstString> globals;
// Instance variables to hold the values for command options.
};
@@ -491,6 +494,9 @@ public:
if (valobj_sp)
{
+ if (m_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_options.format);
+
if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
{
var_sp->GetDeclaration ().DumpStopContext (&s, false);
@@ -550,6 +556,9 @@ public:
valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp);
if (valobj_sp)
{
+ if (m_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_options.format);
+
if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
{
var_sp->GetDeclaration ().DumpStopContext (&s, false);
@@ -593,6 +602,9 @@ public:
valobj_sp = exe_ctx.frame->GetValueForVariableExpressionPath (name_cstr, expr_path_options, error);
if (valobj_sp)
{
+ if (m_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_options.format);
+
if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
{
var_sp->GetDeclaration ().DumpStopContext (&s, false);
@@ -672,6 +684,9 @@ public:
valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp);
if (valobj_sp)
{
+ if (m_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_options.format);
+
// When dumping all variables, don't print any variables
// that are not in scope to avoid extra unneeded output
if (valobj_sp->IsInScope (exe_ctx.frame))
@@ -726,7 +741,8 @@ CommandObjectFrameVariable::CommandOptions::g_option_table[] =
{ LLDB_OPT_SET_1, false, "objc", 'o', no_argument, NULL, 0, eArgTypeNone, "When looking up a variable by name, print as an Objective-C object."},
{ LLDB_OPT_SET_1, false, "ptr-depth", 'p', required_argument, NULL, 0, eArgTypeCount, "The number of pointers to be traversed when dumping values (default is zero)."},
{ LLDB_OPT_SET_1, false, "regex", 'r', no_argument, NULL, 0, eArgTypeRegularExpression, "The <variable-name> argument for name lookups are regular expressions."},
-{ LLDB_OPT_SET_1, false, "flat", 'f', no_argument, NULL, 0, eArgTypeNone, "Display results in a flat format that uses expression paths for each variable or member."},
+{ LLDB_OPT_SET_1, false, "flat", 'F', no_argument, NULL, 0, eArgTypeNone, "Display results in a flat format that uses expression paths for each variable or member."},
+{ LLDB_OPT_SET_1, false, "format", 'f', required_argument, NULL, 0, eArgTypeExprFormat, "Specify the format that the variable output should use."},
{ 0, false, NULL, 0, 0, NULL, NULL, eArgTypeNone, NULL }
};
#pragma mark CommandObjectMultiwordFrame
diff --git a/lldb/source/Commands/CommandObjectPlatform.cpp b/lldb/source/Commands/CommandObjectPlatform.cpp
new file mode 100644
index 00000000000..97eb0a4e5fc
--- /dev/null
+++ b/lldb/source/Commands/CommandObjectPlatform.cpp
@@ -0,0 +1,306 @@
+//===-- CommandObjectPlatform.cpp -------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CommandObjectPlatform.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/Debugger.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Interpreter/Args.h"
+#include "lldb/Interpreter/CommandInterpreter.h"
+#include "lldb/Interpreter/CommandReturnObject.h"
+#include "lldb/Target/ExecutionContext.h"
+#include "lldb/Target/Platform.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//----------------------------------------------------------------------
+// "platform create <platform-name>"
+//----------------------------------------------------------------------
+class CommandObjectPlatformCreate : public CommandObject
+{
+public:
+ CommandObjectPlatformCreate (CommandInterpreter &interpreter) :
+ CommandObject (interpreter,
+ "platform create",
+ "Create a platform instance by name and select it as the current platform.",
+ "platform create <platform-name>",
+ 0)
+ {
+ }
+
+ virtual
+ ~CommandObjectPlatformCreate ()
+ {
+ }
+
+ virtual bool
+ Execute (Args& args, CommandReturnObject &result)
+ {
+ Error error;
+ if (args.GetArgumentCount() == 1)
+ {
+ PlatformSP platform_sp (Platform::Create (args.GetArgumentAtIndex (0), error));
+
+ if (platform_sp)
+ {
+ m_interpreter.GetDebugger().GetPlatformList().Append (platform_sp, true);
+ if (m_options.os_version_major != UINT32_MAX)
+ {
+ platform_sp->SetOSVersion (m_options.os_version_major,
+ m_options.os_version_minor,
+ m_options.os_version_update);
+ }
+
+ platform_sp->GetStatus (result.GetOutputStream());
+ }
+ }
+ else
+ {
+ result.AppendError ("command not implemented");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ return result.Succeeded();
+ }
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
+
+ class CommandOptions : public Options
+ {
+ public:
+
+ CommandOptions () :
+ os_version_major (UINT32_MAX),
+ os_version_minor (UINT32_MAX),
+ os_version_update (UINT32_MAX)
+ {
+ }
+
+ virtual
+ ~CommandOptions ()
+ {
+ }
+
+ virtual Error
+ SetOptionValue (int option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
+
+ switch (short_option)
+ {
+ case 'v':
+ if (Args::StringToVersion (option_arg,
+ os_version_major,
+ os_version_minor,
+ os_version_update) == option_arg)
+ {
+ error.SetErrorStringWithFormat ("invalid version string '%s'", option_arg);
+ }
+ break;
+
+ default:
+ error.SetErrorStringWithFormat ("Unrecognized option '%c'.\n", short_option);
+ break;
+ }
+
+ return error;
+ }
+
+ void
+ ResetOptionValues ()
+ {
+ os_version_major = UINT32_MAX;
+ os_version_minor = UINT32_MAX;
+ os_version_update = UINT32_MAX;
+ }
+
+ const lldb::OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
+
+ // Options table: Required for subclasses of Options.
+
+ static lldb::OptionDefinition g_option_table[];
+
+ // Instance variables to hold the values for command options.
+
+ uint32_t os_version_major;
+ uint32_t os_version_minor;
+ uint32_t os_version_update;
+ };
+ CommandOptions m_options;
+};
+
+lldb::OptionDefinition
+CommandObjectPlatformCreate::CommandOptions::g_option_table[] =
+{
+ { LLDB_OPT_SET_ALL, false, "sdk-version", 'v', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK version to use prior to connecting." },
+ { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
+};
+
+//----------------------------------------------------------------------
+// "platform list"
+//----------------------------------------------------------------------
+class CommandObjectPlatformList : public CommandObject
+{
+public:
+ CommandObjectPlatformList (CommandInterpreter &interpreter) :
+ CommandObject (interpreter,
+ "platform list",
+ "List all platforms that are available.",
+ NULL,
+ 0)
+ {
+ }
+
+ virtual
+ ~CommandObjectPlatformList ()
+ {
+ }
+
+ virtual bool
+ Execute (Args& args, CommandReturnObject &result)
+ {
+ Stream &ostrm = result.GetOutputStream();
+ ostrm.Printf("Available platforms:\n");
+
+ PlatformSP host_platform_sp (Platform::GetDefaultPlatform());
+ ostrm.Printf ("%s: %s\n",
+ host_platform_sp->GetShortPluginName(),
+ host_platform_sp->GetDescription());
+
+ uint32_t idx;
+ for (idx = 0; 1; ++idx)
+ {
+ const char *plugin_name = PluginManager::GetPlatformPluginNameAtIndex (idx);
+ if (plugin_name == NULL)
+ break;
+ const char *plugin_desc = PluginManager::GetPlatformPluginDescriptionAtIndex (idx);
+ if (plugin_desc == NULL)
+ break;
+ ostrm.Printf("%s: %s\n", plugin_name, plugin_desc);
+ }
+
+ if (idx == 0)
+ {
+ result.AppendError ("no platforms are available");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ return result.Succeeded();
+ }
+};
+
+//----------------------------------------------------------------------
+// "platform status"
+//----------------------------------------------------------------------
+class CommandObjectPlatformStatus : public CommandObject
+{
+public:
+ CommandObjectPlatformStatus (CommandInterpreter &interpreter) :
+ CommandObject (interpreter,
+ "platform status",
+ "Display status for the currently selected platform.",
+ NULL,
+ 0)
+ {
+ }
+
+ virtual
+ ~CommandObjectPlatformStatus ()
+ {
+ }
+
+ virtual bool
+ Execute (Args& args, CommandReturnObject &result)
+ {
+ Stream &ostrm = result.GetOutputStream();
+
+ PlatformSP selected_platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
+ if (selected_platform_sp)
+ {
+ selected_platform_sp->GetStatus (ostrm);
+ result.SetStatus (eReturnStatusSuccessFinishResult);
+ }
+ else
+ {
+ result.AppendError ("no platform us currently selected");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ return result.Succeeded();
+ }
+};
+
+
+//----------------------------------------------------------------------
+// "platform select <platform-name>"
+//----------------------------------------------------------------------
+class CommandObjectPlatformSelect : public CommandObject
+{
+public:
+ CommandObjectPlatformSelect (CommandInterpreter &interpreter) :
+ CommandObject (interpreter,
+ "platform select",
+ "Select a platform by name to be the currently selected platform.",
+ "platform select <platform-name>",
+ 0)
+ {
+ }
+
+ virtual
+ ~CommandObjectPlatformSelect ()
+ {
+ }
+
+ virtual bool
+ Execute (Args& args, CommandReturnObject &result)
+ {
+ result.AppendError ("command not implemented");
+ result.SetStatus (eReturnStatusFailed);
+ return result.Succeeded();
+ }
+};
+
+
+
+//----------------------------------------------------------------------
+// CommandObjectPlatform constructor
+//----------------------------------------------------------------------
+CommandObjectPlatform::CommandObjectPlatform(CommandInterpreter &interpreter) :
+ CommandObjectMultiword (interpreter,
+ "platform",
+ "A set of commands to manage and create platforms.",
+ "platform [create|list|status|select] ...")
+{
+ LoadSubCommand ("create", CommandObjectSP (new CommandObjectPlatformCreate (interpreter)));
+ LoadSubCommand ("list" , CommandObjectSP (new CommandObjectPlatformList (interpreter)));
+ LoadSubCommand ("select", CommandObjectSP (new CommandObjectPlatformSelect (interpreter)));
+ LoadSubCommand ("status", CommandObjectSP (new CommandObjectPlatformStatus (interpreter)));
+}
+
+
+//----------------------------------------------------------------------
+// Destructor
+//----------------------------------------------------------------------
+CommandObjectPlatform::~CommandObjectPlatform()
+{
+}
diff --git a/lldb/source/Commands/CommandObjectPlatform.h b/lldb/source/Commands/CommandObjectPlatform.h
new file mode 100644
index 00000000000..994052e6001
--- /dev/null
+++ b/lldb/source/Commands/CommandObjectPlatform.h
@@ -0,0 +1,45 @@
+//===-- CommandObjectPlatform.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_CommandObjectPlatform_h_
+#define liblldb_CommandObjectPlatform_h_
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Interpreter/CommandObjectMultiword.h"
+
+namespace lldb_private {
+
+//-------------------------------------------------------------------------
+// CommandObjectPlatform
+//-------------------------------------------------------------------------
+
+class CommandObjectPlatform : public CommandObjectMultiword
+{
+public:
+ //------------------------------------------------------------------
+ // Constructors and Destructors
+ //------------------------------------------------------------------
+ CommandObjectPlatform(CommandInterpreter &interpreter);
+
+ virtual
+ ~CommandObjectPlatform();
+
+private:
+ //------------------------------------------------------------------
+ // For CommandObjectPlatform only
+ //------------------------------------------------------------------
+ DISALLOW_COPY_AND_ASSIGN (CommandObjectPlatform);
+};
+
+} // namespace lldb_private
+
+#endif // liblldb_CommandObjectPlatform_h_
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp
index 0dbc9b82873..ece8fe10aaf 100644
--- a/lldb/source/Commands/CommandObjectProcess.cpp
+++ b/lldb/source/Commands/CommandObjectProcess.cpp
@@ -523,7 +523,7 @@ public:
const char *partial_name = NULL;
partial_name = input.GetArgumentAtIndex(opt_arg_pos);
- PlatformSP platform_sp (Platform::GetSelectedPlatform ());
+ PlatformSP platform_sp (interpeter.GetDebugger().GetPlatformList().GetSelectedPlatform ());
if (platform_sp)
{
ProcessInfoList process_infos;
@@ -703,7 +703,7 @@ public:
if (attach_pid == LLDB_INVALID_PROCESS_ID && wait_name != NULL)
{
ProcessInfoList process_infos;
- PlatformSP platform_sp (Platform::GetSelectedPlatform ());
+ PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform ());
if (platform_sp)
{
platform_sp->FindProcessesByName (wait_name, eNameMatchEquals, process_infos);
diff --git a/lldb/source/Core/Address.cpp b/lldb/source/Core/Address.cpp
index 67d2c2ea304..12de3aaaeb0 100644
--- a/lldb/source/Core/Address.cpp
+++ b/lldb/source/Core/Address.cpp
@@ -808,3 +808,16 @@ Address::ResolveLinkedAddress ()
}
}
}
+
+lldb::AddressClass
+Address::GetAddressClass () const
+{
+ Module *module = GetModule();
+ if (module)
+ {
+ ObjectFile *obj_file = module->GetObjectFile();
+ if (obj_file)
+ return obj_file->GetAddressClass (GetFileAddress());
+ }
+ return eAddressClassUnknown;
+}
diff --git a/lldb/source/Core/ArchSpec.cpp b/lldb/source/Core/ArchSpec.cpp
index f15f02a2ad6..512b5f030de 100644
--- a/lldb/source/Core/ArchSpec.cpp
+++ b/lldb/source/Core/ArchSpec.cpp
@@ -49,6 +49,9 @@ static const CoreDefinition g_core_definitions[ArchSpec::kNumCores] =
{ eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5t , "armv5t" },
{ eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv6 , "armv6" },
{ eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7 , "armv7" },
+ { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7f , "armv7f" },
+ { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7k , "armv7k" },
+ { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7s , "armv7s" },
{ eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_xscale , "xscale" },
{ eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_generic , "ppc" },
@@ -112,6 +115,9 @@ static const ArchDefinitionEntry g_macho_arch_entries[] =
{ ArchSpec::eCore_arm_armv5 , llvm::MachO::CPUTypeARM , 7 },
{ ArchSpec::eCore_arm_xscale , llvm::MachO::CPUTypeARM , 8 },
{ ArchSpec::eCore_arm_armv7 , llvm::MachO::CPUTypeARM , 9 },
+ { ArchSpec::eCore_arm_armv7f , llvm::MachO::CPUTypeARM , 10 },
+ { ArchSpec::eCore_arm_armv7k , llvm::MachO::CPUTypeARM , 12 },
+ { ArchSpec::eCore_arm_armv7s , llvm::MachO::CPUTypeARM , 11 },
{ ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , CPU_ANY },
{ ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , 0 },
{ ArchSpec::eCore_ppc_ppc601 , llvm::MachO::CPUTypePowerPC , 1 },
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 0718a2de67f..89ceab95006 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -225,6 +225,7 @@ Debugger::Debugger () :
m_output_file (),
m_error_file (),
m_target_list (),
+ m_platform_list (),
m_listener ("lldb.Debugger"),
m_source_manager (),
m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)),
@@ -234,6 +235,10 @@ Debugger::Debugger () :
{
m_input_comm.SetCloseOnEOF(false);
m_command_interpreter_ap->Initialize ();
+ // Always add our default platform to the platform list
+ PlatformSP default_platform_sp (Platform::GetDefaultPlatform());
+ assert (default_platform_sp.get());
+ m_platform_list.Append (default_platform_sp, true);
}
Debugger::~Debugger ()
@@ -262,11 +267,6 @@ Debugger::SetAsyncExecution (bool async_execution)
m_command_interpreter_ap->SetSynchronous (!async_execution);
}
-void
-Debugger::DisconnectInput()
-{
- m_input_comm.Clear ();
-}
void
Debugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership)
@@ -311,26 +311,6 @@ Debugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership)
err_file.SetStream (stderr, false);
}
-CommandInterpreter &
-Debugger::GetCommandInterpreter ()
-{
- assert (m_command_interpreter_ap.get());
- return *m_command_interpreter_ap;
-}
-
-Listener &
-Debugger::GetListener ()
-{
- return m_listener;
-}
-
-
-TargetSP
-Debugger::GetSelectedTarget ()
-{
- return m_target_list.GetSelectedTarget ();
-}
-
ExecutionContext
Debugger::GetSelectedExecutionContext ()
{
@@ -360,19 +340,6 @@ Debugger::GetSelectedExecutionContext ()
}
-SourceManager &
-Debugger::GetSourceManager ()
-{
- return m_source_manager;
-}
-
-
-TargetList&
-Debugger::GetTargetList ()
-{
- return m_target_list;
-}
-
InputReaderSP
Debugger::GetCurrentInputReader ()
{
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp
index 12bb4868652..b7ee57dc991 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -226,50 +226,19 @@ struct ABIInstance
typedef std::vector<ABIInstance> ABIInstances;
-static bool
-AccessABIInstances (PluginAction action, ABIInstance &instance, uint32_t index)
+static Mutex &
+GetABIInstancesMutex ()
{
- static ABIInstances g_plugin_instances;
-
- switch (action)
- {
- case ePluginRegisterInstance:
- if (instance.create_callback)
- {
- g_plugin_instances.push_back (instance);
- return true;
- }
- break;
-
- case ePluginUnregisterInstance:
- if (instance.create_callback)
- {
- ABIInstances::iterator pos, end = g_plugin_instances.end();
- for (pos = g_plugin_instances.begin(); pos != end; ++ pos)
- {
- if (pos->create_callback == instance.create_callback)
- {
- g_plugin_instances.erase(pos);
- return true;
- }
- }
- }
- break;
-
- case ePluginGetInstanceAtIndex:
- if (index < g_plugin_instances.size())
- {
- instance = g_plugin_instances[index];
- return true;
- }
- break;
-
- default:
- break;
- }
- return false;
+ static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
+ return g_instances_mutex;
}
+static ABIInstances &
+GetABIInstances ()
+{
+ static ABIInstances g_instances;
+ return g_instances;
+}
bool
PluginManager::RegisterPlugin
@@ -287,7 +256,9 @@ PluginManager::RegisterPlugin
if (description && description[0])
instance.description = description;
instance.create_callback = create_callback;
- return AccessABIInstances (ePluginRegisterInstance, instance, 0);
+ Mutex::Locker locker (GetABIInstancesMutex ());
+ GetABIInstances ().push_back (instance);
+ return true;
}
return false;
}
@@ -297,9 +268,18 @@ PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
{
if (create_callback)
{
- ABIInstance instance;
- instance.create_callback = create_callback;
- return AccessABIInstances (ePluginUnregisterInstance, instance, 0);
+ Mutex::Locker locker (GetABIInstancesMutex ());
+ ABIInstances &instances = GetABIInstances ();
+
+ ABIInstances::iterator pos, end = instances.end();
+ for (pos = instances.begin(); pos != end; ++ pos)
+ {
+ if (pos->create_callback == create_callback)
+ {
+ instances.erase(pos);
+ return true;
+ }
+ }
}
return false;
}
@@ -307,9 +287,11 @@ PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
ABICreateInstance
PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
{
- ABIInstance instance;
- if (AccessABIInstances (ePluginGetInstanceAtIndex, instance, idx))
- return instance.create_callback;
+ Mutex::Locker locker (GetABIInstancesMutex ());
+ ABIInstances &instances = GetABIInstances ();
+
+ if (idx < instances.size())
+ return instances[idx].create_callback;
return NULL;
}
@@ -318,12 +300,15 @@ PluginManager::GetABICreateCallbackForPluginName (const char *name)
{
if (name && name[0])
{
- ABIInstance instance;
+ Mutex::Locker locker (GetABIInstancesMutex ());
std::string ss_name(name);
- for (uint32_t idx = 0; AccessABIInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx)
+ ABIInstances &instances = GetABIInstances ();
+
+ ABIInstances::iterator pos, end = instances.end();
+ for (pos = instances.begin(); pos != end; ++ pos)
{
- if (instance.name == ss_name)
- return instance.create_callback;
+ if (pos->name == ss_name)
+ return pos->create_callback;
}
}
return NULL;
@@ -1212,50 +1197,19 @@ struct PlatformInstance
typedef std::vector<PlatformInstance> PlatformInstances;
-static bool
-AccessPlatformInstances (PluginAction action, PlatformInstance &instance, uint32_t index)
+static Mutex &
+GetPlatformInstancesMutex ()
{
- static PlatformInstances g_plugin_instances;
-
- switch (action)
- {
- case ePluginRegisterInstance:
- if (instance.create_callback)
- {
- g_plugin_instances.push_back (instance);
- return true;
- }
- break;
-
- case ePluginUnregisterInstance:
- if (instance.create_callback)
- {
- PlatformInstances::iterator pos, end = g_plugin_instances.end();
- for (pos = g_plugin_instances.begin(); pos != end; ++ pos)
- {
- if (pos->create_callback == instance.create_callback)
- {
- g_plugin_instances.erase(pos);
- return true;
- }
- }
- }
- break;
-
- case ePluginGetInstanceAtIndex:
- if (index < g_plugin_instances.size())
- {
- instance = g_plugin_instances[index];
- return true;
- }
- break;
-
- default:
- break;
- }
- return false;
+ static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
+ return g_platform_instances_mutex;
}
+static PlatformInstances &
+GetPlatformInstances ()
+{
+ static PlatformInstances g_platform_instances;
+ return g_platform_instances;
+}
bool
PluginManager::RegisterPlugin (const char *name,
@@ -1264,13 +1218,16 @@ PluginManager::RegisterPlugin (const char *name,
{
if (create_callback)
{
+ Mutex::Locker locker (GetPlatformInstancesMutex ());
+
PlatformInstance instance;
assert (name && name[0]);
instance.name = name;
if (description && description[0])
instance.description = description;
instance.create_callback = create_callback;
- return AccessPlatformInstances (ePluginRegisterInstance, instance, 0);
+ GetPlatformInstances ().push_back (instance);
+ return true;
}
return false;
}
@@ -1278,18 +1235,20 @@ PluginManager::RegisterPlugin (const char *name,
const char *
PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
{
- PlatformInstance instance;
- if (AccessPlatformInstances (ePluginGetInstanceAtIndex, instance, idx))
- return instance.name.c_str();
+ Mutex::Locker locker (GetPlatformInstancesMutex ());
+ PlatformInstances &platform_instances = GetPlatformInstances ();
+ if (idx < platform_instances.size())
+ return platform_instances[idx].name.c_str();
return NULL;
}
const char *
PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
{
- PlatformInstance instance;
- if (AccessPlatformInstances (ePluginGetInstanceAtIndex, instance, idx))
- return instance.description.c_str();
+ Mutex::Locker locker (GetPlatformInstancesMutex ());
+ PlatformInstances &platform_instances = GetPlatformInstances ();
+ if (idx < platform_instances.size())
+ return platform_instances[idx].description.c_str();
return NULL;
}
@@ -1298,9 +1257,18 @@ PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
{
if (create_callback)
{
- PlatformInstance instance;
- instance.create_callback = create_callback;
- return AccessPlatformInstances (ePluginUnregisterInstance, instance, 0);
+ Mutex::Locker locker (GetPlatformInstancesMutex ());
+ PlatformInstances &platform_instances = GetPlatformInstances ();
+
+ PlatformInstances::iterator pos, end = platform_instances.end();
+ for (pos = platform_instances.begin(); pos != end; ++ pos)
+ {
+ if (pos->create_callback == create_callback)
+ {
+ platform_instances.erase(pos);
+ return true;
+ }
+ }
}
return false;
}
@@ -1308,9 +1276,10 @@ PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
PlatformCreateInstance
PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
{
- PlatformInstance instance;
- if (AccessPlatformInstances (ePluginGetInstanceAtIndex, instance, idx))
- return instance.create_callback;
+ Mutex::Locker locker (GetPlatformInstancesMutex ());
+ PlatformInstances &platform_instances = GetPlatformInstances ();
+ if (idx < platform_instances.size())
+ return platform_instances[idx].create_callback;
return NULL;
}
@@ -1319,12 +1288,15 @@ PluginManager::GetPlatformCreateCallbackForPluginName (const char *name)
{
if (name && name[0])
{
- PlatformInstance instance;
+ Mutex::Locker locker (GetPlatformInstancesMutex ());
std::string ss_name(name);
- for (uint32_t idx = 0; AccessPlatformInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx)
+ PlatformInstances &platform_instances = GetPlatformInstances ();
+
+ PlatformInstances::iterator pos, end = platform_instances.end();
+ for (pos = platform_instances.begin(); pos != end; ++ pos)
{
- if (instance.name == ss_name)
- return instance.create_callback;
+ if (pos->name == ss_name)
+ return pos->create_callback;
}
}
return NULL;
diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm
index e7df53dd9d9..a537c67937a 100644
--- a/lldb/source/Host/macosx/Host.mm
+++ b/lldb/source/Host/macosx/Host.mm
@@ -830,3 +830,48 @@ Host::GetEnvironment (StringList &env)
return i;
}
+
+
+bool
+Host::GetOSVersion
+(
+ uint32_t &major,
+ uint32_t &minor,
+ uint32_t &update
+)
+{
+
+ SInt32 version;
+
+ OSErr err = ::Gestalt (gestaltSystemVersion, &version);
+ if (err != noErr)
+ return false;
+
+ if (version < 0x1040)
+ {
+ major = ((version & 0xF000) >> 12) * 10 + ((version & 0x0F00) >> 8);
+ minor = (version & 0x00F0) >> 4;
+ update = (version & 0x000F);
+ }
+ else
+ {
+ if (::Gestalt (gestaltSystemVersionMajor, &version) != noErr)
+ return false;
+ major = version;
+
+ if (::Gestalt (gestaltSystemVersionMinor, &version) == noErr)
+ minor = version;
+ else
+ minor = 0;
+
+ if (::Gestalt (gestaltSystemVersionBugFix, &version) == noErr)
+ update = version;
+ else
+ update = 0;
+ }
+
+ return true;
+
+}
+
+
diff --git a/lldb/source/Interpreter/Args.cpp b/lldb/source/Interpreter/Args.cpp
index e0c04f467c9..d278873b813 100644
--- a/lldb/source/Interpreter/Args.cpp
+++ b/lldb/source/Interpreter/Args.cpp
@@ -754,6 +754,47 @@ Args::StringToBoolean (const char *s, bool fail_value, bool *success_ptr)
return fail_value;
}
+const char *
+Args::StringToVersion (const char *s, uint32_t &major, uint32_t &minor, uint32_t &update)
+{
+ major = UINT32_MAX;
+ minor = UINT32_MAX;
+ update = UINT32_MAX;
+
+ if (s && s[0])
+ {
+ char *pos = NULL;
+ uint32_t uval32;
+ uval32 = ::strtoul (s, &pos, 0);
+ if (pos == s)
+ return s;
+ major = uval32;
+ if (*pos == '\0')
+ {
+ return pos; // Decoded major and got end of string
+ }
+ else if (*pos == '.')
+ {
+ const char *minor_cstr = pos + 1;
+ uval32 = ::strtoul (minor_cstr, &pos, 0);
+ if (pos == minor_cstr)
+ return pos; // Didn't get any digits for the minor version...
+ minor = uval32;
+ if (*pos == '.')
+ {
+ const char *update_cstr = pos + 1;
+ uval32 = ::strtoul (update_cstr, &pos, 0);
+ if (pos == update_cstr)
+ return pos;
+ update = uval32;
+ }
+ return pos;
+ }
+ }
+ return 0;
+}
+
+
int32_t
Args::StringToOptionEnum (const char *s, lldb::OptionEnumValueElement *enum_values, int32_t fail_value, bool *success_ptr)
{
diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index 461c54383ac..6f1c74fde9e 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -25,6 +25,7 @@
#include "../Commands/CommandObjectImage.h"
#include "../Commands/CommandObjectLog.h"
#include "../Commands/CommandObjectMemory.h"
+#include "../Commands/CommandObjectPlatform.h"
#include "../Commands/CommandObjectProcess.h"
#include "../Commands/CommandObjectQuit.h"
#include "lldb/Interpreter/CommandObjectRegexCommand.h"
@@ -166,6 +167,7 @@ CommandInterpreter::LoadCommandDictionary ()
m_command_dict["image"] = CommandObjectSP (new CommandObjectImage (*this));
m_command_dict["log"] = CommandObjectSP (new CommandObjectLog (*this));
m_command_dict["memory"] = CommandObjectSP (new CommandObjectMemory (*this));
+ m_command_dict["platform"] = CommandObjectSP (new CommandObjectPlatform (*this));
m_command_dict["process"] = CommandObjectSP (new CommandObjectMultiwordProcess (*this));
m_command_dict["quit"] = CommandObjectSP (new CommandObjectQuit (*this));
m_command_dict["register"] = CommandObjectSP (new CommandObjectRegister (*this));
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
index 9f2ddd845e7..3b10a343209 100644
--- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
+++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
@@ -31,8 +31,8 @@ using namespace lldb;
using namespace lldb_private;
-static
-int DataExtractorByteReader(uint8_t *byte, uint64_t address, void *arg)
+static int
+DataExtractorByteReader(uint8_t *byte, uint64_t address, void *arg)
{
DataExtractor &extractor = *((DataExtractor *)arg);
@@ -66,7 +66,7 @@ static int IPRegisterReader(uint64_t *value, unsigned regID, void* arg)
uint64_t instructionPointer = ((RegisterReaderArg*)arg)->instructionPointer;
EDDisassemblerRef disassembler = ((RegisterReaderArg*)arg)->disassembler;
- if(EDRegisterIsProgramCounter(disassembler, regID)) {
+ if (EDRegisterIsProgramCounter(disassembler, regID)) {
*value = instructionPointer;
return 0;
}
@@ -371,13 +371,26 @@ DisassemblerLLVM::CreateInstance(const ArchSpec &arch)
DisassemblerLLVM::DisassemblerLLVM(const ArchSpec &arch) :
Disassembler (arch),
- m_disassembler (NULL)
+ m_disassembler (NULL),
+ m_disassembler_thumb (NULL) // For ARM only
{
const std::string &arch_triple = arch.GetTriple().str();
if (!arch_triple.empty())
{
if (EDGetDisassembler(&m_disassembler, arch_triple.c_str(), SyntaxForArchSpec (arch)))
m_disassembler = NULL;
+ llvm::Triple::ArchType llvm_arch = arch.GetTriple().getArch();
+ if (llvm_arch == llvm::Triple::arm)
+ {
+ if (EDGetDisassembler(&m_disassembler_thumb, "thumb-apple-darwin", kEDAssemblySyntaxARMUAL))
+ m_disassembler_thumb = NULL;
+ }
+ else if (llvm_arch == llvm::Triple::thumb)
+ {
+ m_disassembler_thumb = m_disassembler;
+ if (EDGetDisassembler(&m_disassembler, "arm-apple-darwin-unknown", kEDAssemblySyntaxARMUAL))
+ m_disassembler = NULL;
+ }
}
}
@@ -405,7 +418,18 @@ DisassemblerLLVM::DecodeInstructions
{
Address inst_addr (base_addr);
inst_addr.Slide(data_offset);
- InstructionSP inst_sp (new InstructionLLVM(m_disassembler, inst_addr));
+
+ bool use_thumb = false;
+ // If we have a thumb disassembler, then we have an ARM architecture
+ // so we need to check what the instruction address class is to make
+ // sure we shouldn't be disassembling as thumb...
+ if (m_disassembler_thumb)
+ {
+ if (inst_addr.GetAddressClass () == eAddressClassCodeAlternateISA)
+ use_thumb = true;
+ }
+ InstructionSP inst_sp (new InstructionLLVM (use_thumb ? m_disassembler_thumb : m_disassembler,
+ inst_addr));
size_t inst_byte_size = inst_sp->Extract (data, data_offset);
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
index 69ac743fcf2..842c03d5dcd 100644
--- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
+++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h
@@ -100,6 +100,7 @@ protected:
}
EDDisassemblerRef m_disassembler;
+ EDDisassemblerRef m_disassembler_thumb;
};
#endif // liblldb_DisassemblerLLVM_h_
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 56d3daf6d5e..72c21fede3a 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -29,6 +29,7 @@ using namespace lldb;
using namespace lldb_private;
using namespace llvm::MachO;
+#define MACHO_NLIST_ARM_SYMBOL_IS_THUMB 0x0008
void
ObjectFileMachO::Initialize()
@@ -201,6 +202,108 @@ ObjectFileMachO::GetAddressByteSize () const
return m_data.GetAddressByteSize ();
}
+lldb::AddressClass
+ObjectFileMachO::GetAddressClass (lldb::addr_t file_addr)
+{
+ Symtab *symtab = GetSymtab();
+ if (symtab)
+ {
+ Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
+ if (symbol)
+ {
+ const AddressRange *range_ptr = symbol->GetAddressRangePtr();
+ if (range_ptr)
+ {
+ const Section *section = range_ptr->GetBaseAddress().GetSection();
+ if (section)
+ {
+ const lldb::SectionType section_type = section->GetType();
+ switch (section_type)
+ {
+ case eSectionTypeInvalid: return eAddressClassUnknown;
+ case eSectionTypeCode:
+ if (m_header.cputype == llvm::MachO::CPUTypeARM)
+ {
+ // For ARM we have a bit in the n_desc field of the symbol
+ // that tells us ARM/Thumb which is bit 0x0008.
+ if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
+ return eAddressClassCodeAlternateISA;
+ }
+ return eAddressClassCode;
+
+ case eSectionTypeContainer: return eAddressClassUnknown;
+ case eSectionTypeData: return eAddressClassData;
+ case eSectionTypeDataCString: return eAddressClassDataConst;
+ case eSectionTypeDataCStringPointers: return eAddressClassData;
+ case eSectionTypeDataSymbolAddress: return eAddressClassData;
+ case eSectionTypeData4: return eAddressClassData;
+ case eSectionTypeData8: return eAddressClassData;
+ case eSectionTypeData16: return eAddressClassData;
+ case eSectionTypeDataPointers: return eAddressClassData;
+ case eSectionTypeZeroFill: return eAddressClassData;
+ case eSectionTypeDataObjCMessageRefs: return eAddressClassDataConst;
+ case eSectionTypeDataObjCCFStrings: return eAddressClassDataConst;
+ case eSectionTypeDebug: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugAbbrev: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugAranges: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugFrame: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugInfo: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugLine: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugLoc: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugMacInfo: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugPubNames: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugPubTypes: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugRanges: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugStr: return eAddressClassDebug;
+ case eSectionTypeEHFrame: return eAddressClassRuntime;
+ case eSectionTypeOther: return eAddressClassUnknown;
+ }
+ }
+ }
+
+ const lldb::SymbolType symbol_type = symbol->GetType();
+ switch (symbol_type)
+ {
+ case eSymbolTypeAny: return eAddressClassUnknown;
+ case eSymbolTypeAbsolute: return eAddressClassUnknown;
+ case eSymbolTypeExtern: return eAddressClassUnknown;
+
+ case eSymbolTypeCode:
+ case eSymbolTypeTrampoline:
+ if (m_header.cputype == llvm::MachO::CPUTypeARM)
+ {
+ // For ARM we have a bit in the n_desc field of the symbol
+ // that tells us ARM/Thumb which is bit 0x0008.
+ if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
+ return eAddressClassCodeAlternateISA;
+ }
+ return eAddressClassCode;
+
+ case eSymbolTypeData: return eAddressClassData;
+ case eSymbolTypeRuntime: return eAddressClassRuntime;
+ case eSymbolTypeException: return eAddressClassRuntime;
+ case eSymbolTypeSourceFile: return eAddressClassDebug;
+ case eSymbolTypeHeaderFile: return eAddressClassDebug;
+ case eSymbolTypeObjectFile: return eAddressClassDebug;
+ case eSymbolTypeCommonBlock: return eAddressClassDebug;
+ case eSymbolTypeBlock: return eAddressClassDebug;
+ case eSymbolTypeLocal: return eAddressClassData;
+ case eSymbolTypeParam: return eAddressClassData;
+ case eSymbolTypeVariable: return eAddressClassData;
+ case eSymbolTypeVariableType: return eAddressClassDebug;
+ case eSymbolTypeLineEntry: return eAddressClassDebug;
+ case eSymbolTypeLineHeader: return eAddressClassDebug;
+ case eSymbolTypeScopeBegin: return eAddressClassDebug;
+ case eSymbolTypeScopeEnd: return eAddressClassDebug;
+ case eSymbolTypeAdditional: return eAddressClassUnknown;
+ case eSymbolTypeCompiler: return eAddressClassDebug;
+ case eSymbolTypeInstrumentation:return eAddressClassDebug;
+ case eSymbolTypeUndefined: return eAddressClassUnknown;
+ }
+ }
+ }
+ return eAddressClassUnknown;
+}
Symtab *
ObjectFileMachO::GetSymtab()
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
index c079fe419de..bd25062c38e 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -74,6 +74,9 @@ public:
virtual size_t
GetAddressByteSize () const;
+ virtual lldb::AddressClass
+ GetAddressClass (lldb::addr_t file_addr);
+
virtual lldb_private::Symtab *
GetSymtab();
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
index b1df7ba6bb8..8c1ef1d5c9d 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -10,16 +10,20 @@
#include "PlatformMacOSX.h"
// C Includes
+#include <sys/sysctl.h>
+
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Error.h"
+#include "lldb/Breakpoint/BreakpointLocation.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleList.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Host/FileSpec.h"
#include "lldb/Host/Host.h"
#include "lldb/Target/Process.h"
+#include "lldb/Target/Target.h"
using namespace lldb;
using namespace lldb_private;
@@ -29,6 +33,7 @@ PlatformMacOSX::Initialize ()
{
#if defined (__APPLE__)
PlatformSP default_platform_sp (new PlatformMacOSX());
+ default_platform_sp->SetSystemArchitecture (Host::GetArchitecture());
Platform::SetDefaultPlatform (default_platform_sp);
#endif
}
@@ -38,7 +43,6 @@ PlatformMacOSX::Terminate ()
{
}
-
Error
PlatformMacOSX::ResolveExecutable (const FileSpec &exe_file,
const ArchSpec &exe_arch,
@@ -142,11 +146,58 @@ PlatformMacOSX::GetFile (const FileSpec &platform_file, FileSpec &local_file)
}
+void
+PlatformMacOSX::GetStatus (Stream &strm)
+{
+ char sysctlstring[1024];
+ size_t datalen;
+ int mib[CTL_MAXNAME];
+
+ uint32_t major = UINT32_MAX;
+ uint32_t minor = UINT32_MAX;
+ uint32_t update = UINT32_MAX;
+ strm.PutCString("Host platform: Mac OS X Native\n");
+ if (GetOSVersion(major, minor, update))
+ {
+ strm.Printf("OS version: %u", major);
+ if (minor != UINT32_MAX)
+ strm.Printf(".%u", minor);
+ if (update != UINT32_MAX)
+ strm.Printf(".%u", update);
+
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_OSVERSION;
+ datalen = sizeof(sysctlstring);
+ if (::sysctl (mib, 2, sysctlstring, &datalen, NULL, 0) == 0)
+ {
+ sysctlstring[datalen] = '\0';
+ strm.Printf(" (%s)", sysctlstring);
+ }
+
+ strm.EOL();
+ }
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_VERSION;
+ datalen = sizeof(sysctlstring);
+ if (::sysctl (mib, 2, sysctlstring, &datalen, NULL, 0) == 0)
+ {
+ sysctlstring[datalen] = '\0';
+ strm.Printf("Kernel version: %s\n", sysctlstring);
+ }
+}
+
+
//------------------------------------------------------------------
/// Default Constructor
//------------------------------------------------------------------
PlatformMacOSX::PlatformMacOSX () :
- Platform()
+#if defined (__APPLE__)
+ Platform(true) // This is the local host platform
+#else
+ Platform(false) // This is a remote platform
+#endif
{
}
@@ -197,3 +248,65 @@ PlatformMacOSX::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
}
return false;
}
+
+size_t
+PlatformMacOSX::GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite *bp_site)
+{
+ const uint8_t *trap_opcode = NULL;
+ uint32_t trap_opcode_size = 0;
+
+ llvm::Triple::ArchType machine = target.GetArchitecture().GetMachine();
+ switch (machine)
+ {
+ case llvm::Triple::x86:
+ case llvm::Triple::x86_64:
+ {
+ static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC };
+ trap_opcode = g_i386_breakpoint_opcode;
+ trap_opcode_size = sizeof(g_i386_breakpoint_opcode);
+ }
+ break;
+
+ case llvm::Triple::arm:
+ {
+ static const uint8_t g_arm_breakpoint_opcode[] = { 0xFE, 0xDE, 0xFF, 0xE7 };
+ static const uint8_t g_thumb_breakpooint_opcode[] = { 0xFE, 0xDE };
+
+ lldb::BreakpointLocationSP bp_loc_sp (bp_site->GetOwnerAtIndex (0));
+ if (bp_loc_sp)
+ {
+ const AddressClass addr_class = bp_loc_sp->GetAddress().GetAddressClass ();
+ if (addr_class == eAddressClassCodeAlternateISA)
+ {
+ trap_opcode = g_thumb_breakpooint_opcode;
+ trap_opcode_size = sizeof(g_thumb_breakpooint_opcode);
+ break;
+ }
+ }
+ trap_opcode = g_arm_breakpoint_opcode;
+ trap_opcode_size = sizeof(g_arm_breakpoint_opcode);
+ }
+ break;
+
+ case llvm::Triple::ppc:
+ case llvm::Triple::ppc64:
+ {
+ static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 };
+ trap_opcode = g_ppc_breakpoint_opcode;
+ trap_opcode_size = sizeof(g_ppc_breakpoint_opcode);
+ }
+ break;
+
+ default:
+ assert(!"Unhandled architecture in ProcessMacOSX::GetSoftwareBreakpointTrapOpcode()");
+ break;
+ }
+
+ if (trap_opcode && trap_opcode_size)
+ {
+ if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size))
+ return trap_opcode_size;
+ }
+ return 0;
+
+}
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
index 037cac28e74..4b0db1584a4 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
@@ -45,7 +45,7 @@ namespace lldb_private {
virtual const char *
GetShortPluginName()
{
- return "platform.macosx";
+ return "local-macosx";
}
virtual uint32_t
@@ -63,6 +63,15 @@ namespace lldb_private {
const ArchSpec &arch,
lldb::ModuleSP &module_sp);
+ virtual const char *
+ GetDescription ()
+ {
+ return "The native host platform on MacOSX.";
+ }
+
+ virtual void
+ GetStatus (Stream &strm);
+
virtual Error
GetFile (const FileSpec &platform_file, FileSpec &local_file);
@@ -77,9 +86,10 @@ namespace lldb_private {
virtual bool
GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch);
- protected:
-
-
+ virtual size_t
+ GetSoftwareBreakpointTrapOpcode (Target &target,
+ BreakpointSite *bp_site);
+
private:
DISALLOW_COPY_AND_ASSIGN (PlatformMacOSX);
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
new file mode 100644
index 00000000000..03af1ddfb1f
--- /dev/null
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
@@ -0,0 +1,613 @@
+//===-- Platform.cpp --------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "PlatformRemoteiOS.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Breakpoint/BreakpointLocation.h"
+#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/Error.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleList.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/StreamString.h"
+#include "lldb/Host/FileSpec.h"
+#include "lldb/Host/Host.h"
+#include "lldb/Target/Process.h"
+#include "lldb/Target/Target.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+void
+PlatformRemoteiOS::Initialize ()
+{
+ static bool g_initialized = false;
+
+ if (g_initialized == false)
+ {
+ g_initialized = true;
+ PluginManager::RegisterPlugin (GetShortPluginNameStatic(),
+ GetDescriptionStatic(),
+ CreateInstance);
+ }
+}
+
+Platform*
+PlatformRemoteiOS::CreateInstance ()
+{
+ return new PlatformRemoteiOS ();
+}
+
+void
+PlatformRemoteiOS::Terminate ()
+{
+}
+
+const char *
+PlatformRemoteiOS::GetPluginNameStatic ()
+{
+ return "PlatformRemoteiOS";
+}
+
+const char *
+PlatformRemoteiOS::GetShortPluginNameStatic()
+{
+ return "remote-ios";
+}
+
+const char *
+PlatformRemoteiOS::GetDescriptionStatic()
+{
+ return "Remote iOS platform plug-in.";
+}
+
+
+void
+PlatformRemoteiOS::GetStatus (Stream &strm)
+{
+ uint32_t major = UINT32_MAX;
+ uint32_t minor = UINT32_MAX;
+ uint32_t update = UINT32_MAX;
+ const char *sdk_directory = GetDeviceSupportDirectoryForOSVersion();
+ strm.PutCString ("Remote platform: iOS platform\n");
+ if (GetOSVersion(major, minor, update))
+ {
+ strm.Printf("SDK version: %u", major);
+ if (minor != UINT32_MAX)
+ strm.Printf(".%u", minor);
+ if (update != UINT32_MAX)
+ strm.Printf(".%u", update);
+ strm.EOL();
+ }
+
+ if (!m_build_update.empty())
+ strm.Printf("SDK update: %s\n", m_build_update.c_str());
+
+ if (sdk_directory)
+ strm.Printf ("SDK path: \"%s\"\n", sdk_directory);
+ else
+ strm.PutCString ("SDK path: error: unable to locate SDK\n");
+
+ if (IsConnected())
+ strm.Printf("Connected to: %s\n", m_remote_url.c_str());
+ else
+ strm.PutCString("Not connected to a remote device.\n");
+}
+
+
+Error
+PlatformRemoteiOS::ResolveExecutable (const FileSpec &exe_file,
+ const ArchSpec &exe_arch,
+ lldb::ModuleSP &exe_module_sp)
+{
+ Error error;
+ // Nothing special to do here, just use the actual file and architecture
+
+ FileSpec resolved_exe_file (exe_file);
+
+ // If we have "ls" as the exe_file, resolve the executable loation based on
+ // the current path variables
+ // TODO: resolve bare executables in the Platform SDK
+// if (!resolved_exe_file.Exists())
+// resolved_exe_file.ResolveExecutableLocation ();
+
+ // Resolve any executable within a bundle on MacOSX
+ // TODO: verify that this handles shallow bundles, if not then implement one ourselves
+ Host::ResolveExecutableInBundle (resolved_exe_file);
+
+ if (resolved_exe_file.Exists())
+ {
+ if (exe_arch.IsValid())
+ {
+ error = ModuleList::GetSharedModule (resolved_exe_file,
+ exe_arch,
+ NULL,
+ NULL,
+ 0,
+ exe_module_sp,
+ NULL,
+ NULL);
+
+ if (exe_module_sp->GetObjectFile() == NULL)
+ {
+ exe_module_sp.reset();
+ error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain the architecture %s",
+ exe_file.GetDirectory().AsCString(""),
+ exe_file.GetDirectory() ? "/" : "",
+ exe_file.GetFilename().AsCString(""),
+ exe_arch.GetArchitectureName());
+ }
+ }
+ else
+ {
+ // No valid architecture was specified, ask the platform for
+ // the architectures that we should be using (in the correct order)
+ // and see if we can find a match that way
+ StreamString arch_names;
+ ArchSpec platform_arch;
+ for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx)
+ {
+ error = ModuleList::GetSharedModule (resolved_exe_file,
+ platform_arch,
+ NULL,
+ NULL,
+ 0,
+ exe_module_sp,
+ NULL,
+ NULL);
+ // Did we find an executable using one of the
+ if (error.Success())
+ {
+ if (exe_module_sp && exe_module_sp->GetObjectFile())
+ break;
+ else
+ error.SetErrorToGenericError();
+ }
+
+ if (idx > 0)
+ arch_names.PutCString (", ");
+ arch_names.PutCString (platform_arch.GetArchitectureName());
+ }
+
+ if (error.Fail() || !exe_module_sp)
+ {
+ error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain any '%s' platform architectures: %s",
+ exe_file.GetDirectory().AsCString(""),
+ exe_file.GetDirectory() ? "/" : "",
+ exe_file.GetFilename().AsCString(""),
+ GetShortPluginName(),
+ arch_names.GetString().c_str());
+ }
+ }
+ }
+ else
+ {
+ error.SetErrorStringWithFormat ("'%s%s%s' does not exist",
+ exe_file.GetDirectory().AsCString(""),
+ exe_file.GetDirectory() ? "/" : "",
+ exe_file.GetFilename().AsCString(""));
+ }
+
+ return error;
+}
+
+const char *
+PlatformRemoteiOS::GetDeviceSupportDirectory()
+{
+ if (m_device_support_directory.empty())
+ {
+ bool developer_dir_path_valid = false;
+ char developer_dir_path[PATH_MAX];
+ FileSpec temp_file_spec;
+ if (Host::GetLLDBPath (ePathTypeLLDBShlibDir, temp_file_spec))
+ {
+ if (temp_file_spec.GetPath (developer_dir_path, sizeof(developer_dir_path)))
+ {
+ char *lib_priv_frameworks = strstr (developer_dir_path, "/Library/PrivateFrameworks/LLDB.framework");
+ if (lib_priv_frameworks)
+ {
+ *lib_priv_frameworks = '\0';
+ developer_dir_path_valid = true;
+ }
+ }
+ }
+
+ if (!developer_dir_path_valid)
+ {
+ std::string xcode_dir_path;
+ const char *xcode_select_prefix_dir = getenv ("XCODE_SELECT_PREFIX_DIR");
+ if (xcode_select_prefix_dir)
+ xcode_dir_path.append (xcode_select_prefix_dir);
+ xcode_dir_path.append ("/usr/share/xcode-select/xcode_dir_path");
+ temp_file_spec.SetFile(xcode_dir_path.c_str(), false);
+ size_t bytes_read = temp_file_spec.ReadFileContents(0, developer_dir_path, sizeof(developer_dir_path));
+ if (bytes_read > 0)
+ {
+ developer_dir_path[bytes_read] = '\0';
+ while (developer_dir_path[bytes_read-1] == '\r' ||
+ developer_dir_path[bytes_read-1] == '\n')
+ developer_dir_path[--bytes_read] = '\0';
+ developer_dir_path_valid = true;
+ }
+ }
+
+ if (developer_dir_path_valid)
+ {
+ temp_file_spec.SetFile (developer_dir_path, false);
+ if (temp_file_spec.Exists())
+ {
+ m_device_support_directory.assign (developer_dir_path);
+ return m_device_support_directory.c_str();
+ }
+ }
+ // Assign a single NULL character so we know we tried to find the device
+ // support directory and we don't keep trying to find it over and over.
+ m_device_support_directory.assign (1, '\0');
+ }
+
+ // We should have put a single NULL character into m_device_support_directory
+ // or it should have a valid path if the code gets here
+ assert (m_device_support_directory.empty() == false);
+ if (m_device_support_directory[0])
+ return m_device_support_directory.c_str();
+ return NULL;
+}
+
+const char *
+PlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion()
+{
+ if (m_device_support_directory_for_os_version.empty())
+ {
+ const char *device_support_dir = GetDeviceSupportDirectory();
+ const bool resolve_path = true;
+ if (device_support_dir)
+ {
+ m_device_support_directory_for_os_version.assign (device_support_dir);
+ m_device_support_directory_for_os_version.append ("/Platforms/iPhoneOS.platform/DeviceSupport");
+
+ uint32_t major = 0;
+ uint32_t minor = 0;
+ uint32_t update = 0;
+ FileSpec file_spec;
+ char resolved_path[PATH_MAX];
+ if (GetOSVersion(major, minor, update))
+ {
+ if (major != UINT32_MAX && minor != UINT32_MAX && update != UINT32_MAX)
+ {
+ ::snprintf (resolved_path,
+ sizeof(resolved_path),
+ "%s/%i.%i.%i",
+ m_device_support_directory_for_os_version.c_str(),
+ major,
+ minor,
+ update);
+
+ file_spec.SetFile(resolved_path, resolve_path);
+ if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path)))
+ {
+ m_device_support_directory_for_os_version.assign (resolved_path);
+ return m_device_support_directory_for_os_version.c_str();
+ }
+ }
+
+ if (major != UINT32_MAX && minor != UINT32_MAX)
+ {
+ ::snprintf (resolved_path,
+ sizeof(resolved_path),
+ "%s/%i.%i",
+ m_device_support_directory_for_os_version.c_str(),
+ major,
+ minor,
+ update);
+
+ file_spec.SetFile(resolved_path, resolve_path);
+ if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path)))
+ {
+ m_device_support_directory_for_os_version.assign (resolved_path);
+ return m_device_support_directory_for_os_version.c_str();
+ }
+ }
+ }
+ else
+ {
+ // Use the default as we have no OS version selected
+ m_device_support_directory_for_os_version.append ("/Latest");
+ file_spec.SetFile(m_device_support_directory_for_os_version.c_str(), resolve_path);
+
+ if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path)))
+ {
+ if (m_major_os_version == UINT32_MAX)
+ {
+ const char *resolved_latest_dirname = file_spec.GetFilename().GetCString();
+ const char *pos = Args::StringToVersion (resolved_latest_dirname,
+ m_major_os_version,
+ m_minor_os_version,
+ m_update_os_version);
+
+ if (m_build_update.empty() && pos[0] == ' ' && pos[1] == '(')
+ {
+ const char *end_paren = strchr (pos + 2, ')');
+ m_build_update.assign (pos + 2, end_paren);
+ }
+ }
+ m_device_support_directory_for_os_version.assign (resolved_path);
+ return m_device_support_directory_for_os_version.c_str();
+ }
+ }
+ }
+ // Assign a single NULL character so we know we tried to find the device
+ // support directory and we don't keep trying to find it over and over.
+ m_device_support_directory_for_os_version.assign (1, '\0');
+ }
+ // We should have put a single NULL character into m_device_support_directory_for_os_version
+ // or it should have a valid path if the code gets here
+ assert (m_device_support_directory_for_os_version.empty() == false);
+ if (m_device_support_directory_for_os_version[0])
+ return m_device_support_directory_for_os_version.c_str();
+ return NULL;
+}
+
+Error
+PlatformRemoteiOS::GetFile (const FileSpec &platform_file,
+ FileSpec &local_file)
+{
+ Error error;
+ char platform_file_path[PATH_MAX];
+ if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path)))
+ {
+ char resolved_path[PATH_MAX];
+
+ const char * os_version_dir = GetDeviceSupportDirectoryForOSVersion();
+ if (os_version_dir)
+ {
+ ::snprintf (resolved_path,
+ sizeof(resolved_path),
+ "%s/Symbols.Internal/%s",
+ os_version_dir,
+ platform_file_path);
+
+ local_file.SetFile(resolved_path, true);
+ if (local_file.Exists())
+ return error;
+ ::snprintf (resolved_path,
+ sizeof(resolved_path),
+ "%s/Symbols/%s",
+ os_version_dir,
+ platform_file_path);
+
+ local_file.SetFile(resolved_path, true);
+ if (local_file.Exists())
+ return error;
+
+ }
+ local_file = platform_file;
+ if (local_file.Exists())
+ return error;
+
+ error.SetErrorStringWithFormat ("unable to locate a platform file for '%s' in platform '%s'",
+ platform_file_path,
+ GetPluginName());
+ }
+ else
+ {
+ error.SetErrorString ("invalid platform file argument");
+ }
+ return error;
+}
+
+//------------------------------------------------------------------
+/// Default Constructor
+//------------------------------------------------------------------
+PlatformRemoteiOS::PlatformRemoteiOS () :
+ Platform(false), // This is a remote platform
+ m_device_support_directory (),
+ m_device_support_directory_for_os_version ()
+{
+}
+
+//------------------------------------------------------------------
+/// Destructor.
+///
+/// The destructor is virtual since this class is designed to be
+/// inherited from by the plug-in instance.
+//------------------------------------------------------------------
+PlatformRemoteiOS::~PlatformRemoteiOS()
+{
+}
+
+uint32_t
+PlatformRemoteiOS::FindProcessesByName (const char *name_match,
+ lldb::NameMatchType name_match_type,
+ ProcessInfoList &process_infos)
+{
+ // TODO: if connected, send a packet to get the remote process infos by name
+ process_infos.Clear();
+ return 0;
+}
+
+bool
+PlatformRemoteiOS::GetProcessInfo (lldb::pid_t pid, ProcessInfo &process_info)
+{
+ // TODO: if connected, send a packet to get the remote process info
+ process_info.Clear();
+ return false;
+}
+
+bool
+PlatformRemoteiOS::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
+{
+ ArchSpec system_arch (GetSystemArchitecture());
+ const ArchSpec::Core system_core = system_arch.GetCore();
+ switch (system_core)
+ {
+ default:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv7-apple-darwin"); return true;
+ case 1: arch.SetTriple ("armv7f-apple-darwin"); return true;
+ case 2: arch.SetTriple ("armv7k-apple-darwin"); return true;
+ case 3: arch.SetTriple ("armv7s-apple-darwin"); return true;
+ case 4: arch.SetTriple ("armv6-apple-darwin"); return true;
+ case 5: arch.SetTriple ("armv5-apple-darwin"); return true;
+ case 6: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 7: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+
+ case ArchSpec::eCore_arm_armv7f:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv7f-apple-darwin"); return true;
+ case 1: arch.SetTriple ("armv7-apple-darwin"); return true;
+ case 2: arch.SetTriple ("armv6-apple-darwin"); return true;
+ case 3: arch.SetTriple ("armv5-apple-darwin"); return true;
+ case 4: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 5: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+
+ case ArchSpec::eCore_arm_armv7k:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv7k-apple-darwin"); return true;
+ case 1: arch.SetTriple ("armv7-apple-darwin"); return true;
+ case 2: arch.SetTriple ("armv6-apple-darwin"); return true;
+ case 3: arch.SetTriple ("armv5-apple-darwin"); return true;
+ case 4: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 5: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+
+ case ArchSpec::eCore_arm_armv7s:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv7s-apple-darwin"); return true;
+ case 1: arch.SetTriple ("armv7-apple-darwin"); return true;
+ case 2: arch.SetTriple ("armv6-apple-darwin"); return true;
+ case 3: arch.SetTriple ("armv5-apple-darwin"); return true;
+ case 4: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 5: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+
+ case ArchSpec::eCore_arm_armv7:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv7-apple-darwin"); return true;
+ case 1: arch.SetTriple ("armv6-apple-darwin"); return true;
+ case 2: arch.SetTriple ("armv5-apple-darwin"); return true;
+ case 3: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 4: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+
+ case ArchSpec::eCore_arm_armv6:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv6-apple-darwin"); return true;
+ case 1: arch.SetTriple ("armv5-apple-darwin"); return true;
+ case 2: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 3: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+
+ case ArchSpec::eCore_arm_armv5:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv5-apple-darwin"); return true;
+ case 1: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 2: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+
+ case ArchSpec::eCore_arm_armv4:
+ switch (idx)
+ {
+ case 0: arch.SetTriple ("armv4-apple-darwin"); return true;
+ case 1: arch.SetTriple ("arm-apple-darwin"); return true;
+ default: break;
+ }
+ break;
+ }
+ arch.Clear();
+ return false;
+}
+
+size_t
+PlatformRemoteiOS::GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite *bp_site)
+{
+ const uint8_t *trap_opcode = NULL;
+ uint32_t trap_opcode_size = 0;
+
+ llvm::Triple::ArchType machine = target.GetArchitecture().GetMachine();
+ switch (machine)
+ {
+ case llvm::Triple::x86:
+ case llvm::Triple::x86_64:
+ {
+ static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC };
+ trap_opcode = g_i386_breakpoint_opcode;
+ trap_opcode_size = sizeof(g_i386_breakpoint_opcode);
+ }
+ break;
+
+ case llvm::Triple::arm:
+ {
+ static const uint8_t g_arm_breakpoint_opcode[] = { 0xFE, 0xDE, 0xFF, 0xE7 };
+ static const uint8_t g_thumb_breakpooint_opcode[] = { 0xFE, 0xDE };
+
+ lldb::BreakpointLocationSP bp_loc_sp (bp_site->GetOwnerAtIndex (0));
+ if (bp_loc_sp)
+ {
+ const AddressClass addr_class = bp_loc_sp->GetAddress().GetAddressClass ();
+ if (addr_class == eAddressClassCodeAlternateISA)
+ {
+ trap_opcode = g_thumb_breakpooint_opcode;
+ trap_opcode_size = sizeof(g_thumb_breakpooint_opcode);
+ break;
+ }
+ }
+ trap_opcode = g_arm_breakpoint_opcode;
+ trap_opcode_size = sizeof(g_arm_breakpoint_opcode);
+ }
+ break;
+
+ case llvm::Triple::ppc:
+ case llvm::Triple::ppc64:
+ {
+ static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 };
+ trap_opcode = g_ppc_breakpoint_opcode;
+ trap_opcode_size = sizeof(g_ppc_breakpoint_opcode);
+ }
+ break;
+
+ default:
+ assert(!"Unhandled architecture in ProcessMacOSX::GetSoftwareBreakpointTrapOpcode()");
+ break;
+ }
+
+ if (trap_opcode && trap_opcode_size)
+ {
+ if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size))
+ return trap_opcode_size;
+ }
+ return 0;
+
+}
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
new file mode 100644
index 00000000000..5c0f075b41c
--- /dev/null
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
@@ -0,0 +1,123 @@
+//===-- PlatformRemoteiOS.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_PlatformRemoteiOS_h_
+#define liblldb_PlatformRemoteiOS_h_
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Target/Platform.h"
+
+namespace lldb_private {
+
+ class PlatformRemoteiOS : public Platform
+ {
+ public:
+
+ static Platform*
+ CreateInstance ();
+
+ static void
+ Initialize ();
+
+ static void
+ Terminate ();
+
+ PlatformRemoteiOS ();
+
+ virtual
+ ~PlatformRemoteiOS();
+
+ //------------------------------------------------------------
+ // lldb_private::PluginInterface functions
+ //------------------------------------------------------------
+
+ static const char *
+ GetPluginNameStatic ();
+
+ static const char *
+ GetShortPluginNameStatic();
+
+ static const char *
+ GetDescriptionStatic();
+
+ virtual const char *
+ GetPluginName()
+ {
+ return GetPluginNameStatic();
+ }
+
+ virtual const char *
+ GetShortPluginName()
+ {
+ return GetShortPluginNameStatic();
+ }
+
+ virtual uint32_t
+ GetPluginVersion()
+ {
+ return 1;
+ }
+
+ //------------------------------------------------------------
+ // lldb_private::Platform functions
+ //------------------------------------------------------------
+ virtual Error
+ ResolveExecutable (const FileSpec &exe_file,
+ const ArchSpec &arch,
+ lldb::ModuleSP &module_sp);
+
+ virtual const char *
+ GetDescription ()
+ {
+ return GetDescriptionStatic();
+ }
+
+ virtual void
+ GetStatus (Stream &strm);
+
+ virtual Error
+ GetFile (const FileSpec &platform_file, FileSpec &local_file);
+
+ virtual uint32_t
+ FindProcessesByName (const char *name_match,
+ lldb::NameMatchType name_match_type,
+ ProcessInfoList &process_infos);
+
+ virtual bool
+ GetProcessInfo (lldb::pid_t pid, ProcessInfo &proc_info);
+
+ virtual bool
+ GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch);
+
+ virtual size_t
+ GetSoftwareBreakpointTrapOpcode (Target &target,
+ BreakpointSite *bp_site);
+
+ protected:
+ std::string m_device_support_directory;
+ std::string m_device_support_directory_for_os_version;
+ std::string m_build_update;
+ //std::vector<FileSpec> m_device_support_os_dirs;
+
+ const char *
+ GetDeviceSupportDirectory();
+
+ const char *
+ GetDeviceSupportDirectoryForOSVersion();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN (PlatformRemoteiOS);
+
+ };
+} // namespace lldb_private
+
+#endif // liblldb_Platform_h_
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
index 3106e34565c..baa12e14e06 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
@@ -183,7 +183,7 @@ using namespace lldb_private;
const char *
ProcessMacOSX::GetPluginNameStatic()
{
- return "process.macosx";
+ return "macosx-user";
}
const char *
@@ -455,52 +455,6 @@ ProcessMacOSX::DoResume ()
return error;
}
-size_t
-ProcessMacOSX::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
-{
- const uint8_t *trap_opcode = NULL;
- uint32_t trap_opcode_size = 0;
-
- static const uint8_t g_arm_breakpoint_opcode[] = { 0xFE, 0xDE, 0xFF, 0xE7 };
- //static const uint8_t g_thumb_breakpooint_opcode[] = { 0xFE, 0xDE };
- static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 };
- static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC };
-
- llvm::Triple::ArchType machine = m_arch_spec.GetMachine();
- switch (machine)
- {
- case llvm::Triple::x86:
- case llvm::Triple::x86_64:
- trap_opcode = g_i386_breakpoint_opcode;
- trap_opcode_size = sizeof(g_i386_breakpoint_opcode);
- break;
-
- case llvm::Triple::arm:
- // TODO: fill this in for ARM. We need to dig up the symbol for
- // the address in the breakpoint locaiton and figure out if it is
- // an ARM or Thumb breakpoint.
- trap_opcode = g_arm_breakpoint_opcode;
- trap_opcode_size = sizeof(g_arm_breakpoint_opcode);
- break;
-
- case llvm::Triple::ppc:
- case llvm::Triple::ppc64:
- trap_opcode = g_ppc_breakpoint_opcode;
- trap_opcode_size = sizeof(g_ppc_breakpoint_opcode);
- break;
-
- default:
- assert(!"Unhandled architecture in ProcessMacOSX::GetSoftwareBreakpointTrapOpcode()");
- break;
- }
-
- if (trap_opcode && trap_opcode_size)
- {
- if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size))
- return trap_opcode_size;
- }
- return 0;
-}
uint32_t
ProcessMacOSX::UpdateThreadListIfNeeded ()
{
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
index 85ce15104b6..a1d28178115 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
@@ -192,12 +192,6 @@ public:
//----------------------------------------------------------------------
// Process Breakpoints
//----------------------------------------------------------------------
- virtual size_t
- GetSoftwareBreakpointTrapOpcode (lldb_private::BreakpointSite *bp_site);
-
- //----------------------------------------------------------------------
- // Process Breakpoints
- //----------------------------------------------------------------------
virtual lldb_private::Error
EnableBreakpoint (lldb_private::BreakpointSite *bp_site);
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 2ae589d551c..d88c240f30c 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -63,7 +63,7 @@ get_random_port ()
const char *
ProcessGDBRemote::GetPluginNameStatic()
{
- return "process.gdb-remote";
+ return "gdb-remote";
}
const char *
@@ -1025,53 +1025,6 @@ ProcessGDBRemote::DoResume ()
return error;
}
-size_t
-ProcessGDBRemote::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
-{
- const uint8_t *trap_opcode = NULL;
- uint32_t trap_opcode_size = 0;
-
- static const uint8_t g_arm_breakpoint_opcode[] = { 0xFE, 0xDE, 0xFF, 0xE7 };
- //static const uint8_t g_thumb_breakpooint_opcode[] = { 0xFE, 0xDE };
- static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 };
- static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC };
-
- const llvm::Triple::ArchType machine = GetTarget().GetArchitecture().GetMachine();
- switch (machine)
- {
- case llvm::Triple::x86:
- case llvm::Triple::x86_64:
- trap_opcode = g_i386_breakpoint_opcode;
- trap_opcode_size = sizeof(g_i386_breakpoint_opcode);
- break;
-
- case llvm::Triple::arm:
- // TODO: fill this in for ARM. We need to dig up the symbol for
- // the address in the breakpoint locaiton and figure out if it is
- // an ARM or Thumb breakpoint.
- trap_opcode = g_arm_breakpoint_opcode;
- trap_opcode_size = sizeof(g_arm_breakpoint_opcode);
- break;
-
- case llvm::Triple::ppc:
- case llvm::Triple::ppc64:
- trap_opcode = g_ppc_breakpoint_opcode;
- trap_opcode_size = sizeof(g_ppc_breakpoint_opcode);
- break;
-
- default:
- assert(!"Unhandled architecture in ProcessMacOSX::GetSoftwareBreakpointTrapOpcode()");
- break;
- }
-
- if (trap_opcode && trap_opcode_size)
- {
- if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size))
- return trap_opcode_size;
- }
- return 0;
-}
-
uint32_t
ProcessGDBRemote::UpdateThreadListIfNeeded ()
{
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
index 4bb337fb6d9..6273041825a 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -189,12 +189,6 @@ public:
//----------------------------------------------------------------------
// Process Breakpoints
//----------------------------------------------------------------------
- virtual size_t
- GetSoftwareBreakpointTrapOpcode (lldb_private::BreakpointSite *bp_site);
-
- //----------------------------------------------------------------------
- // Process Breakpoints
- //----------------------------------------------------------------------
virtual lldb_private::Error
EnableBreakpoint (lldb_private::BreakpointSite *bp_site);
diff --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp
index 1dbea48a2b2..fde35a0d36b 100644
--- a/lldb/source/Symbol/ObjectFile.cpp
+++ b/lldb/source/Symbol/ObjectFile.cpp
@@ -102,3 +102,88 @@ ObjectFile::SetModulesArchitecture (const ArchSpec &new_arch)
return m_module->SetArchitecture (new_arch);
}
+lldb::AddressClass
+ObjectFile::GetAddressClass (lldb::addr_t file_addr)
+{
+ Symtab *symtab = GetSymtab();
+ if (symtab)
+ {
+ Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
+ if (symbol)
+ {
+ const AddressRange *range_ptr = symbol->GetAddressRangePtr();
+ if (range_ptr)
+ {
+ const Section *section = range_ptr->GetBaseAddress().GetSection();
+ if (section)
+ {
+ const lldb::SectionType section_type = section->GetType();
+ switch (section_type)
+ {
+ case eSectionTypeInvalid: return eAddressClassUnknown;
+ case eSectionTypeCode: return eAddressClassCode;
+ case eSectionTypeContainer: return eAddressClassUnknown;
+ case eSectionTypeData: return eAddressClassData;
+ case eSectionTypeDataCString: return eAddressClassDataConst;
+ case eSectionTypeDataCStringPointers: return eAddressClassData;
+ case eSectionTypeDataSymbolAddress: return eAddressClassData;
+ case eSectionTypeData4: return eAddressClassData;
+ case eSectionTypeData8: return eAddressClassData;
+ case eSectionTypeData16: return eAddressClassData;
+ case eSectionTypeDataPointers: return eAddressClassData;
+ case eSectionTypeZeroFill: return eAddressClassData;
+ case eSectionTypeDataObjCMessageRefs: return eAddressClassDataConst;
+ case eSectionTypeDataObjCCFStrings: return eAddressClassDataConst;
+ case eSectionTypeDebug: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugAbbrev: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugAranges: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugFrame: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugInfo: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugLine: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugLoc: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugMacInfo: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugPubNames: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugPubTypes: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugRanges: return eAddressClassDebug;
+ case eSectionTypeDWARFDebugStr: return eAddressClassDebug;
+ case eSectionTypeEHFrame: return eAddressClassRuntime;
+ case eSectionTypeOther: return eAddressClassUnknown;
+ }
+ }
+ }
+
+ const lldb::SymbolType symbol_type = symbol->GetType();
+ switch (symbol_type)
+ {
+ case eSymbolTypeAny: return eAddressClassUnknown;
+ case eSymbolTypeAbsolute: return eAddressClassUnknown;
+ case eSymbolTypeExtern: return eAddressClassUnknown;
+ case eSymbolTypeCode: return eAddressClassCode;
+ case eSymbolTypeTrampoline: return eAddressClassCode;
+ case eSymbolTypeData: return eAddressClassData;
+ case eSymbolTypeRuntime: return eAddressClassRuntime;
+ case eSymbolTypeException: return eAddressClassRuntime;
+ case eSymbolTypeSourceFile: return eAddressClassDebug;
+ case eSymbolTypeHeaderFile: return eAddressClassDebug;
+ case eSymbolTypeObjectFile: return eAddressClassDebug;
+ case eSymbolTypeCommonBlock: return eAddressClassDebug;
+ case eSymbolTypeBlock: return eAddressClassDebug;
+ case eSymbolTypeLocal: return eAddressClassData;
+ case eSymbolTypeParam: return eAddressClassData;
+ case eSymbolTypeVariable: return eAddressClassData;
+ case eSymbolTypeVariableType: return eAddressClassDebug;
+ case eSymbolTypeLineEntry: return eAddressClassDebug;
+ case eSymbolTypeLineHeader: return eAddressClassDebug;
+ case eSymbolTypeScopeBegin: return eAddressClassDebug;
+ case eSymbolTypeScopeEnd: return eAddressClassDebug;
+ case eSymbolTypeAdditional: return eAddressClassUnknown;
+ case eSymbolTypeCompiler: return eAddressClassDebug;
+ case eSymbolTypeInstrumentation:return eAddressClassDebug;
+ case eSymbolTypeUndefined: return eAddressClassUnknown;
+ }
+ }
+ }
+ return eAddressClassUnknown;
+}
+
+
diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp
index 497df2478cc..32ac194b66c 100644
--- a/lldb/source/Target/Platform.cpp
+++ b/lldb/source/Target/Platform.cpp
@@ -16,6 +16,7 @@
#include "lldb/Core/Error.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Host/FileSpec.h"
+#include "lldb/Host/Host.h"
#include "lldb/Target/Target.h"
using namespace lldb;
@@ -30,13 +31,6 @@ GetDefaultPlatformSP ()
return g_default_platform_sp;
}
-static PlatformSP&
-GetSelectedPlatformSP ()
-{
- static PlatformSP g_selected_platform_sp;
- return g_selected_platform_sp;
-}
-
static Mutex &
GetConnectedPlatformListMutex ()
{
@@ -74,24 +68,6 @@ Platform::SetDefaultPlatform (const lldb::PlatformSP &platform_sp)
GetDefaultPlatformSP () = platform_sp;
}
-PlatformSP
-Platform::GetSelectedPlatform ()
-{
- PlatformSP platform_sp (GetSelectedPlatformSP ());
- if (!platform_sp)
- platform_sp = GetDefaultPlatform ();
- return platform_sp;
-}
-
-void
-Platform::SetSelectedPlatform (const lldb::PlatformSP &platform_sp)
-{
- // The native platform should use its static void Platform::Initialize()
- // function to register itself as the native platform.
- GetSelectedPlatformSP () = platform_sp;
-}
-
-
Error
Platform::GetFile (const FileSpec &platform_file, FileSpec &local_file)
{
@@ -102,26 +78,20 @@ Platform::GetFile (const FileSpec &platform_file, FileSpec &local_file)
PlatformSP
-Platform::ConnectRemote (const char *platform_name, const char *remote_connect_url, Error &error)
+Platform::Create (const char *platform_name, Error &error)
{
PlatformCreateInstance create_callback = NULL;
lldb::PlatformSP platform_sp;
- if (platform_name)
+ if (platform_name && platform_name[0])
{
create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (platform_name);
if (create_callback)
- {
platform_sp.reset(create_callback());
- if (platform_sp)
- error = platform_sp->ConnectRemote (remote_connect_url);
- else
- error.SetErrorStringWithFormat ("unable to create a platform instance of \"%s\"", platform_name);
- }
else
- error.SetErrorStringWithFormat ("invalid platform name \"%s\"", platform_name);
+ error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name);
}
else
- error.SetErrorString ("Empty platform name");
+ error.SetErrorString ("invalid platform name");
return platform_sp;
}
@@ -147,8 +117,15 @@ Platform::GetConnectedRemotePlatformAtIndex (uint32_t idx)
//------------------------------------------------------------------
/// Default Constructor
//------------------------------------------------------------------
-Platform::Platform () :
- m_remote_url ()
+Platform::Platform (bool is_host) :
+ m_is_host (is_host),
+ m_is_connected (is_host), // If this is the default host platform, then we are always connected
+ m_os_version_set_while_connected (false),
+ m_system_arch_set_while_connected (false),
+ m_remote_url (),
+ m_major_os_version (UINT32_MAX),
+ m_minor_os_version (UINT32_MAX),
+ m_update_os_version (UINT32_MAX)
{
}
@@ -162,6 +139,98 @@ Platform::~Platform()
{
}
+
+bool
+Platform::GetOSVersion (uint32_t &major,
+ uint32_t &minor,
+ uint32_t &update)
+{
+ bool success = m_major_os_version != UINT32_MAX;
+ if (IsHost())
+ {
+ if (!success)
+ {
+ // We have a local host platform
+ success = Host::GetOSVersion (m_major_os_version,
+ m_minor_os_version,
+ m_update_os_version);
+ m_os_version_set_while_connected = success;
+ }
+ }
+ else
+ {
+ // We have a remote platform. We can only fetch the remote
+ // OS version if we are connected, and we don't want to do it
+ // more than once.
+
+ const bool is_connected = IsConnected();
+
+ bool fetch_os_version = false;
+ if (success)
+ {
+ // We have valid OS version info, check to make sure it wasn't
+ // manually set prior to connecting. If it was manually set prior
+ // to connecting, then lets fetch the actual OS version info
+ // if we are now connected.
+ if (is_connected && !m_os_version_set_while_connected)
+ fetch_os_version = true;
+ }
+ else
+ {
+ // We don't have valid OS version info, fetch it if we are connected
+ fetch_os_version = is_connected;
+ }
+
+ if (fetch_os_version)
+ {
+ success = FetchRemoteOSVersion ();
+ m_os_version_set_while_connected = success;
+ }
+ }
+
+ if (success)
+ {
+ major = m_major_os_version;
+ minor = m_minor_os_version;
+ update = m_update_os_version;
+ }
+ return success;
+}
+
+bool
+Platform::SetOSVersion (uint32_t major,
+ uint32_t minor,
+ uint32_t update)
+{
+ if (IsHost())
+ {
+ // We don't need anyone setting the OS version for the host platform,
+ // we should be able to figure it out by calling Host::GetOSVersion(...).
+ return false;
+ }
+ else
+ {
+ // We have a remote platform, allow setting the target OS version if
+ // we aren't connected, since if we are connected, we should be able to
+ // request the remote OS version from the connected platform.
+ if (IsConnected())
+ return false;
+ else
+ {
+ // We aren't connected and we might want to set the OS version
+ // ahead of time before we connect so we can peruse files and
+ // use a local SDK or PDK cache of support files to disassemble
+ // or do other things.
+ m_major_os_version = major;
+ m_minor_os_version = minor;
+ m_update_os_version = update;
+ return true;
+ }
+ }
+ return false;
+}
+
+
Error
Platform::ResolveExecutable (const FileSpec &exe_file,
const ArchSpec &exe_arch,
@@ -213,6 +282,53 @@ Platform::ResolveExecutable (const FileSpec &exe_file,
return error;
}
+
+const ArchSpec &
+Platform::GetSystemArchitecture()
+{
+ if (IsHost())
+ {
+ if (!m_system_arch.IsValid())
+ {
+ // We have a local host platform
+ m_system_arch = Host::GetArchitecture();
+ m_system_arch_set_while_connected = m_system_arch.IsValid();
+ }
+ }
+ else
+ {
+ // We have a remote platform. We can only fetch the remote
+ // system architecture if we are connected, and we don't want to do it
+ // more than once.
+
+ const bool is_connected = IsConnected();
+
+ bool fetch = false;
+ if (m_system_arch.IsValid())
+ {
+ // We have valid OS version info, check to make sure it wasn't
+ // manually set prior to connecting. If it was manually set prior
+ // to connecting, then lets fetch the actual OS version info
+ // if we are now connected.
+ if (is_connected && !m_system_arch_set_while_connected)
+ fetch = true;
+ }
+ else
+ {
+ // We don't have valid OS version info, fetch it if we are connected
+ fetch = is_connected;
+ }
+
+ if (fetch)
+ {
+ m_system_arch = FetchRemoteSystemArchitecture ();
+ m_system_arch_set_while_connected = m_system_arch.IsValid();
+ }
+ }
+ return m_system_arch;
+}
+
+
Error
Platform::ConnectRemote (const char *remote_url)
{
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index bbee9567289..a8bd19e1beb 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -1037,6 +1037,16 @@ Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t
}
+
+size_t
+Process::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
+{
+ PlatformSP platform_sp (m_target.GetPlatform());
+ if (platform_sp)
+ return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site);
+ return 0;
+}
+
Error
Process::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
{
@@ -1661,7 +1671,7 @@ Process::Attach (lldb::pid_t attach_pid)
// of the current Target, and if not adjust it.
ProcessInfo process_info;
- PlatformSP platform_sp (Platform::GetSelectedPlatform ());
+ PlatformSP platform_sp (m_target.GetDebugger().GetPlatformList().GetSelectedPlatform ());
if (platform_sp)
{
if (platform_sp->GetProcessInfo (attach_pid, process_info))
@@ -1714,7 +1724,7 @@ Process::Attach (const char *process_name, bool wait_for_launch)
if (!wait_for_launch)
{
ProcessInfoList process_infos;
- PlatformSP platform_sp (Platform::GetSelectedPlatform ());
+ PlatformSP platform_sp (m_target.GetDebugger().GetPlatformList().GetSelectedPlatform ());
if (platform_sp)
{
platform_sp->FindProcessesByName (process_name, eNameMatchEquals, process_infos);
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 3d8849fe9ec..60f2e2d7d5f 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -39,8 +39,9 @@ using namespace lldb_private;
//----------------------------------------------------------------------
// Target constructor
//----------------------------------------------------------------------
-Target::Target(Debugger &debugger) :
+Target::Target(Debugger &debugger, const lldb::PlatformSP &platform_sp) :
Broadcaster("lldb.target"),
+ m_platform_sp (platform_sp),
TargetInstanceSettings (*GetSettingsController()),
m_debugger (debugger),
m_mutex (Mutex::eMutexTypeRecursive),
@@ -418,33 +419,21 @@ Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
FileSpecList dependent_files;
ObjectFile *executable_objfile = executable_sp->GetObjectFile();
- assert (executable_objfile);
- // TODO: remote assertion above after verifying that it doesn't fire off
- // after the platform changes. The platform is what should be selecting
- // the right slice of an executable file, and it also should be the one
- // to resolve any executables in their bundles.
-// if (executable_objfile == NULL)
-// {
-//
-// FileSpec bundle_executable(executable_sp->GetFileSpec());
-// if (Host::ResolveExecutableInBundle (bundle_executable))
-// {
-// ModuleSP bundle_exe_module_sp(GetSharedModule(bundle_executable,
-// exe_arch));
-// SetExecutableModule (bundle_exe_module_sp, get_dependent_files);
-// if (bundle_exe_module_sp->GetObjectFile() != NULL)
-// executable_sp = bundle_exe_module_sp;
-// return;
-// }
-// }
if (executable_objfile)
{
executable_objfile->GetDependentModules(dependent_files);
for (uint32_t i=0; i<dependent_files.GetSize(); i++)
{
- ModuleSP image_module_sp(GetSharedModule(dependent_files.GetFileSpecPointerAtIndex(i),
- exe_arch));
+ FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
+ FileSpec platform_dependent_file_spec;
+ if (m_platform_sp)
+ m_platform_sp->GetFile (dependent_file_spec, platform_dependent_file_spec);
+ else
+ platform_dependent_file_spec = dependent_file_spec;
+
+ ModuleSP image_module_sp(GetSharedModule (platform_dependent_file_spec,
+ exe_arch));
if (image_module_sp.get())
{
//image_module_sp->Dump(&s);// REMOVE THIS, DEBUG ONLY
diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp
index 25b768f2e51..34520bbfaea 100644
--- a/lldb/source/Target/TargetList.cpp
+++ b/lldb/source/Target/TargetList.cpp
@@ -12,6 +12,7 @@
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Broadcaster.h"
+#include "lldb/Core/Debugger.h"
#include "lldb/Core/Event.h"
#include "lldb/Core/State.h"
#include "lldb/Core/Timer.h"
@@ -60,6 +61,8 @@ TargetList::CreateTarget
file.GetFilename().AsCString(),
arch.GetArchitectureName());
Error error;
+
+ PlatformSP platform_sp (debugger.GetPlatformList().GetSelectedPlatform ());
if (file)
{
@@ -67,7 +70,6 @@ TargetList::CreateTarget
FileSpec resolved_file(file);
ArchSpec platform_arch;
- PlatformSP platform_sp (Platform::GetSelectedPlatform ());
if (platform_sp)
error = platform_sp->ResolveExecutable (file, arch, exe_module_sp);
@@ -92,7 +94,7 @@ TargetList::CreateTarget
}
return error;
}
- target_sp.reset(new Target(debugger));
+ target_sp.reset(new Target(debugger, platform_sp));
target_sp->SetExecutableModule (exe_module_sp, get_dependent_files);
}
}
@@ -100,7 +102,7 @@ TargetList::CreateTarget
{
// No file was specified, just create an empty target with any arch
// if a valid arch was specified
- target_sp.reset(new Target(debugger));
+ target_sp.reset(new Target(debugger, platform_sp));
if (arch.IsValid())
target_sp->SetArchitecture(arch);
}
diff --git a/lldb/source/lldb.cpp b/lldb/source/lldb.cpp
index 061a3d8ee68..b2c2de9bc1d 100644
--- a/lldb/source/lldb.cpp
+++ b/lldb/source/lldb.cpp
@@ -46,6 +46,7 @@
#include "Plugins/Process/MacOSX-User/source/ProcessMacOSX.h"
#include "Plugins/Process/gdb-remote/ProcessGDBRemote.h"
#include "Plugins/Platform/MacOSX/PlatformMacOSX.h"
+#include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
#endif
#if defined (__linux__)
@@ -100,6 +101,7 @@ lldb_private::Initialize ()
//ProcessMacOSX::Initialize();
SymbolVendorMacOSX::Initialize();
PlatformMacOSX::Initialize();
+ PlatformRemoteiOS::Initialize();
#endif
#if defined (__linux__)
PlatformLinux::Initialize();
@@ -154,6 +156,7 @@ lldb_private::Terminate ()
//ProcessMacOSX::Terminate();
SymbolVendorMacOSX::Terminate();
PlatformMacOSX::Terminate();
+ PlatformRemoteiOS::Terminate();
#endif
Debugger::SettingsTerminate ();
OpenPOWER on IntegriCloud