X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-db%2FCLIDebugger.cpp;h=1d2a8387a9c76e209ebc92f2ac3bc17363cdae77;hb=56867520990a4fea1353d55f71bb74a0126554e6;hp=2b3937a075e4214c0c1bab3b1f20e97756f6e8e7;hpb=7af5c12597b4a99a501e1e7ddbecb72b69400488;p=oota-llvm.git diff --git a/tools/llvm-db/CLIDebugger.cpp b/tools/llvm-db/CLIDebugger.cpp index 2b3937a075e..1d2a8387a9c 100644 --- a/tools/llvm-db/CLIDebugger.cpp +++ b/tools/llvm-db/CLIDebugger.cpp @@ -1,12 +1,12 @@ //===-- CLIDebugger.cpp - Command Line Interface to the Debugger ----------===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// -// +// // This file contains the main implementation of the Command Line Interface to // the debugger. // @@ -15,7 +15,7 @@ #include "CLIDebugger.h" #include "CLICommand.h" #include "llvm/Debugger/SourceFile.h" -#include "Support/StringExtras.h" +#include "llvm/ADT/StringExtras.h" #include using namespace llvm; @@ -43,9 +43,9 @@ CLIDebugger::CLIDebugger() &CLIDebugger::fileCommand)); addCommand("create", new BuiltinCLICommand( - "Start the current program, stopping execution in main", + "Start the program, halting its execution in main", "This command creates an instance of the current program, but stops" - " execution immediately.", + "\nexecution immediately.\n", &CLIDebugger::createCommand)); addCommand("kill", new BuiltinCLICommand( @@ -77,7 +77,7 @@ CLIDebugger::CLIDebugger() addCommand("next", C = new BuiltinCLICommand( "Step program until it reaches a new source line, stepping over calls", "", &CLIDebugger::nextCommand)); - addCommand("n", C); + addCommand("n", C); addCommand("finish", new BuiltinCLICommand( "Execute until the selected stack frame returns", @@ -91,8 +91,8 @@ CLIDebugger::CLIDebugger() "Print backtrace of all stack frames, or innermost COUNT frames", "FIXME: describe. Takes 'n', '-n' or 'full'\n", &CLIDebugger::backtraceCommand)); - addCommand("bt", C); - + addCommand("bt", C); + addCommand("up", new BuiltinCLICommand( "Select and print stack frame that called this one", "An argument says how many frames up to go.\n", @@ -108,7 +108,7 @@ CLIDebugger::CLIDebugger() "With no argument, print the selected stack frame. (See also 'info frame').\n" "An argument specifies the frame to select.\n", &CLIDebugger::frameCommand)); - addCommand("f", C); + addCommand("f", C); //===--------------------------------------------------------------------===// // Breakpoint related commands @@ -117,7 +117,7 @@ CLIDebugger::CLIDebugger() "Set breakpoint at specified line or function", "FIXME: describe.\n", &CLIDebugger::breakCommand)); - addCommand("b", C); + addCommand("b", C); //===--------------------------------------------------------------------===// @@ -125,7 +125,10 @@ CLIDebugger::CLIDebugger() // addCommand("info", new BuiltinCLICommand( "Generic command for showing things about the program being debugged", - "FIXME: document\n", + "info functions: display information about functions in the program.\ninfo" + " source : display information about the current source file.\ninfo source" + "s : Display source file names for the program\ninfo target : print status" + " of inferior process\n", &CLIDebugger::infoCommand)); addCommand("list", C = new BuiltinCLICommand( @@ -184,9 +187,9 @@ CLICommand *CLIDebugger::getCommand(const std::string &Command) { // Look up the command in the table. std::map::iterator CI = CommandTable.lower_bound(Command); - + if (Command == "") { - throw "Null command not implemented yet."; + throw "Null command should not get here!"; } else if (CI == CommandTable.end() || !isValidPrefix(Command, CI->first)) { // If this command has no relation to anything in the command table, @@ -204,7 +207,7 @@ CLICommand *CLIDebugger::getCommand(const std::string &Command) { // If the next command is a valid completion of this one, we are // ambiguous. if (++CI2 != CommandTable.end() && isValidPrefix(Command, CI2->first)) { - std::string ErrorMsg = + std::string ErrorMsg = "Ambiguous command '" + Command + "'. Options: " + CI->first; for (++CI; CI != CommandTable.end() && isValidPrefix(Command, CI->first); ++CI) @@ -225,6 +228,11 @@ int CLIDebugger::run() { std::string Command; std::cout << Prompt; + // Keep track of the last command issued, so that we can reissue it if the + // user hits enter as the command. + CLICommand *LastCommand = 0; + std::string LastArgs; + // Continue reading commands until the end of file. while (getline(std::cin, Command)) { std::string Arguments = Command; @@ -233,8 +241,23 @@ int CLIDebugger::run() { Command = getToken(Arguments, " \t\n\v\f\r\\/;.*&"); try { - // Look up the command and execute it. - getCommand(Command)->runCommand(*this, Arguments); + CLICommand *CurCommand; + + if (Command == "") { + CurCommand = LastCommand; + Arguments = LastArgs; + } else { + CurCommand = getCommand(Command); + } + + // Save the command we are running in case the user wants us to repeat it + // next time. + LastCommand = CurCommand; + LastArgs = Arguments; + + // Finally, execute the command. + if (CurCommand) + CurCommand->runCommand(*this, Arguments); } catch (int RetVal) { // The quit command exits the command loop by throwing an integer return @@ -250,7 +273,7 @@ int CLIDebugger::run() { std::cout << "ERROR: Debugger caught unexpected exception!\n"; // Attempt to continue. } - + // Write the prompt to get the next bit of user input std::cout << Prompt; } @@ -279,7 +302,7 @@ bool CLIDebugger::askYesNo(const std::string &Message) const { std::cout << "Please answer y or n.\n" << Message << " (y or n) " << std::flush; } - + // Ran out of input? return false; }