Home | History | Annotate | Download | only in Orc
      1 //===- CompileOnDemandLayer.h - Compile each function on demand -*- 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 // JIT layer for breaking up modules and inserting callbacks to allow
     11 // individual functions to be compiled on demand.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_EXECUTIONENGINE_ORC_COMPILEONDEMANDLAYER_H
     16 #define LLVM_EXECUTIONENGINE_ORC_COMPILEONDEMANDLAYER_H
     17 
     18 #include "llvm/ADT/APInt.h"
     19 #include "llvm/ADT/STLExtras.h"
     20 #include "llvm/ADT/StringRef.h"
     21 #include "llvm/ADT/Twine.h"
     22 #include "llvm/ExecutionEngine/JITSymbol.h"
     23 #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h"
     24 #include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
     25 #include "llvm/ExecutionEngine/Orc/Layer.h"
     26 #include "llvm/ExecutionEngine/Orc/Legacy.h"
     27 #include "llvm/ExecutionEngine/Orc/OrcError.h"
     28 #include "llvm/ExecutionEngine/RuntimeDyld.h"
     29 #include "llvm/IR/Attributes.h"
     30 #include "llvm/IR/Constant.h"
     31 #include "llvm/IR/Constants.h"
     32 #include "llvm/IR/DataLayout.h"
     33 #include "llvm/IR/Function.h"
     34 #include "llvm/IR/GlobalAlias.h"
     35 #include "llvm/IR/GlobalValue.h"
     36 #include "llvm/IR/GlobalVariable.h"
     37 #include "llvm/IR/Instruction.h"
     38 #include "llvm/IR/Mangler.h"
     39 #include "llvm/IR/Module.h"
     40 #include "llvm/IR/Type.h"
     41 #include "llvm/Support/Casting.h"
     42 #include "llvm/Support/raw_ostream.h"
     43 #include "llvm/Transforms/Utils/ValueMapper.h"
     44 #include <algorithm>
     45 #include <cassert>
     46 #include <functional>
     47 #include <iterator>
     48 #include <list>
     49 #include <memory>
     50 #include <set>
     51 #include <string>
     52 #include <utility>
     53 #include <vector>
     54 
     55 namespace llvm {
     56 
     57 class Value;
     58 
     59 namespace orc {
     60 
     61 class ExtractingIRMaterializationUnit;
     62 
     63 class CompileOnDemandLayer2 : public IRLayer {
     64   friend class ExtractingIRMaterializationUnit;
     65 
     66 public:
     67   /// Builder for IndirectStubsManagers.
     68   using IndirectStubsManagerBuilder =
     69       std::function<std::unique_ptr<IndirectStubsManager>()>;
     70 
     71   using GetAvailableContextFunction = std::function<LLVMContext &()>;
     72 
     73   CompileOnDemandLayer2(ExecutionSession &ES, IRLayer &BaseLayer,
     74                         JITCompileCallbackManager &CCMgr,
     75                         IndirectStubsManagerBuilder BuildIndirectStubsManager,
     76                         GetAvailableContextFunction GetAvailableContext);
     77 
     78   Error add(VSO &V, VModuleKey K, std::unique_ptr<Module> M) override;
     79 
     80   void emit(MaterializationResponsibility R, VModuleKey K,
     81             std::unique_ptr<Module> M) override;
     82 
     83 private:
     84   using StubManagersMap =
     85       std::map<const VSO *, std::unique_ptr<IndirectStubsManager>>;
     86 
     87   IndirectStubsManager &getStubsManager(const VSO &V);
     88 
     89   void emitExtractedFunctionsModule(MaterializationResponsibility R,
     90                                     std::unique_ptr<Module> M);
     91 
     92   mutable std::mutex CODLayerMutex;
     93 
     94   IRLayer &BaseLayer;
     95   JITCompileCallbackManager &CCMgr;
     96   IndirectStubsManagerBuilder BuildIndirectStubsManager;
     97   StubManagersMap StubsMgrs;
     98   GetAvailableContextFunction GetAvailableContext;
     99 };
    100 
    101 /// Compile-on-demand layer.
    102 ///
    103 ///   When a module is added to this layer a stub is created for each of its
    104 /// function definitions. The stubs and other global values are immediately
    105 /// added to the layer below. When a stub is called it triggers the extraction
    106 /// of the function body from the original module. The extracted body is then
    107 /// compiled and executed.
    108 template <typename BaseLayerT,
    109           typename CompileCallbackMgrT = JITCompileCallbackManager,
    110           typename IndirectStubsMgrT = IndirectStubsManager>
    111 class CompileOnDemandLayer {
    112 private:
    113   template <typename MaterializerFtor>
    114   class LambdaMaterializer final : public ValueMaterializer {
    115   public:
    116     LambdaMaterializer(MaterializerFtor M) : M(std::move(M)) {}
    117 
    118     Value *materialize(Value *V) final { return M(V); }
    119 
    120   private:
    121     MaterializerFtor M;
    122   };
    123 
    124   template <typename MaterializerFtor>
    125   LambdaMaterializer<MaterializerFtor>
    126   createLambdaMaterializer(MaterializerFtor M) {
    127     return LambdaMaterializer<MaterializerFtor>(std::move(M));
    128   }
    129 
    130   // Provide type-erasure for the Modules and MemoryManagers.
    131   template <typename ResourceT>
    132   class ResourceOwner {
    133   public:
    134     ResourceOwner() = default;
    135     ResourceOwner(const ResourceOwner &) = delete;
    136     ResourceOwner &operator=(const ResourceOwner &) = delete;
    137     virtual ~ResourceOwner() = default;
    138 
    139     virtual ResourceT& getResource() const = 0;
    140   };
    141 
    142   template <typename ResourceT, typename ResourcePtrT>
    143   class ResourceOwnerImpl : public ResourceOwner<ResourceT> {
    144   public:
    145     ResourceOwnerImpl(ResourcePtrT ResourcePtr)
    146       : ResourcePtr(std::move(ResourcePtr)) {}
    147 
    148     ResourceT& getResource() const override { return *ResourcePtr; }
    149 
    150   private:
    151     ResourcePtrT ResourcePtr;
    152   };
    153 
    154   template <typename ResourceT, typename ResourcePtrT>
    155   std::unique_ptr<ResourceOwner<ResourceT>>
    156   wrapOwnership(ResourcePtrT ResourcePtr) {
    157     using RO = ResourceOwnerImpl<ResourceT, ResourcePtrT>;
    158     return llvm::make_unique<RO>(std::move(ResourcePtr));
    159   }
    160 
    161   class StaticGlobalRenamer {
    162   public:
    163     StaticGlobalRenamer() = default;
    164     StaticGlobalRenamer(StaticGlobalRenamer &&) = default;
    165     StaticGlobalRenamer &operator=(StaticGlobalRenamer &&) = default;
    166 
    167     void rename(Module &M) {
    168       for (auto &F : M)
    169         if (F.hasLocalLinkage())
    170           F.setName("$static." + Twine(NextId++));
    171       for (auto &G : M.globals())
    172         if (G.hasLocalLinkage())
    173           G.setName("$static." + Twine(NextId++));
    174     }
    175 
    176   private:
    177     unsigned NextId = 0;
    178   };
    179 
    180   struct LogicalDylib {
    181     struct SourceModuleEntry {
    182       std::unique_ptr<Module> SourceMod;
    183       std::set<Function*> StubsToClone;
    184     };
    185 
    186     using SourceModulesList = std::vector<SourceModuleEntry>;
    187     using SourceModuleHandle = typename SourceModulesList::size_type;
    188 
    189     LogicalDylib() = default;
    190 
    191     LogicalDylib(VModuleKey K, std::shared_ptr<SymbolResolver> BackingResolver,
    192                  std::unique_ptr<IndirectStubsMgrT> StubsMgr)
    193         : K(std::move(K)), BackingResolver(std::move(BackingResolver)),
    194           StubsMgr(std::move(StubsMgr)) {}
    195 
    196     SourceModuleHandle addSourceModule(std::unique_ptr<Module> M) {
    197       SourceModuleHandle H = SourceModules.size();
    198       SourceModules.push_back(SourceModuleEntry());
    199       SourceModules.back().SourceMod = std::move(M);
    200       return H;
    201     }
    202 
    203     Module& getSourceModule(SourceModuleHandle H) {
    204       return *SourceModules[H].SourceMod;
    205     }
    206 
    207     std::set<Function*>& getStubsToClone(SourceModuleHandle H) {
    208       return SourceModules[H].StubsToClone;
    209     }
    210 
    211     JITSymbol findSymbol(BaseLayerT &BaseLayer, const std::string &Name,
    212                          bool ExportedSymbolsOnly) {
    213       if (auto Sym = StubsMgr->findStub(Name, ExportedSymbolsOnly))
    214         return Sym;
    215       for (auto BLK : BaseLayerVModuleKeys)
    216         if (auto Sym = BaseLayer.findSymbolIn(BLK, Name, ExportedSymbolsOnly))
    217           return Sym;
    218         else if (auto Err = Sym.takeError())
    219           return std::move(Err);
    220       return nullptr;
    221     }
    222 
    223     Error removeModulesFromBaseLayer(BaseLayerT &BaseLayer) {
    224       for (auto &BLK : BaseLayerVModuleKeys)
    225         if (auto Err = BaseLayer.removeModule(BLK))
    226           return Err;
    227       return Error::success();
    228     }
    229 
    230     VModuleKey K;
    231     std::shared_ptr<SymbolResolver> BackingResolver;
    232     std::unique_ptr<IndirectStubsMgrT> StubsMgr;
    233     StaticGlobalRenamer StaticRenamer;
    234     SourceModulesList SourceModules;
    235     std::vector<VModuleKey> BaseLayerVModuleKeys;
    236   };
    237 
    238 public:
    239 
    240   /// Module partitioning functor.
    241   using PartitioningFtor = std::function<std::set<Function*>(Function&)>;
    242 
    243   /// Builder for IndirectStubsManagers.
    244   using IndirectStubsManagerBuilderT =
    245       std::function<std::unique_ptr<IndirectStubsMgrT>()>;
    246 
    247   using SymbolResolverGetter =
    248       std::function<std::shared_ptr<SymbolResolver>(VModuleKey K)>;
    249 
    250   using SymbolResolverSetter =
    251       std::function<void(VModuleKey K, std::shared_ptr<SymbolResolver> R)>;
    252 
    253   /// Construct a compile-on-demand layer instance.
    254   CompileOnDemandLayer(ExecutionSession &ES, BaseLayerT &BaseLayer,
    255                        SymbolResolverGetter GetSymbolResolver,
    256                        SymbolResolverSetter SetSymbolResolver,
    257                        PartitioningFtor Partition,
    258                        CompileCallbackMgrT &CallbackMgr,
    259                        IndirectStubsManagerBuilderT CreateIndirectStubsManager,
    260                        bool CloneStubsIntoPartitions = true)
    261       : ES(ES), BaseLayer(BaseLayer),
    262         GetSymbolResolver(std::move(GetSymbolResolver)),
    263         SetSymbolResolver(std::move(SetSymbolResolver)),
    264         Partition(std::move(Partition)), CompileCallbackMgr(CallbackMgr),
    265         CreateIndirectStubsManager(std::move(CreateIndirectStubsManager)),
    266         CloneStubsIntoPartitions(CloneStubsIntoPartitions) {}
    267 
    268   ~CompileOnDemandLayer() {
    269     // FIXME: Report error on log.
    270     while (!LogicalDylibs.empty())
    271       consumeError(removeModule(LogicalDylibs.begin()->first));
    272   }
    273 
    274   /// Add a module to the compile-on-demand layer.
    275   Error addModule(VModuleKey K, std::unique_ptr<Module> M) {
    276 
    277     assert(!LogicalDylibs.count(K) && "VModuleKey K already in use");
    278     auto I = LogicalDylibs.insert(
    279         LogicalDylibs.end(),
    280         std::make_pair(K, LogicalDylib(K, GetSymbolResolver(K),
    281                                        CreateIndirectStubsManager())));
    282 
    283     return addLogicalModule(I->second, std::move(M));
    284   }
    285 
    286   /// Add extra modules to an existing logical module.
    287   Error addExtraModule(VModuleKey K, std::unique_ptr<Module> M) {
    288     return addLogicalModule(LogicalDylibs[K], std::move(M));
    289   }
    290 
    291   /// Remove the module represented by the given key.
    292   ///
    293   ///   This will remove all modules in the layers below that were derived from
    294   /// the module represented by K.
    295   Error removeModule(VModuleKey K) {
    296     auto I = LogicalDylibs.find(K);
    297     assert(I != LogicalDylibs.end() && "VModuleKey K not valid here");
    298     auto Err = I->second.removeModulesFromBaseLayer(BaseLayer);
    299     LogicalDylibs.erase(I);
    300     return Err;
    301   }
    302 
    303   /// Search for the given named symbol.
    304   /// @param Name The name of the symbol to search for.
    305   /// @param ExportedSymbolsOnly If true, search only for exported symbols.
    306   /// @return A handle for the given named symbol, if it exists.
    307   JITSymbol findSymbol(StringRef Name, bool ExportedSymbolsOnly) {
    308     for (auto &KV : LogicalDylibs) {
    309       if (auto Sym = KV.second.StubsMgr->findStub(Name, ExportedSymbolsOnly))
    310         return Sym;
    311       if (auto Sym = findSymbolIn(KV.first, Name, ExportedSymbolsOnly))
    312         return Sym;
    313       else if (auto Err = Sym.takeError())
    314         return std::move(Err);
    315     }
    316     return BaseLayer.findSymbol(Name, ExportedSymbolsOnly);
    317   }
    318 
    319   /// Get the address of a symbol provided by this layer, or some layer
    320   ///        below this one.
    321   JITSymbol findSymbolIn(VModuleKey K, const std::string &Name,
    322                          bool ExportedSymbolsOnly) {
    323     assert(LogicalDylibs.count(K) && "VModuleKey K is not valid here");
    324     return LogicalDylibs[K].findSymbol(BaseLayer, Name, ExportedSymbolsOnly);
    325   }
    326 
    327   /// Update the stub for the given function to point at FnBodyAddr.
    328   /// This can be used to support re-optimization.
    329   /// @return true if the function exists and the stub is updated, false
    330   ///         otherwise.
    331   //
    332   // FIXME: We should track and free associated resources (unused compile
    333   //        callbacks, uncompiled IR, and no-longer-needed/reachable function
    334   //        implementations).
    335   Error updatePointer(std::string FuncName, JITTargetAddress FnBodyAddr) {
    336     //Find out which logical dylib contains our symbol
    337     auto LDI = LogicalDylibs.begin();
    338     for (auto LDE = LogicalDylibs.end(); LDI != LDE; ++LDI) {
    339       if (auto LMResources =
    340             LDI->getLogicalModuleResourcesForSymbol(FuncName, false)) {
    341         Module &SrcM = LMResources->SourceModule->getResource();
    342         std::string CalledFnName = mangle(FuncName, SrcM.getDataLayout());
    343         if (auto Err = LMResources->StubsMgr->updatePointer(CalledFnName,
    344                                                             FnBodyAddr))
    345           return Err;
    346         return Error::success();
    347       }
    348     }
    349     return make_error<JITSymbolNotFound>(FuncName);
    350   }
    351 
    352 private:
    353   Error addLogicalModule(LogicalDylib &LD, std::unique_ptr<Module> SrcMPtr) {
    354 
    355     // Rename all static functions / globals to $static.X :
    356     // This will unique the names across all modules in the logical dylib,
    357     // simplifying symbol lookup.
    358     LD.StaticRenamer.rename(*SrcMPtr);
    359 
    360     // Bump the linkage and rename any anonymous/private members in SrcM to
    361     // ensure that everything will resolve properly after we partition SrcM.
    362     makeAllSymbolsExternallyAccessible(*SrcMPtr);
    363 
    364     // Create a logical module handle for SrcM within the logical dylib.
    365     Module &SrcM = *SrcMPtr;
    366     auto LMId = LD.addSourceModule(std::move(SrcMPtr));
    367 
    368     // Create stub functions.
    369     const DataLayout &DL = SrcM.getDataLayout();
    370     {
    371       typename IndirectStubsMgrT::StubInitsMap StubInits;
    372       for (auto &F : SrcM) {
    373         // Skip declarations.
    374         if (F.isDeclaration())
    375           continue;
    376 
    377         // Skip weak functions for which we already have definitions.
    378         auto MangledName = mangle(F.getName(), DL);
    379         if (F.hasWeakLinkage() || F.hasLinkOnceLinkage()) {
    380           if (auto Sym = LD.findSymbol(BaseLayer, MangledName, false))
    381             continue;
    382           else if (auto Err = Sym.takeError())
    383             return std::move(Err);
    384         }
    385 
    386         // Record all functions defined by this module.
    387         if (CloneStubsIntoPartitions)
    388           LD.getStubsToClone(LMId).insert(&F);
    389 
    390         // Create a callback, associate it with the stub for the function,
    391         // and set the compile action to compile the partition containing the
    392         // function.
    393         auto CompileAction = [this, &LD, LMId, &F]() -> JITTargetAddress {
    394           if (auto FnImplAddrOrErr = this->extractAndCompile(LD, LMId, F))
    395             return *FnImplAddrOrErr;
    396           else {
    397             // FIXME: Report error, return to 'abort' or something similar.
    398             consumeError(FnImplAddrOrErr.takeError());
    399             return 0;
    400           }
    401         };
    402         if (auto CCAddr =
    403                 CompileCallbackMgr.getCompileCallback(std::move(CompileAction)))
    404           StubInits[MangledName] =
    405               std::make_pair(*CCAddr, JITSymbolFlags::fromGlobalValue(F));
    406         else
    407           return CCAddr.takeError();
    408       }
    409 
    410       if (auto Err = LD.StubsMgr->createStubs(StubInits))
    411         return Err;
    412     }
    413 
    414     // If this module doesn't contain any globals, aliases, or module flags then
    415     // we can bail out early and avoid the overhead of creating and managing an
    416     // empty globals module.
    417     if (SrcM.global_empty() && SrcM.alias_empty() &&
    418         !SrcM.getModuleFlagsMetadata())
    419       return Error::success();
    420 
    421     // Create the GlobalValues module.
    422     auto GVsM = llvm::make_unique<Module>((SrcM.getName() + ".globals").str(),
    423                                           SrcM.getContext());
    424     GVsM->setDataLayout(DL);
    425 
    426     ValueToValueMapTy VMap;
    427 
    428     // Clone global variable decls.
    429     for (auto &GV : SrcM.globals())
    430       if (!GV.isDeclaration() && !VMap.count(&GV))
    431         cloneGlobalVariableDecl(*GVsM, GV, &VMap);
    432 
    433     // And the aliases.
    434     for (auto &A : SrcM.aliases())
    435       if (!VMap.count(&A))
    436         cloneGlobalAliasDecl(*GVsM, A, VMap);
    437 
    438     // Clone the module flags.
    439     cloneModuleFlagsMetadata(*GVsM, SrcM, VMap);
    440 
    441     // Now we need to clone the GV and alias initializers.
    442 
    443     // Initializers may refer to functions declared (but not defined) in this
    444     // module. Build a materializer to clone decls on demand.
    445     auto Materializer = createLambdaMaterializer(
    446       [&LD, &GVsM](Value *V) -> Value* {
    447         if (auto *F = dyn_cast<Function>(V)) {
    448           // Decls in the original module just get cloned.
    449           if (F->isDeclaration())
    450             return cloneFunctionDecl(*GVsM, *F);
    451 
    452           // Definitions in the original module (which we have emitted stubs
    453           // for at this point) get turned into a constant alias to the stub
    454           // instead.
    455           const DataLayout &DL = GVsM->getDataLayout();
    456           std::string FName = mangle(F->getName(), DL);
    457           unsigned PtrBitWidth = DL.getPointerTypeSizeInBits(F->getType());
    458           JITTargetAddress StubAddr =
    459             LD.StubsMgr->findStub(FName, false).getAddress();
    460 
    461           ConstantInt *StubAddrCI =
    462             ConstantInt::get(GVsM->getContext(), APInt(PtrBitWidth, StubAddr));
    463           Constant *Init = ConstantExpr::getCast(Instruction::IntToPtr,
    464                                                  StubAddrCI, F->getType());
    465           return GlobalAlias::create(F->getFunctionType(),
    466                                      F->getType()->getAddressSpace(),
    467                                      F->getLinkage(), F->getName(),
    468                                      Init, GVsM.get());
    469         }
    470         // else....
    471         return nullptr;
    472       });
    473 
    474     // Clone the global variable initializers.
    475     for (auto &GV : SrcM.globals())
    476       if (!GV.isDeclaration())
    477         moveGlobalVariableInitializer(GV, VMap, &Materializer);
    478 
    479     // Clone the global alias initializers.
    480     for (auto &A : SrcM.aliases()) {
    481       auto *NewA = cast<GlobalAlias>(VMap[&A]);
    482       assert(NewA && "Alias not cloned?");
    483       Value *Init = MapValue(A.getAliasee(), VMap, RF_None, nullptr,
    484                              &Materializer);
    485       NewA->setAliasee(cast<Constant>(Init));
    486     }
    487 
    488     // Build a resolver for the globals module and add it to the base layer.
    489     auto LegacyLookup = [this, &LD](const std::string &Name) -> JITSymbol {
    490       if (auto Sym = LD.StubsMgr->findStub(Name, false))
    491         return Sym;
    492 
    493       if (auto Sym = LD.findSymbol(BaseLayer, Name, false))
    494         return Sym;
    495       else if (auto Err = Sym.takeError())
    496         return std::move(Err);
    497 
    498       return nullptr;
    499     };
    500 
    501     auto GVsResolver = createSymbolResolver(
    502         [&LD, LegacyLookup](const SymbolNameSet &Symbols) {
    503           auto SymbolFlags = lookupFlagsWithLegacyFn(Symbols, LegacyLookup);
    504 
    505           if (!SymbolFlags) {
    506             logAllUnhandledErrors(SymbolFlags.takeError(), errs(),
    507                                   "CODLayer/GVsResolver flags lookup failed: ");
    508             return SymbolFlagsMap();
    509           }
    510 
    511           if (SymbolFlags->size() == Symbols.size())
    512             return *SymbolFlags;
    513 
    514           SymbolNameSet NotFoundViaLegacyLookup;
    515           for (auto &S : Symbols)
    516             if (!SymbolFlags->count(S))
    517               NotFoundViaLegacyLookup.insert(S);
    518           auto SymbolFlags2 =
    519               LD.BackingResolver->lookupFlags(NotFoundViaLegacyLookup);
    520 
    521           for (auto &KV : SymbolFlags2)
    522             (*SymbolFlags)[KV.first] = std::move(KV.second);
    523 
    524           return *SymbolFlags;
    525         },
    526         [this, &LD,
    527          LegacyLookup](std::shared_ptr<AsynchronousSymbolQuery> Query,
    528                        SymbolNameSet Symbols) {
    529           auto NotFoundViaLegacyLookup =
    530               lookupWithLegacyFn(ES, *Query, Symbols, LegacyLookup);
    531           return LD.BackingResolver->lookup(Query, NotFoundViaLegacyLookup);
    532         });
    533 
    534     SetSymbolResolver(LD.K, std::move(GVsResolver));
    535 
    536     if (auto Err = BaseLayer.addModule(LD.K, std::move(GVsM)))
    537       return Err;
    538 
    539     LD.BaseLayerVModuleKeys.push_back(LD.K);
    540 
    541     return Error::success();
    542   }
    543 
    544   static std::string mangle(StringRef Name, const DataLayout &DL) {
    545     std::string MangledName;
    546     {
    547       raw_string_ostream MangledNameStream(MangledName);
    548       Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
    549     }
    550     return MangledName;
    551   }
    552 
    553   Expected<JITTargetAddress>
    554   extractAndCompile(LogicalDylib &LD,
    555                     typename LogicalDylib::SourceModuleHandle LMId,
    556                     Function &F) {
    557     Module &SrcM = LD.getSourceModule(LMId);
    558 
    559     // If F is a declaration we must already have compiled it.
    560     if (F.isDeclaration())
    561       return 0;
    562 
    563     // Grab the name of the function being called here.
    564     std::string CalledFnName = mangle(F.getName(), SrcM.getDataLayout());
    565 
    566     JITTargetAddress CalledAddr = 0;
    567     auto Part = Partition(F);
    568     if (auto PartKeyOrErr = emitPartition(LD, LMId, Part)) {
    569       auto &PartKey = *PartKeyOrErr;
    570       for (auto *SubF : Part) {
    571         std::string FnName = mangle(SubF->getName(), SrcM.getDataLayout());
    572         if (auto FnBodySym = BaseLayer.findSymbolIn(PartKey, FnName, false)) {
    573           if (auto FnBodyAddrOrErr = FnBodySym.getAddress()) {
    574             JITTargetAddress FnBodyAddr = *FnBodyAddrOrErr;
    575 
    576             // If this is the function we're calling record the address so we can
    577             // return it from this function.
    578             if (SubF == &F)
    579               CalledAddr = FnBodyAddr;
    580 
    581             // Update the function body pointer for the stub.
    582             if (auto EC = LD.StubsMgr->updatePointer(FnName, FnBodyAddr))
    583               return 0;
    584 
    585           } else
    586             return FnBodyAddrOrErr.takeError();
    587         } else if (auto Err = FnBodySym.takeError())
    588           return std::move(Err);
    589         else
    590           llvm_unreachable("Function not emitted for partition");
    591       }
    592 
    593       LD.BaseLayerVModuleKeys.push_back(PartKey);
    594     } else
    595       return PartKeyOrErr.takeError();
    596 
    597     return CalledAddr;
    598   }
    599 
    600   template <typename PartitionT>
    601   Expected<VModuleKey>
    602   emitPartition(LogicalDylib &LD,
    603                 typename LogicalDylib::SourceModuleHandle LMId,
    604                 const PartitionT &Part) {
    605     Module &SrcM = LD.getSourceModule(LMId);
    606 
    607     // Create the module.
    608     std::string NewName = SrcM.getName();
    609     for (auto *F : Part) {
    610       NewName += ".";
    611       NewName += F->getName();
    612     }
    613 
    614     auto M = llvm::make_unique<Module>(NewName, SrcM.getContext());
    615     M->setDataLayout(SrcM.getDataLayout());
    616     ValueToValueMapTy VMap;
    617 
    618     auto Materializer = createLambdaMaterializer([&LD, &LMId,
    619                                                   &M](Value *V) -> Value * {
    620       if (auto *GV = dyn_cast<GlobalVariable>(V))
    621         return cloneGlobalVariableDecl(*M, *GV);
    622 
    623       if (auto *F = dyn_cast<Function>(V)) {
    624         // Check whether we want to clone an available_externally definition.
    625         if (!LD.getStubsToClone(LMId).count(F))
    626           return cloneFunctionDecl(*M, *F);
    627 
    628         // Ok - we want an inlinable stub. For that to work we need a decl
    629         // for the stub pointer.
    630         auto *StubPtr = createImplPointer(*F->getType(), *M,
    631                                           F->getName() + "$stub_ptr", nullptr);
    632         auto *ClonedF = cloneFunctionDecl(*M, *F);
    633         makeStub(*ClonedF, *StubPtr);
    634         ClonedF->setLinkage(GlobalValue::AvailableExternallyLinkage);
    635         ClonedF->addFnAttr(Attribute::AlwaysInline);
    636         return ClonedF;
    637       }
    638 
    639       if (auto *A = dyn_cast<GlobalAlias>(V)) {
    640         auto *Ty = A->getValueType();
    641         if (Ty->isFunctionTy())
    642           return Function::Create(cast<FunctionType>(Ty),
    643                                   GlobalValue::ExternalLinkage, A->getName(),
    644                                   M.get());
    645 
    646         return new GlobalVariable(*M, Ty, false, GlobalValue::ExternalLinkage,
    647                                   nullptr, A->getName(), nullptr,
    648                                   GlobalValue::NotThreadLocal,
    649                                   A->getType()->getAddressSpace());
    650       }
    651 
    652       return nullptr;
    653     });
    654 
    655     // Create decls in the new module.
    656     for (auto *F : Part)
    657       cloneFunctionDecl(*M, *F, &VMap);
    658 
    659     // Move the function bodies.
    660     for (auto *F : Part)
    661       moveFunctionBody(*F, VMap, &Materializer);
    662 
    663     auto K = ES.allocateVModule();
    664 
    665     auto LegacyLookup = [this, &LD](const std::string &Name) -> JITSymbol {
    666       return LD.findSymbol(BaseLayer, Name, false);
    667     };
    668 
    669     // Create memory manager and symbol resolver.
    670     auto Resolver = createSymbolResolver(
    671         [&LD, LegacyLookup](const SymbolNameSet &Symbols) {
    672           auto SymbolFlags = lookupFlagsWithLegacyFn(Symbols, LegacyLookup);
    673           if (!SymbolFlags) {
    674             logAllUnhandledErrors(SymbolFlags.takeError(), errs(),
    675                                   "CODLayer/SubResolver flags lookup failed: ");
    676             return SymbolFlagsMap();
    677           }
    678 
    679           if (SymbolFlags->size() == Symbols.size())
    680             return *SymbolFlags;
    681 
    682           SymbolNameSet NotFoundViaLegacyLookup;
    683           for (auto &S : Symbols)
    684             if (!SymbolFlags->count(S))
    685               NotFoundViaLegacyLookup.insert(S);
    686 
    687           auto SymbolFlags2 =
    688               LD.BackingResolver->lookupFlags(NotFoundViaLegacyLookup);
    689 
    690           for (auto &KV : SymbolFlags2)
    691             (*SymbolFlags)[KV.first] = std::move(KV.second);
    692 
    693           return *SymbolFlags;
    694         },
    695         [this, &LD, LegacyLookup](std::shared_ptr<AsynchronousSymbolQuery> Q,
    696                                   SymbolNameSet Symbols) {
    697           auto NotFoundViaLegacyLookup =
    698               lookupWithLegacyFn(ES, *Q, Symbols, LegacyLookup);
    699           return LD.BackingResolver->lookup(Q,
    700                                             std::move(NotFoundViaLegacyLookup));
    701         });
    702     SetSymbolResolver(K, std::move(Resolver));
    703 
    704     if (auto Err = BaseLayer.addModule(std::move(K), std::move(M)))
    705       return std::move(Err);
    706 
    707     return K;
    708   }
    709 
    710   ExecutionSession &ES;
    711   BaseLayerT &BaseLayer;
    712   SymbolResolverGetter GetSymbolResolver;
    713   SymbolResolverSetter SetSymbolResolver;
    714   PartitioningFtor Partition;
    715   CompileCallbackMgrT &CompileCallbackMgr;
    716   IndirectStubsManagerBuilderT CreateIndirectStubsManager;
    717 
    718   std::map<VModuleKey, LogicalDylib> LogicalDylibs;
    719   bool CloneStubsIntoPartitions;
    720 };
    721 
    722 } // end namespace orc
    723 
    724 } // end namespace llvm
    725 
    726 #endif // LLVM_EXECUTIONENGINE_ORC_COMPILEONDEMANDLAYER_H
    727