| //===- 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 <unordered_set> |
| |
| using namespace llvm; |
| |
| // Print IR out before/after specified passes. |
| static cl::list<std::string> |
| PrintBefore("print-before", |
| llvm::cl::desc("Print IR before specified passes"), |
| cl::CommaSeparated, cl::Hidden); |
| |
| static cl::list<std::string> |
| PrintAfter("print-after", llvm::cl::desc("Print IR after specified passes"), |
| cl::CommaSeparated, cl::Hidden); |
| |
| static cl::opt<bool> PrintBeforeAll("print-before-all", |
| llvm::cl::desc("Print IR before each pass"), |
| cl::init(false), cl::Hidden); |
| static cl::opt<bool> PrintAfterAll("print-after-all", |
| llvm::cl::desc("Print IR after each pass"), |
| cl::init(false), cl::Hidden); |
| |
| static cl::opt<bool> |
| 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<std::string> |
| 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<std::string> 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<std::string> llvm::printBeforePasses() { |
| return std::vector<std::string>(PrintBefore); |
| } |
| |
| std::vector<std::string> llvm::printAfterPasses() { |
| return std::vector<std::string>(PrintAfter); |
| } |
| |
| bool llvm::forcePrintModuleIR() { return PrintModuleScope; } |
| |
| bool llvm::isFunctionInPrintList(StringRef FunctionName) { |
| static std::unordered_set<std::string> PrintFuncNames(PrintFuncsList.begin(), |
| PrintFuncsList.end()); |
| return PrintFuncNames.empty() || |
| PrintFuncNames.count(std::string(FunctionName)); |
| } |