| //===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/IR/DiagnosticHandler.h" | |
| #include "llvm/Support/CommandLine.h" | |
| #include "llvm/Support/Regex.h" | |
| using namespace llvm; | |
| namespace { | |
| /// Regular expression corresponding to the value given in one of the | |
| /// -pass-remarks* command line flags. Passes whose name matches this regexp | |
| /// will emit a diagnostic when calling the associated diagnostic function | |
| /// (emitOptimizationRemark, emitOptimizationRemarkMissed or | |
| /// emitOptimizationRemarkAnalysis). | |
| struct PassRemarksOpt { | |
| std::shared_ptr<Regex> Pattern; | |
| void operator=(const std::string &Val) { | |
| // Create a regexp object to match pass names for emitOptimizationRemark. | |
| if (!Val.empty()) { | |
| Pattern = std::make_shared<Regex>(Val); | |
| std::string RegexError; | |
| if (!Pattern->isValid(RegexError)) | |
| report_fatal_error("Invalid regular expression '" + Val + | |
| "' in -pass-remarks: " + RegexError, | |
| false); | |
| } | |
| } | |
| }; | |
| static PassRemarksOpt PassRemarksPassedOptLoc; | |
| static PassRemarksOpt PassRemarksMissedOptLoc; | |
| static PassRemarksOpt PassRemarksAnalysisOptLoc; | |
| // -pass-remarks | |
| // Command line flag to enable emitOptimizationRemark() | |
| static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarks( | |
| "pass-remarks", cl::value_desc("pattern"), | |
| cl::desc("Enable optimization remarks from passes whose name match " | |
| "the given regular expression"), | |
| cl::Hidden, cl::location(PassRemarksPassedOptLoc), cl::ValueRequired, | |
| cl::ZeroOrMore); | |
| // -pass-remarks-missed | |
| // Command line flag to enable emitOptimizationRemarkMissed() | |
| static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed( | |
| "pass-remarks-missed", cl::value_desc("pattern"), | |
| cl::desc("Enable missed optimization remarks from passes whose name match " | |
| "the given regular expression"), | |
| cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired, | |
| cl::ZeroOrMore); | |
| // -pass-remarks-analysis | |
| // Command line flag to enable emitOptimizationRemarkAnalysis() | |
| static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> | |
| PassRemarksAnalysis( | |
| "pass-remarks-analysis", cl::value_desc("pattern"), | |
| cl::desc( | |
| "Enable optimization analysis remarks from passes whose name match " | |
| "the given regular expression"), | |
| cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired, | |
| cl::ZeroOrMore); | |
| } | |
| bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const { | |
| return (PassRemarksAnalysisOptLoc.Pattern && | |
| PassRemarksAnalysisOptLoc.Pattern->match(PassName)); | |
| } | |
| bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const { | |
| return (PassRemarksMissedOptLoc.Pattern && | |
| PassRemarksMissedOptLoc.Pattern->match(PassName)); | |
| } | |
| bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const { | |
| return (PassRemarksPassedOptLoc.Pattern && | |
| PassRemarksPassedOptLoc.Pattern->match(PassName)); | |
| } | |
| bool DiagnosticHandler::isAnyRemarkEnabled() const { | |
| return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern || | |
| PassRemarksAnalysisOptLoc.Pattern); | |
| } |