MCJIT.cpp revision 52c9016db0560644a03ca661302e45143372f2fc
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"
218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor#include "llvm/IR/Module.h"
22f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/MC/MCAsmInfo.h"
231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DynamicLibrary.h"
24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
25f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/Support/MemoryBuffer.h"
26ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor#include "llvm/Support/MutexGuard.h"
276aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
286aec29848676494867e26307698155bc2c5a4033Daniel Dunbarusing namespace llvm;
296aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
306aec29848676494867e26307698155bc2c5a4033Daniel Dunbarnamespace {
316aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
326aec29848676494867e26307698155bc2c5a4033Daniel Dunbarstatic struct RegisterJIT {
336aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  RegisterJIT() { MCJIT::Register(); }
346aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} JITRegistrator;
356aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
366aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
376aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
386aec29848676494867e26307698155bc2c5a4033Daniel Dunbarextern "C" void LLVMLinkInMCJIT() {
396aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
406aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
416aec29848676494867e26307698155bc2c5a4033Daniel DunbarExecutionEngine *MCJIT::createJIT(Module *M,
426aec29848676494867e26307698155bc2c5a4033Daniel Dunbar                                  std::string *ErrorStr,
4313a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo                                  RTDyldMemoryManager *MemMgr,
446aec29848676494867e26307698155bc2c5a4033Daniel Dunbar                                  bool GVsWithCode,
45c5b28580a94e247300e5d3ccf532e153f2ae6f12Dylan Noblesmith                                  TargetMachine *TM) {
466aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  // Try to register the program as a source of symbols to resolve against.
476aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  //
486aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  // FIXME: Don't do this here.
496aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  sys::DynamicLibrary::LoadLibraryPermanently(0, NULL);
506aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
5113a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo  return new MCJIT(M, TM, MemMgr ? MemMgr : new SectionMemoryManager(),
5213a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo                   GVsWithCode);
536aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
546aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
558005bcd5e0c923881d82afcb813a7e537cd1b241Jim GrosbachMCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM,
568005bcd5e0c923881d82afcb813a7e537cd1b241Jim Grosbach             bool AllocateGVsWithCode)
578e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  : ExecutionEngine(m), TM(tm), Ctx(0), MemMgr(this, MM), Dyld(&MemMgr),
588e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    ObjCache(0) {
5931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
608e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  ModuleStates[m] = ModuleAdded;
613574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  setDataLayout(TM->getDataLayout());
62ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor}
63ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
64ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew KaylorMCJIT::~MCJIT() {
658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  LoadedObjectMap::iterator it, end = LoadedObjects.end();
668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  for (it = LoadedObjects.begin(); it != end; ++it) {
678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    ObjectImage *Obj = it->second;
688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (Obj) {
698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      NotifyFreeingObject(*Obj);
708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      delete Obj;
718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    }
728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  }
738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  LoadedObjects.clear();
74ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  delete TM;
75ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor}
76ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::addModule(Module *M) {
788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Modules.push_back(M);
798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  ModuleStates[M] = MCJITModuleState();
808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
821c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylorvoid MCJIT::setObjectCache(ObjectCache* NewCache) {
831c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  ObjCache = NewCache;
841c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor}
851c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
868e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorObjectBufferStream* MCJIT::emitObject(Module *M) {
878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // This must be a module which has already been added to this MCJIT instance.
888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end());
898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(ModuleStates.find(M) != ModuleStates.end());
90ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
91ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  // Get a thread lock to make sure we aren't trying to compile multiple times
92ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  MutexGuard locked(lock);
93ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
94ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  // Re-compilation is not supported
958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(!ModuleStates[M].hasBeenEmitted());
96ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
97ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  PassManager PM;
98ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
993574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  PM.add(new DataLayout(*TM->getDataLayout()));
10031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
1013f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  // The RuntimeDyld will take ownership of this shortly
1021c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  OwningPtr<ObjectBufferStream> CompiledObject(new ObjectBufferStream());
1033f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor
10431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // Turn the machine code intermediate representation into bytes in memory
10531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // that may be executed.
1061c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(), false)) {
10731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach    report_fatal_error("Target does not support MC emission!");
10831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  }
10931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
11031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // Initialize passes.
1118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  PM.run(*M);
1123f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  // Flush the output buffer to get the generated code into memory
1131c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  CompiledObject->flush();
1141c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1151c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // If we have an object cache, tell it about the new object.
1161c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // Note that we're using the compiled image, not the loaded image (as below).
1171c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  if (ObjCache) {
1181c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    // MemoryBuffer is a thin wrapper around the actual memory, so it's OK
1191c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    // to create a temporary object here and delete it after the call.
1201c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    OwningPtr<MemoryBuffer> MB(CompiledObject->getMemBuffer());
1218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    ObjCache->notifyObjectCompiled(M, MB.get());
1221c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  }
1231c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1241c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  return CompiledObject.take();
1251c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor}
1261c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::generateCodeForModule(Module *M) {
1288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // This must be a module which has already been added to this MCJIT instance.
1298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end());
1308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(ModuleStates.find(M) != ModuleStates.end());
1311c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1321c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // Get a thread lock to make sure we aren't trying to load multiple times
1331c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  MutexGuard locked(lock);
1341c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1351c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // Re-compilation is not supported
1368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (ModuleStates[M].hasBeenLoaded())
1371c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    return;
1381c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1391c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  OwningPtr<ObjectBuffer> ObjectToLoad;
1401c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // Try to load the pre-compiled object from cache if possible
1411c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  if (0 != ObjCache) {
14240d8171e3e74f4786d89a8f1fb370653f81c7941Andrew Kaylor    OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M));
1431c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    if (0 != PreCompiledObject.get())
1441c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor      ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take()));
1451c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  }
1461c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor
1471c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  // If the cache did not contain a suitable object, compile the object
1481c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  if (!ObjectToLoad) {
1491c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    ObjectToLoad.reset(emitObject(M));
1501c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    assert(ObjectToLoad.get() && "Compilation did not produce an object.");
1511c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  }
152f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach
153f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach  // Load the object into the dynamic linker.
1548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // MCJIT now owns the ObjectImage pointer (via its LoadedObjects map).
1558e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  ObjectImage *LoadedObject = Dyld.loadObject(ObjectToLoad.take());
1568e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  LoadedObjects[M] = LoadedObject;
1573f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  if (!LoadedObject)
1588086f3b49429e02603270c8e09e2aabac9215a21Jim Grosbach    report_fatal_error(Dyld.getErrorString());
159ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
1603f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  // FIXME: Make this optional, maybe even move it to a JIT event listener
1613f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  LoadedObject->registerWithDebugger();
1623f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor
163776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  NotifyObjectEmitted(*LoadedObject);
164776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor
1658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  ModuleStates[M] = ModuleLoaded;
1668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
1678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
1688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeLoadedModules() {
1698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Resolve any outstanding relocations.
1708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Dyld.resolveRelocations();
1718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
1728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Register EH frame data for any module we own which has been loaded
1738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  SmallVector<Module *, 1>::iterator end = Modules.end();
1748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  SmallVector<Module *, 1>::iterator it;
1758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  for (it = Modules.begin(); it != end; ++it) {
1768e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    Module *M = *it;
1778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    assert(ModuleStates.find(M) != ModuleStates.end());
1788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
1798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (ModuleStates[M].hasBeenLoaded() &&
1808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor        !ModuleStates[M].hasBeenFinalized()) {
1818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      // FIXME: This should be module specific!
1828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      StringRef EHData = Dyld.getEHFrameSection();
1838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      if (!EHData.empty())
1848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor        MemMgr.registerEHFrames(EHData);
1858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      ModuleStates[M] = ModuleFinalized;
1868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    }
1878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  }
1888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
1898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Set page permissions.
1908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  MemMgr.finalizeMemory();
1916aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
1926aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
1938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// FIXME: Rename this.
19428989889bf3aa3314562d438aece245b71176ec4Andrew Kaylorvoid MCJIT::finalizeObject() {
1958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // FIXME: This is a temporary hack to get around problems with calling
1968e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // finalize multiple times.
1978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  bool finalizeNeeded = false;
1988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  SmallVector<Module *, 1>::iterator end = Modules.end();
1998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  SmallVector<Module *, 1>::iterator it;
2008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  for (it = Modules.begin(); it != end; ++it) {
2018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    Module *M = *it;
2028e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    assert(ModuleStates.find(M) != ModuleStates.end());
2038e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (!ModuleStates[M].hasBeenFinalized())
2048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      finalizeNeeded = true;
2058e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2068e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    // I don't really like this, but the C API depends on this behavior.
2078e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    // I suppose it's OK for a deprecated function.
2088e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (!ModuleStates[M].hasBeenLoaded())
2098e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      generateCodeForModule(M);
2108e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  }
2118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (!finalizeNeeded)
2128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return;
2138e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2148e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Resolve any outstanding relocations.
2158e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Dyld.resolveRelocations();
2168e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2178e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Register EH frame data for any module we own which has been loaded
2188e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  for (it = Modules.begin(); it != end; ++it) {
2198e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    Module *M = *it;
2208e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    assert(ModuleStates.find(M) != ModuleStates.end());
2218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (ModuleStates[M].hasBeenLoaded() &&
2238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor        !ModuleStates[M].hasBeenFinalized()) {
2248e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      // FIXME: This should be module specific!
2258e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      StringRef EHData = Dyld.getEHFrameSection();
2268e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      if (!EHData.empty())
2278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor        MemMgr.registerEHFrames(EHData);
2288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      ModuleStates[M] = ModuleFinalized;
2298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    }
23028989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor  }
23128989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor
2328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Set page permissions.
2338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  MemMgr.finalizeMemory();
2348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeModule(Module *M) {
2378e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // This must be a module which has already been added to this MCJIT instance.
2388e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end());
2398e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(ModuleStates.find(M) != ModuleStates.end());
2408e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2418e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (ModuleStates[M].hasBeenFinalized())
2428e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return;
2438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If the module hasn't been compiled, just do that.
2458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (!ModuleStates[M].hasBeenLoaded())
2468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    generateCodeForModule(M);
2478e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Resolve any outstanding relocations.
2498e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Dyld.resolveRelocations();
2508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // FIXME: Should this be module specific?
252a2e40fbd624916c187a95ed76939ca7f02ed3e53Rafael Espindola  StringRef EHData = Dyld.getEHFrameSection();
253a2e40fbd624916c187a95ed76939ca7f02ed3e53Rafael Espindola  if (!EHData.empty())
2548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    MemMgr.registerEHFrames(EHData);
25553608a34ce3f0969e9fb01eaa983422761011e03Andrew Kaylor
25653608a34ce3f0969e9fb01eaa983422761011e03Andrew Kaylor  // Set page permissions.
2578e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  MemMgr.finalizeMemory();
2588e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2598e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  ModuleStates[M] = ModuleFinalized;
26028989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor}
26128989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor
2626aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::getPointerToBasicBlock(BasicBlock *BB) {
2636aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  report_fatal_error("not yet implemented");
2646aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
2656aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
2668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getExistingSymbolAddress(const std::string &Name) {
2678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Check with the RuntimeDyld to see if we already have this symbol.
2688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Name[0] == '\1')
2698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return Dyld.getSymbolLoadAddress(Name.substr(1));
2708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix()
2718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor                                       + Name));
2728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2748e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorModule *MCJIT::findModuleForSymbol(const std::string &Name,
2758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor                                   bool CheckFunctionsOnly) {
2768e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If it hasn't already been generated, see if it's in one of our modules.
2778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  SmallVector<Module *, 1>::iterator end = Modules.end();
2788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  SmallVector<Module *, 1>::iterator it;
2798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  for (it = Modules.begin(); it != end; ++it) {
2808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    Module *M = *it;
2818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    Function *F = M->getFunction(Name);
2828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (F && !F->empty())
2838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      return M;
2848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    if (!CheckFunctionsOnly) {
2858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      GlobalVariable *G = M->getGlobalVariable(Name);
2868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      if (G)
2878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor        return M;
2888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor      // FIXME: Do we need to worry about global aliases?
2898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    }
2908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  }
2918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // We didn't find the symbol in any of our modules.
2928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return NULL;
2938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2948e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getSymbolAddress(const std::string &Name,
2968e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor                                 bool CheckFunctionsOnly)
2978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor{
2988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // First, check to see if we already have this symbol.
2998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Addr = getExistingSymbolAddress(Name);
3008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Addr)
3018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return Addr;
3028e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3038e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If it hasn't already been generated, see if it's in one of our modules.
3048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Module *M = findModuleForSymbol(Name, CheckFunctionsOnly);
3058e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (!M)
3068e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return 0;
3078e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3088e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If this is in one of our modules, generate code for that module.
3098e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(ModuleStates.find(M) != ModuleStates.end());
3108e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If the module code has already been generated, we won't find the symbol.
3118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (ModuleStates[M].hasBeenLoaded())
3128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return 0;
31335ed842773da41779d57d3ed23f440202d0be198Jim Grosbach
3148e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // FIXME: We probably need to make sure we aren't in the process of
3158e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  //        loading or finalizing this module.
3168e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  generateCodeForModule(M);
3178e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3188e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Check the RuntimeDyld table again, it should be there now.
3198e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return getExistingSymbolAddress(Name);
3208e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getGlobalValueAddress(const std::string &Name) {
3238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Result = getSymbolAddress(Name, false);
3248e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Result != 0)
3258e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    finalizeLoadedModules();
3268e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return Result;
3278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getFunctionAddress(const std::string &Name) {
3308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Result = getSymbolAddress(Name, true);
3318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Result != 0)
3328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    finalizeLoadedModules();
3338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return Result;
3348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// Deprecated.  Use getFunctionAddress instead.
3378e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid *MCJIT::getPointerToFunction(Function *F) {
338ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor
33934714a06096f854c76371295d8c20b017fbba50bJim Grosbach  if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) {
34034714a06096f854c76371295d8c20b017fbba50bJim Grosbach    bool AbortOnFailure = !F->hasExternalWeakLinkage();
34134714a06096f854c76371295d8c20b017fbba50bJim Grosbach    void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure);
34234714a06096f854c76371295d8c20b017fbba50bJim Grosbach    addGlobalMapping(F, Addr);
34334714a06096f854c76371295d8c20b017fbba50bJim Grosbach    return Addr;
34434714a06096f854c76371295d8c20b017fbba50bJim Grosbach  }
34534714a06096f854c76371295d8c20b017fbba50bJim Grosbach
3468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // If this function doesn't belong to one of our modules, we're done.
3478e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  Module *M = F->getParent();
3488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (std::find(Modules.begin(), Modules.end(), M) == Modules.end())
3498e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return NULL;
3508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  assert(ModuleStates.find(M) != ModuleStates.end());
3528e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3538e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // Make sure the relevant module has been compiled and loaded.
3548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (!ModuleStates[M].hasBeenLoaded())
3558e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    generateCodeForModule(M);
3568e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
357ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor  // FIXME: Should the Dyld be retaining module information? Probably not.
3583ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach  // FIXME: Should we be using the mangler for this? Probably.
35935ed842773da41779d57d3ed23f440202d0be198Jim Grosbach  //
36035ed842773da41779d57d3ed23f440202d0be198Jim Grosbach  // This is the accessor for the target address, so make sure to check the
36135ed842773da41779d57d3ed23f440202d0be198Jim Grosbach  // load address of the symbol, not the local address.
3623ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach  StringRef BaseName = F->getName();
3633ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach  if (BaseName[0] == '\1')
36435ed842773da41779d57d3ed23f440202d0be198Jim Grosbach    return (void*)Dyld.getSymbolLoadAddress(BaseName.substr(1));
36535ed842773da41779d57d3ed23f440202d0be198Jim Grosbach  return (void*)Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix()
366c0ceedb6f885b1cbd3d3cea02f695afe393dfd2cJim Grosbach                                       + BaseName).str());
3676aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
3686aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
3696aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::recompileAndRelinkFunction(Function *F) {
3706aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  report_fatal_error("not yet implemented");
3716aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
3726aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
3736aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid MCJIT::freeMachineCodeForFunction(Function *F) {
3746aec29848676494867e26307698155bc2c5a4033Daniel Dunbar  report_fatal_error("not yet implemented");
3756aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
3766aec29848676494867e26307698155bc2c5a4033Daniel Dunbar
3776aec29848676494867e26307698155bc2c5a4033Daniel DunbarGenericValue MCJIT::runFunction(Function *F,
3786aec29848676494867e26307698155bc2c5a4033Daniel Dunbar                                const std::vector<GenericValue> &ArgValues) {
37934714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert(F && "Function *F was null at entry to run()");
38034714a06096f854c76371295d8c20b017fbba50bJim Grosbach
38131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  void *FPtr = getPointerToFunction(F);
38234714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
383db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  FunctionType *FTy = F->getFunctionType();
384db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *RetTy = FTy->getReturnType();
38534714a06096f854c76371295d8c20b017fbba50bJim Grosbach
38634714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert((FTy->getNumParams() == ArgValues.size() ||
38734714a06096f854c76371295d8c20b017fbba50bJim Grosbach          (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) &&
38834714a06096f854c76371295d8c20b017fbba50bJim Grosbach         "Wrong number of arguments passed into function!");
38934714a06096f854c76371295d8c20b017fbba50bJim Grosbach  assert(FTy->getNumParams() == ArgValues.size() &&
39034714a06096f854c76371295d8c20b017fbba50bJim Grosbach         "This doesn't support passing arguments through varargs (yet)!");
39134714a06096f854c76371295d8c20b017fbba50bJim Grosbach
39234714a06096f854c76371295d8c20b017fbba50bJim Grosbach  // Handle some common cases first.  These cases correspond to common `main'
39334714a06096f854c76371295d8c20b017fbba50bJim Grosbach  // prototypes.
39434714a06096f854c76371295d8c20b017fbba50bJim Grosbach  if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) {
39534714a06096f854c76371295d8c20b017fbba50bJim Grosbach    switch (ArgValues.size()) {
39634714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case 3:
39734714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (FTy->getParamType(0)->isIntegerTy(32) &&
39834714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(1)->isPointerTy() &&
39934714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(2)->isPointerTy()) {
40034714a06096f854c76371295d8c20b017fbba50bJim Grosbach        int (*PF)(int, char **, const char **) =
40134714a06096f854c76371295d8c20b017fbba50bJim Grosbach          (int(*)(int, char **, const char **))(intptr_t)FPtr;
40234714a06096f854c76371295d8c20b017fbba50bJim Grosbach
40334714a06096f854c76371295d8c20b017fbba50bJim Grosbach        // Call the function.
40434714a06096f854c76371295d8c20b017fbba50bJim Grosbach        GenericValue rv;
40534714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
40634714a06096f854c76371295d8c20b017fbba50bJim Grosbach                                 (char **)GVTOP(ArgValues[1]),
40734714a06096f854c76371295d8c20b017fbba50bJim Grosbach                                 (const char **)GVTOP(ArgValues[2])));
40834714a06096f854c76371295d8c20b017fbba50bJim Grosbach        return rv;
40934714a06096f854c76371295d8c20b017fbba50bJim Grosbach      }
41034714a06096f854c76371295d8c20b017fbba50bJim Grosbach      break;
41134714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case 2:
41234714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (FTy->getParamType(0)->isIntegerTy(32) &&
41334714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(1)->isPointerTy()) {
41434714a06096f854c76371295d8c20b017fbba50bJim Grosbach        int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr;
41534714a06096f854c76371295d8c20b017fbba50bJim Grosbach
41634714a06096f854c76371295d8c20b017fbba50bJim Grosbach        // Call the function.
41734714a06096f854c76371295d8c20b017fbba50bJim Grosbach        GenericValue rv;
41834714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
41934714a06096f854c76371295d8c20b017fbba50bJim Grosbach                                 (char **)GVTOP(ArgValues[1])));
42034714a06096f854c76371295d8c20b017fbba50bJim Grosbach        return rv;
42134714a06096f854c76371295d8c20b017fbba50bJim Grosbach      }
42234714a06096f854c76371295d8c20b017fbba50bJim Grosbach      break;
42334714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case 1:
42434714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (FTy->getNumParams() == 1 &&
42534714a06096f854c76371295d8c20b017fbba50bJim Grosbach          FTy->getParamType(0)->isIntegerTy(32)) {
42634714a06096f854c76371295d8c20b017fbba50bJim Grosbach        GenericValue rv;
42734714a06096f854c76371295d8c20b017fbba50bJim Grosbach        int (*PF)(int) = (int(*)(int))(intptr_t)FPtr;
42834714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue()));
42934714a06096f854c76371295d8c20b017fbba50bJim Grosbach        return rv;
43034714a06096f854c76371295d8c20b017fbba50bJim Grosbach      }
43134714a06096f854c76371295d8c20b017fbba50bJim Grosbach      break;
43234714a06096f854c76371295d8c20b017fbba50bJim Grosbach    }
43334714a06096f854c76371295d8c20b017fbba50bJim Grosbach  }
43434714a06096f854c76371295d8c20b017fbba50bJim Grosbach
43534714a06096f854c76371295d8c20b017fbba50bJim Grosbach  // Handle cases where no arguments are passed first.
43634714a06096f854c76371295d8c20b017fbba50bJim Grosbach  if (ArgValues.empty()) {
43734714a06096f854c76371295d8c20b017fbba50bJim Grosbach    GenericValue rv;
43834714a06096f854c76371295d8c20b017fbba50bJim Grosbach    switch (RetTy->getTypeID()) {
43934714a06096f854c76371295d8c20b017fbba50bJim Grosbach    default: llvm_unreachable("Unknown return type for function call!");
44034714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::IntegerTyID: {
44134714a06096f854c76371295d8c20b017fbba50bJim Grosbach      unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth();
44234714a06096f854c76371295d8c20b017fbba50bJim Grosbach      if (BitWidth == 1)
44334714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)());
44434714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 8)
44534714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)());
44634714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 16)
44734714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)());
44834714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 32)
44934714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)());
45034714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else if (BitWidth <= 64)
45134714a06096f854c76371295d8c20b017fbba50bJim Grosbach        rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)());
45234714a06096f854c76371295d8c20b017fbba50bJim Grosbach      else
45334714a06096f854c76371295d8c20b017fbba50bJim Grosbach        llvm_unreachable("Integer types > 64 bits not supported");
45434714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
45534714a06096f854c76371295d8c20b017fbba50bJim Grosbach    }
45634714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::VoidTyID:
45734714a06096f854c76371295d8c20b017fbba50bJim Grosbach      rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)());
45834714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
45934714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::FloatTyID:
46034714a06096f854c76371295d8c20b017fbba50bJim Grosbach      rv.FloatVal = ((float(*)())(intptr_t)FPtr)();
46134714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
46234714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::DoubleTyID:
46334714a06096f854c76371295d8c20b017fbba50bJim Grosbach      rv.DoubleVal = ((double(*)())(intptr_t)FPtr)();
46434714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return rv;
46534714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::X86_FP80TyID:
46634714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::FP128TyID:
46734714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::PPC_FP128TyID:
46834714a06096f854c76371295d8c20b017fbba50bJim Grosbach      llvm_unreachable("long double not supported yet");
46934714a06096f854c76371295d8c20b017fbba50bJim Grosbach    case Type::PointerTyID:
47034714a06096f854c76371295d8c20b017fbba50bJim Grosbach      return PTOGV(((void*(*)())(intptr_t)FPtr)());
47134714a06096f854c76371295d8c20b017fbba50bJim Grosbach    }
47234714a06096f854c76371295d8c20b017fbba50bJim Grosbach  }
47334714a06096f854c76371295d8c20b017fbba50bJim Grosbach
474858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  llvm_unreachable("Full-featured argument passing not supported yet!");
4756aec29848676494867e26307698155bc2c5a4033Daniel Dunbar}
47630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev
47730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshevvoid *MCJIT::getPointerToNamedFunction(const std::string &Name,
4785fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky                                       bool AbortOnFailure) {
4798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (!isSymbolSearchingDisabled()) {
4808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    void *ptr = MemMgr.getPointerToNamedFunction(Name, false);
48130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev    if (ptr)
48230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev      return ptr;
48330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  }
48430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev
48530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  /// If a LazyFunctionCreator is installed, use it to get/create the function.
48630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  if (LazyFunctionCreator)
48730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev    if (void *RP = LazyFunctionCreator(Name))
48830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev      return RP;
48930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev
49030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  if (AbortOnFailure) {
49130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev    report_fatal_error("Program used external function '"+Name+
4925fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky                       "' which could not be resolved!");
49330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  }
49430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev  return 0;
49530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev}
496776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor
497776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::RegisterJITEventListener(JITEventListener *L) {
498776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  if (L == NULL)
499776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    return;
500776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
501776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  EventListeners.push_back(L);
502776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
503776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::UnregisterJITEventListener(JITEventListener *L) {
504776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  if (L == NULL)
505776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    return;
506776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
507776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  SmallVector<JITEventListener*, 2>::reverse_iterator I=
508776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor      std::find(EventListeners.rbegin(), EventListeners.rend(), L);
509776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  if (I != EventListeners.rend()) {
510776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    std::swap(*I, EventListeners.back());
511776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    EventListeners.pop_back();
512776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  }
513776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
514776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) {
515776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
516776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
517776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    EventListeners[I]->NotifyObjectEmitted(Obj);
518776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  }
519776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
520776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyFreeingObject(const ObjectImage& Obj) {
521776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  MutexGuard locked(lock);
522776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
523776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor    EventListeners[I]->NotifyFreeingObject(Obj);
524776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor  }
525776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor}
5268e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
5278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t LinkingMemoryManager::getSymbolAddress(const std::string &Name) {
5288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  uint64_t Result = ParentEngine->getSymbolAddress(Name, false);
52952c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor  // If the symbols wasn't found and it begins with an underscore, try again
53052c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor  // without the underscore.
53152c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor  if (!Result && Name[0] == '_')
53252c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor    Result = ParentEngine->getSymbolAddress(Name.substr(1), false);
5338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  if (Result)
5348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    return Result;
5358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  return ClientMM->getSymbolAddress(Name);
5368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
537