192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner//===-- Interpreter.h ------------------------------------------*- C++ -*--===// 2d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman// 3856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// The LLVM Compiler Infrastructure 4856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// 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 1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_EXECUTIONENGINE_INTERPRETER_INTERPRETER_H 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_EXECUTIONENGINE_INTERPRETER_INTERPRETER_H 1692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 179722294d30fff2a432d8e171eb904f33956353e2Brian Gaeke#include "llvm/ExecutionEngine/ExecutionEngine.h" 189722294d30fff2a432d8e171eb904f33956353e2Brian Gaeke#include "llvm/ExecutionEngine/GenericValue.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CallSite.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/InstVisitor.h" 231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 24c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 25bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner#include "llvm/Support/raw_ostream.h" 26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 28726c1ef2bdd72975f41e3188371bb7d6f40401beChris Lattnerclass IntrinsicLowering; 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 { 3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::vector<void *> Allocations; 4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 419bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattnerpublic: 4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines AllocaHolder() {} 4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Make this type move-only. Define explicit move special members for MSVC. 4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines AllocaHolder(AllocaHolder &&RHS) : Allocations(std::move(RHS.Allocations)) {} 4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines AllocaHolder &operator=(AllocaHolder &&RHS) { 4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Allocations = std::move(RHS.Allocations); 4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return *this; 499bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner } 509bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner 5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ~AllocaHolder() { 5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines for (void *Allocation : Allocations) 5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines free(Allocation); 5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 559bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner 5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void add(void *Mem) { Allocations.push_back(Mem); } 579bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner}; 589bffa73530b3712b42f6e6bddf21f22b8aba276dChris Lattner 59697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnertypedef std::vector<GenericValue> ValuePlaneTy; 6092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 6192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// ExecutionContext struct - This struct represents one stack frame currently 6292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// executing. 6392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// 6492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerstruct ExecutionContext { 65da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner Function *CurFunction;// The currently executing function 6692101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner BasicBlock *CurBB; // The currently executing BB 6792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner BasicBlock::iterator CurInst; // The next instruction to execute 682cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke CallSite Caller; // Holds the call that called subframes. 692cb474c8ad8d9d5fe65e801e19e1d96e2c3128b4Brian Gaeke // NULL if main func or debugger invoked fn 7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::map<Value *, GenericValue> Values; // LLVM values used in this invocation 7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::vector<GenericValue> VarArgs; // Values passed through an ellipsis 7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines AllocaHolder Allocas; // Track memory allocated by alloca 7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ExecutionContext() : CurFunction(nullptr), CurBB(nullptr), CurInst(nullptr) {} 7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ExecutionContext(ExecutionContext &&O) 7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : CurFunction(O.CurFunction), CurBB(O.CurBB), CurInst(O.CurInst), 7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Caller(O.Caller), Values(std::move(O.Values)), 7937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines VarArgs(std::move(O.VarArgs)), Allocas(std::move(O.Allocas)) {} 8037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 8137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ExecutionContext &operator=(ExecutionContext &&O) { 8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurFunction = O.CurFunction; 8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurBB = O.CurBB; 8437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurInst = O.CurInst; 8537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Caller = O.Caller; 8637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Values = std::move(O.Values); 8737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines VarArgs = std::move(O.VarArgs); 8837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Allocas = std::move(O.Allocas); 8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return *this; 9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 9192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner}; 9292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 9392101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// Interpreter - This class represents the entirety of the interpreter. 9492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner// 95d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattnerclass Interpreter : public ExecutionEngine, public InstVisitor<Interpreter> { 968c9191c644cf8c3aceac8e0d1ddc72273355588cJeff Cohen GenericValue ExitValue; // The return value of the called function 977301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner IntrinsicLowering *IL; 9892101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 9992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner // The runtime stack of executing code. The top of the stack is the current 1002fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner // function record. 101697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::vector<ExecutionContext> ECStack; 10292101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 10370975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke // AtExitHandlers - List of functions to call when the program exits, 10470975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke // registered with the atexit() library function. 10544edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner std::vector<Function*> AtExitHandlers; 10663bd61330b89afc669b17a08a25b97ba911e1c96Chris Lattner 10792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattnerpublic: 10837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines explicit Interpreter(std::unique_ptr<Module> M); 1090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ~Interpreter() override; 11092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 1112cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner /// runAtExitHandlers - Run any functions registered by the program's calls to 1122cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner /// atexit(3), which we intercept and store in AtExitHandlers. 11370975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke /// 1142cab55d7e1bde83cd5f5dccee9a331ada8c1a67cChris Lattner void runAtExitHandlers(); 11570975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke 1162fe4bb06c6c40d16b7a5ae9cdf6bb6fe94d51be0Chris Lattner static void Register() { 1172fe4bb06c6c40d16b7a5ae9cdf6bb6fe94d51be0Chris Lattner InterpCtor = create; 1182fe4bb06c6c40d16b7a5ae9cdf6bb6fe94d51be0Chris Lattner } 11937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 12037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Create an interpreter ExecutionEngine. 12182d8277ad5862b54341808812bb4016e52347060Brian Gaeke /// 12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines static ExecutionEngine *create(std::unique_ptr<Module> M, 12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::string *ErrorStr = nullptr); 12482d8277ad5862b54341808812bb4016e52347060Brian Gaeke 125fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner /// run - Start execution with the specified function and arguments. 126fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner /// 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines GenericValue runFunction(Function *F, 1286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ArrayRef<GenericValue> ArgValues) override; 12992101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 13037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void *getPointerToNamedFunction(StringRef Name, 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool AbortOnFailure = true) override { 13245a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev // FIXME: not implemented. 133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1344302a4965c4fffcecee23210dd1910d8d2c88259Bill Wendling } 13545a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev 13670975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke // Methods used to execute code: 13770975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke // Place a call on the stack 1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void callFunction(Function *F, ArrayRef<GenericValue> ArgVals); 13970975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke void run(); // Execute instructions until nothing left to do 14092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 14192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner // Opcode Implementations 142d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitReturnInst(ReturnInst &I); 143d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitBranchInst(BranchInst &I); 144d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitSwitchInst(SwitchInst &I); 145f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner void visitIndirectBrInst(IndirectBrInst &I); 146d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner 147d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitBinaryOperator(BinaryOperator &I); 148e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer void visitICmpInst(ICmpInst &I); 149e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer void visitFCmpInst(FCmpInst &I); 1507b929dad59785f62a66f7c58615082f98441e95eVictor Hernandez void visitAllocaInst(AllocaInst &I); 151d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitLoadInst(LoadInst &I); 152d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitStoreInst(StoreInst &I); 153d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitGetElementPtrInst(GetElementPtrInst &I); 154c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin void visitPHINode(PHINode &PN) { 155c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("PHI nodes already handled!"); 156c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin } 157a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitTruncInst(TruncInst &I); 158a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitZExtInst(ZExtInst &I); 159a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitSExtInst(SExtInst &I); 160a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitFPTruncInst(FPTruncInst &I); 161a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitFPExtInst(FPExtInst &I); 162a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitUIToFPInst(UIToFPInst &I); 163a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitSIToFPInst(SIToFPInst &I); 164a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitFPToUIInst(FPToUIInst &I); 165a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitFPToSIInst(FPToSIInst &I); 166a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitPtrToIntInst(PtrToIntInst &I); 167a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitIntToPtrInst(IntToPtrInst &I); 168a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer void visitBitCastInst(BitCastInst &I); 169759d34ffb718cf35e97682b5bd541beb82d9a192Chris Lattner void visitSelectInst(SelectInst &I); 170759d34ffb718cf35e97682b5bd541beb82d9a192Chris Lattner 171fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke 172fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke void visitCallSite(CallSite CS); 173fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke void visitCallInst(CallInst &I) { visitCallSite (CallSite (&I)); } 174fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke void visitInvokeInst(InvokeInst &I) { visitCallSite (CallSite (&I)); } 175ec7c1ab1dafa0fdb383d0e6df4726cecb4c88c70Chris Lattner void visitUnreachableInst(UnreachableInst &I); 176fea483d7c027c595101dce825bdf3f512bf9aacaBrian Gaeke 177832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer void visitShl(BinaryOperator &I); 178832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer void visitLShr(BinaryOperator &I); 179832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer void visitAShr(BinaryOperator &I); 180832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer 181c1a2be18eaf1e9862af973126be1f1ef975185f1Brian Gaeke void visitVAArgInst(VAArgInst &I); 182953783e00c9934bc41077108fffeb1e2a17b00dfNadav Rotem void visitExtractElementInst(ExtractElementInst &I); 1834ca0ce2594a3e3d420be548cb3b6e4e8f51e229fElena Demikhovsky void visitInsertElementInst(InsertElementInst &I); 1844ca0ce2594a3e3d420be548cb3b6e4e8f51e229fElena Demikhovsky void visitShuffleVectorInst(ShuffleVectorInst &I); 1854ca0ce2594a3e3d420be548cb3b6e4e8f51e229fElena Demikhovsky 1863c5ce29cad9b8fab1a280ffd3bd1dbdb4b53ff5eElena Demikhovsky void visitExtractValueInst(ExtractValueInst &I); 1873c5ce29cad9b8fab1a280ffd3bd1dbdb4b53ff5eElena Demikhovsky void visitInsertValueInst(InsertValueInst &I); 1883c5ce29cad9b8fab1a280ffd3bd1dbdb4b53ff5eElena Demikhovsky 189d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner void visitInstruction(Instruction &I) { 190a50c6d95e492590c14e5ace8c3e2e1de8bf5e80eDuncan Sands errs() << I << "\n"; 191c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Instruction not interpretable yet!"); 192d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner } 193d7916e988c544b2ab6af26b723b6bc340ecb78ccChris Lattner 194d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman GenericValue callExternalFunction(Function *F, 1956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ArrayRef<GenericValue> ArgVals); 196e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner void exitCalled(GenericValue GV); 19792101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 19844edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner void addAtExitHandler(Function *F) { 19944edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner AtExitHandlers.push_back(F); 20044edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner } 20144edb6bdd2edc48eb31ed160a09006b610cead67Chris Lattner 2028da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke GenericValue *getFirstVarArg () { 203e62589058c5123d84bb4f8239c63e493bb6bb25bBrian Gaeke return &(ECStack.back ().VarArgs[0]); 2048da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke } 2058da17489aa1a66bee9a4ceda352c78bcbcd1ac56Brian Gaeke 2064781e30b7ba4e1830b4deb5f47498627ca9b89dcDan Gohmanprivate: // Helper functions 2074af6de8f0a767a3892ff7682954cbd2ae2ca3de8Chris Lattner GenericValue executeGEPOperation(Value *Ptr, gep_type_iterator I, 2083c94497ec7852eccd68c1bc1663e8ac2a7bb1ab9Misha Brukman gep_type_iterator E, ExecutionContext &SF); 209fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner 21077113b627237fe2850676cccd809de1e05f03952Chris Lattner // SwitchToNewBasicBlock - Start execution in a new basic block and run any 21177113b627237fe2850676cccd809de1e05f03952Chris Lattner // PHI nodes in the top of the block. This is used for intraprocedural 21277113b627237fe2850676cccd809de1e05f03952Chris Lattner // control flow. 213d1c881a8d4da8b4d99c2a40512fbcca652ab445eMisha Brukman // 21477113b627237fe2850676cccd809de1e05f03952Chris Lattner void SwitchToNewBasicBlock(BasicBlock *Dest, ExecutionContext &SF); 21577113b627237fe2850676cccd809de1e05f03952Chris Lattner 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *getPointerToFunction(Function *F) override { return (void*)F; } 217fe11a97fcde7c63109c3ad36570657807d0cd6efChris Lattner 218fdca74c5671e01447be0f1bac3c0c7aa1727690bOwen Anderson void initializeExecutionEngine() { } 219da82ed52ac02497d343b898cca0bb2cf303f062dChris Lattner void initializeExternalFunctions(); 220dfa58498ae0f8f306dd0f86fd7f070cad0245c62Brian Gaeke GenericValue getConstantExprValue(ConstantExpr *CE, ExecutionContext &SF); 22129794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke GenericValue getOperandValue(Value *V, ExecutionContext &SF); 222db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeTruncInst(Value *SrcVal, Type *DstTy, 223a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 224db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeSExtInst(Value *SrcVal, Type *DstTy, 225a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 226db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeZExtInst(Value *SrcVal, Type *DstTy, 227a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 228db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeFPTruncInst(Value *SrcVal, Type *DstTy, 229a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 230db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeFPExtInst(Value *SrcVal, Type *DstTy, 231a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 232db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeFPToUIInst(Value *SrcVal, Type *DstTy, 233a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 234db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeFPToSIInst(Value *SrcVal, Type *DstTy, 235a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 236db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeUIToFPInst(Value *SrcVal, Type *DstTy, 237a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 238db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeSIToFPInst(Value *SrcVal, Type *DstTy, 239a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 240db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executePtrToIntInst(Value *SrcVal, Type *DstTy, 241a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 242db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeIntToPtrInst(Value *SrcVal, Type *DstTy, 243a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 244db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GenericValue executeBitCastInst(Value *SrcVal, Type *DstTy, 245a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer ExecutionContext &SF); 2463da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer GenericValue executeCastOperation(Instruction::CastOps opcode, Value *SrcVal, 247db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *Ty, ExecutionContext &SF); 248db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner void popStackAndReturnValueToCaller(Type *RetTy, GenericValue Result); 24990935f608d0f6ea4bfa3dbd999b2e27063195e30Reid Spencer 25092101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner}; 25192101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner 252d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 253d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25492101acd7fd44fd467fbeb974ae6c042289c74f9Chris Lattner#endif 255