
Expensive checks complains when we mark them as preserved. The bitcode being embedded generally doesn't change anything important in the module, but some things are modified under ThinLTO, like vtables under WPD. This became a non-issue when we cloned the module, but after we had to revert that in #145987, we need to handle this case properly.
46 lines
1.6 KiB
C++
46 lines
1.6 KiB
C++
//===- EmbedBitcodePass.cpp - Pass that embeds the bitcode into a global---===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Transforms/IPO/EmbedBitcodePass.h"
|
|
#include "llvm/Bitcode/BitcodeWriter.h"
|
|
#include "llvm/Bitcode/BitcodeWriterPass.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/MemoryBufferRef.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "llvm/TargetParser/Triple.h"
|
|
#include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h"
|
|
#include "llvm/Transforms/Utils/ModuleUtils.h"
|
|
|
|
#include <string>
|
|
|
|
using namespace llvm;
|
|
|
|
PreservedAnalyses EmbedBitcodePass::run(Module &M, ModuleAnalysisManager &AM) {
|
|
if (M.getGlobalVariable("llvm.embedded.module", /*AllowInternal=*/true))
|
|
reportFatalUsageError("Can only embed the module once");
|
|
|
|
Triple T(M.getTargetTriple());
|
|
if (T.getObjectFormat() != Triple::ELF)
|
|
reportFatalUsageError(
|
|
"EmbedBitcode pass currently only supports ELF object format");
|
|
|
|
std::string Data;
|
|
raw_string_ostream OS(Data);
|
|
if (IsThinLTO)
|
|
ThinLTOBitcodeWriterPass(OS, /*ThinLinkOS=*/nullptr).run(M, AM);
|
|
else
|
|
BitcodeWriterPass(OS, /*ShouldPreserveUseListOrder=*/false, EmitLTOSummary)
|
|
.run(M, AM);
|
|
|
|
embedBufferInModule(M, MemoryBufferRef(Data, "ModuleData"), ".llvm.lto");
|
|
|
|
return PreservedAnalyses::none();
|
|
}
|