This patch plumbs the command line --experimental-debuginfo-iterators flag in to the pass managers, so that modules can be converted to the new format, passes run, then converted back to the old format. That allows developers to test-out the new debuginfo representation across some part of LLVM with no further work, and from the command line. It also installs flag-catchers at the various points that bitcode and textual IR can egress from a process, and temporarily convert the module to dbg.value format when doing so. No tests alas as it's designed to be transparent. Differential Revision: https://reviews.llvm.org/D154372
96 lines
3.1 KiB
C++
96 lines
3.1 KiB
C++
//===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// PrintModulePass and PrintFunctionPass implementations.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/IRPrinter/IRPrintingPasses.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/IR/PrintPasses.h"
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
PrintModulePass::PrintModulePass() : OS(dbgs()) {}
|
|
PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
|
|
bool ShouldPreserveUseListOrder,
|
|
bool EmitSummaryIndex)
|
|
: OS(OS), Banner(Banner),
|
|
ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
|
|
EmitSummaryIndex(EmitSummaryIndex) {}
|
|
|
|
PreservedAnalyses PrintModulePass::run(Module &M, ModuleAnalysisManager &AM) {
|
|
// RemoveDIs: there's no textual representation of the DPValue debug-info,
|
|
// convert to dbg.values before writing out.
|
|
bool ShouldConvert = M.IsNewDbgInfoFormat;
|
|
if (ShouldConvert)
|
|
M.convertFromNewDbgValues();
|
|
|
|
if (llvm::isFunctionInPrintList("*")) {
|
|
if (!Banner.empty())
|
|
OS << Banner << "\n";
|
|
M.print(OS, nullptr, ShouldPreserveUseListOrder);
|
|
} else {
|
|
bool BannerPrinted = false;
|
|
for (const auto &F : M.functions()) {
|
|
if (llvm::isFunctionInPrintList(F.getName())) {
|
|
if (!BannerPrinted && !Banner.empty()) {
|
|
OS << Banner << "\n";
|
|
BannerPrinted = true;
|
|
}
|
|
F.print(OS);
|
|
}
|
|
}
|
|
}
|
|
|
|
ModuleSummaryIndex *Index =
|
|
EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M))
|
|
: nullptr;
|
|
if (Index) {
|
|
if (Index->modulePaths().empty())
|
|
Index->addModule("");
|
|
Index->print(OS);
|
|
}
|
|
|
|
if (ShouldConvert)
|
|
M.convertToNewDbgValues();
|
|
|
|
return PreservedAnalyses::all();
|
|
}
|
|
|
|
PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
|
|
PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
|
|
: OS(OS), Banner(Banner) {}
|
|
|
|
PreservedAnalyses PrintFunctionPass::run(Function &F,
|
|
FunctionAnalysisManager &) {
|
|
// RemoveDIs: there's no textual representation of the DPValue debug-info,
|
|
// convert to dbg.values before writing out.
|
|
bool ShouldConvert = F.IsNewDbgInfoFormat;
|
|
if (ShouldConvert)
|
|
F.convertFromNewDbgValues();
|
|
|
|
if (isFunctionInPrintList(F.getName())) {
|
|
if (forcePrintModuleIR())
|
|
OS << Banner << " (function: " << F.getName() << ")\n" << *F.getParent();
|
|
else
|
|
OS << Banner << '\n' << static_cast<Value &>(F);
|
|
}
|
|
|
|
if (ShouldConvert)
|
|
F.convertToNewDbgValues();
|
|
|
|
return PreservedAnalyses::all();
|
|
}
|