summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target
diff options
context:
space:
mode:
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