diff options
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/Interpreter.cpp')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Interpreter.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.cpp b/lib/ExecutionEngine/Interpreter/Interpreter.cpp new file mode 100644 index 0000000..678c77a --- /dev/null +++ b/lib/ExecutionEngine/Interpreter/Interpreter.cpp @@ -0,0 +1,56 @@ +//===- Interpreter.cpp - Top-Level LLVM Interpreter Implementation --------===// +// +// This file implements the top-level functionality for the LLVM interpreter. +// This interpreter is designed to be a very simple, portable, inefficient +// interpreter. +// +//===----------------------------------------------------------------------===// + +#include "Interpreter.h" +#include "llvm/Target/TargetMachineImpls.h" + +/// createInterpreter - Create a new interpreter object. This can never fail. +/// +ExecutionEngine *ExecutionEngine::createInterpreter(Module *M, + unsigned Config, + bool DebugMode, + bool TraceMode) { + return new Interpreter(M, Config, DebugMode, TraceMode); +} + +//===----------------------------------------------------------------------===// +// Interpreter ctor - Initialize stuff +// +Interpreter::Interpreter(Module *M, unsigned Config, + bool DebugMode, bool TraceMode) + : ExecutionEngine(M), ExitCode(0), Debug(DebugMode), Trace(TraceMode), + CurFrame(-1), TD("lli", (Config & TM::EndianMask) == TM::LittleEndian, + 1, 4, + (Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4, + (Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4) { + + setTargetData(TD); + // Initialize the "backend" + initializeExecutionEngine(); + initializeExternalMethods(); + CW.setModule(M); // Update Writer +} + +/// run - Start execution with the specified function and arguments. +/// +int Interpreter::run(const std::string &MainFunction, + const std::vector<std::string> &Args) { + // Start interpreter into the main function... + // + if (!callMainMethod(MainFunction, Args) && !Debug) { + // If not in debug mode and if the call succeeded, run the code now... + run(); + } + + // If debug mode, allow the user to interact... also, if the user pressed + // ctrl-c or execution hit an error, enter the event loop... + if (Debug || isStopped()) + handleUserInput(); + return ExitCode; +} + |