summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-03-19 01:12:21 +0000
committerGreg Clayton <gclayton@apple.com>2011-03-19 01:12:21 +0000
commitded470d31aa3a3b1c6b06fc8ae191d210ae089d5 (patch)
tree57af3b30c78261da0625d9ed4def8ccb212dc078 /lldb/source/Target
parent5366ff18659c58ac54ab55db5c6f3cf5d0e01034 (diff)
downloadbcm5719-llvm-ded470d31aa3a3b1c6b06fc8ae191d210ae089d5.tar.gz
bcm5719-llvm-ded470d31aa3a3b1c6b06fc8ae191d210ae089d5.zip
Added more platform support. There are now some new commands:
platform status -- gets status information for the selected platform platform create <platform-name> -- creates a new instance of a remote platform platform list -- list all available platforms platform select -- select a platform instance as the current platform (not working yet) When using "platform create" it will create a remote platform and make it the selected platform. For instances for iPhone OS debugging on Mac OS X one can do: (lldb) platform create remote-ios --sdk-version=4.0 Remote platform: iOS platform SDK version: 4.0 SDK path: "/Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.0" Not connected to a remote device. (lldb) file ~/Documents/a.out Current executable set to '~/Documents/a.out' (armv6). (lldb) image list [ 0] /Volumes/work/gclayton/Documents/devb/attach/a.out [ 1] /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.0/Symbols/usr/lib/dyld [ 2] /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.0/Symbols/usr/lib/libSystem.B.dylib Note that this is all happening prior to running _or_ connecting to a remote platform. Once connected to a remote platform the OS version might change which means we will need to update our dependecies. Also once we run, we will need to match up the actualy binaries with the actualy UUID's to files in the SDK, or download and cache them locally. This is just the start of the remote platforms, but this modification is the first iteration in getting the platforms really doing something. llvm-svn: 127934
Diffstat (limited to 'lldb/source/Target')
-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
4 files changed, 181 insertions, 64 deletions
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);
}
OpenPOWER on IntegriCloud