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