diff options
Diffstat (limited to 'tools/lldb-mi/MICmdCmdMiscellanous.cpp')
| -rw-r--r-- | tools/lldb-mi/MICmdCmdMiscellanous.cpp | 586 | 
1 files changed, 0 insertions, 586 deletions
| diff --git a/tools/lldb-mi/MICmdCmdMiscellanous.cpp b/tools/lldb-mi/MICmdCmdMiscellanous.cpp deleted file mode 100644 index 5aa795999535..000000000000 --- a/tools/lldb-mi/MICmdCmdMiscellanous.cpp +++ /dev/null @@ -1,586 +0,0 @@ -//===-- MICmdCmdMiscellanous.cpp --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview:    CMICmdCmdGdbExit                implementation. -//              CMICmdCmdListThreadGroups       implementation. -//              CMICmdCmdInterpreterExec        implementation. -//              CMICmdCmdInferiorTtySet         implementation. - -// Third Party Headers: -#include "lldb/API/SBCommandInterpreter.h" -#include "lldb/API/SBThread.h" - -// In-house headers: -#include "MICmdArgValFile.h" -#include "MICmdArgValListOfN.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" -#include "MICmdCmdMiscellanous.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnStreamStderr.h" -#include "MICmnStreamStdout.h" -#include "MIDriverBase.h" - -//++ -// Details: CMICmdCmdGdbExit constructor. -// Type:    Method. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdGdbExit::CMICmdCmdGdbExit() { -  // Command factory matches this name with that received from the stdin stream -  m_strMiCmd = "gdb-exit"; - -  // Required by the CMICmdFactory when registering *this command -  m_pSelfCreatorFn = &CMICmdCmdGdbExit::CreateSelf; -} - -//++ -// Details: CMICmdCmdGdbExit destructor. -// Type:    Overrideable. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdGdbExit::~CMICmdCmdGdbExit() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -//          The command is likely to communicate with the LLDB SBDebugger in -//          here. -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdGdbExit::Execute() { -  CMICmnLLDBDebugger::Instance().GetDriver().SetExitApplicationFlag(true); -  const lldb::SBError sbErr = m_rLLDBDebugSessionInfo.GetProcess().Destroy(); -  // Do not check for sbErr.Fail() here, m_lldbProcess is likely !IsValid() - -  return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -//          for the work carried out in the Execute(). -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdGdbExit::Acknowledge() { -  const CMICmnMIResultRecord miRecordResult( -      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Exit); -  m_miResultRecord = miRecordResult; - -  // Prod the client i.e. Eclipse with out-of-band results to help it 'continue' -  // because it is using LLDB debugger -  // Give the client '=thread-group-exited,id="i1"' -  m_bHasResultRecordExtra = true; -  const CMICmnMIValueConst miValueConst2("i1"); -  const CMICmnMIValueResult miValueResult2("id", miValueConst2); -  const CMICmnMIOutOfBandRecord miOutOfBand( -      CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited, miValueResult2); -  m_miResultRecordExtra = miOutOfBand.GetString(); - -  return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -//          calls this function to create an instance of *this command. -// Type:    Static method. -// Args:    None. -// Return:  CMICmdBase * - Pointer to a new command. -// Throws:  None. -//-- -CMICmdBase *CMICmdCmdGdbExit::CreateSelf() { return new CMICmdCmdGdbExit(); } - - -//++ -// Details: CMICmdCmdListThreadGroups constructor. -// Type:    Method. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdListThreadGroups::CMICmdCmdListThreadGroups() -    : m_bIsI1(false), m_bHaveArgOption(false), m_bHaveArgRecurse(false), -      m_constStrArgNamedAvailable("available"), -      m_constStrArgNamedRecurse("recurse"), m_constStrArgNamedGroup("group"), -      m_constStrArgNamedThreadGroup("i1") { -  // Command factory matches this name with that received from the stdin stream -  m_strMiCmd = "list-thread-groups"; - -  // Required by the CMICmdFactory when registering *this command -  m_pSelfCreatorFn = &CMICmdCmdListThreadGroups::CreateSelf; -} - -//++ -// Details: CMICmdCmdListThreadGroups destructor. -// Type:    Overrideable. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdListThreadGroups::~CMICmdCmdListThreadGroups() { -  m_vecMIValueTuple.clear(); -} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -//          arguments to extract values for each of those arguments. -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdListThreadGroups::ParseArgs() { -  m_setCmdArgs.Add( -      new CMICmdArgValOptionLong(m_constStrArgNamedAvailable, false, true)); -  m_setCmdArgs.Add( -      new CMICmdArgValOptionLong(m_constStrArgNamedRecurse, false, true, -                                 CMICmdArgValListBase::eArgValType_Number, 1)); -  m_setCmdArgs.Add( -      new CMICmdArgValListOfN(m_constStrArgNamedGroup, false, true, -                              CMICmdArgValListBase::eArgValType_Number)); -  m_setCmdArgs.Add( -      new CMICmdArgValThreadGrp(m_constStrArgNamedThreadGroup, false, true)); -  return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -//          The command is likely to communicate with the LLDB SBDebugger in -//          here. -//          Synopsis: -list-thread-groups [ --available ] [ --recurse 1 ] [ -//          group ... ] -//          This command does not follow the MI documentation exactly. Has an -//          extra -//          argument "i1" to handle. -//          Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Miscellaneous-Commands.html#GDB_002fMI-Miscellaneous-Commands -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdListThreadGroups::Execute() { -  if (m_setCmdArgs.IsArgContextEmpty()) -    // No options so "top level thread groups" -    return MIstatus::success; - -  CMICMDBASE_GETOPTION(pArgAvailable, OptionLong, m_constStrArgNamedAvailable); -  CMICMDBASE_GETOPTION(pArgRecurse, OptionLong, m_constStrArgNamedRecurse); -  CMICMDBASE_GETOPTION(pArgThreadGroup, ThreadGrp, -                       m_constStrArgNamedThreadGroup); - -  // Got some options so "threads" -  if (pArgAvailable->GetFound()) { -    if (pArgRecurse->GetFound()) { -      m_bHaveArgRecurse = true; -      return MIstatus::success; -    } - -    m_bHaveArgOption = true; -    return MIstatus::success; -  } -  // "i1" as first argument (pos 0 of possible arg) -  if (!pArgThreadGroup->GetFound()) -    return MIstatus::success; -  m_bIsI1 = true; - -  CMICmnLLDBDebugSessionInfo &rSessionInfo( -      CMICmnLLDBDebugSessionInfo::Instance()); -  lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - -  // Note do not check for sbProcess is IsValid(), continue - -  m_vecMIValueTuple.clear(); -  const MIuint nThreads = sbProcess.GetNumThreads(); -  for (MIuint i = 0; i < nThreads; i++) { -    //  GetThreadAtIndex() uses a base 0 index -    //  GetThreadByIndexID() uses a base 1 index -    lldb::SBThread thread = sbProcess.GetThreadAtIndex(i); - -    if (thread.IsValid()) { -      CMICmnMIValueTuple miTuple; -      if (!rSessionInfo.MIResponseFormThreadInfo( -              m_cmdData, thread, -              CMICmnLLDBDebugSessionInfo::eThreadInfoFormat_NoFrames, miTuple)) -        return MIstatus::failure; - -      m_vecMIValueTuple.push_back(miTuple); -    } -  } - -  return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -//          for the work carried out in the Execute(). -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdListThreadGroups::Acknowledge() { -  if (m_bHaveArgOption) { -    if (m_bHaveArgRecurse) { -      const CMICmnMIValueConst miValueConst( -          MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); -      const CMICmnMIValueResult miValueResult("msg", miValueConst); -      const CMICmnMIResultRecord miRecordResult( -          m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, -          miValueResult); -      m_miResultRecord = miRecordResult; - -      return MIstatus::success; -    } - -    const CMICmnMIValueConst miValueConst1("i1"); -    const CMICmnMIValueResult miValueResult1("id", miValueConst1); -    CMICmnMIValueTuple miTuple(miValueResult1); - -    const CMICmnMIValueConst miValueConst2("process"); -    const CMICmnMIValueResult miValueResult2("type", miValueConst2); -    miTuple.Add(miValueResult2); - -    CMICmnLLDBDebugSessionInfo &rSessionInfo( -        CMICmnLLDBDebugSessionInfo::Instance()); -    if (rSessionInfo.GetProcess().IsValid()) { -      const lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); -      const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); -      const CMICmnMIValueConst miValueConst3(strPid); -      const CMICmnMIValueResult miValueResult3("pid", miValueConst3); -      miTuple.Add(miValueResult3); -    } - -    const CMICmnMIValueConst miValueConst4( -        MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); -    const CMICmnMIValueResult miValueResult4("num_children", miValueConst4); -    miTuple.Add(miValueResult4); - -    const CMICmnMIValueConst miValueConst5( -        MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); -    const CMICmnMIValueResult miValueResult5("cores", miValueConst5); -    miTuple.Add(miValueResult5); - -    const CMICmnMIValueList miValueList(miTuple); -    const CMICmnMIValueResult miValueResult6("groups", miValueList); -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, -        miValueResult6); -    m_miResultRecord = miRecordResult; - -    return MIstatus::success; -  } - -  if (!m_bIsI1) { -    const CMICmnMIValueConst miValueConst1("i1"); -    const CMICmnMIValueResult miValueResult1("id", miValueConst1); -    CMICmnMIValueTuple miTuple(miValueResult1); - -    const CMICmnMIValueConst miValueConst2("process"); -    const CMICmnMIValueResult miValueResult2("type", miValueConst2); -    miTuple.Add(miValueResult2); - -    CMICmnLLDBDebugSessionInfo &rSessionInfo( -        CMICmnLLDBDebugSessionInfo::Instance()); -    if (rSessionInfo.GetProcess().IsValid()) { -      const lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); -      const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); -      const CMICmnMIValueConst miValueConst3(strPid); -      const CMICmnMIValueResult miValueResult3("pid", miValueConst3); -      miTuple.Add(miValueResult3); -    } - -    if (rSessionInfo.GetTarget().IsValid()) { -      lldb::SBTarget sbTrgt = rSessionInfo.GetTarget(); -      const char *pDir = sbTrgt.GetExecutable().GetDirectory(); -      const char *pFileName = sbTrgt.GetExecutable().GetFilename(); -      const CMIUtilString strFile( -          CMIUtilString::Format("%s/%s", -                                CMIUtilString::WithNullAsEmpty(pDir), -                                CMIUtilString::WithNullAsEmpty(pFileName))); -      const CMICmnMIValueConst miValueConst4(strFile); -      const CMICmnMIValueResult miValueResult4("executable", miValueConst4); -      miTuple.Add(miValueResult4); -    } - -    const CMICmnMIValueList miValueList(miTuple); -    const CMICmnMIValueResult miValueResult5("groups", miValueList); -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, -        miValueResult5); -    m_miResultRecord = miRecordResult; -    return MIstatus::success; -  } - -  // Build up a list of thread information from tuples -  VecMIValueTuple_t::const_iterator it = m_vecMIValueTuple.begin(); -  if (it == m_vecMIValueTuple.end()) { -    const CMICmnMIValueConst miValueConst("[]"); -    const CMICmnMIValueResult miValueResult("threads", miValueConst); -    const CMICmnMIResultRecord miRecordResult( -        m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, -        miValueResult); -    m_miResultRecord = miRecordResult; -    return MIstatus::success; -  } -  CMICmnMIValueList miValueList(*it); -  ++it; -  while (it != m_vecMIValueTuple.end()) { -    const CMICmnMIValueTuple &rTuple(*it); -    miValueList.Add(rTuple); - -    // Next -    ++it; -  } - -  const CMICmnMIValueResult miValueResult("threads", miValueList); -  const CMICmnMIResultRecord miRecordResult( -      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, -      miValueResult); -  m_miResultRecord = miRecordResult; - -  return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -//          calls this function to create an instance of *this command. -// Type:    Static method. -// Args:    None. -// Return:  CMICmdBase * - Pointer to a new command. -// Throws:  None. -//-- -CMICmdBase *CMICmdCmdListThreadGroups::CreateSelf() { -  return new CMICmdCmdListThreadGroups(); -} - - -//++ -// Details: CMICmdCmdInterpreterExec constructor. -// Type:    Method. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdInterpreterExec::CMICmdCmdInterpreterExec() -    : m_constStrArgNamedInterpreter("interpreter"), -      m_constStrArgNamedCommand("command") { -  // Command factory matches this name with that received from the stdin stream -  m_strMiCmd = "interpreter-exec"; - -  // Required by the CMICmdFactory when registering *this command -  m_pSelfCreatorFn = &CMICmdCmdInterpreterExec::CreateSelf; -} - -//++ -// Details: CMICmdCmdInterpreterExec destructor. -// Type:    Overrideable. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdInterpreterExec::~CMICmdCmdInterpreterExec() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -//          arguments to extract values for each of those arguments. -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdInterpreterExec::ParseArgs() { -  m_setCmdArgs.Add( -      new CMICmdArgValString(m_constStrArgNamedInterpreter, true, true)); -  m_setCmdArgs.Add( -      new CMICmdArgValString(m_constStrArgNamedCommand, true, true, true)); -  return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -//          The command is likely to communicate with the LLDB SBDebugger in -//          here. -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdInterpreterExec::Execute() { -  CMICMDBASE_GETOPTION(pArgInterpreter, String, m_constStrArgNamedInterpreter); -  CMICMDBASE_GETOPTION(pArgCommand, String, m_constStrArgNamedCommand); - -  // Handle the interpreter parameter by do nothing on purpose (set to 'handled' -  // in the arg definition above) -  const CMIUtilString &rStrInterpreter(pArgInterpreter->GetValue()); -  MIunused(rStrInterpreter); - -  const CMIUtilString &rStrCommand(pArgCommand->GetValue()); -  CMICmnLLDBDebugSessionInfo &rSessionInfo( -      CMICmnLLDBDebugSessionInfo::Instance()); -  const lldb::ReturnStatus rtn = -      rSessionInfo.GetDebugger().GetCommandInterpreter().HandleCommand( -          rStrCommand.c_str(), m_lldbResult, true); -  MIunused(rtn); - -  return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -//          for the work carried out in the Execute(). -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdInterpreterExec::Acknowledge() { -  if (m_lldbResult.GetOutputSize() > 0) { -    const CMIUtilString line(m_lldbResult.GetOutput()); -    const bool bEscapeQuotes(true); -    CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); -    CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_ConsoleStreamOutput, miValueConst); -    const bool bOk = CMICmnStreamStdout::TextToStdout(miOutOfBandRecord.GetString()); -    if (!bOk) -      return MIstatus::failure; -  } -  if (m_lldbResult.GetErrorSize() > 0) { -    const CMIUtilString line(m_lldbResult.GetError()); -    const bool bEscapeQuotes(true); -    CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); -    CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_LogStreamOutput, miValueConst); -    const bool bOk = CMICmnStreamStdout::TextToStdout(miOutOfBandRecord.GetString()); -    if (!bOk) -      return MIstatus::failure; -  } - -  const CMICmnMIResultRecord miRecordResult( -      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); -  m_miResultRecord = miRecordResult; - -  return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -//          calls this function to create an instance of *this command. -// Type:    Static method. -// Args:    None. -// Return:  CMICmdBase * - Pointer to a new command. -// Throws:  None. -//-- -CMICmdBase *CMICmdCmdInterpreterExec::CreateSelf() { -  return new CMICmdCmdInterpreterExec(); -} - - -//++ -// Details: CMICmdCmdInferiorTtySet constructor. -// Type:    Method. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdInferiorTtySet::CMICmdCmdInferiorTtySet() { -  // Command factory matches this name with that received from the stdin stream -  m_strMiCmd = "inferior-tty-set"; - -  // Required by the CMICmdFactory when registering *this command -  m_pSelfCreatorFn = &CMICmdCmdInferiorTtySet::CreateSelf; -} - -//++ -// Details: CMICmdCmdInferiorTtySet destructor. -// Type:    Overrideable. -// Args:    None. -// Return:  None. -// Throws:  None. -//-- -CMICmdCmdInferiorTtySet::~CMICmdCmdInferiorTtySet() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -//          The command is likely to communicate with the LLDB SBDebugger in -//          here. -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdInferiorTtySet::Execute() { -  // Do nothing - -  return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -//          for the work carried out in the Execute(). -// Type:    Overridden. -// Args:    None. -// Return:  MIstatus::success - Functional succeeded. -//          MIstatus::failure - Functional failed. -// Throws:  None. -//-- -bool CMICmdCmdInferiorTtySet::Acknowledge() { -  const CMICmnMIResultRecord miRecordResult( -      m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error); -  m_miResultRecord = miRecordResult; - -  return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -//          calls this function to create an instance of *this command. -// Type:    Static method. -// Args:    None. -// Return:  CMICmdBase * - Pointer to a new command. -// Throws:  None. -//-- -CMICmdBase *CMICmdCmdInferiorTtySet::CreateSelf() { -  return new CMICmdCmdInferiorTtySet(); -} | 
