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 15using namespace llvm; 16 17namespace { 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). 24struct 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("Invalid regular expression '" + Val + 34 "' in -pass-remarks: " + RegexError, 35 false); 36 } 37 } 38}; 39 40static PassRemarksOpt PassRemarksPassedOptLoc; 41static PassRemarksOpt PassRemarksMissedOptLoc; 42static PassRemarksOpt PassRemarksAnalysisOptLoc; 43 44// -pass-remarks 45// Command line flag to enable emitOptimizationRemark() 46static 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() 55static 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() 64static 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 74bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const { 75 return (PassRemarksAnalysisOptLoc.Pattern && 76 PassRemarksAnalysisOptLoc.Pattern->match(PassName)); 77} 78bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const { 79 return (PassRemarksMissedOptLoc.Pattern && 80 PassRemarksMissedOptLoc.Pattern->match(PassName)); 81} 82bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const { 83 return (PassRemarksPassedOptLoc.Pattern && 84 PassRemarksPassedOptLoc.Pattern->match(PassName)); 85} 86 87bool DiagnosticHandler::isAnyRemarkEnabled() const { 88 return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern || 89 PassRemarksAnalysisOptLoc.Pattern); 90} 91