//===- PrintPasses.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 // //===----------------------------------------------------------------------===// #include "llvm/IR/PrintPasses.h" #include "llvm/Support/CommandLine.h" #include using namespace llvm; // Print IR out before/after specified passes. static cl::list PrintBefore("print-before", llvm::cl::desc("Print IR before specified passes"), cl::CommaSeparated, cl::Hidden); static cl::list PrintAfter("print-after", llvm::cl::desc("Print IR after specified passes"), cl::CommaSeparated, cl::Hidden); static cl::opt PrintBeforeAll("print-before-all", llvm::cl::desc("Print IR before each pass"), cl::init(false), cl::Hidden); static cl::opt PrintAfterAll("print-after-all", llvm::cl::desc("Print IR after each pass"), cl::init(false), cl::Hidden); static cl::opt PrintModuleScope("print-module-scope", cl::desc("When printing IR for print-[before|after]{-all} " "always print a module IR"), cl::init(false), cl::Hidden); static cl::list PrintFuncsList("filter-print-funcs", cl::value_desc("function names"), cl::desc("Only print IR for functions whose name " "match this for all print-[before|after][-all] " "options"), cl::CommaSeparated, cl::Hidden); /// This is a helper to determine whether to print IR before or /// after a pass. bool llvm::shouldPrintBeforeSomePass() { return PrintBeforeAll || !PrintBefore.empty(); } bool llvm::shouldPrintAfterSomePass() { return PrintAfterAll || !PrintAfter.empty(); } static bool shouldPrintBeforeOrAfterPass(StringRef PassID, ArrayRef PassesToPrint) { return llvm::is_contained(PassesToPrint, PassID); } bool llvm::shouldPrintBeforeAll() { return PrintBeforeAll; } bool llvm::shouldPrintAfterAll() { return PrintAfterAll; } bool llvm::shouldPrintBeforePass(StringRef PassID) { return PrintBeforeAll || shouldPrintBeforeOrAfterPass(PassID, PrintBefore); } bool llvm::shouldPrintAfterPass(StringRef PassID) { return PrintAfterAll || shouldPrintBeforeOrAfterPass(PassID, PrintAfter); } std::vector llvm::printBeforePasses() { return std::vector(PrintBefore); } std::vector llvm::printAfterPasses() { return std::vector(PrintAfter); } bool llvm::forcePrintModuleIR() { return PrintModuleScope; } bool llvm::isFunctionInPrintList(StringRef FunctionName) { static std::unordered_set PrintFuncNames(PrintFuncsList.begin(), PrintFuncsList.end()); return PrintFuncNames.empty() || PrintFuncNames.count(std::string(FunctionName)); }