14d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner//===-- JIT.cpp - LLVM Just in Time Compiler ------------------------------===// 2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 104d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner// This tool implements a just-in-time compiler for LLVM, allowing direct 11a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// execution of LLVM bitcode in an efficient manner. 12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===// 14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 154d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner#include "JIT.h" 1640966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin#include "llvm/ADT/SmallPtrSet.h" 17a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes#include "llvm/CodeGen/JITCodeEmitter.h" 18b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis#include "llvm/CodeGen/MachineCodeInfo.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Config/config.h" 20df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin#include "llvm/ExecutionEngine/GenericValue.h" 21df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin#include "llvm/ExecutionEngine/JITEventListener.h" 2230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev#include "llvm/ExecutionEngine/JITMemoryManager.h" 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h" 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h" 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Module.h" 3044e3dd1672572df28e79649c86f2d44bf3730062Chris Lattner#include "llvm/Support/Dwarf.h" 31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/DynamicLibrary.h" 3231e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#include "llvm/Support/ErrorHandling.h" 3340966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin#include "llvm/Support/ManagedStatic.h" 3444e3dd1672572df28e79649c86f2d44bf3730062Chris Lattner#include "llvm/Support/MutexGuard.h" 35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetJITInfo.h" 36d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 373b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov 38c19aadee66b744311afe6e420847e80822a765f2Chris Lattnerusing namespace llvm; 39abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman 404f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach#ifdef __APPLE__ 413b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov// Apple gcc defaults to -fuse-cxa-atexit (i.e. calls __cxa_atexit instead 423b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov// of atexit). It passes the address of linker generated symbol __dso_handle 433b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov// to the function. 443b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov// This configuration change happened at version 5330. 453b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov# include <AvailabilityMacros.h> 463b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov# if defined(MAC_OS_X_VERSION_10_4) && \ 473b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov ((MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4) || \ 483b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov (MAC_OS_X_VERSION_MIN_REQUIRED == MAC_OS_X_VERSION_10_4 && \ 493b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov __APPLE_CC__ >= 5330)) 503b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov# ifndef HAVE___DSO_HANDLE 513b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov# define HAVE___DSO_HANDLE 1 523b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov# endif 533b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov# endif 545f42c550305814f916207b9604b92fbd258e8eafEvan Cheng#endif 553b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov 563b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov#if HAVE___DSO_HANDLE 573b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikovextern void *__dso_handle __attribute__ ((__visibility__ ("hidden"))); 58b76ea74845849e7a499603bb04bfe1614101e910Nate Begeman#endif 595f42c550305814f916207b9604b92fbd258e8eafEvan Cheng 60844731a7f1909f55935e3514c9e713a62d67662eDan Gohmannamespace { 61844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 622fe4bb06c6c40d16b7a5ae9cdf6bb6fe94d51be0Chris Lattnerstatic struct RegisterJIT { 632fe4bb06c6c40d16b7a5ae9cdf6bb6fe94d51be0Chris Lattner RegisterJIT() { JIT::Register(); } 642fe4bb06c6c40d16b7a5ae9cdf6bb6fe94d51be0Chris Lattner} JITRegistrator; 652fe4bb06c6c40d16b7a5ae9cdf6bb6fe94d51be0Chris Lattner 66844731a7f1909f55935e3514c9e713a62d67662eDan Gohman} 67844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 68e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilsonextern "C" void LLVMLinkInJIT() { 692f51914d828b462b054195e73c75448f24e01979Jeff Cohen} 702f51914d828b462b054195e73c75448f24e01979Jeff Cohen 7134c9433004cabd4760987dce4804a91c84908219Chris Lattner/// createJIT - This is the factory method for creating a JIT for the current 7234c9433004cabd4760987dce4804a91c84908219Chris Lattner/// machine, it does not fall back to the interpreter. This takes ownership 73f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// of the module. 74f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey YasskinExecutionEngine *JIT::createJIT(Module *M, 754b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner std::string *ErrorStr, 764b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner JITMemoryManager *JMM, 7788b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher bool GVsWithCode, 78c5b28580a94e247300e5d3ccf532e153f2ae6f12Dylan Noblesmith TargetMachine *TM) { 7983a82ac0b4dc6ea6b3e56f9e239a113eb5be5f38Nick Lewycky // Try to register the program as a source of symbols to resolve against. 802ea29ba2a8ddd7ba4b946eb754f1a39304d9fc09Dylan Noblesmith // 812ea29ba2a8ddd7ba4b946eb754f1a39304d9fc09Dylan Noblesmith // FIXME: Don't do this here. 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines sys::DynamicLibrary::LoadLibraryPermanently(nullptr, nullptr); 8383a82ac0b4dc6ea6b3e56f9e239a113eb5be5f38Nick Lewycky 842ea29ba2a8ddd7ba4b946eb754f1a39304d9fc09Dylan Noblesmith // If the target supports JIT code generation, create the JIT. 854b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner if (TargetJITInfo *TJ = TM->getJITInfo()) { 869ea47179e647e806a2c67639bfead9d254514e59Dylan Noblesmith return new JIT(M, *TM, *TJ, JMM, GVsWithCode); 874b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } else { 884b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner if (ErrorStr) 894b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner *ErrorStr = "target does not support JIT code generation"; 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 914b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner } 9234c9433004cabd4760987dce4804a91c84908219Chris Lattner} 9334c9433004cabd4760987dce4804a91c84908219Chris Lattner 9440966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskinnamespace { 9540966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin/// This class supports the global getPointerToNamedFunction(), which allows 9640966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin/// bugpoint or gdb users to search for a function by name without any context. 9740966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskinclass JitPool { 9840966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin SmallPtrSet<JIT*, 1> JITs; // Optimize for process containing just 1 JIT. 9940966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin mutable sys::Mutex Lock; 10040966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskinpublic: 10140966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin void Add(JIT *jit) { 10240966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin MutexGuard guard(Lock); 10340966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin JITs.insert(jit); 10440966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin } 10540966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin void Remove(JIT *jit) { 10640966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin MutexGuard guard(Lock); 10740966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin JITs.erase(jit); 10840966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin } 10940966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin void *getPointerToNamedFunction(const char *Name) const { 11040966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin MutexGuard guard(Lock); 11140966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin assert(JITs.size() != 0 && "No Jit registered"); 11240966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin //search function in every instance of JIT 11340966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin for (SmallPtrSet<JIT*, 1>::const_iterator Jit = JITs.begin(), 11440966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin end = JITs.end(); 11540966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin Jit != end; ++Jit) { 11640966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin if (Function *F = (*Jit)->FindFunctionNamed(Name)) 11740966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin return (*Jit)->getPointerToFunction(F); 11840966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin } 11940966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // The function is not available : fallback on the first created (will 12040966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // search in symbol of the current program/library) 12140966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin return (*JITs.begin())->getPointerToNamedFunction(Name); 12240966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin } 12340966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin}; 12440966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey YasskinManagedStatic<JitPool> AllJits; 12540966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin} 12640966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskinextern "C" { 12740966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // getPointerToNamedFunction - This function is used as a global wrapper to 12840966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // JIT::getPointerToNamedFunction for the purpose of resolving symbols when 12940966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // bugpoint is debugging the JIT. In that scenario, we are loading an .so and 13040966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // need to resolve function(s) that are being mis-codegenerated, so we need to 13140966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // resolve their addresses at runtime, and this is the way to do it. 13240966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin void *getPointerToNamedFunction(const char *Name) { 13340966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin return AllJits->getPointerToNamedFunction(Name); 13440966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin } 13540966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin} 13640966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin 137f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey YasskinJIT::JIT(Module *M, TargetMachine &tm, TargetJITInfo &tji, 13830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev JITMemoryManager *jmm, bool GVsWithCode) 13930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev : ExecutionEngine(M), TM(tm), TJI(tji), 14030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev JMM(jmm ? jmm : JITMemoryManager::CreateDefaultMemManager()), 14130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev AllocateGVsWithCode(GVsWithCode), isAlreadyCodeGenerating(false) { 1423574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow setDataLayout(TM.getDataLayout()); 143abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman 144f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin jitstate = new JITState(M); 145f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 146a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes // Initialize JCE 1472763217fbd2f1c54a7a25fd3ae9e997ea6ece0cbReid Kleckner JCE = createEmitter(*this, JMM, TM); 148f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman 14940966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin // Register in global list of all JITs. 15040966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin AllJits->Add(this); 15140966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin 15250872d5385463cf1d2e23a758516e7f818e1af24Brian Gaeke // Add target data 153ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer MutexGuard locked(lock); 154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines FunctionPassManager &PM = jitstate->getPM(); 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines M->setDataLayout(TM.getDataLayout()); 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PM.add(new DataLayoutPass(M)); 15750872d5385463cf1d2e23a758516e7f818e1af24Brian Gaeke 1584d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner // Turn the machine code intermediate representation into bytes in memory that 1594d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner // may be executed. 160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (TM.addPassesToEmitMachineCode(PM, *JCE, !getVerifyModules())) { 16175361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Target does not support machine code emission!"); 1624d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner } 1634f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 1641911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner // Initialize passes. 1651911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner PM.doInitialization(); 166bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 167bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 1684d326fa9bea5b80147edf14d1521fc41ce315275Chris LattnerJIT::~JIT() { 169b35fd448cea32da671ecd3ecaad3cc637598c6e0Duncan Sands // Cleanup. 17040966a7c6847c102fbf466da3e8726c59c3dbb1eJeffrey Yasskin AllJits->Remove(this); 171f049e07eb8930214941c72f8e4409df394de1567Nate Begeman delete jitstate; 172a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes delete JCE; 17330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev // JMM is a ownership of JCE, so we no need delete JMM here. 1744d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner delete &TM; 1754d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner} 1764d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 177f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// addModule - Add a new Module to the JIT. If we previously removed the last 178f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// Module, we need re-initialize jitstate with a valid Module. 179f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinvoid JIT::addModule(Module *M) { 180f049e07eb8930214941c72f8e4409df394de1567Nate Begeman MutexGuard locked(lock); 181f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 182f049e07eb8930214941c72f8e4409df394de1567Nate Begeman if (Modules.empty()) { 183f049e07eb8930214941c72f8e4409df394de1567Nate Begeman assert(!jitstate && "jitstate should be NULL if Modules vector is empty!"); 184f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 185f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin jitstate = new JITState(M); 186f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 187cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines FunctionPassManager &PM = jitstate->getPM(); 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines M->setDataLayout(TM.getDataLayout()); 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PM.add(new DataLayoutPass(M)); 190f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 191f049e07eb8930214941c72f8e4409df394de1567Nate Begeman // Turn the machine code intermediate representation into bytes in memory 192f049e07eb8930214941c72f8e4409df394de1567Nate Begeman // that may be executed. 193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (TM.addPassesToEmitMachineCode(PM, *JCE, !getVerifyModules())) { 19475361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Target does not support machine code emission!"); 195f049e07eb8930214941c72f8e4409df394de1567Nate Begeman } 1964f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 197f049e07eb8930214941c72f8e4409df394de1567Nate Begeman // Initialize passes. 198f049e07eb8930214941c72f8e4409df394de1567Nate Begeman PM.doInitialization(); 199f049e07eb8930214941c72f8e4409df394de1567Nate Begeman } 2004f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 201f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin ExecutionEngine::addModule(M); 202f049e07eb8930214941c72f8e4409df394de1567Nate Begeman} 203f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 204f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// removeModule - If we are removing the last Module, invalidate the jitstate 205f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// since the PassManager it contains references a released Module. 206f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool JIT::removeModule(Module *M) { 207f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin bool result = ExecutionEngine::removeModule(M); 2084f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 209f049e07eb8930214941c72f8e4409df394de1567Nate Begeman MutexGuard locked(lock); 2104f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 2119402be960b4895217d009b6204cf08d8e697b8d5Chad Rosier if (jitstate && jitstate->getModule() == M) { 212f049e07eb8930214941c72f8e4409df394de1567Nate Begeman delete jitstate; 213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines jitstate = nullptr; 214f049e07eb8930214941c72f8e4409df394de1567Nate Begeman } 2154f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 216d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman if (!jitstate && !Modules.empty()) { 217d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman jitstate = new JITState(Modules[0]); 218d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman 219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines FunctionPassManager &PM = jitstate->getPM(); 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines M->setDataLayout(TM.getDataLayout()); 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PM.add(new DataLayoutPass(M)); 2224f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 223d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman // Turn the machine code intermediate representation into bytes in memory 224d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman // that may be executed. 225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (TM.addPassesToEmitMachineCode(PM, *JCE, !getVerifyModules())) { 22675361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Target does not support machine code emission!"); 227d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman } 2284f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 229d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman // Initialize passes. 230d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman PM.doInitialization(); 2314f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach } 232f049e07eb8930214941c72f8e4409df394de1567Nate Begeman return result; 233f049e07eb8930214941c72f8e4409df394de1567Nate Begeman} 234f049e07eb8930214941c72f8e4409df394de1567Nate Begeman 23570975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke/// run - Start execution with the specified function and arguments. 23605a1a306bcfba2b533dc1210d24924e5f3e9ed0eChris Lattner/// 237ff0f1bb32a439cf82cb09ee29544c894a2bfe877Chris LattnerGenericValue JIT::runFunction(Function *F, 238ff0f1bb32a439cf82cb09ee29544c894a2bfe877Chris Lattner const std::vector<GenericValue> &ArgValues) { 239b47130c580385a5a2c922c480a85438b2bb80293Chris Lattner assert(F && "Function *F was null at entry to run()"); 240b47130c580385a5a2c922c480a85438b2bb80293Chris Lattner 241b47130c580385a5a2c922c480a85438b2bb80293Chris Lattner void *FPtr = getPointerToFunction(F); 2427c45d7898bdfdc29a61a58b678e13ed41333ed51Chris Lattner assert(FPtr && "Pointer to fn's code was null after getPointerToFunction"); 243db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *FTy = F->getFunctionType(); 244db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *RetTy = FTy->getReturnType(); 245bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 24607ab52b6459f65b3e1c94d52321165688a6096aaDan Gohman assert((FTy->getNumParams() == ArgValues.size() || 24707ab52b6459f65b3e1c94d52321165688a6096aaDan Gohman (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) && 24807ab52b6459f65b3e1c94d52321165688a6096aaDan Gohman "Wrong number of arguments passed into function!"); 249e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner assert(FTy->getNumParams() == ArgValues.size() && 250e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner "This doesn't support passing arguments through varargs (yet)!"); 251e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner 252ec8430270a9f1adbf9b790319a1d4781658359fdMisha Brukman // Handle some common cases first. These cases correspond to common `main' 253e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner // prototypes. 254b0bc6c361da9009e8414efde317d9bbff755f6c0Duncan Sands if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) { 255f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner switch (ArgValues.size()) { 256f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner case 3: 257b0bc6c361da9009e8414efde317d9bbff755f6c0Duncan Sands if (FTy->getParamType(0)->isIntegerTy(32) && 2581df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands FTy->getParamType(1)->isPointerTy() && 2591df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands FTy->getParamType(2)->isPointerTy()) { 260f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner int (*PF)(int, char **, const char **) = 261870286aa33290c00e55ba479a60251c79f3a7911Chris Lattner (int(*)(int, char **, const char **))(intptr_t)FPtr; 262ec8430270a9f1adbf9b790319a1d4781658359fdMisha Brukman 263f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner // Call the function. 264e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner GenericValue rv; 2654f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 26638f6a15df69c271c3bebf648642041b31380e31aReid Spencer (char **)GVTOP(ArgValues[1]), 26738f6a15df69c271c3bebf648642041b31380e31aReid Spencer (const char **)GVTOP(ArgValues[2]))); 268f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner return rv; 269f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner } 270f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner break; 271174f2264649d9ae062bdb0a038131c2836596be5Chris Lattner case 2: 272b0bc6c361da9009e8414efde317d9bbff755f6c0Duncan Sands if (FTy->getParamType(0)->isIntegerTy(32) && 2731df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands FTy->getParamType(1)->isPointerTy()) { 274870286aa33290c00e55ba479a60251c79f3a7911Chris Lattner int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr; 275ec8430270a9f1adbf9b790319a1d4781658359fdMisha Brukman 276174f2264649d9ae062bdb0a038131c2836596be5Chris Lattner // Call the function. 277174f2264649d9ae062bdb0a038131c2836596be5Chris Lattner GenericValue rv; 2784f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 27938f6a15df69c271c3bebf648642041b31380e31aReid Spencer (char **)GVTOP(ArgValues[1]))); 280174f2264649d9ae062bdb0a038131c2836596be5Chris Lattner return rv; 281174f2264649d9ae062bdb0a038131c2836596be5Chris Lattner } 282174f2264649d9ae062bdb0a038131c2836596be5Chris Lattner break; 283f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner case 1: 284847a32b78fefb3097b662bcd1156c202d4569d96Nuno Lopes if (FTy->getParamType(0)->isIntegerTy(32)) { 285e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner GenericValue rv; 286870286aa33290c00e55ba479a60251c79f3a7911Chris Lattner int (*PF)(int) = (int(*)(int))(intptr_t)FPtr; 28738f6a15df69c271c3bebf648642041b31380e31aReid Spencer rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue())); 288f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner return rv; 289f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner } 290847a32b78fefb3097b662bcd1156c202d4569d96Nuno Lopes if (FTy->getParamType(0)->isPointerTy()) { 291847a32b78fefb3097b662bcd1156c202d4569d96Nuno Lopes GenericValue rv; 292847a32b78fefb3097b662bcd1156c202d4569d96Nuno Lopes int (*PF)(char *) = (int(*)(char *))(intptr_t)FPtr; 293847a32b78fefb3097b662bcd1156c202d4569d96Nuno Lopes rv.IntVal = APInt(32, PF((char*)GVTOP(ArgValues[0]))); 294847a32b78fefb3097b662bcd1156c202d4569d96Nuno Lopes return rv; 295847a32b78fefb3097b662bcd1156c202d4569d96Nuno Lopes } 296f7bedf447e080cb57c64d6f0cbf6fbeb9f4c596eChris Lattner break; 297e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner } 298e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner } 299e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner 300e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner // Handle cases where no arguments are passed first. 301e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner if (ArgValues.empty()) { 302e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner GenericValue rv; 303e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner switch (RetTy->getTypeID()) { 304c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Unknown return type for function call!"); 305a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer case Type::IntegerTyID: { 306a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth(); 307a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer if (BitWidth == 1) 30838f6a15df69c271c3bebf648642041b31380e31aReid Spencer rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)()); 309a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 8) 31038f6a15df69c271c3bebf648642041b31380e31aReid Spencer rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)()); 311a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 16) 31238f6a15df69c271c3bebf648642041b31380e31aReid Spencer rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)()); 313a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 32) 31438f6a15df69c271c3bebf648642041b31380e31aReid Spencer rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)()); 315a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 64) 31638f6a15df69c271c3bebf648642041b31380e31aReid Spencer rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)()); 3174f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach else 318c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Integer types > 64 bits not supported"); 319e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner return rv; 320a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } 321e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner case Type::VoidTyID: 32238f6a15df69c271c3bebf648642041b31380e31aReid Spencer rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)()); 323e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner return rv; 324e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner case Type::FloatTyID: 325870286aa33290c00e55ba479a60251c79f3a7911Chris Lattner rv.FloatVal = ((float(*)())(intptr_t)FPtr)(); 326e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner return rv; 327e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner case Type::DoubleTyID: 328870286aa33290c00e55ba479a60251c79f3a7911Chris Lattner rv.DoubleVal = ((double(*)())(intptr_t)FPtr)(); 329d297aea5f24f2ad369162b8c1084cda4dcc839f0Chris Lattner return rv; 3301abac0d725374cb6e527d2a735a5272a4f7913faDale Johannesen case Type::X86_FP80TyID: 3311abac0d725374cb6e527d2a735a5272a4f7913faDale Johannesen case Type::FP128TyID: 3321abac0d725374cb6e527d2a735a5272a4f7913faDale Johannesen case Type::PPC_FP128TyID: 333c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("long double not supported yet"); 334e5eab142a51373dd3bee758ea958575afbfce259Chris Lattner case Type::PointerTyID: 335870286aa33290c00e55ba479a60251c79f3a7911Chris Lattner return PTOGV(((void*(*)())(intptr_t)FPtr)()); 336d297aea5f24f2ad369162b8c1084cda4dcc839f0Chris Lattner } 337ff0f1bb32a439cf82cb09ee29544c894a2bfe877Chris Lattner } 33870975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke 339cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // Okay, this is not one of our quick and easy cases. Because we don't have a 340cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // full FFI, we have to codegen a nullary stub function that just calls the 341cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // function we are interested in, passing in constants for all of the 342cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // arguments. Make this function and return. 343cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner 344cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // First, create the function. 345debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson FunctionType *STy=FunctionType::get(RetTy, false); 346051a950000e21935165db56695e35bade668193bGabor Greif Function *Stub = Function::Create(STy, Function::InternalLinkage, "", 347051a950000e21935165db56695e35bade668193bGabor Greif F->getParent()); 348cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner 349cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // Insert a basic block. 3501d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BasicBlock *StubBB = BasicBlock::Create(F->getContext(), "", Stub); 351cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner 352cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // Convert all of the GenericValue arguments over to constants. Note that we 353cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner // currently don't support varargs. 354990b849abc9481b8c7a482019cd0d95fe2f2a3eaChris Lattner SmallVector<Value*, 8> Args; 355cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner for (unsigned i = 0, e = ArgValues.size(); i != e; ++i) { 356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constant *C = nullptr; 357db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *ArgTy = FTy->getParamType(i); 358cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner const GenericValue &AV = ArgValues[i]; 359cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner switch (ArgTy->getTypeID()) { 360c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Unknown argument type for function call!"); 36102a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner case Type::IntegerTyID: 362eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson C = ConstantInt::get(F->getContext(), AV.IntVal); 36302a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner break; 36402a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner case Type::FloatTyID: 3656f83c9c6ef0e7f79825a0a8f22941815e4b684c7Owen Anderson C = ConstantFP::get(F->getContext(), APFloat(AV.FloatVal)); 36602a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner break; 36702a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner case Type::DoubleTyID: 3686f83c9c6ef0e7f79825a0a8f22941815e4b684c7Owen Anderson C = ConstantFP::get(F->getContext(), APFloat(AV.DoubleVal)); 36902a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner break; 3701abac0d725374cb6e527d2a735a5272a4f7913faDale Johannesen case Type::PPC_FP128TyID: 3711abac0d725374cb6e527d2a735a5272a4f7913faDale Johannesen case Type::X86_FP80TyID: 37202a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner case Type::FP128TyID: 3730a29cb045444c13160e90fe7942a9d7c720185edTim Northover C = ConstantFP::get(F->getContext(), APFloat(ArgTy->getFltSemantics(), 3740a29cb045444c13160e90fe7942a9d7c720185edTim Northover AV.IntVal)); 37502a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner break; 376cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner case Type::PointerTyID: 377cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner void *ArgPtr = GVTOP(AV); 37802a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner if (sizeof(void*) == 4) 3794f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach C = ConstantInt::get(Type::getInt32Ty(F->getContext()), 3801d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson (int)(intptr_t)ArgPtr); 38102a260aa11a2e1b2c14335274d3c42ca3f3eabc0Chris Lattner else 3821d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson C = ConstantInt::get(Type::getInt64Ty(F->getContext()), 3831d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson (intptr_t)ArgPtr); 3849adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson // Cast the integer to pointer 385baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson C = ConstantExpr::getIntToPtr(C, ArgTy); 386cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner break; 387cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner } 388cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner Args.push_back(C); 389cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner } 390cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner 391a3efbb15ddd5aa9006564cd79086723640084878Jay Foad CallInst *TheCall = CallInst::Create(F, Args, "", StubBB); 392cdfc51ffe3eda17a611fe2aaed1a2e6650d3d203Chris Lattner TheCall->setCallingConv(F->getCallingConv()); 393a471e045b7cef5da428bdada4a362a4be671ef0bChris Lattner TheCall->setTailCall(); 394f012705c7e4ca8cf90b6b734ce1d5355daca5ba5Benjamin Kramer if (!TheCall->getType()->isVoidTy()) 3951d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson // Return result of the call. 3961d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson ReturnInst::Create(F->getContext(), TheCall, StubBB); 397cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner else 3981d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson ReturnInst::Create(F->getContext(), StubBB); // Just return void. 399cc22e9f406cf21e3a2036bf6628ee7a5c850d42cChris Lattner 4003174f6703e534366382390b7c7daa913483f4340Jeffrey Yasskin // Finally, call our nullary stub function. 4013174f6703e534366382390b7c7daa913483f4340Jeffrey Yasskin GenericValue Result = runFunction(Stub, std::vector<GenericValue>()); 4023174f6703e534366382390b7c7daa913483f4340Jeffrey Yasskin // Erase it, since no other function can have a reference to it. 4033174f6703e534366382390b7c7daa913483f4340Jeffrey Yasskin Stub->eraseFromParent(); 4043174f6703e534366382390b7c7daa913483f4340Jeffrey Yasskin // And return the result. 4053174f6703e534366382390b7c7daa913483f4340Jeffrey Yasskin return Result; 406bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 4074d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 408df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinvoid JIT::RegisterJITEventListener(JITEventListener *L) { 409dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!L) 410df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin return; 411df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MutexGuard locked(lock); 412df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin EventListeners.push_back(L); 413df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin} 414df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinvoid JIT::UnregisterJITEventListener(JITEventListener *L) { 415dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!L) 416df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin return; 417df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MutexGuard locked(lock); 418df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin std::vector<JITEventListener*>::reverse_iterator I= 419df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin std::find(EventListeners.rbegin(), EventListeners.rend(), L); 420df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin if (I != EventListeners.rend()) { 421df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin std::swap(*I, EventListeners.back()); 422df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin EventListeners.pop_back(); 423df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin } 424df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin} 425df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinvoid JIT::NotifyFunctionEmitted( 426df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin const Function &F, 427df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin void *Code, size_t Size, 428df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin const JITEvent_EmittedFunctionDetails &Details) { 429df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MutexGuard locked(lock); 430df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 431df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin EventListeners[I]->NotifyFunctionEmitted(F, Code, Size, Details); 432df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin } 433df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin} 434df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin 4357a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskinvoid JIT::NotifyFreeingMachineCode(void *OldPtr) { 436df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MutexGuard locked(lock); 437df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 4387a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskin EventListeners[I]->NotifyFreeingMachineCode(OldPtr); 439df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin } 440df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin} 441df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin 4424d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// runJITOnFunction - Run the FunctionPassManager full of 4434d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// just-in-time compilation passes on F, hopefully filling in 4444d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// GlobalAddress[F] with the address of F's machine code. 4454d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// 446b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidisvoid JIT::runJITOnFunction(Function *F, MachineCodeInfo *MCI) { 447ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer MutexGuard locked(lock); 448b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis 449df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin class MCIListener : public JITEventListener { 450df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MachineCodeInfo *const MCI; 451df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin public: 452df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MCIListener(MachineCodeInfo *mci) : MCI(mci) {} 45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void NotifyFunctionEmitted(const Function &, void *Code, size_t Size, 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const EmittedFunctionDetails &) override { 455df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MCI->setAddress(Code); 456df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MCI->setSize(Size); 457df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin } 458df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin }; 459df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin MCIListener MCIL(MCI); 46092fdf4537bd298673552d47adac2ff7bceab9dc9Jeffrey Yasskin if (MCI) 46192fdf4537bd298673552d47adac2ff7bceab9dc9Jeffrey Yasskin RegisterJITEventListener(&MCIL); 462b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis 463cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines runJITOnFunctionUnlocked(F); 464b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis 46592fdf4537bd298673552d47adac2ff7bceab9dc9Jeffrey Yasskin if (MCI) 46692fdf4537bd298673552d47adac2ff7bceab9dc9Jeffrey Yasskin UnregisterJITEventListener(&MCIL); 46721afcda54479602c2936946731a3f1ee8e5d2322Dan Gohman} 46821afcda54479602c2936946731a3f1ee8e5d2322Dan Gohman 469cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid JIT::runJITOnFunctionUnlocked(Function *F) { 47017f218e001862785c5ba5974a6374f2f7bc29ac0Chris Lattner assert(!isAlreadyCodeGenerating && "Error: Recursive compilation detected!"); 4714d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 472cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines jitTheFunctionUnlocked(F); 473c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner 474d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman // If the function referred to another function that had not yet been 475dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin // read from bitcode, and we are jitting non-lazily, emit it now. 476cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines while (!jitstate->getPendingFunctions().empty()) { 477cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Function *PF = jitstate->getPendingFunctions().back(); 478cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines jitstate->getPendingFunctions().pop_back(); 479d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman 480aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin assert(!PF->hasAvailableExternallyLinkage() && 481aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin "Externally-defined function should not be in pending list."); 482aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin 483cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines jitTheFunctionUnlocked(PF); 4844f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 485d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman // Now that the function has been jitted, ask the JITEmitter to rewrite 486d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman // the stub with real address of the function. 487cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines updateFunctionStubUnlocked(PF); 488c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner } 4894d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner} 4904d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 491cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid JIT::jitTheFunctionUnlocked(Function *F) { 49268feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner isAlreadyCodeGenerating = true; 493cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines jitstate->getPM().run(*F); 49468feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner isAlreadyCodeGenerating = false; 49568feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner 49668feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner // clear basic block addresses after this function is done 497cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getBasicBlockAddressMap().clear(); 49868feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner} 49968feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner 5004d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// getPointerToFunction - This method is used to get the address of the 5017a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner/// specified function, compiling it if necessary. 5024d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// 5034d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattnervoid *JIT::getPointerToFunction(Function *F) { 504ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer 505c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner if (void *Addr = getPointerToGlobalIfAvailable(F)) 506c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner return Addr; // Check if function already code gen'd 5074d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 508a3ac0c105d26f8535d03031db7e97274b3ff8159Dan Gohman MutexGuard locked(lock); 5091c341c8462a208ccc5ba4b4e030cdc989ce38818Mon P Wang 510aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin // Now that this thread owns the lock, make sure we read in the function if it 511aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin // exists in this Module. 512aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin std::string ErrorMsg; 513f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin if (F->Materialize(&ErrorMsg)) { 51475361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Error reading function '" + F->getName()+ 515aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin "' from bitcode file: " + ErrorMsg); 516fd7d99120b394e7aa4cf0b670f7b783a61dec3a1Nicolas Geoffray } 5174d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 518aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin // ... and check if another thread has already code gen'd the function. 519aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin if (void *Addr = getPointerToGlobalIfAvailable(F)) 520aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin return Addr; 521aad0d52c5bc088e6182f83becee29846bb00d592Jeffrey Yasskin 52246264f020a2f08c605ac69754291a7413d747766Chris Lattner if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) { 5236f348e458660063a40052b208bab96895c822877Jeffrey Yasskin bool AbortOnFailure = !F->hasExternalWeakLinkage(); 52469f9378675b23135043d93aa58300fed3ec41cbfDan Gohman void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure); 525c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner addGlobalMapping(F, Addr); 526c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner return Addr; 527c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner } 5284d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines runJITOnFunctionUnlocked(F); 530c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner 531c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner void *Addr = getPointerToGlobalIfAvailable(F); 5324d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner assert(Addr && "Code generation didn't add function to GlobalAddress table!"); 5334d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner return Addr; 5344d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner} 5354d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 53668feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattnervoid JIT::addPointerToBasicBlock(const BasicBlock *BB, void *Addr) { 53768feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner MutexGuard locked(lock); 5384f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 53968feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner BasicBlockAddressMapTy::iterator I = 540cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getBasicBlockAddressMap().find(BB); 541cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (I == getBasicBlockAddressMap().end()) { 542cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getBasicBlockAddressMap()[BB] = Addr; 54368feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner } else { 54468feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner // ignore repeats: some BBs can be split into few MBBs? 54568feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner } 54668feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner} 54768feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner 54868feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattnervoid JIT::clearPointerToBasicBlock(const BasicBlock *BB) { 54968feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner MutexGuard locked(lock); 550cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getBasicBlockAddressMap().erase(BB); 55168feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner} 55268feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner 55368feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattnervoid *JIT::getPointerToBasicBlock(BasicBlock *BB) { 55468feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner // make sure it's function is compiled by JIT 55568feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner (void)getPointerToFunction(BB->getParent()); 55668feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner 55768feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner // resolve basic block address 55868feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner MutexGuard locked(lock); 5594f9fc854bc8d1482e65cd8fad464644a24fca4bfJim Grosbach 56068feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner BasicBlockAddressMapTy::iterator I = 561cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getBasicBlockAddressMap().find(BB); 562cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (I != getBasicBlockAddressMap().end()) { 56368feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner return I->second; 56468feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner } else { 565858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("JIT does not have BB address for address-of-label, was" 566858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper " it eliminated by optimizer?"); 56768feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner } 56868feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner} 56968feb22ad8e7e3b5cd97312ef105505b3c554d40Chris Lattner 57030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshevvoid *JIT::getPointerToNamedFunction(const std::string &Name, 57130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev bool AbortOnFailure){ 57230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (!isSymbolSearchingDisabled()) { 57330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev void *ptr = JMM->getPointerToNamedFunction(Name, false); 57430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (ptr) 57530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return ptr; 57630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 57730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 57830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev /// If a LazyFunctionCreator is installed, use it to get/create the function. 57930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (LazyFunctionCreator) 58030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (void *RP = LazyFunctionCreator(Name)) 58130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return RP; 58230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 58330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (AbortOnFailure) { 58430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev report_fatal_error("Program used external function '"+Name+ 58530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev "' which could not be resolved!"); 58630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 587dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 58830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev} 58930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 59030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 591c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner/// getOrEmitGlobalVariable - Return the address of the specified global 592c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner/// variable, possibly emitting it to memory if needed. This is used by the 593c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner/// Emitter. 594c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattnervoid *JIT::getOrEmitGlobalVariable(const GlobalVariable *GV) { 595ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer MutexGuard locked(lock); 596ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer 597c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner void *Ptr = getPointerToGlobalIfAvailable(GV); 598c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner if (Ptr) return Ptr; 599c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner 600c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner // If the global is external, just remember the address. 601898e9df8dbc65b9b7b92c35ac6673ac8651ff3e8Jeffrey Yasskin if (GV->isDeclaration() || GV->hasAvailableExternallyLinkage()) { 6023b30a6e92d1da79674451879d4112a8f83cc12a4Anton Korobeynikov#if HAVE___DSO_HANDLE 6035f42c550305814f916207b9604b92fbd258e8eafEvan Cheng if (GV->getName() == "__dso_handle") 6045f42c550305814f916207b9604b92fbd258e8eafEvan Cheng return (void*)&__dso_handle; 605b82ab94e20bd48ac149746864e0d5b1653bdcf3eEvan Cheng#endif 606fbee579ed46016166d88b4defb81a2e7e253062dDaniel Dunbar Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(GV->getName()); 607dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Ptr) { 60875361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Could not resolve external global address: " 60931e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin +GV->getName()); 610c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner } 61166941988de6a295649b33f4c2b0f36a094b2244dNate Begeman addGlobalMapping(GV, Ptr); 612c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner } else { 613dd947ea3c5e020c33c58a31939561265b980a3adDale Johannesen // If the global hasn't been emitted to memory yet, allocate space and 614489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // emit it into memory. 615489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin Ptr = getMemoryForGV(GV); 616dd947ea3c5e020c33c58a31939561265b980a3adDale Johannesen addGlobalMapping(GV, Ptr); 617489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin EmitGlobalVariable(GV); // Initialize the variable. 618c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner } 619c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner return Ptr; 620c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner} 621c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner 6224d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// recompileAndRelinkFunction - This method is used to force a function 6234d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// which has already been compiled, to be compiled again, possibly 6244d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// after it has been modified. Then the entry to the old copy is overwritten 6254d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// with a branch to the new copy. If there was no old copy, this acts 6264d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// just like JIT::getPointerToFunction(). 6274d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner/// 6284d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattnervoid *JIT::recompileAndRelinkFunction(Function *F) { 629c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner void *OldAddr = getPointerToGlobalIfAvailable(F); 6304d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 631c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner // If it's not already compiled there is no reason to patch it up. 632dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!OldAddr) return getPointerToFunction(F); 6334d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner 634c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner // Delete the old function mapping. 635dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addGlobalMapping(F, nullptr); 636c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner 637c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner // Recodegen the function 6384d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner runJITOnFunction(F); 639c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner 640c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner // Update state, forward the old function to the new function. 641c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner void *Addr = getPointerToGlobalIfAvailable(F); 6424d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner assert(Addr && "Code generation didn't add function to GlobalAddress table!"); 6434d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner TJI.replaceMachineCodeForFunction(OldAddr, Addr); 6444d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner return Addr; 6454d326fa9bea5b80147edf14d1521fc41ce315275Chris Lattner} 646895eddfad43f848d5accce1789aa80be0db459d3Misha Brukman 64746fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray/// getMemoryForGV - This method abstracts memory allocation of global 64846fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray/// variable so that the JIT can allocate thread local variables depending 64946fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray/// on the target. 65046fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray/// 65146fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffraychar* JIT::getMemoryForGV(const GlobalVariable* GV) { 652489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin char *Ptr; 653489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin 654489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // GlobalVariable's which are not "constant" will cause trouble in a server 655489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // situation. It's returned in the same block of memory as code which may 656489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // not be writable. 657489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin if (isGVCompilationDisabled() && !GV->isConstant()) { 65875361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Compilation of non-internal GlobalValue is disabled!"); 659489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin } 660489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin 661489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // Some applications require globals and code to live together, so they may 662489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // be allocated into the same buffer, but in general globals are allocated 663489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // through the memory manager which puts them near the code but not in the 664489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // same buffer. 665db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *GlobalType = GV->getType()->getElementType(); 6663574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow size_t S = getDataLayout()->getTypeAllocSize(GlobalType); 6673574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow size_t A = getDataLayout()->getPreferredAlignment(GV); 66846fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray if (GV->isThreadLocal()) { 66946fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray MutexGuard locked(lock); 670489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin Ptr = TJI.allocateThreadLocalMemory(S); 671489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin } else if (TJI.allocateSeparateGVMemory()) { 672489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin if (A <= 8) { 673489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin Ptr = (char*)malloc(S); 674489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin } else { 675489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // Allocate S+A bytes of memory, then use an aligned pointer within that 676489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin // space. 677489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin Ptr = (char*)malloc(S+A); 678489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin unsigned MisAligned = ((intptr_t)Ptr & (A-1)); 679489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin Ptr = Ptr + (MisAligned ? (A-MisAligned) : 0); 680489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin } 681489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin } else if (AllocateGVsWithCode) { 682489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin Ptr = (char*)JCE->allocateSpace(S, A); 68346fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray } else { 684489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin Ptr = (char*)JCE->allocateGlobal(S, A); 68546fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray } 686489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin return Ptr; 68746fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray} 688d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman 689d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begemanvoid JIT::addPendingFunction(Function *F) { 690d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman MutexGuard locked(lock); 691cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines jitstate->getPendingFunctions().push_back(F); 692d6b7a242d345fd79a337afd384bb586c5619cfe7Nate Begeman} 693df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin 694df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin 695df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey YasskinJITEventListener::~JITEventListener() {} 696