KaleidoscopeJIT.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //===----- KaleidoscopeJIT.h - A simple JIT for Kaleidoscope ----*- C++ -*-===//
  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. // Contains a simple JIT definition for use in the kaleidoscope tutorials.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #ifndef LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H
  14. #define LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H
  15. #include "llvm/ExecutionEngine/ExecutionEngine.h"
  16. #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
  17. #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
  18. #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
  19. #include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
  20. #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
  21. #include "llvm/IR/Mangler.h"
  22. #include "llvm/Support/DynamicLibrary.h"
  23. namespace llvm {
  24. namespace orc {
  25. class KaleidoscopeJIT {
  26. public:
  27. typedef ObjectLinkingLayer<> ObjLayerT;
  28. typedef IRCompileLayer<ObjLayerT> CompileLayerT;
  29. typedef CompileLayerT::ModuleSetHandleT ModuleHandleT;
  30. KaleidoscopeJIT()
  31. : TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()),
  32. CompileLayer(ObjectLayer, SimpleCompiler(*TM)) {
  33. llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
  34. }
  35. TargetMachine &getTargetMachine() { return *TM; }
  36. ModuleHandleT addModule(std::unique_ptr<Module> M) {
  37. // We need a memory manager to allocate memory and resolve symbols for this
  38. // new module. Create one that resolves symbols by looking back into the
  39. // JIT.
  40. auto Resolver = createLambdaResolver(
  41. [&](const std::string &Name) {
  42. if (auto Sym = findMangledSymbol(Name))
  43. return RuntimeDyld::SymbolInfo(Sym.getAddress(), Sym.getFlags());
  44. return RuntimeDyld::SymbolInfo(nullptr);
  45. },
  46. [](const std::string &S) { return nullptr; });
  47. auto H = CompileLayer.addModuleSet(singletonSet(std::move(M)),
  48. make_unique<SectionMemoryManager>(),
  49. std::move(Resolver));
  50. ModuleHandles.push_back(H);
  51. return H;
  52. }
  53. void removeModule(ModuleHandleT H) {
  54. ModuleHandles.erase(
  55. std::find(ModuleHandles.begin(), ModuleHandles.end(), H));
  56. CompileLayer.removeModuleSet(H);
  57. }
  58. JITSymbol findSymbol(const std::string Name) {
  59. return findMangledSymbol(mangle(Name));
  60. }
  61. private:
  62. std::string mangle(const std::string &Name) {
  63. std::string MangledName;
  64. {
  65. raw_string_ostream MangledNameStream(MangledName);
  66. Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
  67. }
  68. return MangledName;
  69. }
  70. template <typename T> static std::vector<T> singletonSet(T t) {
  71. std::vector<T> Vec;
  72. Vec.push_back(std::move(t));
  73. return Vec;
  74. }
  75. JITSymbol findMangledSymbol(const std::string &Name) {
  76. // Search modules in reverse order: from last added to first added.
  77. // This is the opposite of the usual search order for dlsym, but makes more
  78. // sense in a REPL where we want to bind to the newest available definition.
  79. for (auto H : make_range(ModuleHandles.rbegin(), ModuleHandles.rend()))
  80. if (auto Sym = CompileLayer.findSymbolIn(H, Name, true))
  81. return Sym;
  82. // If we can't find the symbol in the JIT, try looking in the host process.
  83. if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(Name))
  84. return JITSymbol(SymAddr, JITSymbolFlags::Exported);
  85. return nullptr;
  86. }
  87. std::unique_ptr<TargetMachine> TM;
  88. const DataLayout DL;
  89. ObjLayerT ObjectLayer;
  90. CompileLayerT CompileLayer;
  91. std::vector<ModuleHandleT> ModuleHandles;
  92. };
  93. } // End namespace orc.
  94. } // End namespace llvm
  95. #endif // LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H