aboutsummaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine/Interpreter/UserInput.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2001-08-23 17:05:04 +0000
committerChris Lattner <sabre@nondot.org>2001-08-23 17:05:04 +0000
commit92101acd7fd44fd467fbeb974ae6c042289c74f9 (patch)
tree8a95b8161082bc30eb13e16302b30a3f38fd0ef3 /lib/ExecutionEngine/Interpreter/UserInput.cpp
parente27c344b5657eb225688c2adb163d6064cc9cf8f (diff)
Initial checkin of interpreter
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/UserInput.cpp')
-rw-r--r--lib/ExecutionEngine/Interpreter/UserInput.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/Interpreter/UserInput.cpp b/lib/ExecutionEngine/Interpreter/UserInput.cpp
new file mode 100644
index 0000000000..cfa74f1ffa
--- /dev/null
+++ b/lib/ExecutionEngine/Interpreter/UserInput.cpp
@@ -0,0 +1,147 @@
+//===-- UserInput.cpp - Interpreter Input Loop support --------------------===//
+//
+// This file implements the interpreter Input I/O loop.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Interpreter.h"
+#include "llvm/Assembly/Writer.h"
+#include <algorithm>
+
+enum CommandID {
+ Quit, Help, // Basics
+ Print, List, StackTrace, Up, Down, // Inspection
+ Next, Step, Run, Finish, Call, // Control flow changes
+ Break, Watch, // Debugging
+ Load, Flush
+};
+
+// CommandTable - Build a lookup table for the commands available to the user...
+static struct CommandTableElement {
+ const char *Name;
+ enum CommandID CID;
+
+ inline bool operator<(const CommandTableElement &E) const {
+ return string(Name) < string(E.Name);
+ }
+ inline bool operator==(const string &S) const {
+ return string(Name) == S;
+ }
+} CommandTable[] = {
+ { "quit" , Quit }, { "q", Quit }, { "", Quit }, // Empty str = eof
+ { "help" , Help }, { "h", Help },
+
+ { "print" , Print }, { "p", Print },
+ { "list" , List },
+ { "backtrace", StackTrace }, { "bt", StackTrace }, { "where", StackTrace },
+ { "up" , Up },
+ { "down" , Down },
+
+ { "next" , Next }, { "n", Next },
+ { "step" , Step }, { "s", Step },
+ { "run" , Run },
+ { "finish" , Finish },
+ { "call" , Call },
+
+ { "break" , Break }, { "b", Break },
+ { "watch" , Watch },
+
+ { "load" , Load },
+ { "flush" , Flush },
+};
+static CommandTableElement *CommandTableEnd =
+ CommandTable+sizeof(CommandTable)/sizeof(CommandTable[0]);
+
+
+//===----------------------------------------------------------------------===//
+// handleUserInput - Enter the input loop for the interpreter. This function
+// returns when the user quits the interpreter.
+//
+void Interpreter::handleUserInput() {
+ bool UserQuit = false;
+
+ // Sort the table...
+ sort(CommandTable, CommandTableEnd);
+
+ // Print the instruction that we are stopped at...
+ printCurrentInstruction();
+
+ do {
+ string Command;
+ cout << "lli> " << flush;
+ cin >> Command;
+
+ CommandTableElement *E = find(CommandTable, CommandTableEnd, Command);
+
+ if (E == CommandTableEnd) {
+ cout << "Error: '" << Command << "' not recognized!\n";
+ continue;
+ }
+
+ switch (E->CID) {
+ case Quit: UserQuit = true; break;
+ case Print:
+ cin >> Command;
+ printValue(Command);
+ break;
+ case List: list(); break;
+ case StackTrace: printStackTrace(); break;
+ case Up:
+ if (CurFrame > 0) --CurFrame;
+ else cout << "Error: Already at root of stack!\n";
+ break;
+ case Down:
+ if ((unsigned)CurFrame < ECStack.size()-1) ++CurFrame;
+ else cout << "Error: Already at bottom of stack!\n";
+ break;
+ case Next: nextInstruction(); break;
+ case Step: stepInstruction(); break;
+ case Run: run(); break;
+ case Finish: finish(); break;
+ case Call:
+ cin >> Command;
+ callMethod(Command); // Enter the specified method
+ finish(); // Run until it's complete
+ break;
+
+ default:
+ cout << "Command '" << Command << "' unimplemented!\n";
+ break;
+ }
+
+ } while (!UserQuit);
+}
+
+
+//===----------------------------------------------------------------------===//
+// setBreakpoint - Enable a breakpoint at the specified location
+//
+void Interpreter::setBreakpoint(const string &Name) {
+ Value *PickedVal = ChooseOneOption(Name, LookupMatchingNames(Name));
+ // TODO: Set a breakpoint on PickedVal
+}
+
+//===----------------------------------------------------------------------===//
+// callMethod - Enter the specified method...
+//
+bool Interpreter::callMethod(const string &Name) {
+ vector<Value*> Options = LookupMatchingNames(Name);
+
+ for (unsigned i = 0; i < Options.size(); ++i) { // Remove nonmethod matches...
+ if (!Options[i]->isMethod()) {
+ Options.erase(Options.begin()+i);
+ --i;
+ }
+ }
+
+ Value *PickedMeth = ChooseOneOption(Name, Options);
+ if (PickedMeth == 0)
+ return true;
+
+ callMethod(PickedMeth->castMethodAsserting()); // Start executing it...
+
+ // Reset the current frame location to the top of stack
+ CurFrame = ECStack.size()-1;
+
+ return false;
+}