Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ThreadSafeModule.cpp
35266 views
//===-- ThreadSafeModule.cpp - Thread safe Module, Context, and Utilities1//h-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//89#include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"10#include "llvm/Bitcode/BitcodeReader.h"11#include "llvm/Bitcode/BitcodeWriter.h"12#include "llvm/Transforms/Utils/Cloning.h"1314namespace llvm {15namespace orc {1617ThreadSafeModule cloneToNewContext(const ThreadSafeModule &TSM,18GVPredicate ShouldCloneDef,19GVModifier UpdateClonedDefSource) {20assert(TSM && "Can not clone null module");2122if (!ShouldCloneDef)23ShouldCloneDef = [](const GlobalValue &) { return true; };2425return TSM.withModuleDo([&](Module &M) {26SmallVector<char, 1> ClonedModuleBuffer;2728{29std::set<GlobalValue *> ClonedDefsInSrc;30ValueToValueMapTy VMap;31auto Tmp = CloneModule(M, VMap, [&](const GlobalValue *GV) {32if (ShouldCloneDef(*GV)) {33ClonedDefsInSrc.insert(const_cast<GlobalValue *>(GV));34return true;35}36return false;37});3839if (UpdateClonedDefSource)40for (auto *GV : ClonedDefsInSrc)41UpdateClonedDefSource(*GV);4243BitcodeWriter BCWriter(ClonedModuleBuffer);4445BCWriter.writeModule(*Tmp);46BCWriter.writeSymtab();47BCWriter.writeStrtab();48}4950MemoryBufferRef ClonedModuleBufferRef(51StringRef(ClonedModuleBuffer.data(), ClonedModuleBuffer.size()),52"cloned module buffer");53ThreadSafeContext NewTSCtx(std::make_unique<LLVMContext>());5455auto ClonedModule = cantFail(56parseBitcodeFile(ClonedModuleBufferRef, *NewTSCtx.getContext()));57ClonedModule->setModuleIdentifier(M.getName());58return ThreadSafeModule(std::move(ClonedModule), std::move(NewTSCtx));59});60}6162} // end namespace orc63} // end namespace llvm646566