ExecutionEngine.h revision 70bca51f92871c7f9d3eac9ab68292c149fab53c
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===//
2bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
3bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file defines the abstract interface that implements execution support
4bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// for LLVM.
5bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
6bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===//
7bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
8bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#ifndef EXECUTION_ENGINE_H
9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#define EXECUTION_ENGINE_H
10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <vector>
12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <string>
13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <map>
14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant;
15bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Type;
16bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass GlobalValue;
17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function;
18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module;
19bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData;
20bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerunion GenericValue;
21bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
22bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass ExecutionEngine {
23bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  Module &CurMod;
24bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  const TargetData *TD;
25bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
26bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerprotected:
27bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // GlobalAddress - A mapping between LLVM global values and their actualized
28bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // version...
29bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  std::map<const GlobalValue*, void *> GlobalAddress;
30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
31bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void setTargetData(const TargetData &td) {
32bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    TD = &td;
33bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    emitGlobals();
34bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic:
36bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  ExecutionEngine(Module *M) : CurMod(*M) {
37bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    assert(M && "Module is null?");
38bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  virtual ~ExecutionEngine();
40bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
41bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  Module &getModule() const { return CurMod; }
42bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  const TargetData &getTargetData() const { return *TD; }
43bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
44bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  /// run - Start execution with the specified function and arguments.
45bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  ///
46bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  virtual int run(const std::string &FnName,
47bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner		  const std::vector<std::string> &Args) = 0;
48bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
49bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  /// createJIT - Create an return a new JIT compiler if there is one available
50bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  /// for the current target.  Otherwise it returns null.
51bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  ///
52bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  static ExecutionEngine *createJIT(Module *M, unsigned Config);
53bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
54bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  /// createInterpreter - Create a new interpreter object.  This can never fail.
55bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  ///
56bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  static ExecutionEngine *createInterpreter(Module *M, unsigned Config,
57bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner					    bool DebugMode, bool TraceMode);
58bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
59bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void addGlobalMapping(const Function *F, void *Addr) {
60bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    void *&CurVal = GlobalAddress[(const GlobalValue*)F];
61bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    assert(CurVal == 0 && "GlobalMapping already established!");
62bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    CurVal = Addr;
63bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
64bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
6570bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  // getPointerToGlobalIfAvailable - This returns the address of the specified
6670bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  // global value if it is available, otherwise it returns null.
6770bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  //
6870bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  void *getPointerToGlobalIfAvailable(const GlobalValue *GV) {
6970bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner    std::map<const GlobalValue*, void*>::iterator I = GlobalAddress.find(GV);
7070bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner    return I != GlobalAddress.end() ? I->second : 0;
7170bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  }
7270bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner
73bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // getPointerToGlobal - This returns the address of the specified global
74bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // value.  This may involve code generation if it's a function.
75bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  //
76bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void *getPointerToGlobal(const GlobalValue *GV);
77bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
78bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // getPointerToFunction - The different EE's represent function bodies in
79bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // different ways.  They should each implement this to say what a function
80bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // pointer should look like.
81bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  //
82bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  virtual void *getPointerToFunction(const Function *F) = 0;
83bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
84bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerprivate:
85bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void emitGlobals();
86bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
87bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic:   // FIXME: protected:   // API shared among subclasses
88bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  GenericValue getConstantValue(const Constant *C);
89bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty);
90f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner  GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty);
91bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void *CreateArgv(const std::vector<std::string> &InputArgv);
92bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void InitializeMemory(const Constant *Init, void *Addr);
93bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner};
94bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
95bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif
96