2002-12-24 00:01:05 +00:00
|
|
|
//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===//
|
2003-10-20 20:19:47 +00:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2002-12-24 00:01:05 +00:00
|
|
|
//
|
|
|
|
// This file defines the abstract interface that implements execution support
|
|
|
|
// for LLVM.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef EXECUTION_ENGINE_H
|
|
|
|
#define EXECUTION_ENGINE_H
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <map>
|
2003-07-25 18:06:53 +00:00
|
|
|
#include <cassert>
|
2003-11-11 22:41:34 +00:00
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
2003-12-20 02:45:16 +00:00
|
|
|
union GenericValue;
|
2002-12-24 00:01:05 +00:00
|
|
|
class Constant;
|
|
|
|
class Function;
|
2003-12-20 02:45:16 +00:00
|
|
|
class GlobalVariable;
|
2003-10-14 21:35:52 +00:00
|
|
|
class GlobalValue;
|
2002-12-24 00:01:05 +00:00
|
|
|
class Module;
|
2003-10-16 21:16:21 +00:00
|
|
|
class ModuleProvider;
|
2002-12-24 00:01:05 +00:00
|
|
|
class TargetData;
|
2003-10-14 21:35:52 +00:00
|
|
|
class Type;
|
2002-12-24 00:01:05 +00:00
|
|
|
|
|
|
|
class ExecutionEngine {
|
|
|
|
Module &CurMod;
|
|
|
|
const TargetData *TD;
|
|
|
|
|
|
|
|
protected:
|
2003-10-14 21:35:52 +00:00
|
|
|
ModuleProvider *MP;
|
2002-12-24 00:01:05 +00:00
|
|
|
// GlobalAddress - A mapping between LLVM global values and their actualized
|
|
|
|
// version...
|
|
|
|
std::map<const GlobalValue*, void *> GlobalAddress;
|
|
|
|
|
|
|
|
void setTargetData(const TargetData &td) {
|
|
|
|
TD = &td;
|
|
|
|
}
|
2003-10-14 21:35:52 +00:00
|
|
|
|
2002-12-24 00:01:05 +00:00
|
|
|
public:
|
2003-10-16 21:16:21 +00:00
|
|
|
ExecutionEngine(ModuleProvider *P);
|
|
|
|
ExecutionEngine(Module *M);
|
2002-12-24 00:01:05 +00:00
|
|
|
virtual ~ExecutionEngine();
|
|
|
|
|
|
|
|
Module &getModule() const { return CurMod; }
|
|
|
|
const TargetData &getTargetData() const { return *TD; }
|
|
|
|
|
2003-08-21 21:12:30 +00:00
|
|
|
/// run - Start execution with the specified function, arguments, and
|
|
|
|
/// environment.
|
2002-12-24 00:01:05 +00:00
|
|
|
///
|
2003-09-05 18:42:01 +00:00
|
|
|
virtual GenericValue run(Function *F,
|
|
|
|
const std::vector<GenericValue> &ArgValues) = 0;
|
2002-12-24 00:01:05 +00:00
|
|
|
|
2003-10-24 19:58:38 +00:00
|
|
|
static ExecutionEngine *create(ModuleProvider *MP, bool ForceInterpreter);
|
2003-09-03 20:34:19 +00:00
|
|
|
|
2003-12-20 02:45:16 +00:00
|
|
|
void addGlobalMapping(const GlobalValue *GV, void *Addr) {
|
|
|
|
void *&CurVal = GlobalAddress[GV];
|
2002-12-24 00:01:05 +00:00
|
|
|
assert(CurVal == 0 && "GlobalMapping already established!");
|
|
|
|
CurVal = Addr;
|
|
|
|
}
|
|
|
|
|
2003-12-12 06:31:42 +00:00
|
|
|
/// getPointerToGlobalIfAvailable - This returns the address of the specified
|
|
|
|
/// global value if it is available, otherwise it returns null.
|
|
|
|
///
|
2003-05-09 03:29:03 +00:00
|
|
|
void *getPointerToGlobalIfAvailable(const GlobalValue *GV) {
|
|
|
|
std::map<const GlobalValue*, void*>::iterator I = GlobalAddress.find(GV);
|
|
|
|
return I != GlobalAddress.end() ? I->second : 0;
|
|
|
|
}
|
|
|
|
|
2003-12-12 06:31:42 +00:00
|
|
|
/// getPointerToGlobal - This returns the address of the specified global
|
|
|
|
/// value. This may involve code generation if it's a function.
|
|
|
|
///
|
2002-12-24 00:01:05 +00:00
|
|
|
void *getPointerToGlobal(const GlobalValue *GV);
|
|
|
|
|
2003-12-12 06:31:42 +00:00
|
|
|
/// getPointerToFunction - The different EE's represent function bodies in
|
|
|
|
/// different ways. They should each implement this to say what a function
|
|
|
|
/// pointer should look like.
|
|
|
|
///
|
2003-08-13 18:17:54 +00:00
|
|
|
virtual void *getPointerToFunction(Function *F) = 0;
|
2002-12-24 00:01:05 +00:00
|
|
|
|
2003-12-12 06:31:42 +00:00
|
|
|
/// getPointerToFunctionOrStub - If the specified function has been
|
|
|
|
/// code-gen'd, return a pointer to the function. If not, compile it, or use
|
|
|
|
/// a stub to implement lazy compilation if available.
|
|
|
|
///
|
2003-12-08 08:22:01 +00:00
|
|
|
virtual void *getPointerToFunctionOrStub(Function *F) {
|
|
|
|
// Default implementation, just codegen the function.
|
|
|
|
return getPointerToFunction(F);
|
|
|
|
}
|
|
|
|
|
2003-09-05 18:55:03 +00:00
|
|
|
void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty);
|
|
|
|
void InitializeMemory(const Constant *Init, void *Addr);
|
|
|
|
|
2003-12-08 08:22:01 +00:00
|
|
|
/// recompileAndRelinkFunction - This method is used to force a function
|
2003-12-12 06:31:42 +00:00
|
|
|
/// which has already been compiled to be compiled again, possibly
|
2003-12-08 08:22:01 +00:00
|
|
|
/// after it has been modified. Then the entry to the old copy is overwritten
|
|
|
|
/// with a branch to the new copy. If there was no old copy, this acts
|
|
|
|
/// just like VM::getPointerToFunction().
|
|
|
|
///
|
|
|
|
virtual void *recompileAndRelinkFunction(Function *F) = 0;
|
|
|
|
|
2003-05-12 02:14:34 +00:00
|
|
|
protected:
|
2002-12-24 00:01:05 +00:00
|
|
|
void emitGlobals();
|
2003-12-20 02:45:16 +00:00
|
|
|
|
|
|
|
// EmitGlobalVariable - This method emits the specified global variable to the
|
|
|
|
// address specified in GlobalAddresses, or allocates new memory if it's not
|
|
|
|
// already in the map.
|
|
|
|
void EmitGlobalVariable(GlobalVariable *GV);
|
|
|
|
|
2002-12-24 00:01:05 +00:00
|
|
|
GenericValue getConstantValue(const Constant *C);
|
2003-05-08 16:52:16 +00:00
|
|
|
GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty);
|
2002-12-24 00:01:05 +00:00
|
|
|
};
|
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
} // End llvm namespace
|
|
|
|
|
2002-12-24 00:01:05 +00:00
|
|
|
#endif
|