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
This commit is contained in:
Greg Clayton 2015-01-28 01:33:37 +00:00
parent 33c9433ed4
commit ccd2a6d958
3 changed files with 52 additions and 11 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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])