1bb498ca5c2acb7567d8d4d84b00229bed6f501b1Eric Christopher//===-- MCJIT.cpp - MC-based Just-in-Time Compiler ------------------------===//
26aec29848676494867e26307698155bc2c5a4033Daniel Dunbar//
36aec29848676494867e26307698155bc2c5a4033Daniel Dunbar//                     The LLVM Compiler Infrastructure
46aec29848676494867e26307698155bc2c5a4033Daniel Dunbar//
56aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// This file is distributed under the University of Illinois Open Source
66aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// License. See LICENSE.TXT for details.
76aec29848676494867e26307698155bc2c5a4033Daniel Dunbar//
86aec29848676494867e26307698155bc2c5a4033Daniel Dunbar//===----------------------------------------------------------------------===//
96aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
106aec29848676494867e26307698155bc2c5a4033Daniel Dunbar#include "MCJIT.h"
116aec29848676494867e26307698155bc2c5a4033Daniel Dunbar#include "llvm/ExecutionEngine/GenericValue.h"
12776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor#include "llvm/ExecutionEngine/JITEventListener.h"
13f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/ExecutionEngine/JITMemoryManager.h"
143f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/MCJIT.h"
153f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectBuffer.h"
163f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectImage.h"
17d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor#include "llvm/ExecutionEngine/SectionMemoryManager.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h"
228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor#include "llvm/IR/Module.h"
23f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/MC/MCAsmInfo.h"
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Object/Archive.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/PassManager.h"
261f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DynamicLibrary.h"
27d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
28f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/Support/MemoryBuffer.h"
29ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor#include "llvm/Support/MutexGuard.h"
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetLowering.h"
316aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
326aec29848676494867e26307698155bc2c5a4033Daniel Dunbarusing namespace llvm;
336aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
346aec29848676494867e26307698155bc2c5a4033Daniel Dunbarnamespace {
356aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
366aec29848676494867e26307698155bc2c5a4033Daniel Dunbarstatic struct RegisterJIT {
376aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  RegisterJIT() { MCJIT::Register(); }
386aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} JITRegistrator;
396aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
406aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
416aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
426aec29848676494867e26307698155bc2c5a4033Daniel Dunbarextern "C" void LLVMLinkInMCJIT() {
436aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
446aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
456aec29848676494867e26307698155bc2c5a4033Daniel DunbarExecutionEngine *MCJIT::createJIT(Module *M,
466aec29848676494867e26307698155bc2c5a4033Daniel Dunbar                                  std::string *ErrorStr,
4713a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo                                  RTDyldMemoryManager *MemMgr,
486aec29848676494867e26307698155bc2c5a4033Daniel Dunbar                                  bool GVsWithCode,
49c5b28580a94e247300e5d3ccf532e153f2ae6f12Dylan Noblesmith                                  TargetMachine *TM) {
506aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  // Try to register the program as a source of symbols to resolve against.
516aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  //
526aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  // FIXME: Don't do this here.
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  sys::DynamicLibrary::LoadLibraryPermanently(nullptr, nullptr);
546aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
5513a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo  return new MCJIT(M, TM, MemMgr ? MemMgr : new SectionMemoryManager(),
5613a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo                   GVsWithCode);
576aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
586aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
598005bcd5e0c923881d82afcb813a7e537cd1b241Jim GrosbachMCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM,
608005bcd5e0c923881d82afcb813a7e537cd1b241Jim Grosbach             bool AllocateGVsWithCode)
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  : ExecutionEngine(m), TM(tm), Ctx(nullptr), MemMgr(this, MM), Dyld(&MemMgr),
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ObjCache(nullptr) {
6331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
642ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  OwnedModules.addModule(m);
653574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  setDataLayout(TM->getDataLayout());
66ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor}
67ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
68ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew KaylorMCJIT::~MCJIT() {
696169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
702ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // FIXME: We are managing our modules, so we do not want the base class
712ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // ExecutionEngine to manage them as well. To avoid double destruction
722ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // of the first (and only) module added in ExecutionEngine constructor
732ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // we remove it from EE and will destruct it ourselves.
742ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  //
752ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // It may make sense to move our module manager (based on SmallStPtr) back
762ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // into EE if the JIT and Interpreter can live with it.
772ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // If so, additional functions: addModule, removeModule, FindFunctionNamed,
782ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // runStaticConstructorsDestructors could be moved back to EE as well.
792ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  //
802ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  Modules.clear();
8143507d026bef31100cb0c35614bcf419029a265bAndrew Kaylor  Dyld.deregisterEHFrames();
82817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LoadedObjectList::iterator it, end;
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (it = LoadedObjects.begin(), end = LoadedObjects.end(); it != end; ++it) {
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ObjectImage *Obj = *it;
86817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth    if (Obj) {
87817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth      NotifyFreeingObject(*Obj);
88817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth      delete Obj;
89817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth    }
90817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth  }
918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  LoadedObjects.clear();
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<object::Archive *, 2>::iterator ArIt, ArEnd;
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (ArIt = Archives.begin(), ArEnd = Archives.end(); ArIt != ArEnd; ++ArIt) {
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    object::Archive *A = *ArIt;
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    delete A;
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Archives.clear();
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
101ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  delete TM;
102ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor}
103ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
1048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::addModule(Module *M) {
1056169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
1062ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  OwnedModules.addModule(M);
1072ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor}
1082ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor
1092ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylorbool MCJIT::removeModule(Module *M) {
1102ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  MutexGuard locked(lock);
1112ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  return OwnedModules.removeModule(M);
1128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
1138e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
1142ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor
1152ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) {
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ObjectImage *LoadedObject = Dyld.loadObject(std::move(Obj));
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!LoadedObject || Dyld.hasError())
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    report_fatal_error(Dyld.getErrorString());
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LoadedObjects.push_back(LoadedObject);
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  NotifyObjectEmitted(*LoadedObject);
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCJIT::addArchive(object::Archive *A) {
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Archives.push_back(A);
12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1311c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylorvoid MCJIT::setObjectCache(ObjectCache* NewCache) {
1326169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
1331c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  ObjCache = NewCache;
1341c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor}
1351c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1368e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorObjectBufferStream* MCJIT::emitObject(Module *M) {
1376169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
1386169453ba37ac353655f2475f336e66f31276752Andrew Kaylor
1392ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // This must be a module which has already been added but not loaded to this
1402ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // MCJIT instance, since these conditions are tested by our caller,
1412ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // generateCodeForModule.
142ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
143ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  PassManager PM;
144ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  M->setDataLayout(TM->getDataLayout());
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  PM.add(new DataLayoutPass(M));
14731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
1483f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  // The RuntimeDyld will take ownership of this shortly
14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<ObjectBufferStream> CompiledObject(new ObjectBufferStream());
1503f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor
15131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // Turn the machine code intermediate representation into bytes in memory
15231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // that may be executed.
153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(),
154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            !getVerifyModules())) {
15531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach    report_fatal_error("Target does not support MC emission!");
15631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  }
15731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
15831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // Initialize passes.
1598e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  PM.run(*M);
1603f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  // Flush the output buffer to get the generated code into memory
1611c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  CompiledObject->flush();
1621c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1631c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // If we have an object cache, tell it about the new object.
1641c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // Note that we're using the compiled image, not the loaded image (as below).
1651c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  if (ObjCache) {
1661c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    // MemoryBuffer is a thin wrapper around the actual memory, so it's OK
1671c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    // to create a temporary object here and delete it after the call.
16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::unique_ptr<MemoryBuffer> MB(CompiledObject->getMemBuffer());
1698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    ObjCache->notifyObjectCompiled(M, MB.get());
1701c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  }
1711c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return CompiledObject.release();
1731c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor}
1741c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::generateCodeForModule(Module *M) {
1766169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  // Get a thread lock to make sure we aren't trying to load multiple times
1776169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
1786169453ba37ac353655f2475f336e66f31276752Andrew Kaylor
1798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // This must be a module which has already been added to this MCJIT instance.
1802ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  assert(OwnedModules.ownsModule(M) &&
1812ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor         "MCJIT::generateCodeForModule: Unknown module.");
1821c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1831c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // Re-compilation is not supported
1842ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  if (OwnedModules.hasModuleBeenLoaded(M))
1851c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    return;
1861c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<ObjectBuffer> ObjectToLoad;
1881c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // Try to load the pre-compiled object from cache if possible
189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (ObjCache) {
19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::unique_ptr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M));
191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (PreCompiledObject.get())
19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.release()));
1931c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  }
1941c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1951c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // If the cache did not contain a suitable object, compile the object
1961c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  if (!ObjectToLoad) {
1971c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    ObjectToLoad.reset(emitObject(M));
1981c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    assert(ObjectToLoad.get() && "Compilation did not produce an object.");
1991c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  }
200f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach
201f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach  // Load the object into the dynamic linker.
20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // MCJIT now owns the ObjectImage pointer (via its LoadedObjects list).
20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ObjectImage *LoadedObject = Dyld.loadObject(ObjectToLoad.release());
20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LoadedObjects.push_back(LoadedObject);
2053f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  if (!LoadedObject)
2068086f3b49429e02603270c8e09e2aabac9215a21Jim Grosbach    report_fatal_error(Dyld.getErrorString());
207ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
2083f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  // FIXME: Make this optional, maybe even move it to a JIT event listener
2093f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  LoadedObject->registerWithDebugger();
2103f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor
211776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  NotifyObjectEmitted(*LoadedObject);
212776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor
2132ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  OwnedModules.markModuleAsLoaded(M);
2148e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2158e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2168e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeLoadedModules() {
2176169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
2186169453ba37ac353655f2475f336e66f31276752Andrew Kaylor
2198e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Resolve any outstanding relocations.
2208e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Dyld.resolveRelocations();
2218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2222ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  OwnedModules.markAllLoadedModulesAsFinalized();
2238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2242ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // Register EH frame data for any module we own which has been loaded
225528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor  Dyld.registerEHFrames();
226528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor
2278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Set page permissions.
2288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  MemMgr.finalizeMemory();
2296aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
2306aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
2318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// FIXME: Rename this.
23228989889bf3aa3314562d438aece245b71176ec4Andrew Kaylorvoid MCJIT::finalizeObject() {
2336169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
2346169453ba37ac353655f2475f336e66f31276752Andrew Kaylor
2352ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  for (ModulePtrSet::iterator I = OwnedModules.begin_added(),
2362ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor                              E = OwnedModules.end_added();
2372ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor       I != E; ++I) {
2382ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    Module *M = *I;
2392ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    generateCodeForModule(M);
24028989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor  }
24128989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor
2422ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  finalizeLoadedModules();
2438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeModule(Module *M) {
2466169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
2476169453ba37ac353655f2475f336e66f31276752Andrew Kaylor
2488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // This must be a module which has already been added to this MCJIT instance.
2492ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  assert(OwnedModules.ownsModule(M) && "MCJIT::finalizeModule: Unknown module.");
2508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If the module hasn't been compiled, just do that.
2522ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  if (!OwnedModules.hasModuleBeenLoaded(M))
2538e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    generateCodeForModule(M);
2548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2552ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  finalizeLoadedModules();
25628989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor}
25728989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor
2586aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::getPointerToBasicBlock(BasicBlock *BB) {
2596aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  report_fatal_error("not yet implemented");
2606aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
2616aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
2628e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getExistingSymbolAddress(const std::string &Name) {
26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Mangler Mang(TM->getDataLayout());
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallString<128> FullName;
26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Mang.getNameWithPrefix(FullName, Name);
26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return Dyld.getSymbolLoadAddress(FullName);
2678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2698e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorModule *MCJIT::findModuleForSymbol(const std::string &Name,
2708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor                                   bool CheckFunctionsOnly) {
2716169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
2726169453ba37ac353655f2475f336e66f31276752Andrew Kaylor
2738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If it hasn't already been generated, see if it's in one of our modules.
2742ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  for (ModulePtrSet::iterator I = OwnedModules.begin_added(),
2752ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor                              E = OwnedModules.end_added();
2762ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor       I != E; ++I) {
2772ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    Module *M = *I;
2788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    Function *F = M->getFunction(Name);
27959bbf5a759a4891ea90ac67f13485f67ef42234cAndrew Kaylor    if (F && !F->isDeclaration())
2808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      return M;
2818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (!CheckFunctionsOnly) {
2828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      GlobalVariable *G = M->getGlobalVariable(Name);
28359bbf5a759a4891ea90ac67f13485f67ef42234cAndrew Kaylor      if (G && !G->isDeclaration())
2848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor        return M;
2858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      // FIXME: Do we need to worry about global aliases?
2868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    }
2878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  }
2888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // We didn't find the symbol in any of our modules.
289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
2908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getSymbolAddress(const std::string &Name,
2938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor                                 bool CheckFunctionsOnly)
2948e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor{
2956169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
2966169453ba37ac353655f2475f336e66f31276752Andrew Kaylor
2978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // First, check to see if we already have this symbol.
2988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Addr = getExistingSymbolAddress(Name);
2998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Addr)
3008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return Addr;
3018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<object::Archive*, 2>::iterator I, E;
30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (I = Archives.begin(), E = Archives.end(); I != E; ++I) {
30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    object::Archive *A = *I;
30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Look for our symbols in each Archive
30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    object::Archive::child_iterator ChildIt = A->findSym(Name);
30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (ChildIt != A->child_end()) {
30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // FIXME: Support nested archives?
309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ErrorOr<std::unique_ptr<object::Binary>> ChildBinOrErr =
310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          ChildIt->getAsBinary();
311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (ChildBinOrErr.getError())
312cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        continue;
313cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      std::unique_ptr<object::Binary> ChildBin = std::move(ChildBinOrErr.get());
314cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (ChildBin->isObject()) {
315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        std::unique_ptr<object::ObjectFile> OF(
316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines            static_cast<object::ObjectFile *>(ChildBin.release()));
31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        // This causes the object file to be loaded.
318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        addObjectFile(std::move(OF));
31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        // The address should be here now.
32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Addr = getExistingSymbolAddress(Name);
32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        if (Addr)
32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          return Addr;
32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If it hasn't already been generated, see if it's in one of our modules.
3288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Module *M = findModuleForSymbol(Name, CheckFunctionsOnly);
3298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (!M)
3308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return 0;
3318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  generateCodeForModule(M);
3338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Check the RuntimeDyld table again, it should be there now.
3358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return getExistingSymbolAddress(Name);
3368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3378e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3388e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getGlobalValueAddress(const std::string &Name) {
3396169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
3408e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Result = getSymbolAddress(Name, false);
3418e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Result != 0)
3428e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    finalizeLoadedModules();
3438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return Result;
3448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getFunctionAddress(const std::string &Name) {
3476169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
3488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Result = getSymbolAddress(Name, true);
3498e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Result != 0)
3508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    finalizeLoadedModules();
3518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return Result;
3528e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3538e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// Deprecated.  Use getFunctionAddress instead.
3558e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid *MCJIT::getPointerToFunction(Function *F) {
3566169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  MutexGuard locked(lock);
357ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
35834714a06096f854c76371295d8c20b017fbba50bJim Grosbach  if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) {
35934714a06096f854c76371295d8c20b017fbba50bJim Grosbach    bool AbortOnFailure = !F->hasExternalWeakLinkage();
36034714a06096f854c76371295d8c20b017fbba50bJim Grosbach    void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure);
36134714a06096f854c76371295d8c20b017fbba50bJim Grosbach    addGlobalMapping(F, Addr);
36234714a06096f854c76371295d8c20b017fbba50bJim Grosbach    return Addr;
36334714a06096f854c76371295d8c20b017fbba50bJim Grosbach  }
36434714a06096f854c76371295d8c20b017fbba50bJim Grosbach
3658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Module *M = F->getParent();
3662ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  bool HasBeenAddedButNotLoaded = OwnedModules.hasModuleBeenAddedButNotLoaded(M);
3678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Make sure the relevant module has been compiled and loaded.
3692ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  if (HasBeenAddedButNotLoaded)
3708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    generateCodeForModule(M);
3712ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  else if (!OwnedModules.hasModuleBeenLoaded(M))
3722ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    // If this function doesn't belong to one of our modules, we're done.
373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
3748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
375ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  // FIXME: Should the Dyld be retaining module information? Probably not.
37635ed842773da41779d57d3ed23f440202d0be198Jim Grosbach  //
37735ed842773da41779d57d3ed23f440202d0be198Jim Grosbach  // This is the accessor for the target address, so make sure to check the
37835ed842773da41779d57d3ed23f440202d0be198Jim Grosbach  // load address of the symbol, not the local address.
37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Mangler Mang(TM->getDataLayout());
38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallString<128> Name;
38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TM->getNameWithPrefix(Name, F, Mang);
38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return (void*)Dyld.getSymbolLoadAddress(Name);
3836aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
3846aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
3856aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::recompileAndRelinkFunction(Function *F) {
3866aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  report_fatal_error("not yet implemented");
3876aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
3886aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
3896aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid MCJIT::freeMachineCodeForFunction(Function *F) {
3906aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  report_fatal_error("not yet implemented");
3916aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
3926aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
3932ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylorvoid MCJIT::runStaticConstructorsDestructorsInModulePtrSet(
3942ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    bool isDtors, ModulePtrSet::iterator I, ModulePtrSet::iterator E) {
3952ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  for (; I != E; ++I) {
3962ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    ExecutionEngine::runStaticConstructorsDestructors(*I, isDtors);
3972ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  }
3982ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor}
3992ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor
4002ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylorvoid MCJIT::runStaticConstructorsDestructors(bool isDtors) {
4012ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  // Execute global ctors/dtors for each module in the program.
4022ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  runStaticConstructorsDestructorsInModulePtrSet(
4032ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor      isDtors, OwnedModules.begin_added(), OwnedModules.end_added());
4042ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  runStaticConstructorsDestructorsInModulePtrSet(
4052ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor      isDtors, OwnedModules.begin_loaded(), OwnedModules.end_loaded());
4062ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  runStaticConstructorsDestructorsInModulePtrSet(
4072ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor      isDtors, OwnedModules.begin_finalized(), OwnedModules.end_finalized());
4082ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor}
4092ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor
4102ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew KaylorFunction *MCJIT::FindFunctionNamedInModulePtrSet(const char *FnName,
4112ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor                                                 ModulePtrSet::iterator I,
4122ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor                                                 ModulePtrSet::iterator E) {
4132ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  for (; I != E; ++I) {
4142ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    if (Function *F = (*I)->getFunction(FnName))
4152ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor      return F;
4162ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  }
417dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
4182ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor}
4192ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor
4202ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew KaylorFunction *MCJIT::FindFunctionNamed(const char *FnName) {
4212ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  Function *F = FindFunctionNamedInModulePtrSet(
4222ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor      FnName, OwnedModules.begin_added(), OwnedModules.end_added());
4232ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  if (!F)
4242ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    F = FindFunctionNamedInModulePtrSet(FnName, OwnedModules.begin_loaded(),
4252ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor                                        OwnedModules.end_loaded());
4262ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  if (!F)
4272ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    F = FindFunctionNamedInModulePtrSet(FnName, OwnedModules.begin_finalized(),
4282ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor                                        OwnedModules.end_finalized());
4292ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  return F;
4302ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor}
4312ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor
4326aec29848676494867e26307698155bc2c5a4033Daniel DunbarGenericValue MCJIT::runFunction(Function *F,
4336aec29848676494867e26307698155bc2c5a4033Daniel Dunbar                                const std::vector<GenericValue> &ArgValues) {
43434714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert(F && "Function *F was null at entry to run()");
43534714a06096f854c76371295d8c20b017fbba50bJim Grosbach
43631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  void *FPtr = getPointerToFunction(F);
43734714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
438db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  FunctionType *FTy = F->getFunctionType();
439db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *RetTy = FTy->getReturnType();
44034714a06096f854c76371295d8c20b017fbba50bJim Grosbach
44134714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert((FTy->getNumParams() == ArgValues.size() ||
44234714a06096f854c76371295d8c20b017fbba50bJim Grosbach          (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) &&
44334714a06096f854c76371295d8c20b017fbba50bJim Grosbach         "Wrong number of arguments passed into function!");
44434714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert(FTy->getNumParams() == ArgValues.size() &&
44534714a06096f854c76371295d8c20b017fbba50bJim Grosbach         "This doesn't support passing arguments through varargs (yet)!");
44634714a06096f854c76371295d8c20b017fbba50bJim Grosbach
44734714a06096f854c76371295d8c20b017fbba50bJim Grosbach  // Handle some common cases first.  These cases correspond to common `main'
44834714a06096f854c76371295d8c20b017fbba50bJim Grosbach  // prototypes.
44934714a06096f854c76371295d8c20b017fbba50bJim Grosbach  if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) {
45034714a06096f854c76371295d8c20b017fbba50bJim Grosbach    switch (ArgValues.size()) {
45134714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case 3:
45234714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (FTy->getParamType(0)->isIntegerTy(32) &&
45334714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(1)->isPointerTy() &&
45434714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(2)->isPointerTy()) {
45534714a06096f854c76371295d8c20b017fbba50bJim Grosbach        int (*PF)(int, char **, const char **) =
45634714a06096f854c76371295d8c20b017fbba50bJim Grosbach          (int(*)(int, char **, const char **))(intptr_t)FPtr;
45734714a06096f854c76371295d8c20b017fbba50bJim Grosbach
45834714a06096f854c76371295d8c20b017fbba50bJim Grosbach        // Call the function.
45934714a06096f854c76371295d8c20b017fbba50bJim Grosbach        GenericValue rv;
46034714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
46134714a06096f854c76371295d8c20b017fbba50bJim Grosbach                                 (char **)GVTOP(ArgValues[1]),
46234714a06096f854c76371295d8c20b017fbba50bJim Grosbach                                 (const char **)GVTOP(ArgValues[2])));
46334714a06096f854c76371295d8c20b017fbba50bJim Grosbach        return rv;
46434714a06096f854c76371295d8c20b017fbba50bJim Grosbach      }
46534714a06096f854c76371295d8c20b017fbba50bJim Grosbach      break;
46634714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case 2:
46734714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (FTy->getParamType(0)->isIntegerTy(32) &&
46834714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(1)->isPointerTy()) {
46934714a06096f854c76371295d8c20b017fbba50bJim Grosbach        int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr;
47034714a06096f854c76371295d8c20b017fbba50bJim Grosbach
47134714a06096f854c76371295d8c20b017fbba50bJim Grosbach        // Call the function.
47234714a06096f854c76371295d8c20b017fbba50bJim Grosbach        GenericValue rv;
47334714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
47434714a06096f854c76371295d8c20b017fbba50bJim Grosbach                                 (char **)GVTOP(ArgValues[1])));
47534714a06096f854c76371295d8c20b017fbba50bJim Grosbach        return rv;
47634714a06096f854c76371295d8c20b017fbba50bJim Grosbach      }
47734714a06096f854c76371295d8c20b017fbba50bJim Grosbach      break;
47834714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case 1:
47934714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (FTy->getNumParams() == 1 &&
48034714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(0)->isIntegerTy(32)) {
48134714a06096f854c76371295d8c20b017fbba50bJim Grosbach        GenericValue rv;
48234714a06096f854c76371295d8c20b017fbba50bJim Grosbach        int (*PF)(int) = (int(*)(int))(intptr_t)FPtr;
48334714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue()));
48434714a06096f854c76371295d8c20b017fbba50bJim Grosbach        return rv;
48534714a06096f854c76371295d8c20b017fbba50bJim Grosbach      }
48634714a06096f854c76371295d8c20b017fbba50bJim Grosbach      break;
48734714a06096f854c76371295d8c20b017fbba50bJim Grosbach    }
48834714a06096f854c76371295d8c20b017fbba50bJim Grosbach  }
48934714a06096f854c76371295d8c20b017fbba50bJim Grosbach
49034714a06096f854c76371295d8c20b017fbba50bJim Grosbach  // Handle cases where no arguments are passed first.
49134714a06096f854c76371295d8c20b017fbba50bJim Grosbach  if (ArgValues.empty()) {
49234714a06096f854c76371295d8c20b017fbba50bJim Grosbach    GenericValue rv;
49334714a06096f854c76371295d8c20b017fbba50bJim Grosbach    switch (RetTy->getTypeID()) {
49434714a06096f854c76371295d8c20b017fbba50bJim Grosbach    default: llvm_unreachable("Unknown return type for function call!");
49534714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::IntegerTyID: {
49634714a06096f854c76371295d8c20b017fbba50bJim Grosbach      unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth();
49734714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (BitWidth == 1)
49834714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)());
49934714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 8)
50034714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)());
50134714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 16)
50234714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)());
50334714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 32)
50434714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)());
50534714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 64)
50634714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)());
50734714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else
50834714a06096f854c76371295d8c20b017fbba50bJim Grosbach        llvm_unreachable("Integer types > 64 bits not supported");
50934714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
51034714a06096f854c76371295d8c20b017fbba50bJim Grosbach    }
51134714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::VoidTyID:
51234714a06096f854c76371295d8c20b017fbba50bJim Grosbach      rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)());
51334714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
51434714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::FloatTyID:
51534714a06096f854c76371295d8c20b017fbba50bJim Grosbach      rv.FloatVal = ((float(*)())(intptr_t)FPtr)();
51634714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
51734714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::DoubleTyID:
51834714a06096f854c76371295d8c20b017fbba50bJim Grosbach      rv.DoubleVal = ((double(*)())(intptr_t)FPtr)();
51934714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
52034714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::X86_FP80TyID:
52134714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::FP128TyID:
52234714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::PPC_FP128TyID:
52334714a06096f854c76371295d8c20b017fbba50bJim Grosbach      llvm_unreachable("long double not supported yet");
52434714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::PointerTyID:
52534714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return PTOGV(((void*(*)())(intptr_t)FPtr)());
52634714a06096f854c76371295d8c20b017fbba50bJim Grosbach    }
52734714a06096f854c76371295d8c20b017fbba50bJim Grosbach  }
52834714a06096f854c76371295d8c20b017fbba50bJim Grosbach
529858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  llvm_unreachable("Full-featured argument passing not supported yet!");
5306aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
53130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev
53230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshevvoid *MCJIT::getPointerToNamedFunction(const std::string &Name,
5335fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky                                       bool AbortOnFailure) {
5348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (!isSymbolSearchingDisabled()) {
5358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    void *ptr = MemMgr.getPointerToNamedFunction(Name, false);
53630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev    if (ptr)
53730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev      return ptr;
53830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  }
53930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev
54030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  /// If a LazyFunctionCreator is installed, use it to get/create the function.
54130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  if (LazyFunctionCreator)
54230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev    if (void *RP = LazyFunctionCreator(Name))
54330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev      return RP;
54430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev
54530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  if (AbortOnFailure) {
54630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev    report_fatal_error("Program used external function '"+Name+
5475fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky                       "' which could not be resolved!");
54830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  }
549dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
55030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev}
551776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor
552776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::RegisterJITEventListener(JITEventListener *L) {
553dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!L)
554776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    return;
555776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
556776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  EventListeners.push_back(L);
557776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
558776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::UnregisterJITEventListener(JITEventListener *L) {
559dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!L)
560776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    return;
561776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
562776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  SmallVector<JITEventListener*, 2>::reverse_iterator I=
563776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor      std::find(EventListeners.rbegin(), EventListeners.rend(), L);
564776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  if (I != EventListeners.rend()) {
565776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    std::swap(*I, EventListeners.back());
566776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    EventListeners.pop_back();
567776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  }
568776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
569776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) {
570776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
571b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  MemMgr.notifyObjectLoaded(this, &Obj);
572776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
573776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    EventListeners[I]->NotifyObjectEmitted(Obj);
574776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  }
575776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
576776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyFreeingObject(const ObjectImage& Obj) {
577776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
578776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
579776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    EventListeners[I]->NotifyFreeingObject(Obj);
580776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  }
581776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
5828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
5838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t LinkingMemoryManager::getSymbolAddress(const std::string &Name) {
5848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Result = ParentEngine->getSymbolAddress(Name, false);
58552c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor  // If the symbols wasn't found and it begins with an underscore, try again
58652c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor  // without the underscore.
58752c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor  if (!Result && Name[0] == '_')
58852c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor    Result = ParentEngine->getSymbolAddress(Name.substr(1), false);
5898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Result)
5908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return Result;
5918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return ClientMM->getSymbolAddress(Name);
5928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
593