Interpreter.h revision 7301178aac1baf1cc334e7c7a66bfe50a65fbf49
192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//===-- Interpreter.h ------------------------------------------*- C++ -*--===//
2856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//
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.
7856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//
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"
23fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "Support/DataTypes.h"
245af0c4803b7064938dabc4c7275dcfb231e814aeChris Lattner
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
27da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattnerstruct FunctionInfo;        // Defined in ExecutionAnnotations.h
284af6de8f0a767a3892ff7682954cbd2ae2ca3de8Chris Lattnerclass gep_type_iterator;
29dfa58498ae0f8f306dd0f86fd7f070cad0245c62Brian Gaekeclass ConstantExpr;
3092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
319bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// AllocaHolder - Object to track all of the blocks of memory allocated by
32dfa58498ae0f8f306dd0f86fd7f070cad0245c62Brian Gaeke// alloca.  When the function returns, this object is popped off the execution
339bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// stack, which causes the dtor to be run, which frees all the alloca'd memory.
349bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner//
359bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerclass AllocaHolder {
369bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  friend class AllocaHolderHandle;
379bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  std::vector<void*> Allocations;
389bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  unsigned RefCnt;
399bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerpublic:
409bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolder() : RefCnt(0) {}
419bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  void add(void *mem) { Allocations.push_back(mem); }
429bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  ~AllocaHolder() {
439bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner    for (unsigned i = 0; i < Allocations.size(); ++i)
449bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner      free(Allocations[i]);
459bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  }
469bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner};
479bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
489bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// AllocaHolderHandle gives AllocaHolder value semantics so we can stick it into
499bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// a vector...
509bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner//
519bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerclass AllocaHolderHandle {
529bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolder *H;
539bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerpublic:
549bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle() : H(new AllocaHolder()) { H->RefCnt++; }
559bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle(const AllocaHolderHandle &AH) : H(AH.H) { H->RefCnt++; }
569bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  ~AllocaHolderHandle() { if (--H->RefCnt == 0) delete H; }
579bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
589bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  void add(void *mem) { H->add(mem); }
599bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner};
609bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
61697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnertypedef std::vector<GenericValue> ValuePlaneTy;
6292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
6392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// ExecutionContext struct - This struct represents one stack frame currently
6492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// executing.
6592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
6692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerstruct ExecutionContext {
67da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  Function             *CurFunction;// The currently executing function
6892101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  BasicBlock           *CurBB;      // The currently executing BB
6992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  BasicBlock::iterator  CurInst;    // The next instruction to execute
70f143d3c2843f27bb2bf7d0e3c6f281fd0b01eb0bBrian Gaeke  std::map<Value *, GenericValue> Values; // LLVM values used in this invocation
71cdf5178f8362b0b415a4e1c1378a5b76638826beChris Lattner  std::vector<GenericValue>  VarArgs; // Values passed through an ellipsis
722cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke  CallSite             Caller;     // Holds the call that called subframes.
732cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke                                   // NULL if main func or debugger invoked fn
749bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle    Allocas;    // Track memory allocated by alloca
7592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner};
7692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
7792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// Interpreter - This class represents the entirety of the interpreter.
7892101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
79d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattnerclass Interpreter : public ExecutionEngine, public InstVisitor<Interpreter> {
8092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  int ExitCode;                // The exit code to be returned by the lli util
81fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  TargetData TD;
827301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  IntrinsicLowering *IL;
8392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
8492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  // The runtime stack of executing code.  The top of the stack is the current
852fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner  // function record.
86697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  std::vector<ExecutionContext> ECStack;
8792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
8870975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // AtExitHandlers - List of functions to call when the program exits,
8970975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // registered with the atexit() library function.
9044edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  std::vector<Function*> AtExitHandlers;
9163bd61330b89afc669b17a08a25b97ba911e1c96Chris Lattner
9292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerpublic:
937301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  Interpreter(Module *M, bool isLittleEndian, bool isLongPointer,
947301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner              IntrinsicLowering *IL);
957301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  ~Interpreter();
9692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
972cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  /// runAtExitHandlers - Run any functions registered by the program's calls to
982cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  /// atexit(3), which we intercept and store in AtExitHandlers.
9970975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  ///
1002cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  void runAtExitHandlers();
10170975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke
1027301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  /// create - Create an interpreter ExecutionEngine. This can never fail.  The
1037301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  /// specified IntrinsicLowering implementation will be deleted when the
1047301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  /// Interpreter execution engine is destroyed.
10582d8277ad5862b54341808812bb4016e52347060Brian Gaeke  ///
1067301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  static ExecutionEngine *create(Module *M, IntrinsicLowering *IL);
10782d8277ad5862b54341808812bb4016e52347060Brian Gaeke
108fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  /// run - Start execution with the specified function and arguments.
109fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  ///
1102cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner  virtual GenericValue runFunction(Function *F,
1112cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner                                   const std::vector<GenericValue> &ArgValues);
11292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
113e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  /// recompileAndRelinkFunction - For the interpreter, functions are always
114e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  /// up-to-date.
115e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  ///
116e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  virtual void *recompileAndRelinkFunction(Function *F) {
117e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner    return getPointerToFunction(F);
118e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner  }
119e63fc8b46fb1c9627b1c84508e258070fe3567cfChris Lattner
12070975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // Methods used to execute code:
12170975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // Place a call on the stack
122da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  void callFunction(Function *F, const std::vector<GenericValue> &ArgVals);
12370975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  void run();                // Execute instructions until nothing left to do
12492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
12592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  // Opcode Implementations
126d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitReturnInst(ReturnInst &I);
127d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitBranchInst(BranchInst &I);
128d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitSwitchInst(SwitchInst &I);
129d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner
130d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitBinaryOperator(BinaryOperator &I);
131d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitAllocationInst(AllocationInst &I);
132d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitFreeInst(FreeInst &I);
133d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitLoadInst(LoadInst &I);
134d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitStoreInst(StoreInst &I);
135d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitGetElementPtrInst(GetElementPtrInst &I);
136d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitPHINode(PHINode &PN) { assert(0 && "PHI nodes already handled!"); }
137d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitCastInst(CastInst &I);
138fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke
139fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke  void visitCallSite(CallSite CS);
140fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke  void visitCallInst(CallInst &I) { visitCallSite (CallSite (&I)); }
141fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke  void visitInvokeInst(InvokeInst &I) { visitCallSite (CallSite (&I)); }
1429bf06b155c3e158ac405d2df0f1b9c9c5b387311Brian Gaeke  void visitUnwindInst(UnwindInst &I);
143fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke
144d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitShl(ShiftInst &I);
145d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitShr(ShiftInst &I);
1464c6654963dfa4b91c702a913f3715c4a207472d2Chris Lattner  void visitVANextInst(VANextInst &I);
147c1a2be18eaf1e9862af973126be1f1ef975185f1Brian Gaeke  void visitVAArgInst(VAArgInst &I);
148d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitInstruction(Instruction &I) {
149d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner    std::cerr << I;
150d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner    assert(0 && "Instruction not interpretable yet!");
151d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  }
152d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner
153da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  GenericValue callExternalFunction(Function *F,
154da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner                                    const std::vector<GenericValue> &ArgVals);
155e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner  void exitCalled(GenericValue GV);
15692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
15744edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  void addAtExitHandler(Function *F) {
15844edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner    AtExitHandlers.push_back(F);
15944edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  }
16044edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner
1618da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke  GenericValue *getFirstVarArg () {
1628da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke    return &(ECStack[ECStack.size () - 2].VarArgs[0]);
1638da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke  }
1648da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke
165fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  //FIXME: private:
166fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattnerpublic:
1674af6de8f0a767a3892ff7682954cbd2ae2ca3de8Chris Lattner  GenericValue executeGEPOperation(Value *Ptr, gep_type_iterator I,
1684af6de8f0a767a3892ff7682954cbd2ae2ca3de8Chris Lattner				   gep_type_iterator E, ExecutionContext &SF);
169fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner
17092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerprivate:  // Helper functions
17177113b627237fe2850676cccd809de1e05f03952Chris Lattner  // SwitchToNewBasicBlock - Start execution in a new basic block and run any
17277113b627237fe2850676cccd809de1e05f03952Chris Lattner  // PHI nodes in the top of the block.  This is used for intraprocedural
17377113b627237fe2850676cccd809de1e05f03952Chris Lattner  // control flow.
17477113b627237fe2850676cccd809de1e05f03952Chris Lattner  //
17577113b627237fe2850676cccd809de1e05f03952Chris Lattner  void SwitchToNewBasicBlock(BasicBlock *Dest, ExecutionContext &SF);
17677113b627237fe2850676cccd809de1e05f03952Chris Lattner
177fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke  void *getPointerToFunction(Function *F) { return (void*)F; }
178fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner
1795deea3c5c5d71acf140b0df9488126e3c67e4a0aChris Lattner  void initializeExecutionEngine();
180da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  void initializeExternalFunctions();
181dfa58498ae0f8f306dd0f86fd7f070cad0245c62Brian Gaeke  GenericValue getConstantExprValue(ConstantExpr *CE, ExecutionContext &SF);
18229794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  GenericValue getOperandValue(Value *V, ExecutionContext &SF);
18329794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  GenericValue executeCastOperation(Value *SrcVal, const Type *Ty,
18429794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke				    ExecutionContext &SF);
185af955ba503e37c3e1efb694a01bce84b7e5d05a7Brian Gaeke  void popStackAndReturnValueToCaller(const Type *RetTy, GenericValue Result);
18692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner};
18792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
188d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
189d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
19092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner#endif
191