From 645c6856a68af9b9dd7d918f630560cf07462ed7 Mon Sep 17 00:00:00 2001 From: Jamie Schmeiser Date: Tue, 18 Aug 2020 16:05:20 +0000 Subject: [PATCH] [NFC] Add raw_ostream parameter to printIR routines This is a non-functional-change to generalize the printIR routines so that the output can be saved and manipulated rather than being directly output to dbgs(). This is a prerequisite change for many upcoming changes that allow new ways of examining changes made to the IR in the new pass manager. Reviewed By: aeubanks (Arthur Eubanks) Differential Revision: https://reviews.llvm.org/D85999 --- llvm/lib/Passes/StandardInstrumentations.cpp | 61 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp index 9e9caa1..55dbca7 100644 --- a/llvm/lib/Passes/StandardInstrumentations.cpp +++ b/llvm/lib/Passes/StandardInstrumentations.cpp @@ -86,39 +86,39 @@ Optional> unwrapModule(Any IR) { llvm_unreachable("Unknown IR unit"); } -void printIR(const Function *F, StringRef Banner, StringRef Extra = StringRef(), - bool Brief = false) { +void printIR(raw_ostream &OS, const Function *F, StringRef Banner, + StringRef Extra = StringRef(), bool Brief = false) { if (Brief) { - dbgs() << F->getName() << '\n'; + OS << F->getName() << '\n'; return; } if (!llvm::isFunctionInPrintList(F->getName())) return; - dbgs() << Banner << Extra << "\n" << static_cast(*F); + OS << Banner << Extra << "\n" << static_cast(*F); } -void printIR(const Module *M, StringRef Banner, StringRef Extra = StringRef(), - bool Brief = false) { +void printIR(raw_ostream &OS, const Module *M, StringRef Banner, + StringRef Extra = StringRef(), bool Brief = false) { if (Brief) { - dbgs() << M->getName() << '\n'; + OS << M->getName() << '\n'; return; } if (llvm::isFunctionInPrintList("*") || llvm::forcePrintModuleIR()) { - dbgs() << Banner << Extra << "\n"; - M->print(dbgs(), nullptr, false); + OS << Banner << Extra << "\n"; + M->print(OS, nullptr, false); } else { for (const auto &F : M->functions()) { - printIR(&F, Banner, Extra); + printIR(OS, &F, Banner, Extra); } } } -void printIR(const LazyCallGraph::SCC *C, StringRef Banner, +void printIR(raw_ostream &OS, const LazyCallGraph::SCC *C, StringRef Banner, StringRef Extra = StringRef(), bool Brief = false) { if (Brief) { - dbgs() << *C << '\n'; + OS << *C << '\n'; return; } @@ -127,47 +127,48 @@ void printIR(const LazyCallGraph::SCC *C, StringRef Banner, const Function &F = N.getFunction(); if (!F.isDeclaration() && llvm::isFunctionInPrintList(F.getName())) { if (!BannerPrinted) { - dbgs() << Banner << Extra << "\n"; + OS << Banner << Extra << "\n"; BannerPrinted = true; } - F.print(dbgs()); + F.print(OS); } } } -void printIR(const Loop *L, StringRef Banner, bool Brief = false) { +void printIR(raw_ostream &OS, const Loop *L, StringRef Banner, + bool Brief = false) { if (Brief) { - dbgs() << *L; + OS << *L; return; } const Function *F = L->getHeader()->getParent(); if (!llvm::isFunctionInPrintList(F->getName())) return; - llvm::printLoop(const_cast(*L), dbgs(), std::string(Banner)); + llvm::printLoop(const_cast(*L), OS, std::string(Banner)); } /// Generic IR-printing helper that unpacks a pointer to IRUnit wrapped into /// llvm::Any and does actual print job. -void unwrapAndPrint(Any IR, StringRef Banner, bool ForceModule = false, - bool Brief = false) { +void unwrapAndPrint(raw_ostream &OS, Any IR, StringRef Banner, + bool ForceModule = false, bool Brief = false) { if (ForceModule) { if (auto UnwrappedModule = unwrapModule(IR)) - printIR(UnwrappedModule->first, Banner, UnwrappedModule->second); + printIR(OS, UnwrappedModule->first, Banner, UnwrappedModule->second); return; } if (any_isa(IR)) { const Module *M = any_cast(IR); assert(M && "module should be valid for printing"); - printIR(M, Banner, "", Brief); + printIR(OS, M, Banner, "", Brief); return; } if (any_isa(IR)) { const Function *F = any_cast(IR); assert(F && "function should be valid for printing"); - printIR(F, Banner, "", Brief); + printIR(OS, F, Banner, "", Brief); return; } @@ -175,14 +176,14 @@ void unwrapAndPrint(Any IR, StringRef Banner, bool ForceModule = false, const LazyCallGraph::SCC *C = any_cast(IR); assert(C && "scc should be valid for printing"); std::string Extra = std::string(formatv(" (scc: {0})", C->getName())); - printIR(C, Banner, Extra, Brief); + printIR(OS, C, Banner, Extra, Brief); return; } if (any_isa(IR)) { const Loop *L = any_cast(IR); assert(L && "Loop should be valid for printing"); - printIR(L, Banner, Brief); + printIR(OS, L, Banner, Brief); return; } llvm_unreachable("Unknown wrapped IR type"); @@ -226,7 +227,7 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) { return; SmallString<20> Banner = formatv("*** IR Dump Before {0} ***", PassID); - unwrapAndPrint(IR, Banner, llvm::forcePrintModuleIR()); + unwrapAndPrint(dbgs(), IR, Banner, llvm::forcePrintModuleIR()); return; } @@ -241,7 +242,7 @@ void PrintIRInstrumentation::printAfterPass(StringRef PassID, Any IR) { popModuleDesc(PassID); SmallString<20> Banner = formatv("*** IR Dump After {0} ***", PassID); - unwrapAndPrint(IR, Banner, llvm::forcePrintModuleIR()); + unwrapAndPrint(dbgs(), IR, Banner, llvm::forcePrintModuleIR()); } void PrintIRInstrumentation::printAfterPassInvalidated(StringRef PassID) { @@ -262,7 +263,7 @@ void PrintIRInstrumentation::printAfterPassInvalidated(StringRef PassID) { SmallString<20> Banner = formatv("*** IR Dump After {0} *** invalidated: ", PassID); - printIR(M, Banner, Extra); + printIR(dbgs(), M, Banner, Extra); } void PrintIRInstrumentation::registerCallbacks( @@ -315,7 +316,7 @@ void PrintPassInstrumentation::registerCallbacks( "Unexpectedly skipping special pass"); dbgs() << "Skipping pass: " << PassID << " on "; - unwrapAndPrint(IR, "", false, true); + unwrapAndPrint(dbgs(), IR, "", false, true); }); PIC.registerBeforeNonSkippedPassCallback( @@ -324,12 +325,12 @@ void PrintPassInstrumentation::registerCallbacks( return; dbgs() << "Running pass: " << PassID << " on "; - unwrapAndPrint(IR, "", false, true); + unwrapAndPrint(dbgs(), IR, "", false, true); }); PIC.registerBeforeAnalysisCallback([](StringRef PassID, Any IR) { dbgs() << "Running analysis: " << PassID << " on "; - unwrapAndPrint(IR, "", false, true); + unwrapAndPrint(dbgs(), IR, "", false, true); }); } -- 2.7.4