xref: /freebsd/contrib/llvm-project/llvm/lib/IR/DiagnosticHandler.cpp (revision 43a5ec4eb41567cc92586503212743d89686d78f)
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