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