Files
llvm-project/llvm/lib/CodeGen/MachineFunctionPrinterPass.cpp
Yaxun (Sam) Liu 822f549e98 [IR] Add source location filtering to pass dumps (#203393)
Large dumps from `-print-after-all` can be hard to use when only a few
source lines matter. Function filtering can still print too much and can
miss code after inlining.

Add `-filter-print-source-locs` to limit IR and machine-function dumps
to matching debug locations. The option accepts file names or paths with
selected lines and ranges. It also follows inlined locations and works
with legacy and new pass managers.
2026-09-03 22:16:29 -04:00

86 lines
2.7 KiB
C++

//===-- MachineFunctionPrinterPass.cpp ------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// MachineFunctionPrinterPass implementation.
//
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/SlotIndexes.h"
#include "llvm/IR/PrintPasses.h"
#include "llvm/InitializePasses.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace {
bool shouldPrintMachineFunction(const MachineFunction &MF) {
bool SourceLocFilterEmpty = isSourceLocFilterEmpty();
if (!isFunctionInPrintList(MF.getName()))
return false;
if (SourceLocFilterEmpty)
return true;
for (const MachineBasicBlock &MBB : MF)
for (const MachineInstr &MI : MBB)
if (isSourceLocInPrintList(MI.getDebugLoc()))
return true;
return false;
}
/// MachineFunctionPrinterPass - This is a pass to dump the IR of a
/// MachineFunction.
///
struct MachineFunctionPrinterPass : public MachineFunctionPass {
static char ID;
raw_ostream &OS;
const std::string Banner;
MachineFunctionPrinterPass() : MachineFunctionPass(ID), OS(dbgs()) { }
MachineFunctionPrinterPass(raw_ostream &os, const std::string &banner)
: MachineFunctionPass(ID), OS(os), Banner(banner) {}
StringRef getPassName() const override { return "MachineFunction Printer"; }
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
AU.addUsedIfAvailable<SlotIndexesWrapperPass>();
MachineFunctionPass::getAnalysisUsage(AU);
}
bool runOnMachineFunction(MachineFunction &MF) override {
if (!shouldPrintMachineFunction(MF))
return false;
OS << "# " << Banner << ":\n";
auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
MF.print(OS, SIWrapper ? &SIWrapper->getSI() : nullptr);
return false;
}
};
char MachineFunctionPrinterPass::ID = 0;
}
char &llvm::MachineFunctionPrinterPassID = MachineFunctionPrinterPass::ID;
INITIALIZE_PASS(MachineFunctionPrinterPass, "machineinstr-printer",
"Machine Function Printer", false, false)
/// Returns a newly-created MachineFunction Printer pass. The
/// default banner is empty.
///
MachineFunctionPass *
llvm::createMachineFunctionPrinterPass(raw_ostream &OS,
const std::string &Banner) {
return new MachineFunctionPrinterPass(OS, Banner);
}