MCJIT.cpp revision 52c9016db0560644a03ca661302e45143372f2fc
1//===-- MCJIT.cpp - MC-based Just-in-Time Compiler ------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "MCJIT.h"
11#include "llvm/ExecutionEngine/GenericValue.h"
12#include "llvm/ExecutionEngine/JITEventListener.h"
13#include "llvm/ExecutionEngine/JITMemoryManager.h"
14#include "llvm/ExecutionEngine/MCJIT.h"
15#include "llvm/ExecutionEngine/ObjectBuffer.h"
16#include "llvm/ExecutionEngine/ObjectImage.h"
17#include "llvm/ExecutionEngine/SectionMemoryManager.h"
18#include "llvm/IR/DataLayout.h"
19#include "llvm/IR/DerivedTypes.h"
20#include "llvm/IR/Function.h"
21#include "llvm/IR/Module.h"
22#include "llvm/MC/MCAsmInfo.h"
23#include "llvm/Support/DynamicLibrary.h"
24#include "llvm/Support/ErrorHandling.h"
25#include "llvm/Support/MemoryBuffer.h"
26#include "llvm/Support/MutexGuard.h"
27
28using namespace llvm;
29
30namespace {
31
32static struct RegisterJIT {
33  RegisterJIT() { MCJIT::Register(); }
34} JITRegistrator;
35
36}
37
38extern "C" void LLVMLinkInMCJIT() {
39}
40
41ExecutionEngine *MCJIT::createJIT(Module *M,
42                                  std::string *ErrorStr,
43                                  RTDyldMemoryManager *MemMgr,
44                                  bool GVsWithCode,
45                                  TargetMachine *TM) {
46  // Try to register the program as a source of symbols to resolve against.
47  //
48  // FIXME: Don't do this here.
49  sys::DynamicLibrary::LoadLibraryPermanently(0, NULL);
50
51  return new MCJIT(M, TM, MemMgr ? MemMgr : new SectionMemoryManager(),
52                   GVsWithCode);
53}
54
55MCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM,
56             bool AllocateGVsWithCode)
57  : ExecutionEngine(m), TM(tm), Ctx(0), MemMgr(this, MM), Dyld(&MemMgr),
58    ObjCache(0) {
59
60  ModuleStates[m] = ModuleAdded;
61  setDataLayout(TM->getDataLayout());
62}
63
64MCJIT::~MCJIT() {
65  LoadedObjectMap::iterator it, end = LoadedObjects.end();
66  for (it = LoadedObjects.begin(); it != end; ++it) {
67    ObjectImage *Obj = it->second;
68    if (Obj) {
69      NotifyFreeingObject(*Obj);
70      delete Obj;
71    }
72  }
73  LoadedObjects.clear();
74  delete TM;
75}
76
77void MCJIT::addModule(Module *M) {
78  Modules.push_back(M);
79  ModuleStates[M] = MCJITModuleState();
80}
81
82void MCJIT::setObjectCache(ObjectCache* NewCache) {
83  ObjCache = NewCache;
84}
85
86ObjectBufferStream* MCJIT::emitObject(Module *M) {
87  // This must be a module which has already been added to this MCJIT instance.
88  assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end());
89  assert(ModuleStates.find(M) != ModuleStates.end());
90
91  // Get a thread lock to make sure we aren't trying to compile multiple times
92  MutexGuard locked(lock);
93
94  // Re-compilation is not supported
95  assert(!ModuleStates[M].hasBeenEmitted());
96
97  PassManager PM;
98
99  PM.add(new DataLayout(*TM->getDataLayout()));
100
101  // The RuntimeDyld will take ownership of this shortly
102  OwningPtr<ObjectBufferStream> CompiledObject(new ObjectBufferStream());
103
104  // Turn the machine code intermediate representation into bytes in memory
105  // that may be executed.
106  if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(), false)) {
107    report_fatal_error("Target does not support MC emission!");
108  }
109
110  // Initialize passes.
111  PM.run(*M);
112  // Flush the output buffer to get the generated code into memory
113  CompiledObject->flush();
114
115  // If we have an object cache, tell it about the new object.
116  // Note that we're using the compiled image, not the loaded image (as below).
117  if (ObjCache) {
118    // MemoryBuffer is a thin wrapper around the actual memory, so it's OK
119    // to create a temporary object here and delete it after the call.
120    OwningPtr<MemoryBuffer> MB(CompiledObject->getMemBuffer());
121    ObjCache->notifyObjectCompiled(M, MB.get());
122  }
123
124  return CompiledObject.take();
125}
126
127void MCJIT::generateCodeForModule(Module *M) {
128  // This must be a module which has already been added to this MCJIT instance.
129  assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end());
130  assert(ModuleStates.find(M) != ModuleStates.end());
131
132  // Get a thread lock to make sure we aren't trying to load multiple times
133  MutexGuard locked(lock);
134
135  // Re-compilation is not supported
136  if (ModuleStates[M].hasBeenLoaded())
137    return;
138
139  OwningPtr<ObjectBuffer> ObjectToLoad;
140  // Try to load the pre-compiled object from cache if possible
141  if (0 != ObjCache) {
142    OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M));
143    if (0 != PreCompiledObject.get())
144      ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take()));
145  }
146
147  // If the cache did not contain a suitable object, compile the object
148  if (!ObjectToLoad) {
149    ObjectToLoad.reset(emitObject(M));
150    assert(ObjectToLoad.get() && "Compilation did not produce an object.");
151  }
152
153  // Load the object into the dynamic linker.
154  // MCJIT now owns the ObjectImage pointer (via its LoadedObjects map).
155  ObjectImage *LoadedObject = Dyld.loadObject(ObjectToLoad.take());
156  LoadedObjects[M] = LoadedObject;
157  if (!LoadedObject)
158    report_fatal_error(Dyld.getErrorString());
159
160  // FIXME: Make this optional, maybe even move it to a JIT event listener
161  LoadedObject->registerWithDebugger();
162
163  NotifyObjectEmitted(*LoadedObject);
164
165  ModuleStates[M] = ModuleLoaded;
166}
167
168void MCJIT::finalizeLoadedModules() {
169  // Resolve any outstanding relocations.
170  Dyld.resolveRelocations();
171
172  // Register EH frame data for any module we own which has been loaded
173  SmallVector<Module *, 1>::iterator end = Modules.end();
174  SmallVector<Module *, 1>::iterator it;
175  for (it = Modules.begin(); it != end; ++it) {
176    Module *M = *it;
177    assert(ModuleStates.find(M) != ModuleStates.end());
178
179    if (ModuleStates[M].hasBeenLoaded() &&
180        !ModuleStates[M].hasBeenFinalized()) {
181      // FIXME: This should be module specific!
182      StringRef EHData = Dyld.getEHFrameSection();
183      if (!EHData.empty())
184        MemMgr.registerEHFrames(EHData);
185      ModuleStates[M] = ModuleFinalized;
186    }
187  }
188
189  // Set page permissions.
190  MemMgr.finalizeMemory();
191}
192
193// FIXME: Rename this.
194void MCJIT::finalizeObject() {
195  // FIXME: This is a temporary hack to get around problems with calling
196  // finalize multiple times.
197  bool finalizeNeeded = false;
198  SmallVector<Module *, 1>::iterator end = Modules.end();
199  SmallVector<Module *, 1>::iterator it;
200  for (it = Modules.begin(); it != end; ++it) {
201    Module *M = *it;
202    assert(ModuleStates.find(M) != ModuleStates.end());
203    if (!ModuleStates[M].hasBeenFinalized())
204      finalizeNeeded = true;
205
206    // I don't really like this, but the C API depends on this behavior.
207    // I suppose it's OK for a deprecated function.
208    if (!ModuleStates[M].hasBeenLoaded())
209      generateCodeForModule(M);
210  }
211  if (!finalizeNeeded)
212    return;
213
214  // Resolve any outstanding relocations.
215  Dyld.resolveRelocations();
216
217  // Register EH frame data for any module we own which has been loaded
218  for (it = Modules.begin(); it != end; ++it) {
219    Module *M = *it;
220    assert(ModuleStates.find(M) != ModuleStates.end());
221
222    if (ModuleStates[M].hasBeenLoaded() &&
223        !ModuleStates[M].hasBeenFinalized()) {
224      // FIXME: This should be module specific!
225      StringRef EHData = Dyld.getEHFrameSection();
226      if (!EHData.empty())
227        MemMgr.registerEHFrames(EHData);
228      ModuleStates[M] = ModuleFinalized;
229    }
230  }
231
232  // Set page permissions.
233  MemMgr.finalizeMemory();
234}
235
236void MCJIT::finalizeModule(Module *M) {
237  // This must be a module which has already been added to this MCJIT instance.
238  assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end());
239  assert(ModuleStates.find(M) != ModuleStates.end());
240
241  if (ModuleStates[M].hasBeenFinalized())
242    return;
243
244  // If the module hasn't been compiled, just do that.
245  if (!ModuleStates[M].hasBeenLoaded())
246    generateCodeForModule(M);
247
248  // Resolve any outstanding relocations.
249  Dyld.resolveRelocations();
250
251  // FIXME: Should this be module specific?
252  StringRef EHData = Dyld.getEHFrameSection();
253  if (!EHData.empty())
254    MemMgr.registerEHFrames(EHData);
255
256  // Set page permissions.
257  MemMgr.finalizeMemory();
258
259  ModuleStates[M] = ModuleFinalized;
260}
261
262void *MCJIT::getPointerToBasicBlock(BasicBlock *BB) {
263  report_fatal_error("not yet implemented");
264}
265
266uint64_t MCJIT::getExistingSymbolAddress(const std::string &Name) {
267  // Check with the RuntimeDyld to see if we already have this symbol.
268  if (Name[0] == '\1')
269    return Dyld.getSymbolLoadAddress(Name.substr(1));
270  return Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix()
271                                       + Name));
272}
273
274Module *MCJIT::findModuleForSymbol(const std::string &Name,
275                                   bool CheckFunctionsOnly) {
276  // If it hasn't already been generated, see if it's in one of our modules.
277  SmallVector<Module *, 1>::iterator end = Modules.end();
278  SmallVector<Module *, 1>::iterator it;
279  for (it = Modules.begin(); it != end; ++it) {
280    Module *M = *it;
281    Function *F = M->getFunction(Name);
282    if (F && !F->empty())
283      return M;
284    if (!CheckFunctionsOnly) {
285      GlobalVariable *G = M->getGlobalVariable(Name);
286      if (G)
287        return M;
288      // FIXME: Do we need to worry about global aliases?
289    }
290  }
291  // We didn't find the symbol in any of our modules.
292  return NULL;
293}
294
295uint64_t MCJIT::getSymbolAddress(const std::string &Name,
296                                 bool CheckFunctionsOnly)
297{
298  // First, check to see if we already have this symbol.
299  uint64_t Addr = getExistingSymbolAddress(Name);
300  if (Addr)
301    return Addr;
302
303  // If it hasn't already been generated, see if it's in one of our modules.
304  Module *M = findModuleForSymbol(Name, CheckFunctionsOnly);
305  if (!M)
306    return 0;
307
308  // If this is in one of our modules, generate code for that module.
309  assert(ModuleStates.find(M) != ModuleStates.end());
310  // If the module code has already been generated, we won't find the symbol.
311  if (ModuleStates[M].hasBeenLoaded())
312    return 0;
313
314  // FIXME: We probably need to make sure we aren't in the process of
315  //        loading or finalizing this module.
316  generateCodeForModule(M);
317
318  // Check the RuntimeDyld table again, it should be there now.
319  return getExistingSymbolAddress(Name);
320}
321
322uint64_t MCJIT::getGlobalValueAddress(const std::string &Name) {
323  uint64_t Result = getSymbolAddress(Name, false);
324  if (Result != 0)
325    finalizeLoadedModules();
326  return Result;
327}
328
329uint64_t MCJIT::getFunctionAddress(const std::string &Name) {
330  uint64_t Result = getSymbolAddress(Name, true);
331  if (Result != 0)
332    finalizeLoadedModules();
333  return Result;
334}
335
336// Deprecated.  Use getFunctionAddress instead.
337void *MCJIT::getPointerToFunction(Function *F) {
338
339  if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) {
340    bool AbortOnFailure = !F->hasExternalWeakLinkage();
341    void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure);
342    addGlobalMapping(F, Addr);
343    return Addr;
344  }
345
346  // If this function doesn't belong to one of our modules, we're done.
347  Module *M = F->getParent();
348  if (std::find(Modules.begin(), Modules.end(), M) == Modules.end())
349    return NULL;
350
351  assert(ModuleStates.find(M) != ModuleStates.end());
352
353  // Make sure the relevant module has been compiled and loaded.
354  if (!ModuleStates[M].hasBeenLoaded())
355    generateCodeForModule(M);
356
357  // FIXME: Should the Dyld be retaining module information? Probably not.
358  // FIXME: Should we be using the mangler for this? Probably.
359  //
360  // This is the accessor for the target address, so make sure to check the
361  // load address of the symbol, not the local address.
362  StringRef BaseName = F->getName();
363  if (BaseName[0] == '\1')
364    return (void*)Dyld.getSymbolLoadAddress(BaseName.substr(1));
365  return (void*)Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix()
366                                       + BaseName).str());
367}
368
369void *MCJIT::recompileAndRelinkFunction(Function *F) {
370  report_fatal_error("not yet implemented");
371}
372
373void MCJIT::freeMachineCodeForFunction(Function *F) {
374  report_fatal_error("not yet implemented");
375}
376
377GenericValue MCJIT::runFunction(Function *F,
378                                const std::vector<GenericValue> &ArgValues) {
379  assert(F && "Function *F was null at entry to run()");
380
381  void *FPtr = getPointerToFunction(F);
382  assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
383  FunctionType *FTy = F->getFunctionType();
384  Type *RetTy = FTy->getReturnType();
385
386  assert((FTy->getNumParams() == ArgValues.size() ||
387          (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) &&
388         "Wrong number of arguments passed into function!");
389  assert(FTy->getNumParams() == ArgValues.size() &&
390         "This doesn't support passing arguments through varargs (yet)!");
391
392  // Handle some common cases first.  These cases correspond to common `main'
393  // prototypes.
394  if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) {
395    switch (ArgValues.size()) {
396    case 3:
397      if (FTy->getParamType(0)->isIntegerTy(32) &&
398          FTy->getParamType(1)->isPointerTy() &&
399          FTy->getParamType(2)->isPointerTy()) {
400        int (*PF)(int, char **, const char **) =
401          (int(*)(int, char **, const char **))(intptr_t)FPtr;
402
403        // Call the function.
404        GenericValue rv;
405        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
406                                 (char **)GVTOP(ArgValues[1]),
407                                 (const char **)GVTOP(ArgValues[2])));
408        return rv;
409      }
410      break;
411    case 2:
412      if (FTy->getParamType(0)->isIntegerTy(32) &&
413          FTy->getParamType(1)->isPointerTy()) {
414        int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr;
415
416        // Call the function.
417        GenericValue rv;
418        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
419                                 (char **)GVTOP(ArgValues[1])));
420        return rv;
421      }
422      break;
423    case 1:
424      if (FTy->getNumParams() == 1 &&
425          FTy->getParamType(0)->isIntegerTy(32)) {
426        GenericValue rv;
427        int (*PF)(int) = (int(*)(int))(intptr_t)FPtr;
428        rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue()));
429        return rv;
430      }
431      break;
432    }
433  }
434
435  // Handle cases where no arguments are passed first.
436  if (ArgValues.empty()) {
437    GenericValue rv;
438    switch (RetTy->getTypeID()) {
439    default: llvm_unreachable("Unknown return type for function call!");
440    case Type::IntegerTyID: {
441      unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth();
442      if (BitWidth == 1)
443        rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)());
444      else if (BitWidth <= 8)
445        rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)());
446      else if (BitWidth <= 16)
447        rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)());
448      else if (BitWidth <= 32)
449        rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)());
450      else if (BitWidth <= 64)
451        rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)());
452      else
453        llvm_unreachable("Integer types > 64 bits not supported");
454      return rv;
455    }
456    case Type::VoidTyID:
457      rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)());
458      return rv;
459    case Type::FloatTyID:
460      rv.FloatVal = ((float(*)())(intptr_t)FPtr)();
461      return rv;
462    case Type::DoubleTyID:
463      rv.DoubleVal = ((double(*)())(intptr_t)FPtr)();
464      return rv;
465    case Type::X86_FP80TyID:
466    case Type::FP128TyID:
467    case Type::PPC_FP128TyID:
468      llvm_unreachable("long double not supported yet");
469    case Type::PointerTyID:
470      return PTOGV(((void*(*)())(intptr_t)FPtr)());
471    }
472  }
473
474  llvm_unreachable("Full-featured argument passing not supported yet!");
475}
476
477void *MCJIT::getPointerToNamedFunction(const std::string &Name,
478                                       bool AbortOnFailure) {
479  if (!isSymbolSearchingDisabled()) {
480    void *ptr = MemMgr.getPointerToNamedFunction(Name, false);
481    if (ptr)
482      return ptr;
483  }
484
485  /// If a LazyFunctionCreator is installed, use it to get/create the function.
486  if (LazyFunctionCreator)
487    if (void *RP = LazyFunctionCreator(Name))
488      return RP;
489
490  if (AbortOnFailure) {
491    report_fatal_error("Program used external function '"+Name+
492                       "' which could not be resolved!");
493  }
494  return 0;
495}
496
497void MCJIT::RegisterJITEventListener(JITEventListener *L) {
498  if (L == NULL)
499    return;
500  MutexGuard locked(lock);
501  EventListeners.push_back(L);
502}
503void MCJIT::UnregisterJITEventListener(JITEventListener *L) {
504  if (L == NULL)
505    return;
506  MutexGuard locked(lock);
507  SmallVector<JITEventListener*, 2>::reverse_iterator I=
508      std::find(EventListeners.rbegin(), EventListeners.rend(), L);
509  if (I != EventListeners.rend()) {
510    std::swap(*I, EventListeners.back());
511    EventListeners.pop_back();
512  }
513}
514void MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) {
515  MutexGuard locked(lock);
516  for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
517    EventListeners[I]->NotifyObjectEmitted(Obj);
518  }
519}
520void MCJIT::NotifyFreeingObject(const ObjectImage& Obj) {
521  MutexGuard locked(lock);
522  for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
523    EventListeners[I]->NotifyFreeingObject(Obj);
524  }
525}
526
527uint64_t LinkingMemoryManager::getSymbolAddress(const std::string &Name) {
528  uint64_t Result = ParentEngine->getSymbolAddress(Name, false);
529  // If the symbols wasn't found and it begins with an underscore, try again
530  // without the underscore.
531  if (!Result && Name[0] == '_')
532    Result = ParentEngine->getSymbolAddress(Name.substr(1), false);
533  if (Result)
534    return Result;
535  return ClientMM->getSymbolAddress(Name);
536}
537