summaryrefslogtreecommitdiff
path: root/include/llvm/ExecutionEngine
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-12-24 00:01:05 +0000
committerChris Lattner <sabre@nondot.org>2002-12-24 00:01:05 +0000
commitbd199fb1148b9e16c4e6f3d0ee386c2505a55b71 (patch)
tree226f64cc95160ebd8da8d2ec4cfaf2babf7c3879 /include/llvm/ExecutionEngine
parentfe11a97fcde7c63109c3ad36570657807d0cd6ef (diff)
downloadllvm-bd199fb1148b9e16c4e6f3d0ee386c2505a55b71.tar.gz
llvm-bd199fb1148b9e16c4e6f3d0ee386c2505a55b71.tar.bz2
llvm-bd199fb1148b9e16c4e6f3d0ee386c2505a55b71.tar.xz
Initial checkin of new LLI with JIT compiler
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5126 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ExecutionEngine')
-rw-r--r--include/llvm/ExecutionEngine/ExecutionEngine.h86
-rw-r--r--include/llvm/ExecutionEngine/GenericValue.h40
2 files changed, 126 insertions, 0 deletions
diff --git a/include/llvm/ExecutionEngine/ExecutionEngine.h b/include/llvm/ExecutionEngine/ExecutionEngine.h
new file mode 100644
index 0000000000..57eee95372
--- /dev/null
+++ b/include/llvm/ExecutionEngine/ExecutionEngine.h
@@ -0,0 +1,86 @@
+//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===//
+//
+// This file defines the abstract interface that implements execution support
+// for LLVM.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef EXECUTION_ENGINE_H
+#define EXECUTION_ENGINE_H
+
+#include <vector>
+#include <string>
+#include <map>
+class Constant;
+class Type;
+class GlobalValue;
+class Function;
+class Module;
+class TargetData;
+union GenericValue;
+
+class ExecutionEngine {
+ Module &CurMod;
+ const TargetData *TD;
+
+protected:
+ // GlobalAddress - A mapping between LLVM global values and their actualized
+ // version...
+ std::map<const GlobalValue*, void *> GlobalAddress;
+
+ void setTargetData(const TargetData &td) {
+ TD = &td;
+ emitGlobals();
+ }
+public:
+ ExecutionEngine(Module *M) : CurMod(*M) {
+ assert(M && "Module is null?");
+ }
+ virtual ~ExecutionEngine();
+
+ Module &getModule() const { return CurMod; }
+ const TargetData &getTargetData() const { return *TD; }
+
+ /// run - Start execution with the specified function and arguments.
+ ///
+ virtual int run(const std::string &FnName,
+ const std::vector<std::string> &Args) = 0;
+
+ /// createJIT - Create an return a new JIT compiler if there is one available
+ /// for the current target. Otherwise it returns null.
+ ///
+ static ExecutionEngine *createJIT(Module *M, unsigned Config);
+
+ /// createInterpreter - Create a new interpreter object. This can never fail.
+ ///
+ static ExecutionEngine *createInterpreter(Module *M, unsigned Config,
+ bool DebugMode, bool TraceMode);
+
+ void addGlobalMapping(const Function *F, void *Addr) {
+ void *&CurVal = GlobalAddress[(const GlobalValue*)F];
+ assert(CurVal == 0 && "GlobalMapping already established!");
+ CurVal = Addr;
+ }
+
+ // getPointerToGlobal - This returns the address of the specified global
+ // value. This may involve code generation if it's a function.
+ //
+ void *getPointerToGlobal(const GlobalValue *GV);
+
+ // 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.
+ //
+ virtual void *getPointerToFunction(const Function *F) = 0;
+
+private:
+ void emitGlobals();
+
+public: // FIXME: protected: // API shared among subclasses
+ GenericValue getConstantValue(const Constant *C);
+ void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty);
+ void *CreateArgv(const std::vector<std::string> &InputArgv);
+ void InitializeMemory(const Constant *Init, void *Addr);
+};
+
+#endif
diff --git a/include/llvm/ExecutionEngine/GenericValue.h b/include/llvm/ExecutionEngine/GenericValue.h
new file mode 100644
index 0000000000..f5e70e5fd5
--- /dev/null
+++ b/include/llvm/ExecutionEngine/GenericValue.h
@@ -0,0 +1,40 @@
+//===-- GenericValue.h - Represent any type of LLVM value -------*- C++ -*-===//
+//
+// The GenericValue class is used to represent an LLVM value of arbitrary type.
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifndef GENERIC_VALUE_H
+#define GENERIC_VALUE_H
+
+#include "Support/DataTypes.h"
+
+typedef uint64_t PointerTy;
+
+union GenericValue {
+ bool BoolVal;
+ unsigned char UByteVal;
+ signed char SByteVal;
+ unsigned short UShortVal;
+ signed short ShortVal;
+ unsigned int UIntVal;
+ signed int IntVal;
+ uint64_t ULongVal;
+ int64_t LongVal;
+ double DoubleVal;
+ float FloatVal;
+ PointerTy PointerVal;
+ unsigned char Untyped[8];
+
+ GenericValue() {}
+ GenericValue(void *V) {
+ PointerVal = (PointerTy)(intptr_t)V;
+ }
+};
+
+inline GenericValue PTOGV(void *P) { return GenericValue(P); }
+inline void* GVTOP(const GenericValue &GV) {
+ return (void*)(intptr_t)GV.PointerVal;
+}
+#endif