llvm-6502/lib/ExecutionEngine/Interpreter/Interpreter.cpp
Chris Lattner 56adf152f6 Make sure that globals are emitted AFTER the passmanager is set up for the JIT,
because the globals may refer to functions that need to be compiled!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6105 91177308-0d34-0410-b5e6-96231b3b80d8
2003-05-12 02:14:34 +00:00

58 lines
2.0 KiB
C++

//===- 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,
(Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4,
(Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4,
(Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4) {
setTargetData(TD);
// Initialize the "backend"
initializeExecutionEngine();
initializeExternalFunctions();
CW.setModule(M); // Update Writer
emitGlobals();
}
/// 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 (!callMainFunction(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;
}