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