diff options
| author | Alexander Polyakov <polyakov.alx@gmail.com> | 2018-07-02 23:54:06 +0000 | 
|---|---|---|
| committer | Alexander Polyakov <polyakov.alx@gmail.com> | 2018-07-02 23:54:06 +0000 | 
| commit | fc018b071b9ef9810089fc3ca27a4a61c9300d38 (patch) | |
| tree | 5376e6a057bf31770582aef1923a91bbfaf112d2 /lldb/tools/lldb-mi | |
| parent | d4a1bd7d87b8f7e54a028aa6f38c2bbd34a4bd76 (diff) | |
| download | bcm5719-llvm-fc018b071b9ef9810089fc3ca27a4a61c9300d38.tar.gz bcm5719-llvm-fc018b071b9ef9810089fc3ca27a4a61c9300d38.zip  | |
[lldb-mi] Re-implement a few MI commands.
Summary: This patch updates exec-next-instruction, exec-step-instruction,
exec-finish, exec-interrupt commands to use SB API instead of HandleCommand.
Reviewers: aprantl, clayborg
Reviewed By: aprantl
Subscribers: ki.stfu, lldb-commits
Differential Revision: https://reviews.llvm.org/D48520
llvm-svn: 336155
Diffstat (limited to 'lldb/tools/lldb-mi')
| -rw-r--r-- | lldb/tools/lldb-mi/MICmdCmdExec.cpp | 174 | ||||
| -rw-r--r-- | lldb/tools/lldb-mi/MICmdCmdExec.h | 13 | 
2 files changed, 72 insertions, 115 deletions
diff --git a/lldb/tools/lldb-mi/MICmdCmdExec.cpp b/lldb/tools/lldb-mi/MICmdCmdExec.cpp index 1884531ecc8..1102b952407 100644 --- a/lldb/tools/lldb-mi/MICmdCmdExec.cpp +++ b/lldb/tools/lldb-mi/MICmdCmdExec.cpp @@ -599,14 +599,23 @@ bool CMICmdCmdExecNextInstruction::Execute() {    CMICmnLLDBDebugSessionInfo &rSessionInfo(        CMICmnLLDBDebugSessionInfo::Instance()); -  lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger(); -  CMIUtilString strCmd("thread step-inst-over"); -  if (nThreadId != UINT64_MAX) -    strCmd += CMIUtilString::Format(" %llu", nThreadId); -  rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult, -                                                  false); -  return MIstatus::success; +  lldb::SBError error; +  if (nThreadId != UINT64_MAX) { +    lldb::SBThread sbThread = +        rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); +    if (!sbThread.IsValid()) { +      SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), +                                     m_cmdData.strMiCmd.c_str(), +                                     m_constStrArgThread.c_str())); +      return MIstatus::failure; +    } +    sbThread.StepInstruction(true, error); +  } else +    rSessionInfo.GetProcess().GetSelectedThread().StepInstruction( +        true, error); + +  return HandleSBError(error);  }  //++ @@ -621,21 +630,8 @@ bool CMICmdCmdExecNextInstruction::Execute() {  // Throws:  None.  //--  bool CMICmdCmdExecNextInstruction::Acknowledge() { -  if (m_lldbResult.GetErrorSize() > 0) { -    const char *pLldbErr = m_lldbResult.GetError(); -    MIunused(pLldbErr); -    const CMICmnMIValueConst miValueConst(m_lldbResult.GetError()); -    const CMICmnMIValueResult miValueResult("message", miValueConst); -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, -        miValueResult); -    m_miResultRecord = miRecordResult; -  } else { -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); -    m_miResultRecord = miRecordResult; -  } - +  m_miResultRecord = CMICmnMIResultRecord( +      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running);    return MIstatus::success;  } @@ -727,14 +723,23 @@ bool CMICmdCmdExecStepInstruction::Execute() {    CMICmnLLDBDebugSessionInfo &rSessionInfo(        CMICmnLLDBDebugSessionInfo::Instance()); -  lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger(); -  CMIUtilString strCmd("thread step-inst"); -  if (nThreadId != UINT64_MAX) -    strCmd += CMIUtilString::Format(" %llu", nThreadId); -  rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult, -                                                  false); -  return MIstatus::success; +  lldb::SBError error; +  if (nThreadId != UINT64_MAX) { +    lldb::SBThread sbThread = +        rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); +    if (!sbThread.IsValid()) { +      SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), +                                     m_cmdData.strMiCmd.c_str(), +                                     m_constStrArgThread.c_str())); +      return MIstatus::failure; +    } +    sbThread.StepInstruction(false, error); +  } else +    rSessionInfo.GetProcess().GetSelectedThread().StepInstruction( +        false, error); + +  return HandleSBError(error);  }  //++ @@ -749,21 +754,8 @@ bool CMICmdCmdExecStepInstruction::Execute() {  // Throws:  None.  //--  bool CMICmdCmdExecStepInstruction::Acknowledge() { -  if (m_lldbResult.GetErrorSize() > 0) { -    const char *pLldbErr = m_lldbResult.GetError(); -    MIunused(pLldbErr); -    const CMICmnMIValueConst miValueConst(m_lldbResult.GetError()); -    const CMICmnMIValueResult miValueResult("message", miValueConst); -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, -        miValueResult); -    m_miResultRecord = miRecordResult; -  } else { -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); -    m_miResultRecord = miRecordResult; -  } - +  m_miResultRecord = CMICmnMIResultRecord( +      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running);    return MIstatus::success;  } @@ -851,14 +843,22 @@ bool CMICmdCmdExecFinish::Execute() {    CMICmnLLDBDebugSessionInfo &rSessionInfo(        CMICmnLLDBDebugSessionInfo::Instance()); -  lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger(); -  CMIUtilString strCmd("thread step-out"); -  if (nThreadId != UINT64_MAX) -    strCmd += CMIUtilString::Format(" %llu", nThreadId); -  rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult, -                                                  false); -  return MIstatus::success; +  lldb::SBError error; +  if (nThreadId != UINT64_MAX) { +    lldb::SBThread sbThread = +        rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); +    if (!sbThread.IsValid()) { +      SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), +                                     m_cmdData.strMiCmd.c_str(), +                                     m_constStrArgThread.c_str())); +      return MIstatus::failure; +    } +    sbThread.StepOut(error); +  } else +    rSessionInfo.GetProcess().GetSelectedThread().StepOut(error); + +  return HandleSBError(error);  }  //++ @@ -873,21 +873,8 @@ bool CMICmdCmdExecFinish::Execute() {  // Throws:  None.  //--  bool CMICmdCmdExecFinish::Acknowledge() { -  if (m_lldbResult.GetErrorSize() > 0) { -    const char *pLldbErr = m_lldbResult.GetError(); -    MIunused(pLldbErr); -    const CMICmnMIValueConst miValueConst(m_lldbResult.GetError()); -    const CMICmnMIValueResult miValueResult("message", miValueConst); -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, -        miValueResult); -    m_miResultRecord = miRecordResult; -  } else { -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); -    m_miResultRecord = miRecordResult; -  } - +  m_miResultRecord = CMICmnMIResultRecord( +      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running);    return MIstatus::success;  } @@ -948,25 +935,22 @@ CMICmdCmdExecInterrupt::~CMICmdCmdExecInterrupt() {}  // Throws:  None.  //--  bool CMICmdCmdExecInterrupt::Execute() { -  CMICmnLLDBDebugSessionInfo &rSessionInfo( -      CMICmnLLDBDebugSessionInfo::Instance()); -  lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger(); -  CMIUtilString strCmd("process interrupt"); -  const lldb::ReturnStatus status = -      rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), -                                                      m_lldbResult, false); -  MIunused(status); - -  // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM -  if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging()) { -    const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription()); -    SetErrorDescription( -        CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE), -                              strCmd.c_str(), rErrMsg.c_str())); -    return MIstatus::failure; -  } +  const auto successHandler = [this] { +    // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM +    if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging()) { +      const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription()); +      SetErrorDescription(CMIUtilString::Format( +          MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE), +          m_cmdData.strMiCmd.c_str(), +          rErrMsg.c_str())); +      return MIstatus::failure; +    } +    return MIstatus::success; +  }; -  return MIstatus::success; +  return HandleSBErrorWithSuccess( +      CMICmnLLDBDebugSessionInfo::Instance().GetProcess().Stop(), +      successHandler);  }  //++ @@ -981,19 +965,8 @@ bool CMICmdCmdExecInterrupt::Execute() {  // Throws:  None.  //--  bool CMICmdCmdExecInterrupt::Acknowledge() { -  if (m_lldbResult.GetErrorSize() > 0) { -    const CMICmnMIValueConst miValueConst(m_lldbResult.GetError()); -    const CMICmnMIValueResult miValueResult("message", miValueConst); -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, -        miValueResult); -    m_miResultRecord = miRecordResult; -  } else { -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); -    m_miResultRecord = miRecordResult; -  } - +  m_miResultRecord = CMICmnMIResultRecord( +      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done);    return MIstatus::success;  } @@ -1113,10 +1086,8 @@ bool CMICmdCmdExecArguments::Execute() {  // Throws:  None.  //--  bool CMICmdCmdExecArguments::Acknowledge() { -  const CMICmnMIResultRecord miRecordResult( +  m_miResultRecord = CMICmnMIResultRecord(        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); -  m_miResultRecord = miRecordResult; -    return MIstatus::success;  } @@ -1209,9 +1180,8 @@ bool CMICmdCmdExecAbort::Execute() {  // Throws:  None.  //--  bool CMICmdCmdExecAbort::Acknowledge() { -  const CMICmnMIResultRecord miRecordResult( +  m_miResultRecord = CMICmnMIResultRecord(        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); -  m_miResultRecord = miRecordResult;    return MIstatus::success;  } diff --git a/lldb/tools/lldb-mi/MICmdCmdExec.h b/lldb/tools/lldb-mi/MICmdCmdExec.h index 92bffa8d63f..451d25e29eb 100644 --- a/lldb/tools/lldb-mi/MICmdCmdExec.h +++ b/lldb/tools/lldb-mi/MICmdCmdExec.h @@ -33,8 +33,6 @@  #pragma once  // Third party headers: -#include "lldb/API/SBCommandReturnObject.h" -  // In-house headers:  #include "MICmdBase.h" @@ -90,7 +88,6 @@ public:    bool Acknowledge() override;    // From CMICmnBase    /* dtor */ ~CMICmdCmdExecContinue() override; -  // Attributes:  };  //++ @@ -179,7 +176,6 @@ public:    // Attributes:  private: -  lldb::SBCommandReturnObject m_lldbResult;    const CMIUtilString m_constStrArgNumber; // Not specified in MI spec but                                             // Eclipse gives this option  }; @@ -210,7 +206,6 @@ public:    // Attributes:  private: -  lldb::SBCommandReturnObject m_lldbResult;    const CMIUtilString m_constStrArgNumber; // Not specified in MI spec but                                             // Eclipse gives this option  }; @@ -238,10 +233,6 @@ public:    bool ParseArgs() override;    // From CMICmnBase    /* dtor */ ~CMICmdCmdExecFinish() override; - -  // Attributes: -private: -  lldb::SBCommandReturnObject m_lldbResult;  };  // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM @@ -270,10 +261,6 @@ public:    bool Acknowledge() override;    // From CMICmnBase    /* dtor */ ~CMICmdCmdExecInterrupt() override; - -  // Attributes: -private: -  lldb::SBCommandReturnObject m_lldbResult;  };  //++  | 

