Interpreter.cpp revision 203954
172132Ssemenu//===- Interpreter.cpp - Top-Level LLVM Interpreter Implementation --------===//
272132Ssemenu//
372132Ssemenu//                     The LLVM Compiler Infrastructure
472132Ssemenu//
572132Ssemenu// This file is distributed under the University of Illinois Open Source
672132Ssemenu// License. See LICENSE.TXT for details.
772132Ssemenu//
872132Ssemenu//===----------------------------------------------------------------------===//
972132Ssemenu//
1072132Ssemenu// This file implements the top-level functionality for the LLVM interpreter.
1172132Ssemenu// This interpreter is designed to be a very simple, portable, inefficient
1272132Ssemenu// interpreter.
1372132Ssemenu//
1472132Ssemenu//===----------------------------------------------------------------------===//
1572132Ssemenu
1672132Ssemenu#include "Interpreter.h"
1772132Ssemenu#include "llvm/CodeGen/IntrinsicLowering.h"
1872132Ssemenu#include "llvm/DerivedTypes.h"
1972132Ssemenu#include "llvm/Module.h"
2072132Ssemenu#include <cstring>
2172132Ssemenuusing namespace llvm;
2272132Ssemenu
2372132Ssemenunamespace {
2472132Ssemenu
2572132Ssemenustatic struct RegisterInterp {
2672132Ssemenu  RegisterInterp() { Interpreter::Register(); }
2772132Ssemenu} InterpRegistrator;
2872132Ssemenu
2972132Ssemenu}
3072132Ssemenu
3172132Ssemenuextern "C" void LLVMLinkInInterpreter() { }
3272132Ssemenu
3372132Ssemenu/// create - Create a new interpreter object.  This can never fail.
3472132Ssemenu///
3572132SsemenuExecutionEngine *Interpreter::create(Module *M, std::string* ErrStr) {
3672132Ssemenu  // Tell this Module to materialize everything and release the GVMaterializer.
3772132Ssemenu  if (M->MaterializeAllPermanently(ErrStr))
3872132Ssemenu    // We got an error, just return 0
3972132Ssemenu    return 0;
4072132Ssemenu
4172132Ssemenu  return new Interpreter(M);
4272132Ssemenu}
4372132Ssemenu
4472132Ssemenu//===----------------------------------------------------------------------===//
4572132Ssemenu// Interpreter ctor - Initialize stuff
4672132Ssemenu//
4772132SsemenuInterpreter::Interpreter(Module *M)
4872132Ssemenu  : ExecutionEngine(M), TD(M) {
4972132Ssemenu
5072132Ssemenu  memset(&ExitValue.Untyped, 0, sizeof(ExitValue.Untyped));
5172132Ssemenu  setTargetData(&TD);
5272132Ssemenu  // Initialize the "backend"
5372132Ssemenu  initializeExecutionEngine();
5472132Ssemenu  initializeExternalFunctions();
5572132Ssemenu  emitGlobals();
5672132Ssemenu
5772132Ssemenu  IL = new IntrinsicLowering(TD);
5872132Ssemenu}
5972132Ssemenu
6072132SsemenuInterpreter::~Interpreter() {
6172132Ssemenu  delete IL;
6272132Ssemenu}
6372132Ssemenu
6472132Ssemenuvoid Interpreter::runAtExitHandlers () {
6572132Ssemenu  while (!AtExitHandlers.empty()) {
6672132Ssemenu    callFunction(AtExitHandlers.back(), std::vector<GenericValue>());
6772132Ssemenu    AtExitHandlers.pop_back();
6872132Ssemenu    run();
6972132Ssemenu  }
7072132Ssemenu}
7172132Ssemenu
7272132Ssemenu/// run - Start execution with the specified function and arguments.
7372132Ssemenu///
7472132SsemenuGenericValue
7572132SsemenuInterpreter::runFunction(Function *F,
7672132Ssemenu                         const std::vector<GenericValue> &ArgValues) {
7772132Ssemenu  assert (F && "Function *F was null at entry to run()");
7872132Ssemenu
7972132Ssemenu  // Try extra hard not to pass extra args to a function that isn't
8072132Ssemenu  // expecting them.  C programmers frequently bend the rules and
8172132Ssemenu  // declare main() with fewer parameters than it actually gets
8272132Ssemenu  // passed, and the interpreter barfs if you pass a function more
8372132Ssemenu  // parameters than it is declared to take. This does not attempt to
8472132Ssemenu  // take into account gratuitous differences in declared types,
8572132Ssemenu  // though.
8672132Ssemenu  std::vector<GenericValue> ActualArgs;
8772132Ssemenu  const unsigned ArgCount = F->getFunctionType()->getNumParams();
8872132Ssemenu  for (unsigned i = 0; i < ArgCount; ++i)
8972132Ssemenu    ActualArgs.push_back(ArgValues[i]);
9072132Ssemenu
9172132Ssemenu  // Set up the function call.
9272132Ssemenu  callFunction(F, ActualArgs);
9372132Ssemenu
9472132Ssemenu  // Start executing the function.
9592739Salfred  run();
9692739Salfred
9772132Ssemenu  return ExitValue;
9872132Ssemenu}
9972132Ssemenu