Add -p and -r options to lldb-mi command -file-exec-file-and-symbols to support iOS...
authorHafiz Abid Qadeer <hafiz_abid@mentor.com>
Thu, 12 Mar 2015 18:35:54 +0000 (18:35 +0000)
committerHafiz Abid Qadeer <hafiz_abid@mentor.com>
Thu, 12 Mar 2015 18:35:54 +0000 (18:35 +0000)
The patch adds 2 options which are not present in the GDB MI. Those have been described in MIExtensions.txt.

Patch from Chuck Ries.

llvm-svn: 232077

lldb/tools/lldb-mi/MICmdCmdFile.cpp
lldb/tools/lldb-mi/MICmdCmdFile.h
lldb/tools/lldb-mi/MIExtensions.txt [new file with mode: 0644]

index 83862f24f1f11c8d95694b5f9b5d11f1fe6d2cd0..a5967e92538b92fd70de88476411e522e5463539 100644 (file)
@@ -29,7 +29,9 @@
 #include "MICmnLLDBDebugSessionInfo.h"
 #include "MIUtilFileStd.h"
 #include "MICmdArgValFile.h"
+#include "MICmdArgValString.h"
 #include "MICmdArgValOptionLong.h"
+#include "MICmdArgValOptionShort.h"
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmdCmdFileExecAndSymbols constructor.
@@ -41,6 +43,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 +79,12 @@ CMICmdCmdFileExecAndSymbols::ParseArgs(void)
     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_StringQuotedNumberPath, 1)));
     return (bOk && ParseValidateCmdOptions());
 }
 
@@ -93,13 +103,21 @@ bool
 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<CMICmdArgValFile *>(pArgNamedFile);
     const CMIUtilString &strExeFilePath(pArgFile->GetValue());
+    bool bPlatformName = pArgPlatformName->GetFound();
+    CMIUtilString platformName;
+    if (bPlatformName)
+    {
+        pArgPlatformName->GetExpectedOption<CMICmdArgValString, CMIUtilString>(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;
@@ -119,6 +137,16 @@ CMICmdCmdFileExecAndSymbols::Execute(void)
         SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FNFAILED), m_cmdData.strMiCmd.c_str(), "SetCurrentPlatformSDKRoot()"));
         return MIstatus::failure;
     }
+    if (pArgRemotePath->GetFound())
+    {
+        CMIUtilString remotePath;
+        pArgRemotePath->GetExpectedOption<CMICmdArgValString, CMIUtilString>(remotePath);
+        lldb::SBModule module = target.FindModule(target.GetExecutable());
+        if (module.IsValid())
+        {
+            module.SetPlatformFileSpec(lldb::SBFileSpec(remotePath.c_str()));
+        }
+    }
     lldb::SBStream err;
     if (error.Fail())
     {
index 5e23c85daeff504134047ceb76a4697e825d2201..e379d1867f49a0d974a14493dc8fb0cc73a6664f 100644 (file)
@@ -39,7 +39,8 @@
 // Details: MI command class. MI commands derived from the command base class.
 //          *this class implements MI command "file-exec-and-symbols".
 //          This command does not follow the MI documentation exactly.
-// Gotchas: None.
+// Gotchas: This command has additonal flags that were not available in GDB MI.
+//          See MIextensions.txt for details.
 // Authors: Illya Rudkin 25/02/2014.
 // Changes: None.
 //--
@@ -69,4 +70,6 @@ class CMICmdCmdFileExecAndSymbols : public CMICmdBase
     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
 };
diff --git a/lldb/tools/lldb-mi/MIExtensions.txt b/lldb/tools/lldb-mi/MIExtensions.txt
new file mode 100644 (file)
index 0000000..76fcf1e
--- /dev/null
@@ -0,0 +1,10 @@
+-file-exec-and-symbols now takes two new (optional) options:
+
+Synopsis
+
+       -file-exec-and-symbols <file> [-p <platform>] [-r <remote-file>]
+
+Specify the executable file to be debugged. This file is the one from which the symbol table is also read. 
+When debugging remote targets specify a remote-file for execution and a file from which symbols are read. 
+The optional platform is the name of the platform, e.g., "remote-ios" or "ios-simulator". The remote-file 
+is the on-device path to the exe.