Interpreter.h revision 2cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4
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
25da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattnerstruct FunctionInfo;        // Defined in ExecutionAnnotations.h
2692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
279bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// AllocaHolder - Object to track all of the blocks of memory allocated by
289bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// alloca.  When the function returns, this object is poped off the execution
299bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// stack, which causes the dtor to be run, which frees all the alloca'd memory.
309bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner//
319bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerclass AllocaHolder {
329bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  friend class AllocaHolderHandle;
339bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  std::vector<void*> Allocations;
349bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  unsigned RefCnt;
359bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerpublic:
369bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolder() : RefCnt(0) {}
379bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  void add(void *mem) { Allocations.push_back(mem); }
389bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  ~AllocaHolder() {
399bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner    for (unsigned i = 0; i < Allocations.size(); ++i)
409bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner      free(Allocations[i]);
419bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  }
429bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner};
439bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
449bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// AllocaHolderHandle gives AllocaHolder value semantics so we can stick it into
459bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner// a vector...
469bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner//
479bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerclass AllocaHolderHandle {
489bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolder *H;
499bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerpublic:
509bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle() : H(new AllocaHolder()) { H->RefCnt++; }
519bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle(const AllocaHolderHandle &AH) : H(AH.H) { H->RefCnt++; }
529bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  ~AllocaHolderHandle() { if (--H->RefCnt == 0) delete H; }
539bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
549bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  void add(void *mem) { H->add(mem); }
559bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner};
569bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner
57697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnertypedef std::vector<GenericValue> ValuePlaneTy;
5892101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
5992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// ExecutionContext struct - This struct represents one stack frame currently
6092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// executing.
6192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
6292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerstruct ExecutionContext {
63da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  Function             *CurFunction;// The currently executing function
6492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  BasicBlock           *CurBB;      // The currently executing BB
6592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  BasicBlock::iterator  CurInst;    // The next instruction to execute
66f143d3c2843f27bb2bf7d0e3c6f281fd0b01eb0bBrian Gaeke  std::map<Value *, GenericValue> Values; // LLVM values used in this invocation
67cdf5178f8362b0b415a4e1c1378a5b76638826beChris Lattner  std::vector<GenericValue>  VarArgs; // Values passed through an ellipsis
682cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke  CallSite             Caller;     // Holds the call that called subframes.
692cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke                                   // NULL if main func or debugger invoked fn
709bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner  AllocaHolderHandle    Allocas;    // Track memory allocated by alloca
7192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner};
7292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
7392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// Interpreter - This class represents the entirety of the interpreter.
7492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//
75d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattnerclass Interpreter : public ExecutionEngine, public InstVisitor<Interpreter> {
7692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  int ExitCode;                // The exit code to be returned by the lli util
77fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  TargetData TD;
7892101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
7992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  // The runtime stack of executing code.  The top of the stack is the current
802fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner  // function record.
81697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  std::vector<ExecutionContext> ECStack;
8292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
8370975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // AtExitHandlers - List of functions to call when the program exits,
8470975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // registered with the atexit() library function.
8544edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  std::vector<Function*> AtExitHandlers;
8663bd61330b89afc669b17a08a25b97ba911e1c96Chris Lattner
8792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerpublic:
88f143d3c2843f27bb2bf7d0e3c6f281fd0b01eb0bBrian Gaeke  Interpreter(Module *M, bool isLittleEndian, bool isLongPointer);
89f143d3c2843f27bb2bf7d0e3c6f281fd0b01eb0bBrian Gaeke  inline ~Interpreter() { }
9092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
9170975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  /// runAtExitHandlers - Run any functions registered by the
9270975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  /// program's calls to atexit(3), which we intercept and store in
9370975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  /// AtExitHandlers.
9470975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  ///
9570975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  void runAtExitHandlers ();
9670975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke
9782d8277ad5862b54341808812bb4016e52347060Brian Gaeke  /// create - Create an interpreter ExecutionEngine. This can never fail.
9882d8277ad5862b54341808812bb4016e52347060Brian Gaeke  ///
99f143d3c2843f27bb2bf7d0e3c6f281fd0b01eb0bBrian Gaeke  static ExecutionEngine *create(Module *M);
10082d8277ad5862b54341808812bb4016e52347060Brian Gaeke
101fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  /// run - Start execution with the specified function and arguments.
102fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  ///
10370975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  virtual GenericValue run(Function *F,
10470975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke			   const std::vector<GenericValue> &ArgValues);
10592101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
10670975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // Methods used to execute code:
10770975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  // Place a call on the stack
108da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  void callFunction(Function *F, const std::vector<GenericValue> &ArgVals);
10970975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke  void run();                // Execute instructions until nothing left to do
11092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
11192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner  // Opcode Implementations
112d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitReturnInst(ReturnInst &I);
113d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitBranchInst(BranchInst &I);
114d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitSwitchInst(SwitchInst &I);
115d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner
116d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitBinaryOperator(BinaryOperator &I);
117d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitAllocationInst(AllocationInst &I);
118d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitFreeInst(FreeInst &I);
119d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitLoadInst(LoadInst &I);
120d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitStoreInst(StoreInst &I);
121d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitGetElementPtrInst(GetElementPtrInst &I);
122d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner
123d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitPHINode(PHINode &PN) { assert(0 && "PHI nodes already handled!"); }
124d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitCastInst(CastInst &I);
125d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitCallInst(CallInst &I);
126d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitShl(ShiftInst &I);
127d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitShr(ShiftInst &I);
1284c6654963dfa4b91c702a913f3715c4a207472d2Chris Lattner  void visitVANextInst(VANextInst &I);
129d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  void visitInstruction(Instruction &I) {
130d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner    std::cerr << I;
131d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner    assert(0 && "Instruction not interpretable yet!");
132d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner  }
133d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner
134da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  GenericValue callExternalFunction(Function *F,
135da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner                                    const std::vector<GenericValue> &ArgVals);
136e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner  void exitCalled(GenericValue GV);
13792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
13844edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  void addAtExitHandler(Function *F) {
13944edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner    AtExitHandlers.push_back(F);
14044edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner  }
14144edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner
142fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  //FIXME: private:
143fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattnerpublic:
144fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner  GenericValue executeGEPOperation(Value *Ptr, User::op_iterator I,
145fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner				   User::op_iterator E, ExecutionContext &SF);
146fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner
14792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerprivate:  // Helper functions
14877113b627237fe2850676cccd809de1e05f03952Chris Lattner  // SwitchToNewBasicBlock - Start execution in a new basic block and run any
14977113b627237fe2850676cccd809de1e05f03952Chris Lattner  // PHI nodes in the top of the block.  This is used for intraprocedural
15077113b627237fe2850676cccd809de1e05f03952Chris Lattner  // control flow.
15177113b627237fe2850676cccd809de1e05f03952Chris Lattner  //
15277113b627237fe2850676cccd809de1e05f03952Chris Lattner  void SwitchToNewBasicBlock(BasicBlock *Dest, ExecutionContext &SF);
15377113b627237fe2850676cccd809de1e05f03952Chris Lattner
154fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke  void *getPointerToFunction(Function *F) { return (void*)F; }
155fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner
1565deea3c5c5d71acf140b0df9488126e3c67e4a0aChris Lattner  void initializeExecutionEngine();
157da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner  void initializeExternalFunctions();
15829794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  GenericValue getOperandValue(Value *V, ExecutionContext &SF);
15929794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  GenericValue executeCastOperation(Value *SrcVal, const Type *Ty,
16029794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke				    ExecutionContext &SF);
161af955ba503e37c3e1efb694a01bce84b7e5d05a7Brian Gaeke  void popStackAndReturnValueToCaller(const Type *RetTy, GenericValue Result);
16292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner};
16392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner
16492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner#endif
165