blob: 14419b6ca18cfc1c48254c889116cf29f1db5294 [file] [log] [blame]
Lang Hames4328ea32018-09-28 01:41:33 +00001//===-- ThreadSafeModule.cpp - Thread safe Module, Context, and Utilities
2//h-===//
Lang Hames8d76c712018-09-26 01:24:12 +00003//
Chandler Carruth2946cd72019-01-19 08:50:56 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Lang Hames8d76c712018-09-26 01:24:12 +00007//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
11#include "llvm/Bitcode/BitcodeReader.h"
12#include "llvm/Bitcode/BitcodeWriter.h"
13#include "llvm/Transforms/Utils/Cloning.h"
14
15namespace llvm {
16namespace orc {
17
18ThreadSafeModule cloneToNewContext(ThreadSafeModule &TSM,
19 GVPredicate ShouldCloneDef,
20 GVModifier UpdateClonedDefSource) {
21 assert(TSM && "Can not clone null module");
22
23 if (!ShouldCloneDef)
Lang Hames4328ea32018-09-28 01:41:33 +000024 ShouldCloneDef = [](const GlobalValue &) { return true; };
Lang Hames8d76c712018-09-26 01:24:12 +000025
Lang Hames809e9d12019-08-02 15:21:37 +000026 return TSM.withModuleDo([&](Module &M) {
27 SmallVector<char, 1> ClonedModuleBuffer;
Lang Hames8d76c712018-09-26 01:24:12 +000028
Lang Hames809e9d12019-08-02 15:21:37 +000029 {
30 std::set<GlobalValue *> ClonedDefsInSrc;
31 ValueToValueMapTy VMap;
32 auto Tmp = CloneModule(M, VMap, [&](const GlobalValue *GV) {
33 if (ShouldCloneDef(*GV)) {
34 ClonedDefsInSrc.insert(const_cast<GlobalValue *>(GV));
35 return true;
36 }
37 return false;
38 });
Lang Hames8d76c712018-09-26 01:24:12 +000039
Lang Hames809e9d12019-08-02 15:21:37 +000040 if (UpdateClonedDefSource)
41 for (auto *GV : ClonedDefsInSrc)
42 UpdateClonedDefSource(*GV);
Lang Hames8d76c712018-09-26 01:24:12 +000043
Lang Hames809e9d12019-08-02 15:21:37 +000044 BitcodeWriter BCWriter(ClonedModuleBuffer);
Lang Hames8d76c712018-09-26 01:24:12 +000045
Lang Hames809e9d12019-08-02 15:21:37 +000046 BCWriter.writeModule(*Tmp);
47 BCWriter.writeSymtab();
48 BCWriter.writeStrtab();
49 }
Lang Hames8d76c712018-09-26 01:24:12 +000050
Lang Hames809e9d12019-08-02 15:21:37 +000051 MemoryBufferRef ClonedModuleBufferRef(
52 StringRef(ClonedModuleBuffer.data(), ClonedModuleBuffer.size()),
53 "cloned module buffer");
54 ThreadSafeContext NewTSCtx(llvm::make_unique<LLVMContext>());
Lang Hames8d76c712018-09-26 01:24:12 +000055
Lang Hames809e9d12019-08-02 15:21:37 +000056 auto ClonedModule = cantFail(
57 parseBitcodeFile(ClonedModuleBufferRef, *NewTSCtx.getContext()));
58 ClonedModule->setModuleIdentifier(M.getName());
59 return ThreadSafeModule(std::move(ClonedModule), std::move(NewTSCtx));
60 });
Lang Hames8d76c712018-09-26 01:24:12 +000061}
62
63} // end namespace orc
64} // end namespace llvm