1326938Sdim//===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===// 2326938Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6326938Sdim// 7326938Sdim//===----------------------------------------------------------------------===// 8326938Sdim// 9326938Sdim// 10326938Sdim//===----------------------------------------------------------------------===// 11326938Sdim#include "llvm/IR/DiagnosticHandler.h" 12326938Sdim#include "llvm/Support/CommandLine.h" 13326938Sdim#include "llvm/Support/Regex.h" 14326938Sdim 15326938Sdimusing namespace llvm; 16326938Sdim 17326938Sdimnamespace { 18326938Sdim 19341825Sdim/// Regular expression corresponding to the value given in one of the 20326938Sdim/// -pass-remarks* command line flags. Passes whose name matches this regexp 21326938Sdim/// will emit a diagnostic when calling the associated diagnostic function 22326938Sdim/// (emitOptimizationRemark, emitOptimizationRemarkMissed or 23326938Sdim/// emitOptimizationRemarkAnalysis). 24326938Sdimstruct PassRemarksOpt { 25326938Sdim std::shared_ptr<Regex> Pattern; 26326938Sdim 27326938Sdim void operator=(const std::string &Val) { 28326938Sdim // Create a regexp object to match pass names for emitOptimizationRemark. 29326938Sdim if (!Val.empty()) { 30326938Sdim Pattern = std::make_shared<Regex>(Val); 31326938Sdim std::string RegexError; 32326938Sdim if (!Pattern->isValid(RegexError)) 33326938Sdim report_fatal_error("Invalid regular expression '" + Val + 34326938Sdim "' in -pass-remarks: " + RegexError, 35326938Sdim false); 36326938Sdim } 37326938Sdim } 38326938Sdim}; 39326938Sdim 40326938Sdimstatic PassRemarksOpt PassRemarksPassedOptLoc; 41326938Sdimstatic PassRemarksOpt PassRemarksMissedOptLoc; 42326938Sdimstatic PassRemarksOpt PassRemarksAnalysisOptLoc; 43326938Sdim 44326938Sdim// -pass-remarks 45326938Sdim// Command line flag to enable emitOptimizationRemark() 46326938Sdimstatic cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarks( 47326938Sdim "pass-remarks", cl::value_desc("pattern"), 48326938Sdim cl::desc("Enable optimization remarks from passes whose name match " 49326938Sdim "the given regular expression"), 50326938Sdim cl::Hidden, cl::location(PassRemarksPassedOptLoc), cl::ValueRequired, 51326938Sdim cl::ZeroOrMore); 52326938Sdim 53326938Sdim// -pass-remarks-missed 54326938Sdim// Command line flag to enable emitOptimizationRemarkMissed() 55326938Sdimstatic cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed( 56326938Sdim "pass-remarks-missed", cl::value_desc("pattern"), 57326938Sdim cl::desc("Enable missed optimization remarks from passes whose name match " 58326938Sdim "the given regular expression"), 59326938Sdim cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired, 60326938Sdim cl::ZeroOrMore); 61326938Sdim 62326938Sdim// -pass-remarks-analysis 63326938Sdim// Command line flag to enable emitOptimizationRemarkAnalysis() 64326938Sdimstatic cl::opt<PassRemarksOpt, true, cl::parser<std::string>> 65326938Sdim PassRemarksAnalysis( 66326938Sdim "pass-remarks-analysis", cl::value_desc("pattern"), 67326938Sdim cl::desc( 68326938Sdim "Enable optimization analysis remarks from passes whose name match " 69326938Sdim "the given regular expression"), 70326938Sdim cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired, 71326938Sdim cl::ZeroOrMore); 72326938Sdim} 73326938Sdim 74326938Sdimbool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const { 75326938Sdim return (PassRemarksAnalysisOptLoc.Pattern && 76326938Sdim PassRemarksAnalysisOptLoc.Pattern->match(PassName)); 77326938Sdim} 78326938Sdimbool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const { 79326938Sdim return (PassRemarksMissedOptLoc.Pattern && 80326938Sdim PassRemarksMissedOptLoc.Pattern->match(PassName)); 81326938Sdim} 82326938Sdimbool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const { 83326938Sdim return (PassRemarksPassedOptLoc.Pattern && 84326938Sdim PassRemarksPassedOptLoc.Pattern->match(PassName)); 85326938Sdim} 86326938Sdim 87326938Sdimbool DiagnosticHandler::isAnyRemarkEnabled() const { 88326938Sdim return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern || 89326938Sdim PassRemarksAnalysisOptLoc.Pattern); 90326938Sdim} 91