From 85dfe19b36ba6e9657612e072c9183ce168fdbbc Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 31 Jan 2022 16:33:56 -0800 Subject: [PATCH] [ModuleUtils] Move EmbedBufferInModule to LLVMTransformsUtils D116542 adds EmbedBufferInModule which introduces a layer violation (https://llvm.org/docs/CodingStandards.html#library-layering). See 2d5f857a1eaf5f7a806d12953c79b96ed8952da8 for detail. EmbedBufferInModule does not use BitcodeWriter functionality and should be moved LLVMTransformsUtils. While here, change the function case to the prevailing convention. It seems that EmbedBufferInModule just follows the steps of EmbedBitcodeInModule. EmbedBitcodeInModule calls WriteBitcodeToFile but has IR update operations which ideally should be refactored to another library. Reviewed By: jhuber6 Differential Revision: https://reviews.llvm.org/D118666 --- clang/lib/CodeGen/BackendUtil.cpp | 3 +- llvm/include/llvm/Bitcode/BitcodeWriter.h | 5 --- llvm/include/llvm/Transforms/Utils/ModuleUtils.h | 5 +++ llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 49 ----------------------- llvm/lib/Transforms/Utils/ModuleUtils.cpp | 13 ++++++ utils/bazel/llvm-project-overlay/llvm/BUILD.bazel | 1 - 6 files changed, 20 insertions(+), 56 deletions(-) diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 956352d..da7fed8 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -84,6 +84,7 @@ #include "llvm/Transforms/Utils/CanonicalizeAliases.h" #include "llvm/Transforms/Utils/Debugify.h" #include "llvm/Transforms/Utils/EntryExitInstrumenter.h" +#include "llvm/Transforms/Utils/ModuleUtils.h" #include "llvm/Transforms/Utils/NameAnonGlobals.h" #include "llvm/Transforms/Utils/SymbolRewriter.h" #include @@ -1775,6 +1776,6 @@ void clang::EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, SmallString<128> SectionName( {".llvm.offloading.", std::get<1>(FilenameAndSection)}); - llvm::EmbedBufferInModule(*M, **ObjectOrErr, SectionName); + llvm::embedBufferInModule(*M, **ObjectOrErr, SectionName); } } diff --git a/llvm/include/llvm/Bitcode/BitcodeWriter.h b/llvm/include/llvm/Bitcode/BitcodeWriter.h index 56e74cf..7ad2d37 100644 --- a/llvm/include/llvm/Bitcode/BitcodeWriter.h +++ b/llvm/include/llvm/Bitcode/BitcodeWriter.h @@ -165,11 +165,6 @@ class raw_ostream; bool EmbedCmdline, const std::vector &CmdArgs); - /// Embeds the memory buffer \p Buf into the module \p M as a global using the - /// section name \p SectionName. - void EmbedBufferInModule(Module &M, MemoryBufferRef Buf, - StringRef SectionName); - } // end namespace llvm #endif // LLVM_BITCODE_BITCODEWRITER_H diff --git a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h index 9bbe8ea..8d45997 100644 --- a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h +++ b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h @@ -15,6 +15,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/MemoryBuffer.h" #include // for std::pair namespace llvm { @@ -106,6 +107,10 @@ void filterDeadComdatFunctions( /// unique identifier for this module, so we return the empty string. std::string getUniqueModuleId(Module *M); +/// Embed the memory buffer \p Buf into the module \p M as a global using the +/// specified section name. +void embedBufferInModule(Module &M, MemoryBufferRef Buf, StringRef SectionName); + class CallInst; namespace VFABI { /// Overwrite the Vector Function ABI variants attribute with the names provide diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 7ebe10e..eb4e09e 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -4973,52 +4973,3 @@ void llvm::EmbedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf, llvm::ConstantArray::get(ATy, UsedArray), "llvm.compiler.used"); NewUsed->setSection("llvm.metadata"); } - -static void appendToCompilerUsed(Module &M, ArrayRef Values) { - GlobalVariable *GV = M.getGlobalVariable("llvm.compiler.used"); - SmallPtrSet InitAsSet; - SmallVector Init; - if (GV) { - if (GV->hasInitializer()) { - auto *CA = cast(GV->getInitializer()); - for (auto &Op : CA->operands()) { - Constant *C = cast_or_null(Op); - if (InitAsSet.insert(C).second) - Init.push_back(C); - } - } - GV->eraseFromParent(); - } - - Type *Int8PtrTy = llvm::Type::getInt8PtrTy(M.getContext()); - for (auto *V : Values) { - Constant *C = ConstantExpr::getPointerBitCastOrAddrSpaceCast(V, Int8PtrTy); - if (InitAsSet.insert(C).second) - Init.push_back(C); - } - - if (Init.empty()) - return; - - ArrayType *ATy = ArrayType::get(Int8PtrTy, Init.size()); - GV = new llvm::GlobalVariable(M, ATy, false, GlobalValue::AppendingLinkage, - ConstantArray::get(ATy, Init), - "llvm.compiler.used"); - GV->setSection("llvm.metadata"); -} - -void llvm::EmbedBufferInModule(llvm::Module &M, llvm::MemoryBufferRef Buf, - StringRef SectionName) { - ArrayRef ModuleData = - ArrayRef(Buf.getBufferStart(), Buf.getBufferSize()); - - // Embed the buffer into the module. - llvm::Constant *ModuleConstant = - llvm::ConstantDataArray::get(M.getContext(), ModuleData); - llvm::GlobalVariable *GV = new llvm::GlobalVariable( - M, ModuleConstant->getType(), true, llvm::GlobalValue::PrivateLinkage, - ModuleConstant, "llvm.embedded.object"); - GV->setSection(SectionName); - - appendToCompilerUsed(M, GV); -} diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp index 7c9ab7f..d6a6be2 100644 --- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp +++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp @@ -264,3 +264,16 @@ void VFABI::setVectorVariantNames( CI->addFnAttr( Attribute::get(M->getContext(), MappingsAttrName, Buffer.str())); } + +void llvm::embedBufferInModule(Module &M, MemoryBufferRef Buf, + StringRef SectionName) { + // Embed the buffer into the module. + Constant *ModuleConstant = ConstantDataArray::get( + M.getContext(), makeArrayRef(Buf.getBufferStart(), Buf.getBufferSize())); + GlobalVariable *GV = new GlobalVariable( + M, ModuleConstant->getType(), true, GlobalValue::PrivateLinkage, + ModuleConstant, "llvm.embedded.object"); + GV->setSection(SectionName); + + appendToCompilerUsed(M, GV); +} diff --git a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel index 1e8a860..85d79a2 100644 --- a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel @@ -904,7 +904,6 @@ cc_library( "include/llvm/Bitcode/BitcodeWriter.h", "include/llvm/Bitcode/BitcodeWriterPass.h", "include/llvm/Bitcode/LLVMBitCodes.h", - "include/llvm/Transforms/Utils/ModuleUtils.h", ], copts = llvm_copts, deps = [ -- 2.7.4