diff options
Diffstat (limited to 'lldb/source/Target')
| -rw-r--r-- | lldb/source/Target/Platform.cpp | 190 | ||||
| -rw-r--r-- | lldb/source/Target/Process.cpp | 14 | ||||
| -rw-r--r-- | lldb/source/Target/Target.cpp | 33 | ||||
| -rw-r--r-- | lldb/source/Target/TargetList.cpp | 8 |
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); } |

