From ccd2a6d95846e676a1aefabd1c9022cc2fb3d1db Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Wed, 28 Jan 2015 01:33:37 +0000 Subject: [PATCH] Changes in 226712 needed some fixing as a platform is almost always selected and even if platform options are specified when doing a "target create" they would get ignored if a platform was already selected. The change was made so we could re-use a platform if one was already created instead of creating a new one, but it would fail in the above case. To fix this, if we have a selected platform, we verify that the platform matches the current platform before we try to re-use it. We do this by asking the OptionGroupPlatform if the platform matches. If so, it returns true and we don't create a new platform, else we do. llvm-svn: 227288 --- .../include/lldb/Interpreter/OptionGroupPlatform.h | 6 ++-- lldb/source/Interpreter/OptionGroupPlatform.cpp | 35 ++++++++++++++++++++++ lldb/source/Target/TargetList.cpp | 22 ++++++++------ 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/lldb/include/lldb/Interpreter/OptionGroupPlatform.h b/lldb/include/lldb/Interpreter/OptionGroupPlatform.h index 970ad32..f7de50c 100644 --- a/lldb/include/lldb/Interpreter/OptionGroupPlatform.h +++ b/lldb/include/lldb/Interpreter/OptionGroupPlatform.h @@ -102,8 +102,10 @@ public: SetSDKBuild (const ConstString &sdk_build) { m_sdk_build = sdk_build; - } - + } + + bool + PlatformMatches(const lldb::PlatformSP &platform_sp) const; protected: std::string m_platform_name; diff --git a/lldb/source/Interpreter/OptionGroupPlatform.cpp b/lldb/source/Interpreter/OptionGroupPlatform.cpp index 7e5e124..6bb3655 100644 --- a/lldb/source/Interpreter/OptionGroupPlatform.cpp +++ b/lldb/source/Interpreter/OptionGroupPlatform.cpp @@ -147,3 +147,38 @@ OptionGroupPlatform::SetOptionValue (CommandInterpreter &interpreter, } return error; } + +bool +OptionGroupPlatform::PlatformMatches(const lldb::PlatformSP &platform_sp) const +{ + if (platform_sp) + { + if (!m_platform_name.empty()) + { + if (platform_sp->GetName() != ConstString(m_platform_name.c_str())) + return false; + } + + if (m_sdk_build && m_sdk_build != platform_sp->GetSDKBuild()) + return false; + + if (m_sdk_sysroot && m_sdk_sysroot != platform_sp->GetSDKRootDirectory()) + return false; + + if (m_os_version_major != UINT32_MAX) + { + uint32_t major, minor, update; + if (platform_sp->GetOSVersion (major, minor, update)) + { + if (m_os_version_major != major) + return false; + if (m_os_version_minor != minor) + return false; + if (m_os_version_update != update) + return false; + } + } + return true; + } + return false; +} diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index 9972fda..1e06341 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -130,16 +130,20 @@ TargetList::CreateTargetInternal (Debugger &debugger, // let's see if there is already an existing plaform before we go creating another... platform_sp = debugger.GetPlatformList().GetSelectedPlatform(); - if (!platform_sp && platform_options && platform_options->PlatformWasSpecified ()) + if (platform_options && platform_options->PlatformWasSpecified ()) { - const bool select_platform = true; - platform_sp = platform_options->CreatePlatformWithOptions (interpreter, - arch, - select_platform, - error, - platform_arch); - if (!platform_sp) - return error; + // Create a new platform if it doesn't match the selected platform + if (!platform_options->PlatformMatches(platform_sp)) + { + const bool select_platform = true; + platform_sp = platform_options->CreatePlatformWithOptions (interpreter, + arch, + select_platform, + error, + platform_arch); + if (!platform_sp) + return error; + } } if (user_exe_path && user_exe_path[0]) -- 2.7.4