diff options
Diffstat (limited to 'lldb/tools/lldb-mi/MICmdCmdTarget.cpp')
| -rw-r--r-- | lldb/tools/lldb-mi/MICmdCmdTarget.cpp | 263 | 
1 files changed, 263 insertions, 0 deletions
| diff --git a/lldb/tools/lldb-mi/MICmdCmdTarget.cpp b/lldb/tools/lldb-mi/MICmdCmdTarget.cpp index 80669db514e..17e664f85b4 100644 --- a/lldb/tools/lldb-mi/MICmdCmdTarget.cpp +++ b/lldb/tools/lldb-mi/MICmdCmdTarget.cpp @@ -22,6 +22,9 @@  #include "MICmnLLDBDebugger.h"  #include "MICmnLLDBDebugSessionInfo.h"  #include "MICmdArgValString.h" +#include "MICmdArgValOptionLong.h" +#include "MICmdArgValOptionShort.h" +#include "MICmdArgValNumber.h"  //++ ------------------------------------------------------------------------------------  // Details: CMICmdCmdTargetSelect constructor. @@ -204,3 +207,263 @@ CMICmdCmdTargetSelect::CreateSelf(void)  {      return new CMICmdCmdTargetSelect();  } + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmdCmdTargetAttach constructor. +// Type:    Method. +// Args:    None. +// Return:  None. +// Throws:  None. +//-- +CMICmdCmdTargetAttach::CMICmdCmdTargetAttach(void) +: m_constStrArgPid("pid") +, m_constStrArgNamedFile("n") +, m_constStrArgWaitFor("waitfor") +{ +    // Command factory matches this name with that received from the stdin stream +    m_strMiCmd = "target-attach"; +     +    // Required by the CMICmdFactory when registering *this command +    m_pSelfCreatorFn = &CMICmdCmdTargetAttach::CreateSelf; +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmdCmdTargetAttach destructor. +// Type:    Overrideable. +// Args:    None. +// Return:  None. +// Throws:  None. +//-- +CMICmdCmdTargetAttach::~CMICmdCmdTargetAttach(void) +{ +} + +//++ ------------------------------------------------------------------------------------ +// 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 +CMICmdCmdTargetAttach::ParseArgs(void) +{ +    bool bOk = m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgPid, false, true))); +    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgNamedFile, false, true, +                                                              CMICmdArgValListBase::eArgValType_String, 1))); +    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgWaitFor, false, true))); +    return (bOk && 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: -target-attach file +//          Ref: http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation +// Type:    Overridden. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None. +//-- +bool +CMICmdCmdTargetAttach::Execute(void) +{ +    CMICMDBASE_GETOPTION(pArgPid, Number, m_constStrArgPid); +    CMICMDBASE_GETOPTION(pArgFile, OptionShort, m_constStrArgNamedFile); +    CMICMDBASE_GETOPTION(pArgWaitFor, OptionLong, m_constStrArgWaitFor); +     +    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); +     +    // If the current target is invalid, create one +    lldb::SBTarget target = rSessionInfo.GetTarget(); +    if (!target.IsValid()) +    { +        target = rSessionInfo.GetDebugger().CreateTarget(NULL); +        if (!target.IsValid()) +        { +            SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), m_cmdData.strMiCmd.c_str())); +            return MIstatus::failure; +        } +    } + +    lldb::SBError error; +    lldb::SBListener listener; +    if (pArgPid->GetFound() && pArgPid->GetValid()) +    { +        lldb::pid_t pid; +        pid = pArgPid->GetValue(); +        target.AttachToProcessWithID(listener, pid, error); +    } +    else if (pArgFile->GetFound() && pArgFile->GetValid()) +    { +        bool bWaitFor = (pArgWaitFor->GetFound()); +        CMIUtilString file; +        pArgFile->GetExpectedOption<CMICmdArgValString>(file); +        target.AttachToProcessWithName(listener, file.c_str(), bWaitFor, error); +    } +    else +    { +        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ATTACH_BAD_ARGS), m_cmdData.strMiCmd.c_str())); +        return MIstatus::failure; +    } + +    lldb::SBStream errMsg; +    if (error.Fail()) +    { +        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ATTACH_FAILED), m_cmdData.strMiCmd.c_str(), errMsg.GetData())); +        return MIstatus::failure; +    } +     +    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 +CMICmdCmdTargetAttach::Acknowledge(void) +{ +    const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); +    m_miResultRecord = miRecordResult; +     +    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); +    lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); +    // 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-started,id="i1"' +    m_bHasResultRecordExtra = true; +    const CMICmnMIValueConst miValueConst2("i1"); +    const CMICmnMIValueResult miValueResult2("id", miValueConst2); +    const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); +    const CMICmnMIValueConst miValueConst(strPid); +    const CMICmnMIValueResult miValueResult("pid", miValueConst); +    CMICmnMIOutOfBandRecord miOutOfBand(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, miValueResult2); +    miOutOfBand.Add(miValueResult); +    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 * +CMICmdCmdTargetAttach::CreateSelf(void) +{ +    return new CMICmdCmdTargetAttach(); +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmdCmdTargetDetach constructor. +// Type:    Method. +// Args:    None. +// Return:  None. +// Throws:  None. +//-- +CMICmdCmdTargetDetach::CMICmdCmdTargetDetach() +{ +    // Command factory matches this name with that received from the stdin stream +    m_strMiCmd = "target-detach"; +     +    // Required by the CMICmdFactory when registering *this command +    m_pSelfCreatorFn = &CMICmdCmdTargetDetach::CreateSelf; +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMICmdCmdTargetDetach destructor. +// Type:    Overrideable. +// Args:    None. +// Return:  None. +// Throws:  None. +//-- +CMICmdCmdTargetDetach::~CMICmdCmdTargetDetach(void) +{ +} + +//++ ------------------------------------------------------------------------------------ +// 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 +CMICmdCmdTargetDetach::ParseArgs(void) +{ +    return MIstatus::success; +} + +//++ ------------------------------------------------------------------------------------ +// 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: -target-attach file +//          Ref: http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation +// Type:    Overridden. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None. +//-- +bool +CMICmdCmdTargetDetach::Execute(void) +{ +    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); +     +    lldb::SBProcess process = rSessionInfo.GetProcess(); +     +    if (!process.IsValid()) +    { +        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), m_cmdData.strMiCmd.c_str())); +        return MIstatus::failure; +    } +     +    process.Detach(); +     +    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 +CMICmdCmdTargetDetach::Acknowledge(void) +{ +    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 * +CMICmdCmdTargetDetach::CreateSelf(void) +{ +    return new CMICmdCmdTargetDetach(); +} | 

