diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/ThreadSafeModule.cpp')
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/ThreadSafeModule.cpp | 64 | 
1 files changed, 64 insertions, 0 deletions
| diff --git a/llvm/lib/ExecutionEngine/Orc/ThreadSafeModule.cpp b/llvm/lib/ExecutionEngine/Orc/ThreadSafeModule.cpp new file mode 100644 index 0000000000000..1f4e6f1321150 --- /dev/null +++ b/llvm/lib/ExecutionEngine/Orc/ThreadSafeModule.cpp @@ -0,0 +1,64 @@ +//===-- ThreadSafeModule.cpp - Thread safe Module, Context, and Utilities +//h-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h" +#include "llvm/Bitcode/BitcodeReader.h" +#include "llvm/Bitcode/BitcodeWriter.h" +#include "llvm/Transforms/Utils/Cloning.h" + +namespace llvm { +namespace orc { + +ThreadSafeModule cloneToNewContext(ThreadSafeModule &TSM, +                                   GVPredicate ShouldCloneDef, +                                   GVModifier UpdateClonedDefSource) { +  assert(TSM && "Can not clone null module"); + +  if (!ShouldCloneDef) +    ShouldCloneDef = [](const GlobalValue &) { return true; }; + +  return TSM.withModuleDo([&](Module &M) { +    SmallVector<char, 1> ClonedModuleBuffer; + +    { +      std::set<GlobalValue *> ClonedDefsInSrc; +      ValueToValueMapTy VMap; +      auto Tmp = CloneModule(M, VMap, [&](const GlobalValue *GV) { +        if (ShouldCloneDef(*GV)) { +          ClonedDefsInSrc.insert(const_cast<GlobalValue *>(GV)); +          return true; +        } +        return false; +      }); + +      if (UpdateClonedDefSource) +        for (auto *GV : ClonedDefsInSrc) +          UpdateClonedDefSource(*GV); + +      BitcodeWriter BCWriter(ClonedModuleBuffer); + +      BCWriter.writeModule(*Tmp); +      BCWriter.writeSymtab(); +      BCWriter.writeStrtab(); +    } + +    MemoryBufferRef ClonedModuleBufferRef( +        StringRef(ClonedModuleBuffer.data(), ClonedModuleBuffer.size()), +        "cloned module buffer"); +    ThreadSafeContext NewTSCtx(std::make_unique<LLVMContext>()); + +    auto ClonedModule = cantFail( +        parseBitcodeFile(ClonedModuleBufferRef, *NewTSCtx.getContext())); +    ClonedModule->setModuleIdentifier(M.getName()); +    return ThreadSafeModule(std::move(ClonedModule), std::move(NewTSCtx)); +  }); +} + +} // end namespace orc +} // end namespace llvm | 
