1 //===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // 10 //===----------------------------------------------------------------------===// 11 #include "llvm/IR/DiagnosticHandler.h" 12 #include "llvm/Support/CommandLine.h" 13 #include "llvm/Support/Regex.h" 14 15 using namespace llvm; 16 17 namespace { 18 19 /// Regular expression corresponding to the value given in one of the 20 /// -pass-remarks* command line flags. Passes whose name matches this regexp 21 /// will emit a diagnostic when calling the associated diagnostic function 22 /// (emitOptimizationRemark, emitOptimizationRemarkMissed or 23 /// emitOptimizationRemarkAnalysis). 24 struct PassRemarksOpt { 25 std::shared_ptr<Regex> Pattern; 26 27 void operator=(const std::string &Val) { 28 // Create a regexp object to match pass names for emitOptimizationRemark. 29 if (!Val.empty()) { 30 Pattern = std::make_shared<Regex>(Val); 31 std::string RegexError; 32 if (!Pattern->isValid(RegexError)) 33 report_fatal_error(Twine("Invalid regular expression '") + Val + 34 "' in -pass-remarks: " + RegexError, 35 false); 36 } 37 } 38 }; 39 40 static PassRemarksOpt PassRemarksPassedOptLoc; 41 static PassRemarksOpt PassRemarksMissedOptLoc; 42 static PassRemarksOpt PassRemarksAnalysisOptLoc; 43 44 // -pass-remarks 45 // Command line flag to enable emitOptimizationRemark() 46 static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarks( 47 "pass-remarks", cl::value_desc("pattern"), 48 cl::desc("Enable optimization remarks from passes whose name match " 49 "the given regular expression"), 50 cl::Hidden, cl::location(PassRemarksPassedOptLoc), cl::ValueRequired, 51 cl::ZeroOrMore); 52 53 // -pass-remarks-missed 54 // Command line flag to enable emitOptimizationRemarkMissed() 55 static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed( 56 "pass-remarks-missed", cl::value_desc("pattern"), 57 cl::desc("Enable missed optimization remarks from passes whose name match " 58 "the given regular expression"), 59 cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired, 60 cl::ZeroOrMore); 61 62 // -pass-remarks-analysis 63 // Command line flag to enable emitOptimizationRemarkAnalysis() 64 static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> 65 PassRemarksAnalysis( 66 "pass-remarks-analysis", cl::value_desc("pattern"), 67 cl::desc( 68 "Enable optimization analysis remarks from passes whose name match " 69 "the given regular expression"), 70 cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired, 71 cl::ZeroOrMore); 72 } 73 74 bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const { 75 return (PassRemarksAnalysisOptLoc.Pattern && 76 PassRemarksAnalysisOptLoc.Pattern->match(PassName)); 77 } 78 bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const { 79 return (PassRemarksMissedOptLoc.Pattern && 80 PassRemarksMissedOptLoc.Pattern->match(PassName)); 81 } 82 bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const { 83 return (PassRemarksPassedOptLoc.Pattern && 84 PassRemarksPassedOptLoc.Pattern->match(PassName)); 85 } 86 87 bool DiagnosticHandler::isAnyRemarkEnabled() const { 88 return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern || 89 PassRemarksAnalysisOptLoc.Pattern); 90 } 91