Skip to content

Commit

Permalink
[ModuleUtils] Move EmbedBufferInModule to LLVMTransformsUtils
Browse files Browse the repository at this point in the history
D116542 adds EmbedBufferInModule which introduces a layer violation
(https://llvm.org/docs/CodingStandards.html#library-layering).
See 2d5f857 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
  • Loading branch information
MaskRay committed Feb 1, 2022
1 parent 4a780aa commit 85dfe19
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 56 deletions.
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/BackendUtil.cpp
Expand Up @@ -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 <memory>
Expand Down Expand Up @@ -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);
}
}
5 changes: 0 additions & 5 deletions llvm/include/llvm/Bitcode/BitcodeWriter.h
Expand Up @@ -165,11 +165,6 @@ class raw_ostream;
bool EmbedCmdline,
const std::vector<uint8_t> &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
5 changes: 5 additions & 0 deletions llvm/include/llvm/Transforms/Utils/ModuleUtils.h
Expand Up @@ -15,6 +15,7 @@

#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/MemoryBuffer.h"
#include <utility> // for std::pair

namespace llvm {
Expand Down Expand Up @@ -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
Expand Down
49 changes: 0 additions & 49 deletions llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
Expand Up @@ -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<GlobalValue *> Values) {
GlobalVariable *GV = M.getGlobalVariable("llvm.compiler.used");
SmallPtrSet<Constant *, 16> InitAsSet;
SmallVector<Constant *, 16> Init;
if (GV) {
if (GV->hasInitializer()) {
auto *CA = cast<ConstantArray>(GV->getInitializer());
for (auto &Op : CA->operands()) {
Constant *C = cast_or_null<Constant>(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<char> ModuleData =
ArrayRef<char>(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);
}
13 changes: 13 additions & 0 deletions llvm/lib/Transforms/Utils/ModuleUtils.cpp
Expand Up @@ -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);
}
1 change: 0 additions & 1 deletion utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
Expand Up @@ -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 = [
Expand Down

0 comments on commit 85dfe19

Please sign in to comment.