ExecutionEngine.h revision 4688261c20735f5ead2f08695acdeb727db31894
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file defines the abstract interface that implements execution support 11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// for LLVM. 12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===// 14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 159f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner#ifndef LLVM_EXECUTION_ENGINE_H 169f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner#define LLVM_EXECUTION_ENGINE_H 17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <vector> 19bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <map> 2020aa474f8fbebde588edc101b90e834df28ce4ceAlkis Evlogimenos#include <string> 21fe854034677f59baca1e38075e71f6efca247a03Chris Lattner#include "llvm/ADT/SmallVector.h" 224688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin#include "llvm/ADT/StringRef.h" 2323e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin#include "llvm/ADT/ValueMap.h" 244c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin#include "llvm/Support/ValueHandle.h" 2598a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/System/Mutex.h" 2698a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h" 27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 309d87eb19be82b28d288e38eab3bbe145060a0701Reid Spencerstruct GenericValue; 31bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant; 324c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskinclass ExecutionEngine; 33bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function; 343ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattnerclass GlobalVariable; 35b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass GlobalValue; 36df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass JITEventListener; 37df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass JITMemoryManager; 38df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass MachineCodeInfo; 39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module; 40df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass MutexGuard; 41bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData; 42b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass Type; 43bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 44ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerclass ExecutionEngineState { 454c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskinpublic: 4623e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin struct AddressMapConfig : public ValueMapConfig<const GlobalValue*> { 4723e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin typedef ExecutionEngineState *ExtraData; 4823e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin static sys::Mutex *getMutex(ExecutionEngineState *EES); 4923e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin static void onDelete(ExecutionEngineState *EES, const GlobalValue *Old); 5023e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin static void onRAUW(ExecutionEngineState *, const GlobalValue *, 5123e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin const GlobalValue *); 524c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin }; 534c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin 5423e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin typedef ValueMap<const GlobalValue *, void *, AddressMapConfig> 5523e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin GlobalAddressMapTy; 5623e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin 57ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerprivate: 584c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin ExecutionEngine &EE; 594c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin 60c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// GlobalAddressMap - A mapping between LLVM global values and their 61c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// actualized version... 6223e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin GlobalAddressMapTy GlobalAddressMap; 63c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner 64c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// GlobalAddressReverseMap - This is the reverse mapping of GlobalAddressMap, 65c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// used to convert raw addresses into the LLVM global value that is emitted 66c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// at the address. This map is not computed unless getGlobalValueAtAddress 67c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// is called at some point. 680d5bd59553375dc85ac04c81ef48ef74c9e7193eJeffrey Yasskin std::map<void *, AssertingVH<const GlobalValue> > GlobalAddressReverseMap; 69ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer 70ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerpublic: 7123e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin ExecutionEngineState(ExecutionEngine &EE); 724c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin 7323e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin GlobalAddressMapTy & 7413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling getGlobalAddressMap(const MutexGuard &) { 75ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer return GlobalAddressMap; 76ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer } 77ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer 780d5bd59553375dc85ac04c81ef48ef74c9e7193eJeffrey Yasskin std::map<void*, AssertingVH<const GlobalValue> > & 7913d57320bd212483463d4f8992d5787b29eda5dfBill Wendling getGlobalAddressReverseMap(const MutexGuard &) { 80ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer return GlobalAddressReverseMap; 81ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer } 82c89d27a440370455336202b2a8f25eb9c73e67bcJeffrey Yasskin 83c89d27a440370455336202b2a8f25eb9c73e67bcJeffrey Yasskin // Returns the address ToUnmap was mapped to. 84c89d27a440370455336202b2a8f25eb9c73e67bcJeffrey Yasskin void *RemoveMapping(const MutexGuard &, const GlobalValue *ToUnmap); 85ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer}; 86ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer 87ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer 88ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerclass ExecutionEngine { 89ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer const TargetData *TD; 904c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin ExecutionEngineState EEState; 91dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin bool CompilingLazily; 92446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng bool GVCompilationDisabled; 93e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner bool SymbolSearchingDisabled; 94d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner 954b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner friend class EngineBuilder; // To allow access to JITCtor and InterpCtor. 964b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 971514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattnerprotected: 98f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// Modules - This is a list of Modules that we are JIT'ing from. We use a 99f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// smallvector to optimize for the case where there is only one module. 100f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin SmallVector<Module*, 1> Modules; 101fe854034677f59baca1e38075e71f6efca247a03Chris Lattner 102a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson void setTargetData(const TargetData *td) { 103a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson TD = td; 104bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 10546fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray 10646fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray /// getMemoryforGV - Allocate memory for a global variable. 10746fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray virtual char* getMemoryForGV(const GlobalVariable* GV); 108b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman 109765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner // To avoid having libexecutionengine depend on the JIT and interpreter 110765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner // libraries, the JIT and Interpreter set these functions to ctor pointers 111765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner // at startup time if they are linked in. 1124688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin static ExecutionEngine *(*JITCtor)( 1134688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin Module *M, 1144688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin std::string *ErrorStr, 1154688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin JITMemoryManager *JMM, 1164688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin CodeGenOpt::Level OptLevel, 1174688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin bool GVsWithCode, 1184688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin CodeModel::Model CMM, 1194688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin StringRef MArch, 1204688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin StringRef MCPU, 1214688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin const SmallVectorImpl<std::string>& MAttrs); 122f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin static ExecutionEngine *(*InterpCtor)(Module *M, 1234b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner std::string *ErrorStr); 124d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner 125d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner /// LazyFunctionCreator - If an unknown function is needed, this function 126d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner /// pointer is invoked to create it. If this returns null, the JIT will abort. 127d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner void* (*LazyFunctionCreator)(const std::string &); 128d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner 129afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray /// ExceptionTableRegister - If Exception Handling is set, the JIT will 130afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray /// register dwarf tables with this function 131afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray typedef void (*EERegisterFn)(void*); 132afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray static EERegisterFn ExceptionTableRegister; 133afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray 134bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic: 135765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner /// lock - This lock is protects the ExecutionEngine, JIT, JITResolver and 136765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner /// JITEmitter classes. It must be held while changing the internal state of 137765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner /// any of those classes. 138ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer sys::Mutex lock; // Used to make this class and subclasses thread-safe 139ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer 140f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner //===--------------------------------------------------------------------===// 1419f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner // ExecutionEngine Startup 142f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner //===--------------------------------------------------------------------===// 143ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 1449f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner virtual ~ExecutionEngine(); 145bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 1469f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner /// create - This is the factory method for creating an execution engine which 1479f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner /// is appropriate for the current machine. This takes ownership of the 148f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// module. 149f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin static ExecutionEngine *create(Module *M, 1509f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner bool ForceInterpreter = false, 151502f20b17ede40de84503010b7699b328a4f2867Evan Cheng std::string *ErrorStr = 0, 15298a366d547772010e94609e4584489b3e5ce0043Bill Wendling CodeGenOpt::Level OptLevel = 153489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin CodeGenOpt::Default, 154489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // Allocating globals with code breaks 155489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // freeMachineCodeForFunction and is probably 156489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // unsafe and bad for performance. However, 157489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // we have clients who depend on this 158489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // behavior, so we must support it. 159489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // Eventually, when we're willing to break 160489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // some backwards compatability, this flag 161489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // should be flipped to false, so that by 162489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // default freeMachineCodeForFunction works. 163489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin bool GVsWithCode = true); 164489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin 16534c9433004cabd4760987dce4804a91c84908219Chris Lattner /// createJIT - This is the factory method for creating a JIT for the current 16634c9433004cabd4760987dce4804a91c84908219Chris Lattner /// machine, it does not fall back to the interpreter. This takes ownership 167f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// of the Module and JITMemoryManager if successful. 1681d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar /// 1691d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar /// Clients should make sure to initialize targets prior to calling this 1701d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar /// function. 171f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin static ExecutionEngine *createJIT(Module *M, 17234c9433004cabd4760987dce4804a91c84908219Chris Lattner std::string *ErrorStr = 0, 173502f20b17ede40de84503010b7699b328a4f2867Evan Cheng JITMemoryManager *JMM = 0, 17498a366d547772010e94609e4584489b3e5ce0043Bill Wendling CodeGenOpt::Level OptLevel = 175489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin CodeGenOpt::Default, 17688b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher bool GVsWithCode = true, 17788b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher CodeModel::Model CMM = 17888b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher CodeModel::Default); 17998a366d547772010e94609e4584489b3e5ce0043Bill Wendling 180f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// addModule - Add a Module to the list of modules that we can JIT from. 181f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// Note that this takes ownership of the Module: when the ExecutionEngine is 182f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// destroyed, it destroys the Module as well. 183f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin virtual void addModule(Module *M) { 184f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin Modules.push_back(M); 1852e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner } 1869f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner 1879f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner //===----------------------------------------------------------------------===// 1889f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner 1899f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner const TargetData *getTargetData() const { return TD; } 1909f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner 19173d0e211a39650fc7562e0f15ed21440dde2243aDevang Patel 192f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// removeModule - Remove a Module from the list of modules. Returns true if 193f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// M is found. 194f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin virtual bool removeModule(Module *M); 19560789e419e04c260e36af9a1add5ad316313e490Nate Begeman 196fe854034677f59baca1e38075e71f6efca247a03Chris Lattner /// FindFunctionNamed - Search all of the active modules to find the one that 197fe854034677f59baca1e38075e71f6efca247a03Chris Lattner /// defines FnName. This is very slow operation and shouldn't be used for 198fe854034677f59baca1e38075e71f6efca247a03Chris Lattner /// general code. 199fe854034677f59baca1e38075e71f6efca247a03Chris Lattner Function *FindFunctionNamed(const char *FnName); 200fe854034677f59baca1e38075e71f6efca247a03Chris Lattner 201ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner /// runFunction - Execute the specified function with the specified arguments, 202ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner /// and return the result. 203ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner /// 204ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner virtual GenericValue runFunction(Function *F, 205ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner const std::vector<GenericValue> &ArgValues) = 0; 206ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner 2079ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner /// runStaticConstructorsDestructors - This method is used to execute all of 20818314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng /// the static constructors or destructors for a program, depending on the 2099ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner /// value of isDtors. 2109ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner void runStaticConstructorsDestructors(bool isDtors); 21118314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng /// runStaticConstructorsDestructors - This method is used to execute all of 21218314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng /// the static constructors or destructors for a module, depending on the 21318314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng /// value of isDtors. 21418314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng void runStaticConstructorsDestructors(Module *module, bool isDtors); 2159ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner 2169ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner 217e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner /// runFunctionAsMain - This is a helper function which wraps runFunction to 218e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner /// handle the common task of starting up main with the specified argc, argv, 219e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner /// and envp parameters. 220e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner int runFunctionAsMain(Function *Fn, const std::vector<std::string> &argv, 221e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner const char * const * envp); 222e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner 223e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner 224683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner /// addGlobalMapping - Tell the execution engine that the specified global is 225683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner /// at the specified location. This is used internally as functions are JIT'd 226683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner /// and as global variables are laid out in memory. It can and should also be 227683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner /// used by clients of the EE that want to have an LLVM global overlay 2284c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin /// existing data in memory. Mappings are automatically removed when their 2294c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin /// GlobalValue is destroyed. 230683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner void addGlobalMapping(const GlobalValue *GV, void *Addr); 231683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner 2320982d081056f64d7245ba26368d20de33e206ff9Reid Spencer /// clearAllGlobalMappings - Clear all global mappings and start over again 2330982d081056f64d7245ba26368d20de33e206ff9Reid Spencer /// use in dynamic compilation scenarios when you want to move globals 234683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner void clearAllGlobalMappings(); 235683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner 236f049e07eb8930214941c72f8e4409df394de1567Nate Begeman /// clearGlobalMappingsFromModule - Clear all global mappings that came from a 237f049e07eb8930214941c72f8e4409df394de1567Nate Begeman /// particular module, because it has been removed from the JIT. 238f049e07eb8930214941c72f8e4409df394de1567Nate Begeman void clearGlobalMappingsFromModule(Module *M); 239f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 240f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner /// updateGlobalMapping - Replace an existing mapping for GV with a new 241683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner /// address. This updates both maps as required. If "Addr" is null, the 242f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner /// entry for the global is removed from the mappings. This returns the old 243f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner /// value of the pointer, or null if it was not in the map. 244f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner void *updateGlobalMapping(const GlobalValue *GV, void *Addr); 245683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner 246895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToGlobalIfAvailable - This returns the address of the specified 247683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner /// global value if it is has already been codegen'd, otherwise it returns 248683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner /// null. 249895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 250683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner void *getPointerToGlobalIfAvailable(const GlobalValue *GV); 25170bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner 252895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToGlobal - This returns the address of the specified global 2534c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin /// value. This may involve code generation if it's a function. 254895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 255bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void *getPointerToGlobal(const GlobalValue *GV); 256bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 257895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToFunction - The different EE's represent function bodies in 258895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// different ways. They should each implement this to say what a function 2594c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin /// pointer should look like. When F is destroyed, the ExecutionEngine will 2607a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskin /// remove its global mapping and free any machine code. Be sure no threads 2617a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskin /// are running inside F when that happens. 262895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 263fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke virtual void *getPointerToFunction(Function *F) = 0; 264bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 265f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner /// getPointerToBasicBlock - The different EE's represent basic blocks in 266f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner /// different ways. Return the representation for a blockaddress of the 267f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner /// specified block. 268f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner /// 269f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner virtual void *getPointerToBasicBlock(BasicBlock *BB) = 0; 270f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner 271895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToFunctionOrStub - If the specified function has been 272895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// code-gen'd, return a pointer to the function. If not, compile it, or use 2734c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin /// a stub to implement lazy compilation if available. See 2744c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin /// getPointerToFunction for the requirements on destroying F. 275895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 27618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner virtual void *getPointerToFunctionOrStub(Function *F) { 27718cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner // Default implementation, just codegen the function. 27818cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner return getPointerToFunction(F); 27918cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner } 28018cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner 281b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis // The JIT overrides a version that actually does this. 2825e0644c73e0415e85c035ad1306a86554dd26df7Bill Wendling virtual void runJITOnFunction(Function *, MachineCodeInfo * = 0) { } 283b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis 284c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// getGlobalValueAtAddress - Return the LLVM global value object that starts 285c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// at the specified address. 286c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// 287c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner const GlobalValue *getGlobalValueAtAddress(void *Addr); 288c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner 289c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner 290f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner void StoreValueToMemory(const GenericValue &Val, GenericValue *Ptr, 291f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner const Type *Ty); 29229794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke void InitializeMemory(const Constant *Init, void *Addr); 29329794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke 29418cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// recompileAndRelinkFunction - This method is used to force a function 295895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// which has already been compiled to be compiled again, possibly 29618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// after it has been modified. Then the entry to the old copy is overwritten 29718cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// with a branch to the new copy. If there was no old copy, this acts 29818cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// just like VM::getPointerToFunction(). 29918cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// 30018cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner virtual void *recompileAndRelinkFunction(Function *F) = 0; 30118cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner 302e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// freeMachineCodeForFunction - Release memory in the ExecutionEngine 303e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// corresponding to the machine code emitted to execute this function, useful 304e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// for garbage-collecting generated code. 305e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// 306e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman virtual void freeMachineCodeForFunction(Function *F) = 0; 307e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman 3081514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner /// getOrEmitGlobalVariable - Return the address of the specified global 3091514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner /// variable, possibly emitting it to memory if needed. This is used by the 3104c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin /// Emitter. 3111514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner virtual void *getOrEmitGlobalVariable(const GlobalVariable *GV) { 3121514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner return getPointerToGlobal((GlobalValue*)GV); 3131514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner } 314df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin 315df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin /// Registers a listener to be called back on various events within 316df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin /// the JIT. See JITEventListener.h for more details. Does not 317df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin /// take ownership of the argument. The argument may be NULL, in 318df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin /// which case these functions do nothing. 319df225c0253aa987830fbd3dfcb5d9f8f7f973336Bill Wendling virtual void RegisterJITEventListener(JITEventListener *) {} 320df225c0253aa987830fbd3dfcb5d9f8f7f973336Bill Wendling virtual void UnregisterJITEventListener(JITEventListener *) {} 321df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin 32218fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin /// DisableLazyCompilation - When lazy compilation is off (the default), the 323dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// JIT will eagerly compile every function reachable from the argument to 324dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// getPointerToFunction. If lazy compilation is turned on, the JIT will only 325dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// compile the one function and emit stubs to compile the rest when they're 326dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// first called. If lazy compilation is turned off again while some lazy 327dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// stubs are still around, and one of those stubs is called, the program will 328dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// abort. 329dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// 330dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// In order to safely compile lazily in a threaded program, the user must 331dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// ensure that 1) only one thread at a time can call any particular lazy 332dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// stub, and 2) any thread modifying LLVM IR must hold the JIT's lock 333dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// (ExecutionEngine::lock) or otherwise ensure that no other thread calls a 334dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin /// lazy stub. See http://llvm.org/PR5184 for details. 33518fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin void DisableLazyCompilation(bool Disabled = true) { 33618fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin CompilingLazily = !Disabled; 3371c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner } 338dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin bool isCompilingLazily() const { 339dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin return CompilingLazily; 3401c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner } 34118fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin // Deprecated in favor of isCompilingLazily (to reduce double-negatives). 34218fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin // Remove this in LLVM 2.8. 34318fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin bool isLazyCompilationDisabled() const { 34418fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin return !CompilingLazily; 34518fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin } 346446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng 34777f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng /// DisableGVCompilation - If called, the JIT will abort if it's asked to 34877f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng /// allocate space and populate a GlobalVariable that is not internal to 34977f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng /// the module. 350446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng void DisableGVCompilation(bool Disabled = true) { 351446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng GVCompilationDisabled = Disabled; 352446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng } 353446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng bool isGVCompilationDisabled() const { 354446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng return GVCompilationDisabled; 355446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng } 356446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng 357e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner /// DisableSymbolSearching - If called, the JIT will not try to lookup unknown 358e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner /// symbols with dlsym. A client can still use InstallLazyFunctionCreator to 359e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner /// resolve symbols in a custom way. 360e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner void DisableSymbolSearching(bool Disabled = true) { 361e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner SymbolSearchingDisabled = Disabled; 362e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner } 363e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner bool isSymbolSearchingDisabled() const { 364e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner return SymbolSearchingDisabled; 365e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner } 3666f348e458660063a40052b208bab96895c822877Jeffrey Yasskin 367d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner /// InstallLazyFunctionCreator - If an unknown function is needed, the 368d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner /// specified function pointer is invoked to create it. If it returns null, 369d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner /// the JIT will abort. 370d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner void InstallLazyFunctionCreator(void* (*P)(const std::string &)) { 371d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner LazyFunctionCreator = P; 372d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner } 373afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray 374afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray /// InstallExceptionTableRegister - The JIT will use the given function 375afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray /// to register the exception tables it generates. 376afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray static void InstallExceptionTableRegister(void (*F)(void*)) { 377afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray ExceptionTableRegister = F; 378afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray } 379afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray 380afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray /// RegisterTable - Registers the given pointer as an exception table. It uses 381afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray /// the ExceptionTableRegister function. 382afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray static void RegisterTable(void* res) { 383afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray if (ExceptionTableRegister) 384afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray ExceptionTableRegister(res); 385afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray } 3861514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner 38756adf152f6354a9b5609e059050fd2315ad5960cChris Lattnerprotected: 388f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin explicit ExecutionEngine(Module *M); 3899f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner 390bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void emitGlobals(); 3913ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner 3923ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner // EmitGlobalVariable - This method emits the specified global variable to the 3933ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner // address specified in GlobalAddresses, or allocates new memory if it's not 3943ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner // already in the map. 3951514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner void EmitGlobalVariable(const GlobalVariable *GV); 3963ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner 397bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GenericValue getConstantValue(const Constant *C); 39847567bdcb5ba3886eaf3fa5f0e0b912a24c12347Reid Spencer void LoadValueFromMemory(GenericValue &Result, GenericValue *Ptr, 39947567bdcb5ba3886eaf3fa5f0e0b912a24c12347Reid Spencer const Type *Ty); 400bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}; 401bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 4024b1511b027ce0b648b3379f2891816c25b46f515Reid Klecknernamespace EngineKind { 4034b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner // These are actually bitmasks that get or-ed together. 4044b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner enum Kind { 4054b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner JIT = 0x1, 4064b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner Interpreter = 0x2 4074b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner }; 4084b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner const static Kind Either = (Kind)(JIT | Interpreter); 4094b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner} 4104b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4114b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner/// EngineBuilder - Builder class for ExecutionEngines. Use this by 4124b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner/// stack-allocating a builder, chaining the various set* methods, and 4134b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner/// terminating it with a .create() call. 4144b1511b027ce0b648b3379f2891816c25b46f515Reid Klecknerclass EngineBuilder { 4154b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4164b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner private: 417f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin Module *M; 4184b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner EngineKind::Kind WhichEngine; 4194b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner std::string *ErrorStr; 4204b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner CodeGenOpt::Level OptLevel; 4214b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner JITMemoryManager *JMM; 4224b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner bool AllocateGVsWithCode; 42388b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher CodeModel::Model CMModel; 4244688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin std::string MArch; 4254688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin std::string MCPU; 4264688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin SmallVector<std::string, 4> MAttrs; 4274b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4284b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// InitEngine - Does the common initialization of default options. 4294b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// 4304b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner void InitEngine() { 4314b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner WhichEngine = EngineKind::Either; 4324b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner ErrorStr = NULL; 4334b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner OptLevel = CodeGenOpt::Default; 4344b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner JMM = NULL; 4354b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner AllocateGVsWithCode = false; 43688b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher CMModel = CodeModel::Default; 4374b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 4384b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4394b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner public: 4404b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// EngineBuilder - Constructor for EngineBuilder. If create() is called and 441f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// is successful, the created engine takes ownership of the module. 442f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin EngineBuilder(Module *m) : M(m) { 4434b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner InitEngine(); 4444b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 4454b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4464b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// setEngineKind - Controls whether the user wants the interpreter, the JIT, 4474b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// or whichever engine works. This option defaults to EngineKind::Either. 4484b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner EngineBuilder &setEngineKind(EngineKind::Kind w) { 4494b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner WhichEngine = w; 4504b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner return *this; 4514b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 4524b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4534b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// setJITMemoryManager - Sets the memory manager to use. This allows 4544b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// clients to customize their memory allocation policies. If create() is 4554b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// called and is successful, the created engine takes ownership of the 4564b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// memory manager. This option defaults to NULL. 4574b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner EngineBuilder &setJITMemoryManager(JITMemoryManager *jmm) { 4584b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner JMM = jmm; 4594b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner return *this; 4604b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 4614b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4624b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// setErrorStr - Set the error string to write to on error. This option 4634b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// defaults to NULL. 4644b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner EngineBuilder &setErrorStr(std::string *e) { 4654b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner ErrorStr = e; 4664b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner return *this; 4674b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 4684b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4694b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// setOptLevel - Set the optimization level for the JIT. This option 4704b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// defaults to CodeGenOpt::Default. 4714b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner EngineBuilder &setOptLevel(CodeGenOpt::Level l) { 4724b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner OptLevel = l; 4734b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner return *this; 4744b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 4754b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 47688b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher /// setCodeModel - Set the CodeModel that the ExecutionEngine target 47788b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher /// data is using. Defaults to target specific default "CodeModel::Default". 47888b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher EngineBuilder &setCodeModel(CodeModel::Model M) { 47988b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher CMModel = M; 48088b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher return *this; 48188b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher } 48288b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher 4834b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// setAllocateGVsWithCode - Sets whether global values should be allocated 4844b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// into the same buffer as code. For most applications this should be set 4854b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// to false. Allocating globals with code breaks freeMachineCodeForFunction 4864b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// and is probably unsafe and bad for performance. However, we have clients 4874b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// who depend on this behavior, so we must support it. This option defaults 4884b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// to false so that users of the new API can safely use the new memory 4894b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner /// manager and free machine code. 4904b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner EngineBuilder &setAllocateGVsWithCode(bool a) { 4914b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner AllocateGVsWithCode = a; 4924b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner return *this; 4934b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 4944b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 4954688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin /// setMArch - Override the architecture set by the Module's triple. 4964688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin EngineBuilder &setMArch(StringRef march) { 4974688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin MArch.assign(march.begin(), march.end()); 4984688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin return *this; 4994688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin } 5004688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin 5014688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin /// setMCPU - Target a specific cpu type. 5024688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin EngineBuilder &setMCPU(StringRef mcpu) { 5034688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin MCPU.assign(mcpu.begin(), mcpu.end()); 5044688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin return *this; 5054688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin } 5064688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin 5074688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin /// setMAttrs - Set cpu-specific attributes. 5084688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin template<typename StringSequence> 5094688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin EngineBuilder &setMAttrs(const StringSequence &mattrs) { 5104688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin MAttrs.clear(); 5114688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin MAttrs.append(mattrs.begin(), mattrs.end()); 5124688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin return *this; 5134688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin } 5144688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin 5154b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner ExecutionEngine *create(); 5164b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner}; 5174b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner 518d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 519d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 520bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif 521