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