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
#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>
SmallString<128> SectionName(
{".llvm.offloading.", std::get<1>(FilenameAndSection)});
- llvm::EmbedBufferInModule(*M, **ObjectOrErr, SectionName);
+ llvm::embedBufferInModule(*M, **ObjectOrErr, SectionName);
}
}
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
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/MemoryBuffer.h"
#include <utility> // for std::pair
namespace llvm {
/// 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
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);
-}
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);
+}
"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 = [