
Verify-uselistorder wants to take some input IR and verify that the uselist order is stable after roundtripping to bitcode and assembly. This is disrupted if the file is converted between the new and old debug info formats after parsing - while there's no functional difference, the change to the in-memory representation of the IR modifies the uselist. This patch changes verify-uselistorder to not convert input files between debug info formats by default, preventing changes from being made to the file being checked. In addition, this patch makes it so that when we _do_ print IR in the new debug info format to bitcode or assembly, we delete any lingering debug intrinsic declarations, ensuring that we don't write uselist entries for them.
88 lines
3.1 KiB
C++
88 lines
3.1 KiB
C++
//===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// BitcodeWriterPass implementation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Bitcode/BitcodeWriterPass.h"
|
|
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
|
|
#include "llvm/Bitcode/BitcodeWriter.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/Pass.h"
|
|
using namespace llvm;
|
|
|
|
extern bool WriteNewDbgInfoFormatToBitcode;
|
|
|
|
PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) {
|
|
ScopedDbgInfoFormatSetter FormatSetter(M, M.IsNewDbgInfoFormat &&
|
|
WriteNewDbgInfoFormatToBitcode);
|
|
if (M.IsNewDbgInfoFormat)
|
|
M.removeDebugIntrinsicDeclarations();
|
|
|
|
const ModuleSummaryIndex *Index =
|
|
EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M))
|
|
: nullptr;
|
|
WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash);
|
|
|
|
return PreservedAnalyses::all();
|
|
}
|
|
|
|
namespace {
|
|
class WriteBitcodePass : public ModulePass {
|
|
raw_ostream &OS; // raw_ostream to print on
|
|
bool ShouldPreserveUseListOrder;
|
|
|
|
public:
|
|
static char ID; // Pass identification, replacement for typeid
|
|
WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
|
|
initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder)
|
|
: ModulePass(ID), OS(o),
|
|
ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {
|
|
initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
StringRef getPassName() const override { return "Bitcode Writer"; }
|
|
|
|
bool runOnModule(Module &M) override {
|
|
ScopedDbgInfoFormatSetter FormatSetter(
|
|
M, M.IsNewDbgInfoFormat && WriteNewDbgInfoFormatToBitcode);
|
|
if (M.IsNewDbgInfoFormat)
|
|
M.removeDebugIntrinsicDeclarations();
|
|
|
|
WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, /*Index=*/nullptr,
|
|
/*EmitModuleHash=*/false);
|
|
|
|
return false;
|
|
}
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.setPreservesAll();
|
|
}
|
|
};
|
|
}
|
|
|
|
char WriteBitcodePass::ID = 0;
|
|
INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
|
|
true)
|
|
INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
|
|
INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
|
|
true)
|
|
|
|
ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
|
|
bool ShouldPreserveUseListOrder) {
|
|
return new WriteBitcodePass(Str, ShouldPreserveUseListOrder);
|
|
}
|
|
|
|
bool llvm::isBitcodeWriterPass(Pass *P) {
|
|
return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID;
|
|
}
|