LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Interpreter.cpp
Go to the documentation of this file.
1 //===- Interpreter.cpp - Top-Level LLVM Interpreter Implementation --------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the top-level functionality for the LLVM interpreter.
11 // This interpreter is designed to be a very simple, portable, inefficient
12 // interpreter.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "Interpreter.h"
18 #include "llvm/IR/DerivedTypes.h"
19 #include "llvm/IR/Module.h"
20 #include <cstring>
21 using namespace llvm;
22 
23 namespace {
24 
25 static struct RegisterInterp {
26  RegisterInterp() { Interpreter::Register(); }
27 } InterpRegistrator;
28 
29 }
30 
31 extern "C" void LLVMLinkInInterpreter() { }
32 
33 /// create - Create a new interpreter object. This can never fail.
34 ///
35 ExecutionEngine *Interpreter::create(Module *M, std::string* ErrStr) {
36  // Tell this Module to materialize everything and release the GVMaterializer.
37  if (M->MaterializeAllPermanently(ErrStr))
38  // We got an error, just return 0
39  return 0;
40 
41  return new Interpreter(M);
42 }
43 
44 //===----------------------------------------------------------------------===//
45 // Interpreter ctor - Initialize stuff
46 //
48  : ExecutionEngine(M), TD(M) {
49 
50  memset(&ExitValue.Untyped, 0, sizeof(ExitValue.Untyped));
51  setDataLayout(&TD);
52  // Initialize the "backend"
53  initializeExecutionEngine();
54  initializeExternalFunctions();
55  emitGlobals();
56 
57  IL = new IntrinsicLowering(TD);
58 }
59 
61  delete IL;
62 }
63 
65  while (!AtExitHandlers.empty()) {
66  callFunction(AtExitHandlers.back(), std::vector<GenericValue>());
67  AtExitHandlers.pop_back();
68  run();
69  }
70 }
71 
72 /// run - Start execution with the specified function and arguments.
73 ///
76  const std::vector<GenericValue> &ArgValues) {
77  assert (F && "Function *F was null at entry to run()");
78 
79  // Try extra hard not to pass extra args to a function that isn't
80  // expecting them. C programmers frequently bend the rules and
81  // declare main() with fewer parameters than it actually gets
82  // passed, and the interpreter barfs if you pass a function more
83  // parameters than it is declared to take. This does not attempt to
84  // take into account gratuitous differences in declared types,
85  // though.
86  std::vector<GenericValue> ActualArgs;
87  const unsigned ArgCount = F->getFunctionType()->getNumParams();
88  for (unsigned i = 0; i < ArgCount; ++i)
89  ActualArgs.push_back(ArgValues[i]);
90 
91  // Set up the function call.
92  callFunction(F, ActualArgs);
93 
94  // Start executing the function.
95  run();
96 
97  return ExitValue;
98 }
virtual GenericValue runFunction(Function *F, const std::vector< GenericValue > &ArgValues)
Definition: Interpreter.cpp:75
The main container class for the LLVM Intermediate Representation.
Definition: Module.h:112
unsigned getNumParams() const
Definition: DerivedTypes.h:133
unsigned char Untyped[8]
Definition: GenericValue.h:36
F(f)
void setDataLayout(const DataLayout *td)
void callFunction(Function *F, const std::vector< GenericValue > &ArgVals)
Definition: Execution.cpp:2074
bool MaterializeAllPermanently(std::string *ErrInfo=0)
Definition: Module.cpp:431
Abstract interface for implementation execution of LLVM modules, designed to support both interpreter...
static ExecutionEngine * create(Module *M, std::string *ErrorStr=0)
Definition: Interpreter.cpp:35
Interpreter(Module *M)
Definition: Interpreter.cpp:47
void runAtExitHandlers()
Definition: Interpreter.cpp:64
void LLVMLinkInInterpreter()
Definition: Interpreter.cpp:31
FunctionType * getFunctionType() const
Definition: Function.cpp:171
INITIALIZE_PASS(GlobalMerge,"global-merge","Global Merge", false, false) bool GlobalMerge const DataLayout * TD