Skip to content

Commit

Permalink
[NFC][ThinLTO] Let llvm::EmbedBitcodeInModule handle serialization.
Browse files Browse the repository at this point in the history
llvm::EmbedBitcodeInModule handles serializing the passed-in module, if
the provided MemoryBufferRef is invalid. This is already the path taken
in one of the uses of the API - clang::EmbedBitcode, when called from
BackendConsumer::HandleTranslationUnit - so might as well do the same
here and reduce (by very little) code duplication.

The only difference this patch introduces is that the serialization happens
with ShouldPreserveUseListOrder set to true.

Differential Revision: https://reviews.llvm.org/D87339
  • Loading branch information
mtrofin committed Sep 10, 2020
1 parent ab1de1f commit e543708
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 11 deletions.
4 changes: 4 additions & 0 deletions llvm/include/llvm/Bitcode/BitcodeWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ class raw_ostream;
*ModuleToSummariesForIndex = nullptr);

/// Save a copy of the llvm IR as data in the __LLVM,__bitcode section.
/// If available, pass the serialized module via the Buf parameter. If not,
/// pass an empty (default-initialized) MemoryBufferRef, and the serialization
/// will be handled by this API. The same behavior happens if the provided Buf
/// is not bitcode (i.e. if it's invalid data or even textual LLVM assembly).
void EmbedBitcodeInModule(Module &M, MemoryBufferRef Buf, bool EmbedBitcode,
bool EmbedMarker,
const std::vector<uint8_t> *CmdArgs);
Expand Down
7 changes: 3 additions & 4 deletions llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4829,11 +4829,10 @@ void llvm::EmbedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf,
std::string Data;
ArrayRef<uint8_t> ModuleData;
Triple T(M.getTargetTriple());
// Create a constant that contains the bitcode.
// In case of embedding a marker, ignore the input Buf and use the empty
// ArrayRef. It is also legal to create a bitcode marker even Buf is empty.

if (EmbedBitcode) {
if (!isBitcode((const unsigned char *)Buf.getBufferStart(),
if (Buf.getBufferSize() == 0 ||
!isBitcode((const unsigned char *)Buf.getBufferStart(),
(const unsigned char *)Buf.getBufferEnd())) {
// If the input is LLVM Assembly, bitcode is produced by serializing
// the module. Use-lists order need to be preserved in this case.
Expand Down
8 changes: 1 addition & 7 deletions llvm/lib/LTO/LTOBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,13 +353,7 @@ static cl::opt<bool> EmbedBitcode(
static void EmitBitcodeSection(Module &M) {
if (!EmbedBitcode)
return;
SmallVector<char, 0> Buffer;
raw_svector_ostream OS(Buffer);
WriteBitcodeToFile(M, OS);

std::unique_ptr<MemoryBuffer> Buf(
new SmallVectorMemoryBuffer(std::move(Buffer)));
llvm::EmbedBitcodeInModule(M, Buf->getMemBufferRef(), /*EmbedBitcode*/ true,
llvm::EmbedBitcodeInModule(M, llvm::MemoryBufferRef(), /*EmbedBitcode*/ true,
/*EmbedMarker*/ false, /*CmdArgs*/ nullptr);
}

Expand Down

0 comments on commit e543708

Please sign in to comment.