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