1*bdd1243dSDimitry Andric //===--- IRPrintingPasses.cpp - Module and Function printing passes -------===// 2*bdd1243dSDimitry Andric // 3*bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bdd1243dSDimitry Andric // 7*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8*bdd1243dSDimitry Andric // 9*bdd1243dSDimitry Andric // PrintModulePass and PrintFunctionPass implementations. 10*bdd1243dSDimitry Andric // 11*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 12*bdd1243dSDimitry Andric 13*bdd1243dSDimitry Andric #include "llvm/IRPrinter/IRPrintingPasses.h" 14*bdd1243dSDimitry Andric #include "llvm/ADT/StringRef.h" 15*bdd1243dSDimitry Andric #include "llvm/Analysis/ModuleSummaryAnalysis.h" 16*bdd1243dSDimitry Andric #include "llvm/IR/Function.h" 17*bdd1243dSDimitry Andric #include "llvm/IR/Module.h" 18*bdd1243dSDimitry Andric #include "llvm/IR/PrintPasses.h" 19*bdd1243dSDimitry Andric #include "llvm/Pass.h" 20*bdd1243dSDimitry Andric #include "llvm/Support/Debug.h" 21*bdd1243dSDimitry Andric #include "llvm/Support/raw_ostream.h" 22*bdd1243dSDimitry Andric 23*bdd1243dSDimitry Andric using namespace llvm; 24*bdd1243dSDimitry Andric 25*bdd1243dSDimitry Andric PrintModulePass::PrintModulePass() : OS(dbgs()) {} 26*bdd1243dSDimitry Andric PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner, 27*bdd1243dSDimitry Andric bool ShouldPreserveUseListOrder, 28*bdd1243dSDimitry Andric bool EmitSummaryIndex) 29*bdd1243dSDimitry Andric : OS(OS), Banner(Banner), 30*bdd1243dSDimitry Andric ShouldPreserveUseListOrder(ShouldPreserveUseListOrder), 31*bdd1243dSDimitry Andric EmitSummaryIndex(EmitSummaryIndex) {} 32*bdd1243dSDimitry Andric 33*bdd1243dSDimitry Andric PreservedAnalyses PrintModulePass::run(Module &M, ModuleAnalysisManager &AM) { 34*bdd1243dSDimitry Andric if (llvm::isFunctionInPrintList("*")) { 35*bdd1243dSDimitry Andric if (!Banner.empty()) 36*bdd1243dSDimitry Andric OS << Banner << "\n"; 37*bdd1243dSDimitry Andric M.print(OS, nullptr, ShouldPreserveUseListOrder); 38*bdd1243dSDimitry Andric } else { 39*bdd1243dSDimitry Andric bool BannerPrinted = false; 40*bdd1243dSDimitry Andric for (const auto &F : M.functions()) { 41*bdd1243dSDimitry Andric if (llvm::isFunctionInPrintList(F.getName())) { 42*bdd1243dSDimitry Andric if (!BannerPrinted && !Banner.empty()) { 43*bdd1243dSDimitry Andric OS << Banner << "\n"; 44*bdd1243dSDimitry Andric BannerPrinted = true; 45*bdd1243dSDimitry Andric } 46*bdd1243dSDimitry Andric F.print(OS); 47*bdd1243dSDimitry Andric } 48*bdd1243dSDimitry Andric } 49*bdd1243dSDimitry Andric } 50*bdd1243dSDimitry Andric 51*bdd1243dSDimitry Andric ModuleSummaryIndex *Index = 52*bdd1243dSDimitry Andric EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M)) 53*bdd1243dSDimitry Andric : nullptr; 54*bdd1243dSDimitry Andric if (Index) { 55*bdd1243dSDimitry Andric if (Index->modulePaths().empty()) 56*bdd1243dSDimitry Andric Index->addModule("", 0); 57*bdd1243dSDimitry Andric Index->print(OS); 58*bdd1243dSDimitry Andric } 59*bdd1243dSDimitry Andric 60*bdd1243dSDimitry Andric return PreservedAnalyses::all(); 61*bdd1243dSDimitry Andric } 62*bdd1243dSDimitry Andric 63*bdd1243dSDimitry Andric PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {} 64*bdd1243dSDimitry Andric PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner) 65*bdd1243dSDimitry Andric : OS(OS), Banner(Banner) {} 66*bdd1243dSDimitry Andric 67*bdd1243dSDimitry Andric PreservedAnalyses PrintFunctionPass::run(Function &F, 68*bdd1243dSDimitry Andric FunctionAnalysisManager &) { 69*bdd1243dSDimitry Andric if (isFunctionInPrintList(F.getName())) { 70*bdd1243dSDimitry Andric if (forcePrintModuleIR()) 71*bdd1243dSDimitry Andric OS << Banner << " (function: " << F.getName() << ")\n" << *F.getParent(); 72*bdd1243dSDimitry Andric else 73*bdd1243dSDimitry Andric OS << Banner << '\n' << static_cast<Value &>(F); 74*bdd1243dSDimitry Andric } 75*bdd1243dSDimitry Andric return PreservedAnalyses::all(); 76*bdd1243dSDimitry Andric } 77