Line data Source code
1 : //===-- ThreadSafeModule.cpp - Thread safe Module, Context, and Utilities
2 : //h-===//
3 : //
4 : // The LLVM Compiler Infrastructure
5 : //
6 : // This file is distributed under the University of Illinois Open Source
7 : // License. See LICENSE.TXT for details.
8 : //
9 : //===----------------------------------------------------------------------===//
10 :
11 : #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
12 : #include "llvm/Bitcode/BitcodeReader.h"
13 : #include "llvm/Bitcode/BitcodeWriter.h"
14 : #include "llvm/Transforms/Utils/Cloning.h"
15 :
16 : namespace llvm {
17 : namespace orc {
18 :
19 24 : ThreadSafeModule cloneToNewContext(ThreadSafeModule &TSM,
20 : GVPredicate ShouldCloneDef,
21 : GVModifier UpdateClonedDefSource) {
22 : assert(TSM && "Can not clone null module");
23 :
24 24 : if (!ShouldCloneDef)
25 1 : ShouldCloneDef = [](const GlobalValue &) { return true; };
26 :
27 24 : auto Lock = TSM.getContextLock();
28 :
29 : SmallVector<char, 1> ClonedModuleBuffer;
30 :
31 : {
32 : std::set<GlobalValue *> ClonedDefsInSrc;
33 24 : ValueToValueMapTy VMap;
34 : auto Tmp = CloneModule(*TSM.getModule(), VMap, [&](const GlobalValue *GV) {
35 : if (ShouldCloneDef(*GV)) {
36 : ClonedDefsInSrc.insert(const_cast<GlobalValue *>(GV));
37 : return true;
38 : }
39 : return false;
40 72 : });
41 :
42 24 : if (UpdateClonedDefSource)
43 53 : for (auto *GV : ClonedDefsInSrc)
44 : UpdateClonedDefSource(*GV);
45 :
46 48 : BitcodeWriter BCWriter(ClonedModuleBuffer);
47 :
48 24 : BCWriter.writeModule(*Tmp);
49 24 : BCWriter.writeSymtab();
50 24 : BCWriter.writeStrtab();
51 : }
52 :
53 : MemoryBufferRef ClonedModuleBufferRef(
54 24 : StringRef(ClonedModuleBuffer.data(), ClonedModuleBuffer.size()),
55 24 : "cloned module buffer");
56 24 : ThreadSafeContext NewTSCtx(llvm::make_unique<LLVMContext>());
57 :
58 : auto ClonedModule =
59 48 : cantFail(parseBitcodeFile(ClonedModuleBufferRef, *NewTSCtx.getContext()));
60 24 : ClonedModule->setModuleIdentifier(TSM.getModule()->getName());
61 24 : return ThreadSafeModule(std::move(ClonedModule), std::move(NewTSCtx));
62 : }
63 :
64 : } // end namespace orc
65 : } // end namespace llvm
|