| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 1 | //===-- Interpreter.h ------------------------------------------*- C++ -*--===// | 
|  | 2 | // | 
|  | 3 | // This header file defines the interpreter structure | 
|  | 4 | // | 
|  | 5 | //===----------------------------------------------------------------------===// | 
|  | 6 |  | 
|  | 7 | #ifndef LLI_INTERPRETER_H | 
|  | 8 | #define LLI_INTERPRETER_H | 
|  | 9 |  | 
| Brian Gaeke | 9722294 | 2003-09-05 19:39:22 +0000 | [diff] [blame^] | 10 | #include "llvm/ExecutionEngine/ExecutionEngine.h" | 
|  | 11 | #include "llvm/ExecutionEngine/GenericValue.h" | 
| Chris Lattner | 360e17e | 2001-11-26 23:04:08 +0000 | [diff] [blame] | 12 | #include "Support/DataTypes.h" | 
| Chris Lattner | 5af0c48 | 2001-11-07 04:23:00 +0000 | [diff] [blame] | 13 | #include "llvm/Assembly/CachedWriter.h" | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 14 | #include "llvm/Target/TargetData.h" | 
|  | 15 | #include "llvm/BasicBlock.h" | 
| Chris Lattner | d7916e9 | 2003-05-10 21:22:39 +0000 | [diff] [blame] | 16 | #include "llvm/Support/InstVisitor.h" | 
| Chris Lattner | 5af0c48 | 2001-11-07 04:23:00 +0000 | [diff] [blame] | 17 |  | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 18 | extern CachedWriter CW;     // Object to accelerate printing of LLVM | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 19 |  | 
| Chris Lattner | da82ed5 | 2003-05-08 16:18:31 +0000 | [diff] [blame] | 20 | struct FunctionInfo;        // Defined in ExecutionAnnotations.h | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 21 |  | 
| Chris Lattner | 9bffa73 | 2002-02-19 18:50:09 +0000 | [diff] [blame] | 22 | // AllocaHolder - Object to track all of the blocks of memory allocated by | 
|  | 23 | // alloca.  When the function returns, this object is poped off the execution | 
|  | 24 | // stack, which causes the dtor to be run, which frees all the alloca'd memory. | 
|  | 25 | // | 
|  | 26 | class AllocaHolder { | 
|  | 27 | friend class AllocaHolderHandle; | 
|  | 28 | std::vector<void*> Allocations; | 
|  | 29 | unsigned RefCnt; | 
|  | 30 | public: | 
|  | 31 | AllocaHolder() : RefCnt(0) {} | 
|  | 32 | void add(void *mem) { Allocations.push_back(mem); } | 
|  | 33 | ~AllocaHolder() { | 
|  | 34 | for (unsigned i = 0; i < Allocations.size(); ++i) | 
|  | 35 | free(Allocations[i]); | 
|  | 36 | } | 
|  | 37 | }; | 
|  | 38 |  | 
|  | 39 | // AllocaHolderHandle gives AllocaHolder value semantics so we can stick it into | 
|  | 40 | // a vector... | 
|  | 41 | // | 
|  | 42 | class AllocaHolderHandle { | 
|  | 43 | AllocaHolder *H; | 
|  | 44 | public: | 
|  | 45 | AllocaHolderHandle() : H(new AllocaHolder()) { H->RefCnt++; } | 
|  | 46 | AllocaHolderHandle(const AllocaHolderHandle &AH) : H(AH.H) { H->RefCnt++; } | 
|  | 47 | ~AllocaHolderHandle() { if (--H->RefCnt == 0) delete H; } | 
|  | 48 |  | 
|  | 49 | void add(void *mem) { H->add(mem); } | 
|  | 50 | }; | 
|  | 51 |  | 
| Chris Lattner | 697954c | 2002-01-20 22:54:45 +0000 | [diff] [blame] | 52 | typedef std::vector<GenericValue> ValuePlaneTy; | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 53 |  | 
|  | 54 | // ExecutionContext struct - This struct represents one stack frame currently | 
|  | 55 | // executing. | 
|  | 56 | // | 
|  | 57 | struct ExecutionContext { | 
| Chris Lattner | da82ed5 | 2003-05-08 16:18:31 +0000 | [diff] [blame] | 58 | Function             *CurFunction;// The currently executing function | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 59 | BasicBlock           *CurBB;      // The currently executing BB | 
|  | 60 | BasicBlock::iterator  CurInst;    // The next instruction to execute | 
| Chris Lattner | da82ed5 | 2003-05-08 16:18:31 +0000 | [diff] [blame] | 61 | FunctionInfo         *FuncInfo;   // The FuncInfo annotation for the function | 
| Chris Lattner | 697954c | 2002-01-20 22:54:45 +0000 | [diff] [blame] | 62 | std::vector<ValuePlaneTy>  Values;// ValuePlanes for each type | 
| Chris Lattner | cdf5178 | 2003-05-08 16:06:52 +0000 | [diff] [blame] | 63 | std::vector<GenericValue>  VarArgs; // Values passed through an ellipsis | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 64 |  | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 65 | CallInst             *Caller;     // Holds the call that called subframes. | 
|  | 66 | // NULL if main func or debugger invoked fn | 
| Chris Lattner | 9bffa73 | 2002-02-19 18:50:09 +0000 | [diff] [blame] | 67 | AllocaHolderHandle    Allocas;    // Track memory allocated by alloca | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 68 | }; | 
|  | 69 |  | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 70 | // Interpreter - This class represents the entirety of the interpreter. | 
|  | 71 | // | 
| Chris Lattner | d7916e9 | 2003-05-10 21:22:39 +0000 | [diff] [blame] | 72 | class Interpreter : public ExecutionEngine, public InstVisitor<Interpreter> { | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 73 | int ExitCode;                // The exit code to be returned by the lli util | 
| Chris Lattner | 43e3f7c | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 74 | bool Trace;                  // Tracing enabled? | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 75 | int CurFrame;                // The current stack frame being inspected | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 76 | TargetData TD; | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 77 |  | 
|  | 78 | // The runtime stack of executing code.  The top of the stack is the current | 
| Chris Lattner | 2fbfdcf | 2002-04-07 20:49:59 +0000 | [diff] [blame] | 79 | // function record. | 
| Chris Lattner | 697954c | 2002-01-20 22:54:45 +0000 | [diff] [blame] | 80 | std::vector<ExecutionContext> ECStack; | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 81 |  | 
| Brian Gaeke | 70975ee | 2003-09-05 18:42:01 +0000 | [diff] [blame] | 82 | // AtExitHandlers - List of functions to call when the program exits, | 
|  | 83 | // registered with the atexit() library function. | 
| Chris Lattner | 44edb6b | 2003-05-14 14:21:30 +0000 | [diff] [blame] | 84 | std::vector<Function*> AtExitHandlers; | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 85 | public: | 
| Chris Lattner | 39c0726 | 2003-08-24 19:50:53 +0000 | [diff] [blame] | 86 | Interpreter(Module *M, bool isLittleEndian, bool isLongPointer, | 
| Brian Gaeke | f58815e | 2003-09-04 22:21:24 +0000 | [diff] [blame] | 87 | bool TraceMode); | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 88 | inline ~Interpreter() { CW.setModule(0); } | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 89 |  | 
| Brian Gaeke | 70975ee | 2003-09-05 18:42:01 +0000 | [diff] [blame] | 90 | /// runAtExitHandlers - Run any functions registered by the | 
|  | 91 | /// program's calls to atexit(3), which we intercept and store in | 
|  | 92 | /// AtExitHandlers. | 
|  | 93 | /// | 
|  | 94 | void runAtExitHandlers (); | 
|  | 95 |  | 
| Brian Gaeke | 82d8277 | 2003-09-03 20:34:19 +0000 | [diff] [blame] | 96 | /// create - Create an interpreter ExecutionEngine. This can never fail. | 
|  | 97 | /// | 
| Brian Gaeke | f58815e | 2003-09-04 22:21:24 +0000 | [diff] [blame] | 98 | static ExecutionEngine *create(Module *M, bool TraceMode); | 
| Brian Gaeke | 82d8277 | 2003-09-03 20:34:19 +0000 | [diff] [blame] | 99 |  | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 100 | /// run - Start execution with the specified function and arguments. | 
|  | 101 | /// | 
| Brian Gaeke | 70975ee | 2003-09-05 18:42:01 +0000 | [diff] [blame] | 102 | virtual GenericValue run(Function *F, | 
|  | 103 | const std::vector<GenericValue> &ArgValues); | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 104 |  | 
| Brian Gaeke | 70975ee | 2003-09-05 18:42:01 +0000 | [diff] [blame] | 105 | // Methods used for debug printouts: | 
| Chris Lattner | 2e42d3a | 2001-10-15 05:51:48 +0000 | [diff] [blame] | 106 | static void print(const Type *Ty, GenericValue V); | 
| Chris Lattner | 365a76e | 2001-09-10 04:49:44 +0000 | [diff] [blame] | 107 | static void printValue(const Type *Ty, GenericValue V); | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 108 |  | 
| Brian Gaeke | 70975ee | 2003-09-05 18:42:01 +0000 | [diff] [blame] | 109 | // Methods used to execute code: | 
|  | 110 | // Place a call on the stack | 
| Chris Lattner | da82ed5 | 2003-05-08 16:18:31 +0000 | [diff] [blame] | 111 | void callFunction(Function *F, const std::vector<GenericValue> &ArgVals); | 
| Brian Gaeke | 70975ee | 2003-09-05 18:42:01 +0000 | [diff] [blame] | 112 | void executeInstruction(); // Execute one instruction | 
|  | 113 | void run();                // Execute instructions until nothing left to do | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 114 |  | 
|  | 115 | // Opcode Implementations | 
| Chris Lattner | d7916e9 | 2003-05-10 21:22:39 +0000 | [diff] [blame] | 116 | void visitReturnInst(ReturnInst &I); | 
|  | 117 | void visitBranchInst(BranchInst &I); | 
|  | 118 | void visitSwitchInst(SwitchInst &I); | 
|  | 119 |  | 
|  | 120 | void visitBinaryOperator(BinaryOperator &I); | 
|  | 121 | void visitAllocationInst(AllocationInst &I); | 
|  | 122 | void visitFreeInst(FreeInst &I); | 
|  | 123 | void visitLoadInst(LoadInst &I); | 
|  | 124 | void visitStoreInst(StoreInst &I); | 
|  | 125 | void visitGetElementPtrInst(GetElementPtrInst &I); | 
|  | 126 |  | 
|  | 127 | void visitPHINode(PHINode &PN) { assert(0 && "PHI nodes already handled!"); } | 
|  | 128 | void visitCastInst(CastInst &I); | 
|  | 129 | void visitCallInst(CallInst &I); | 
|  | 130 | void visitShl(ShiftInst &I); | 
|  | 131 | void visitShr(ShiftInst &I); | 
|  | 132 | void visitVarArgInst(VarArgInst &I); | 
|  | 133 | void visitInstruction(Instruction &I) { | 
|  | 134 | std::cerr << I; | 
|  | 135 | assert(0 && "Instruction not interpretable yet!"); | 
|  | 136 | } | 
|  | 137 |  | 
| Chris Lattner | da82ed5 | 2003-05-08 16:18:31 +0000 | [diff] [blame] | 138 | GenericValue callExternalFunction(Function *F, | 
|  | 139 | const std::vector<GenericValue> &ArgVals); | 
| Chris Lattner | e43db88 | 2001-10-27 04:15:57 +0000 | [diff] [blame] | 140 | void exitCalled(GenericValue GV); | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 141 |  | 
| Chris Lattner | 44edb6b | 2003-05-14 14:21:30 +0000 | [diff] [blame] | 142 | void addAtExitHandler(Function *F) { | 
|  | 143 | AtExitHandlers.push_back(F); | 
|  | 144 | } | 
|  | 145 |  | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 146 | //FIXME: private: | 
|  | 147 | public: | 
|  | 148 | GenericValue executeGEPOperation(Value *Ptr, User::op_iterator I, | 
|  | 149 | User::op_iterator E, ExecutionContext &SF); | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 150 |  | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 151 | private:  // Helper functions | 
| Chris Lattner | 77113b6 | 2003-05-10 20:21:16 +0000 | [diff] [blame] | 152 | // SwitchToNewBasicBlock - Start execution in a new basic block and run any | 
|  | 153 | // PHI nodes in the top of the block.  This is used for intraprocedural | 
|  | 154 | // control flow. | 
|  | 155 | // | 
|  | 156 | void SwitchToNewBasicBlock(BasicBlock *Dest, ExecutionContext &SF); | 
|  | 157 |  | 
| Brian Gaeke | fb0ef2e | 2003-08-13 18:17:54 +0000 | [diff] [blame] | 158 | void *getPointerToFunction(Function *F) { return (void*)F; } | 
| Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 159 |  | 
| Chris Lattner | 5deea3c | 2001-10-30 20:28:23 +0000 | [diff] [blame] | 160 | void initializeExecutionEngine(); | 
| Chris Lattner | da82ed5 | 2003-05-08 16:18:31 +0000 | [diff] [blame] | 161 | void initializeExternalFunctions(); | 
| Brian Gaeke | 29794cb | 2003-09-05 18:55:03 +0000 | [diff] [blame] | 162 | GenericValue getOperandValue(Value *V, ExecutionContext &SF); | 
|  | 163 | GenericValue executeCastOperation(Value *SrcVal, const Type *Ty, | 
|  | 164 | ExecutionContext &SF); | 
| Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 165 | }; | 
|  | 166 |  | 
|  | 167 | #endif |