diff options
Diffstat (limited to 'lldb/source/Commands/CommandObjectTarget.cpp')
-rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 430 |
1 files changed, 430 insertions, 0 deletions
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp new file mode 100644 index 00000000000..5ea240e301f --- /dev/null +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -0,0 +1,430 @@ +//===-- CommandObjectTarget.cpp ---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "CommandObjectTarget.h" + +// C Includes +#include <errno.h> +#include <sys/errno.h> +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/Args.h" +#include "lldb/Core/Debugger.h" +#include "lldb/Core/Timer.h" +#include "lldb/Interpreter/CommandContext.h" +#include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Target/Process.h" +#include "lldb/Target/StackFrame.h" +#include "lldb/Target/Thread.h" + +using namespace lldb; +using namespace lldb_private; + +#pragma mark CommandObjectTargetImageSearchPaths + +class CommandObjectTargetImageSearchPathsAdd : public CommandObject +{ +public: + + CommandObjectTargetImageSearchPathsAdd () : + CommandObject ("target image-search-paths add", + "Add new image search paths substitution pairs to the current target.", + "target image-search-paths add <path-prefix> <new-path-prefix> [<path-prefix> <new-path-prefix>] ...") + { + } + + ~CommandObjectTargetImageSearchPathsAdd () + { + } + + bool + Execute (Args& command, + CommandContext *context, + CommandInterpreter *interpreter, + CommandReturnObject &result) + { + Target * target = context->GetTarget(); + if (target) + { + uint32_t argc = command.GetArgumentCount(); + if (argc & 1) + { + result.AppendError ("add requires an even number of arguments"); + result.SetStatus (eReturnStatusFailed); + } + else + { + for (uint32_t i=0; i<argc; i+=2) + { + const char *from = command.GetArgumentAtIndex(i); + const char *to = command.GetArgumentAtIndex(i+1); + + if (from[0] && to[0]) + { + bool last_pair = ((argc - i) == 2); + target->GetImageSearchPathList().Append(ConstString(from), + ConstString(to), + last_pair); // Notify if this is the last pair + } + else + { + if (from[0]) + result.AppendError ("<path-prefix> can't be empty"); + else + result.AppendError ("<new-path-prefix> can't be empty"); + result.SetStatus (eReturnStatusFailed); + } + } + } + } + else + { + result.AppendError ("invalid target"); + result.SetStatus (eReturnStatusFailed); + } + return result.Succeeded(); + } +}; + +class CommandObjectTargetImageSearchPathsClear : public CommandObject +{ +public: + + CommandObjectTargetImageSearchPathsClear () : + CommandObject ("target image-search-paths clear", + "Clears all current image search paths substitution pairs from the current target.", + "target image-search-paths clear") + { + } + + ~CommandObjectTargetImageSearchPathsClear () + { + } + + bool + Execute (Args& command, + CommandContext *context, + CommandInterpreter *interpreter, + CommandReturnObject &result) + { + Target * target = context->GetTarget(); + if (target) + { + bool notify = true; + target->GetImageSearchPathList().Clear(notify); + } + else + { + result.AppendError ("invalid target"); + result.SetStatus (eReturnStatusFailed); + } + return result.Succeeded(); + } +}; + +class CommandObjectTargetImageSearchPathsInsert : public CommandObject +{ +public: + + CommandObjectTargetImageSearchPathsInsert () : + CommandObject ("target image-search-paths insert", + "Inserts a new image search paths substitution pair to the current target at the specified index.", + "target image-search-paths insert <index> <path-prefix> <new-path-prefix> [<path-prefix> <new-path-prefix>] ...") + { + } + + ~CommandObjectTargetImageSearchPathsInsert () + { + } + + bool + Execute (Args& command, + CommandContext *context, + CommandInterpreter *interpreter, + CommandReturnObject &result) + { + Target * target = context->GetTarget(); + if (target) + { + uint32_t argc = command.GetArgumentCount(); + // check for at least 3 arguments and an odd nubmer of parameters + if (argc >= 3 && argc & 1) + { + bool success = false; + + uint32_t insert_idx = Args::StringToUInt32(command.GetArgumentAtIndex(0), UINT32_MAX, 0, &success); + + if (!success) + { + result.AppendErrorWithFormat("<index> parameter is not an integer: '%s'.\n", command.GetArgumentAtIndex(0)); + result.SetStatus (eReturnStatusFailed); + return result.Succeeded(); + } + + // shift off the index + command.Shift(); + argc = command.GetArgumentCount(); + + for (uint32_t i=0; i<argc; i+=2, ++insert_idx) + { + const char *from = command.GetArgumentAtIndex(i); + const char *to = command.GetArgumentAtIndex(i+1); + + if (from[0] && to[0]) + { + bool last_pair = ((argc - i) == 2); + target->GetImageSearchPathList().Insert (ConstString(from), + ConstString(to), + insert_idx, + last_pair); + } + else + { + if (from[0]) + result.AppendError ("<path-prefix> can't be empty"); + else + result.AppendError ("<new-path-prefix> can't be empty"); + result.SetStatus (eReturnStatusFailed); + return false; + } + } + } + else + { + result.AppendError ("insert requires at least three arguments"); + result.SetStatus (eReturnStatusFailed); + return result.Succeeded(); + } + + } + else + { + result.AppendError ("invalid target"); + result.SetStatus (eReturnStatusFailed); + } + return result.Succeeded(); + } +}; + +class CommandObjectTargetImageSearchPathsList : public CommandObject +{ +public: + + CommandObjectTargetImageSearchPathsList () : + CommandObject ("target image-search-paths list", + "Lists all current image search paths substitution pairs in the current target.", + "target image-search-paths list") + { + } + + ~CommandObjectTargetImageSearchPathsList () + { + } + + bool + Execute (Args& command, + CommandContext *context, + CommandInterpreter *interpreter, + CommandReturnObject &result) + { + Target * target = context->GetTarget(); + if (target) + { + if (command.GetArgumentCount() != 0) + { + result.AppendError ("list takes no arguments"); + result.SetStatus (eReturnStatusFailed); + return result.Succeeded(); + } + + target->GetImageSearchPathList().Dump(&result.GetOutputStream()); + } + else + { + result.AppendError ("invalid target"); + result.SetStatus (eReturnStatusFailed); + } + return result.Succeeded(); + } +}; + +class CommandObjectTargetImageSearchPathsQuery : public CommandObject +{ +public: + + CommandObjectTargetImageSearchPathsQuery () : + CommandObject ("target image-search-paths query", + "Transforms a path using the first applicable image search path.", + "target image-search-paths query <path>") + { + } + + ~CommandObjectTargetImageSearchPathsQuery () + { + } + + bool + Execute (Args& command, + CommandContext *context, + CommandInterpreter *interpreter, + CommandReturnObject &result) + { + Target * target = context->GetTarget(); + if (target) + { + if (command.GetArgumentCount() != 1) + { + result.AppendError ("query requires one argument"); + result.SetStatus (eReturnStatusFailed); + return result.Succeeded(); + } + + ConstString orig(command.GetArgumentAtIndex(0)); + ConstString transformed; + if (target->GetImageSearchPathList().RemapPath(orig, transformed)) + result.GetOutputStream().Printf("%s\n", transformed.GetCString()); + else + result.GetOutputStream().Printf("%s\n", orig.GetCString()); + } + else + { + result.AppendError ("invalid target"); + result.SetStatus (eReturnStatusFailed); + } + return result.Succeeded(); + } +}; + +// TODO: implement the target select later when we start doing multiple targets +//#pragma mark CommandObjectTargetSelect +// +////------------------------------------------------------------------------- +//// CommandObjectTargetSelect +////------------------------------------------------------------------------- +// +//class CommandObjectTargetSelect : public CommandObject +//{ +//public: +// +// CommandObjectTargetSelect () : +// CommandObject ("frame select", +// "Select the current frame by index in the current thread.", +// "frame select <frame-index>") +// { +// } +// +// ~CommandObjectTargetSelect () +// { +// } +// +// bool +// Execute (Args& command, +// CommandContext *context, +// CommandInterpreter *interpreter, +// CommandReturnObject &result) +// { +// ExecutionContext exe_ctx (context->GetExecutionContext()); +// if (exe_ctx.thread) +// { +// if (command.GetArgumentCount() == 1) +// { +// const char *frame_idx_cstr = command.GetArgumentAtIndex(0); +// +// const uint32_t num_frames = exe_ctx.thread->GetStackFrameCount(); +// const uint32_t frame_idx = Args::StringToUInt32 (frame_idx_cstr, UINT32_MAX, 0); +// if (frame_idx < num_frames) +// { +// exe_ctx.thread->SetCurrentFrameByIndex (frame_idx); +// exe_ctx.frame = exe_ctx.thread->GetCurrentFrame ().get(); +// +// if (exe_ctx.frame) +// { +// if (DisplayFrameForExecutionContext (exe_ctx.thread, +// exe_ctx.frame, +// interpreter, +// result.GetOutputStream(), +// true, +// true, +// 3, +// 3)) +// { +// result.SetStatus (eReturnStatusSuccessFinishResult); +// return result.Succeeded(); +// } +// } +// } +// if (frame_idx == UINT32_MAX) +// result.AppendErrorWithFormat ("Invalid frame index: %s.\n", frame_idx_cstr); +// else +// result.AppendErrorWithFormat ("Frame index (%u) out of range.\n", frame_idx); +// } +// else +// { +// result.AppendError ("invalid arguments"); +// result.AppendErrorWithFormat ("Usage: %s\n", m_cmd_syntax.c_str()); +// } +// } +// else +// { +// result.AppendError ("no current thread"); +// } +// result.SetStatus (eReturnStatusFailed); +// return false; +// } +//}; + + +#pragma mark CommandObjectMultiwordTarget + +//------------------------------------------------------------------------- +// CommandObjectMultiwordImageSearchPaths +//------------------------------------------------------------------------- + +class CommandObjectMultiwordImageSearchPaths : public CommandObjectMultiword +{ +public: + + CommandObjectMultiwordImageSearchPaths (CommandInterpreter *interpreter) : + CommandObjectMultiword ("target image-search-paths", + "A set of commands for operating on debugger target image search paths.", + "target image-search-paths <subcommand> [<subcommand-options>]") + { + LoadSubCommand (CommandObjectSP (new CommandObjectTargetImageSearchPathsAdd ()), "add", interpreter); + LoadSubCommand (CommandObjectSP (new CommandObjectTargetImageSearchPathsClear ()), "clear", interpreter); + LoadSubCommand (CommandObjectSP (new CommandObjectTargetImageSearchPathsInsert ()), "insert", interpreter); + LoadSubCommand (CommandObjectSP (new CommandObjectTargetImageSearchPathsList ()), "list", interpreter); + LoadSubCommand (CommandObjectSP (new CommandObjectTargetImageSearchPathsQuery ()), "query", interpreter); + } + + ~CommandObjectMultiwordImageSearchPaths() + { + } +}; + + +#pragma mark CommandObjectMultiwordTarget + +//------------------------------------------------------------------------- +// CommandObjectMultiwordTarget +//------------------------------------------------------------------------- + +CommandObjectMultiwordTarget::CommandObjectMultiwordTarget (CommandInterpreter *interpreter) : + CommandObjectMultiword ("target", + "A set of commands for operating on debugger targets.", + "target <subcommand> [<subcommand-options>]") +{ + LoadSubCommand (CommandObjectSP (new CommandObjectMultiwordImageSearchPaths (interpreter)), "image-search-paths", interpreter); +} + +CommandObjectMultiwordTarget::~CommandObjectMultiwordTarget () +{ +} + |