mirror of
https://github.com/llvm/llvm-project.git
synced 2026-10-26 13:53:31 +08:00
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.
86 lines
2.7 KiB
C++
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);
|
|
}
|