ExecutionEngine.h revision 6fbcc26f1460eaee4e0eb8b426fc1ff0c7af11be
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===//
26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under
66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file defines the abstract interface that implements execution support
11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// for LLVM.
12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===//
14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
15bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#ifndef EXECUTION_ENGINE_H
16bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#define EXECUTION_ENGINE_H
17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <vector>
19bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <string>
20bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <map>
212e99791a1ed49f11a2825a9a7590742e1ddc110aChris Lattner#include <cassert>
22bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant;
23bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function;
24b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanunion GenericValue;
25b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass GlobalValue;
26bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module;
277034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukmanclass ModuleProvider;
28bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData;
29b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass Type;
30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
31bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass ExecutionEngine {
32bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  Module &CurMod;
33bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  const TargetData *TD;
34bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerprotected:
36b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman  ModuleProvider *MP;
37bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // GlobalAddress - A mapping between LLVM global values and their actualized
38bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // version...
39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  std::map<const GlobalValue*, void *> GlobalAddress;
40bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
41bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void setTargetData(const TargetData &td) {
42bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    TD = &td;
43bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
44b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman
45bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic:
467034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman  ExecutionEngine(ModuleProvider *P);
477034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman  ExecutionEngine(Module *M);
48bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  virtual ~ExecutionEngine();
49bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
50bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  Module &getModule() const { return CurMod; }
51bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  const TargetData &getTargetData() const { return *TD; }
52bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
5369582b35b6aa4e48cbbad7f6f1193c967da96b25John Criswell  /// run - Start execution with the specified function, arguments, and
5469582b35b6aa4e48cbbad7f6f1193c967da96b25John Criswell  ///       environment.
55bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  ///
5670975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  virtual GenericValue run(Function *F,
5770975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke                           const std::vector<GenericValue> &ArgValues) = 0;
58bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
59b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman  static ExecutionEngine *create(ModuleProvider *MP, bool ForceInterpreter,
60b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman                                 bool TraceMode);
6182d8277ad5862b54341808812bb4016e52347060Brian Gaeke
62bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void addGlobalMapping(const Function *F, void *Addr) {
63bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    void *&CurVal = GlobalAddress[(const GlobalValue*)F];
64bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    assert(CurVal == 0 && "GlobalMapping already established!");
65bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    CurVal = Addr;
66bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
67bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
6870bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  // getPointerToGlobalIfAvailable - This returns the address of the specified
6970bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  // global value if it is available, otherwise it returns null.
7070bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  //
7170bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  void *getPointerToGlobalIfAvailable(const GlobalValue *GV) {
7270bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner    std::map<const GlobalValue*, void*>::iterator I = GlobalAddress.find(GV);
7370bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner    return I != GlobalAddress.end() ? I->second : 0;
7470bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  }
7570bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner
76bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // getPointerToGlobal - This returns the address of the specified global
77bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // value.  This may involve code generation if it's a function.
78bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  //
79bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void *getPointerToGlobal(const GlobalValue *GV);
80bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
81bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // getPointerToFunction - The different EE's represent function bodies in
82bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // different ways.  They should each implement this to say what a function
83bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // pointer should look like.
84bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  //
85fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke  virtual void *getPointerToFunction(Function *F) = 0;
86bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
8729794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty);
8829794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  void InitializeMemory(const Constant *Init, void *Addr);
8929794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke
9056adf152f6354a9b5609e059050fd2315ad5960cChris Lattnerprotected:
91bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void emitGlobals();
92bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  GenericValue getConstantValue(const Constant *C);
93f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner  GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty);
94bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner};
95bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
96bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif
97