Interpreter.h revision d1c881a8d4da8b4d99c2a40512fbcca652ab445e
192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//===-- Interpreter.h ------------------------------------------*- C++ -*--===//
2d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman//
3856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//                     The LLVM Compiler Infrastructure
4856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//
5856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// This file was developed by the LLVM research group and is distributed under
6856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
7d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman//
8856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//===----------------------------------------------------------------------===//
992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
1092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// This header file defines the interpreter structure
1192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
1292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//===----------------------------------------------------------------------===//
1392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
1492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner#ifndef LLI_INTERPRETER_H
1592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner#define LLI_INTERPRETER_H
1692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
17502dda001a9b106b5618bcb6b3136c541865c2b8Chris Lattner#include "llvm/Function.h"
189722294d30fff2a432d8e171eb904f33956353e2Brian Gaeke#include "llvm/ExecutionEngine/ExecutionEngine.h"
199722294d30fff2a432d8e171eb904f33956353e2Brian Gaeke#include "llvm/ExecutionEngine/GenericValue.h"
20d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner#include "llvm/Support/InstVisitor.h"
212cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke#include "llvm/Support/CallSite.h"
22fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "llvm/Target/TargetData.h"
23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/DataTypes.h"
24954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer#include <iostream>
255af0c4803b7064938dabc4c7275dcfb231e814aeChris Lattner
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
28b1dfc70ef1d78436e77d27dac89a81b43abd4d75Chris Lattnerstruct FunctionInfo;
29c6b0fb39cb227c247269a0815961424cd2718d20Chris Lattnertemplate<typename T> class generic_gep_type_iterator;
30dfa58498ae0f8f306dd0f86fd7f070cad0245c62Brian Gaekeclass ConstantExpr;
31702a8a070f73a966da6ecb162f1b85fd98c5ed7eChris Lattnertypedef generic_gep_type_iterator<User::const_op_iterator> gep_type_iterator;
32c6b0fb39cb227c247269a0815961424cd2718d20Chris Lattner
3392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
349bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// AllocaHolder - Object to track all of the blocks of memory allocated by
35dfa58498ae0f8f306dd0f86fd7f070cad0245c62Brian Gaeke// alloca.  When the function returns, this object is popped off the execution
369bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// stack, which causes the dtor to be run, which frees all the alloca'd memory.
379bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner//
389bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerclass AllocaHolder {
399bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  friend class AllocaHolderHandle;
409bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  std::vector<void*> Allocations;
419bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  unsigned RefCnt;
429bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerpublic:
439bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolder() : RefCnt(0) {}
449bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  void add(void *mem) { Allocations.push_back(mem); }
459bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  ~AllocaHolder() {
469bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner    for (unsigned i = 0; i < Allocations.size(); ++i)
479bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner      free(Allocations[i]);
489bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  }
499bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner};
509bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
519bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// AllocaHolderHandle gives AllocaHolder value semantics so we can stick it into
529bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// a vector...
539bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner//
549bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerclass AllocaHolderHandle {
559bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolder *H;
569bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerpublic:
579bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle() : H(new AllocaHolder()) { H->RefCnt++; }
589bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle(const AllocaHolderHandle &AH) : H(AH.H) { H->RefCnt++; }
599bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  ~AllocaHolderHandle() { if (--H->RefCnt == 0) delete H; }
609bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
619bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  void add(void *mem) { H->add(mem); }
629bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner};
639bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
64697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnertypedef std::vector<GenericValue> ValuePlaneTy;
6592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
6692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// ExecutionContext struct - This struct represents one stack frame currently
6792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// executing.
6892101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
6992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerstruct ExecutionContext {
70da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  Function             *CurFunction;// The currently executing function
7192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  BasicBlock           *CurBB;      // The currently executing BB
7292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  BasicBlock::iterator  CurInst;    // The next instruction to execute
73f143d3c2843f27bb2bf7d0e3c6f281fd0b01eb0bBrian Gaeke  std::map<Value *, GenericValue> Values; // LLVM values used in this invocation
74cdf5178f8362b0b415a4e1c1378a5b76638826beChris Lattner  std::vector<GenericValue>  VarArgs; // Values passed through an ellipsis
752cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke  CallSite             Caller;     // Holds the call that called subframes.
762cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke                                   // NULL if main func or debugger invoked fn
779bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle    Allocas;    // Track memory allocated by alloca
7892101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner};
7992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
8092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// Interpreter - This class represents the entirety of the interpreter.
8192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
82d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattnerclass Interpreter : public ExecutionEngine, public InstVisitor<Interpreter> {
8392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  int ExitCode;                // The exit code to be returned by the lli util
84fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  TargetData TD;
857301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  IntrinsicLowering *IL;
8692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
8792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  // The runtime stack of executing code.  The top of the stack is the current
882fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner  // function record.
89697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  std::vector<ExecutionContext> ECStack;
9092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
9170975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // AtExitHandlers - List of functions to call when the program exits,
9270975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // registered with the atexit() library function.
9344edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  std::vector<Function*> AtExitHandlers;
9463bd61330b89afc669b17a08a25b97ba911e1c96Chris Lattner
9592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerpublic:
967301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  Interpreter(Module *M, bool isLittleEndian, bool isLongPointer,
977301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner              IntrinsicLowering *IL);
987301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  ~Interpreter();
9992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
1002cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  /// runAtExitHandlers - Run any functions registered by the program's calls to
1012cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  /// atexit(3), which we intercept and store in AtExitHandlers.
10270975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  ///
1032cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  void runAtExitHandlers();
10470975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke
1057301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  /// create - Create an interpreter ExecutionEngine. This can never fail.  The
1067301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  /// specified IntrinsicLowering implementation will be deleted when the
1077301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  /// Interpreter execution engine is destroyed.
10882d8277ad5862b54341808812bb4016e52347060Brian Gaeke  ///
1097301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  static ExecutionEngine *create(Module *M, IntrinsicLowering *IL);
11082d8277ad5862b54341808812bb4016e52347060Brian Gaeke
111fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  /// run - Start execution with the specified function and arguments.
112fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  ///
1132cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  virtual GenericValue runFunction(Function *F,
1142cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner                                   const std::vector<GenericValue> &ArgValues);
11592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
116e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  /// recompileAndRelinkFunction - For the interpreter, functions are always
117e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  /// up-to-date.
118e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  ///
119e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  virtual void *recompileAndRelinkFunction(Function *F) {
120e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner    return getPointerToFunction(F);
121e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  }
122e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner
123895eddfad43f848d5accce1789aa80be0db459d3Misha Brukman  /// freeMachineCodeForFunction - The interpreter does not generate any code.
124895eddfad43f848d5accce1789aa80be0db459d3Misha Brukman  ///
125895eddfad43f848d5accce1789aa80be0db459d3Misha Brukman  void freeMachineCodeForFunction(Function *F) { }
126d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman
12770975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // Methods used to execute code:
12870975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // Place a call on the stack
129da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  void callFunction(Function *F, const std::vector<GenericValue> &ArgVals);
13070975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  void run();                // Execute instructions until nothing left to do
13192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
13292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  // Opcode Implementations
133d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitReturnInst(ReturnInst &I);
134d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitBranchInst(BranchInst &I);
135d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitSwitchInst(SwitchInst &I);
136d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner
137d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitBinaryOperator(BinaryOperator &I);
138d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitAllocationInst(AllocationInst &I);
139d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitFreeInst(FreeInst &I);
140d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitLoadInst(LoadInst &I);
141d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitStoreInst(StoreInst &I);
142d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitGetElementPtrInst(GetElementPtrInst &I);
143d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitPHINode(PHINode &PN) { assert(0 && "PHI nodes already handled!"); }
144d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitCastInst(CastInst &I);
145759d34ffb718cf35e97682b5bd541beb82d9a192Chris Lattner  void visitSelectInst(SelectInst &I);
146759d34ffb718cf35e97682b5bd541beb82d9a192Chris Lattner
147fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke
148fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke  void visitCallSite(CallSite CS);
149fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke  void visitCallInst(CallInst &I) { visitCallSite (CallSite (&I)); }
150fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke  void visitInvokeInst(InvokeInst &I) { visitCallSite (CallSite (&I)); }
1519bf06b155c3e158ac405d2df0f1b9c9c5b387311Brian Gaeke  void visitUnwindInst(UnwindInst &I);
152ec7c1ab1dafa0fdb383d0e6df4726cecb4c88c70Chris Lattner  void visitUnreachableInst(UnreachableInst &I);
153fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke
154d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitShl(ShiftInst &I);
155d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitShr(ShiftInst &I);
1564c6654963dfa4b91c702a913f3715c4a207472d2Chris Lattner  void visitVANextInst(VANextInst &I);
157c1a2be18eaf1e9862af973126be1f1ef975185f1Brian Gaeke  void visitVAArgInst(VAArgInst &I);
158d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitInstruction(Instruction &I) {
159d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner    std::cerr << I;
160d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner    assert(0 && "Instruction not interpretable yet!");
161d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  }
162d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner
163d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman  GenericValue callExternalFunction(Function *F,
164da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner                                    const std::vector<GenericValue> &ArgVals);
165e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner  void exitCalled(GenericValue GV);
16692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
16744edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  void addAtExitHandler(Function *F) {
16844edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner    AtExitHandlers.push_back(F);
16944edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  }
17044edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner
1718da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke  GenericValue *getFirstVarArg () {
172e62589058c5123d84bb4f8239c63e493bb6bb25bBrian Gaeke    return &(ECStack.back ().VarArgs[0]);
1738da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke  }
1748da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke
175fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  //FIXME: private:
176fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattnerpublic:
1774af6de8f0a767a3892ff7682954cbd2ae2ca3de8Chris Lattner  GenericValue executeGEPOperation(Value *Ptr, gep_type_iterator I,
1784af6de8f0a767a3892ff7682954cbd2ae2ca3de8Chris Lattner				   gep_type_iterator E, ExecutionContext &SF);
179fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner
18092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerprivate:  // Helper functions
18177113b627237fe2850676cccd809de1e05f03952Chris Lattner  // SwitchToNewBasicBlock - Start execution in a new basic block and run any
18277113b627237fe2850676cccd809de1e05f03952Chris Lattner  // PHI nodes in the top of the block.  This is used for intraprocedural
18377113b627237fe2850676cccd809de1e05f03952Chris Lattner  // control flow.
184d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman  //
18577113b627237fe2850676cccd809de1e05f03952Chris Lattner  void SwitchToNewBasicBlock(BasicBlock *Dest, ExecutionContext &SF);
18677113b627237fe2850676cccd809de1e05f03952Chris Lattner
187fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke  void *getPointerToFunction(Function *F) { return (void*)F; }
188fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner
1895deea3c5c5d71acf140b0df9488126e3c67e4a0aChris Lattner  void initializeExecutionEngine();
190da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  void initializeExternalFunctions();
191dfa58498ae0f8f306dd0f86fd7f070cad0245c62Brian Gaeke  GenericValue getConstantExprValue(ConstantExpr *CE, ExecutionContext &SF);
19229794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  GenericValue getOperandValue(Value *V, ExecutionContext &SF);
19329794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  GenericValue executeCastOperation(Value *SrcVal, const Type *Ty,
19429794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke				    ExecutionContext &SF);
195af955ba503e37c3e1efb694a01bce84b7e5d05a7Brian Gaeke  void popStackAndReturnValueToCaller(const Type *RetTy, GenericValue Result);
19692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner};
19792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
198d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
199d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
20092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner#endif
201