Index: tools/lldb-mi/MICmdCmdExec.cpp =================================================================== --- tools/lldb-mi/MICmdCmdExec.cpp +++ tools/lldb-mi/MICmdCmdExec.cpp @@ -92,9 +92,22 @@ CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); lldb::SBError error; lldb::SBStream errMsg; - lldb::SBLaunchInfo launchInfo = rSessionInfo.GetTarget().GetLaunchInfo(); - launchInfo.SetListener(rSessionInfo.GetListener()); - lldb::SBProcess process = rSessionInfo.GetTarget().Launch(launchInfo, error); + + lldb::SBProcess process; + if (rSessionInfo.GetProcess().IsValid() && rSessionInfo.GetProcess().GetState() == lldb::StateType::eStateConnected) + { + // remote process that has not yet been launched + uint32_t launch_flags = lldb::LaunchFlags::eLaunchFlagDebug | lldb::LaunchFlags::eLaunchFlagDisableSTDIO; + process = rSessionInfo.GetProcess(); + process.RemoteLaunch(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, launch_flags, false, error); + } + else + { + lldb::SBLaunchInfo launchInfo = rSessionInfo.GetTarget().GetLaunchInfo(); + launchInfo.SetListener(rSessionInfo.GetListener()); + process = rSessionInfo.GetTarget().Launch(launchInfo, error); + } + if ((!process.IsValid()) || (error.Fail())) { SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), m_cmdData.strMiCmd.c_str(), errMsg.GetData())); Index: tools/lldb-mi/MICmdCmdFile.h =================================================================== --- tools/lldb-mi/MICmdCmdFile.h +++ tools/lldb-mi/MICmdCmdFile.h @@ -69,4 +69,6 @@ const CMIUtilString m_constStrArgNameFile; const CMIUtilString m_constStrArgThreadGrp; // Not handled by *this command. Not specified in MI spec but Eclipse gives this option sometimes + const CMIUtilString m_constStrArgNamedPlatformName; //added to support iOS platform selection + const CMIUtilString m_constStrArgNamedRemotePath; //added to support iOS device remote file location }; Index: tools/lldb-mi/MICmdCmdFile.cpp =================================================================== --- tools/lldb-mi/MICmdCmdFile.cpp +++ tools/lldb-mi/MICmdCmdFile.cpp @@ -29,7 +29,10 @@ #include "MICmnLLDBDebugSessionInfo.h" #include "MIUtilFileStd.h" #include "MICmdArgValFile.h" +#include "MICmdArgValString.h" #include "MICmdArgValOptionLong.h" +#include "MICmdArgValOptionShort.h" + //++ ------------------------------------------------------------------------------------ // Details: CMICmdCmdFileExecAndSymbols constructor. @@ -41,6 +44,8 @@ CMICmdCmdFileExecAndSymbols::CMICmdCmdFileExecAndSymbols(void) : m_constStrArgNameFile("file") , m_constStrArgThreadGrp("thread-group") + , m_constStrArgNamedPlatformName("p") + , m_constStrArgNamedRemotePath("r") { // Command factory matches this name with that received from the stdin stream m_strMiCmd = "file-exec-and-symbols"; @@ -75,6 +80,12 @@ bool bOk = m_setCmdArgs.Add( *(new CMICmdArgValOptionLong(m_constStrArgThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1))); bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValFile(m_constStrArgNameFile, true, true))); + bOk = bOk && + m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgNamedPlatformName, false, true, + CMICmdArgValListBase::eArgValType_String, 1))); + bOk = bOk && + m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgNamedRemotePath, false, true, + CMICmdArgValListBase::eArgValType_StringQuoted, 1))); return (bOk && ParseValidateCmdOptions()); } @@ -93,13 +104,23 @@ CMICmdCmdFileExecAndSymbols::Execute(void) { CMICMDBASE_GETOPTION(pArgNamedFile, File, m_constStrArgNameFile); + CMICMDBASE_GETOPTION(pArgPlatformName, OptionShort, m_constStrArgNamedPlatformName); + CMICMDBASE_GETOPTION(pArgRemotePath, OptionShort, m_constStrArgNamedRemotePath); + CMICmdArgValFile *pArgFile = static_cast(pArgNamedFile); const CMIUtilString &strExeFilePath(pArgFile->GetValue()); + bool bPlatformName = pArgPlatformName->GetFound(); + CMIUtilString platformName(""); + if (bPlatformName) + { + pArgPlatformName->GetExpectedOption(platformName); + } + CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); lldb::SBDebugger &rDbgr = rSessionInfo.GetDebugger(); lldb::SBError error; const MIchar *pTargetTriple = nullptr; // Let LLDB discover the triple required - const MIchar *pTargetPlatformName = ""; + const MIchar *pTargetPlatformName = platformName.c_str(); const bool bAddDepModules = false; lldb::SBTarget target = rDbgr.CreateTarget(strExeFilePath.c_str(), pTargetTriple, pTargetPlatformName, bAddDepModules, error); CMIUtilString strWkDir; @@ -118,7 +139,19 @@ SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FNFAILED), m_cmdData.strMiCmd.c_str(), "SetCurrentPlatformSDKRoot()")); return MIstatus::failure; + + } + if (pArgRemotePath->GetFound()) + { + CMIUtilString remotePath; + pArgRemotePath->GetExpectedOption(remotePath); + lldb::SBModule module = target.GetModuleAtIndex(0); + if (module.IsValid()) + { + module.SetPlatformFileSpec(lldb::SBFileSpec(remotePath.c_str())); + } } + lldb::SBStream err; if (error.Fail()) {