Home | History | Annotate | Line # | Download | only in IR
      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("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