1 //===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===//
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
7 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
11 #include "llvm/IR/DiagnosticHandler.h"
12 #include "llvm/Support/CommandLine.h"
13 #include "llvm/Support/Regex.h"
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
;
27 void operator=(const std::string
&Val
) {
28 // Create a regexp object to match pass names for emitOptimizationRemark.
30 Pattern
= std::make_shared
<Regex
>(Val
);
31 std::string RegexError
;
32 if (!Pattern
->isValid(RegexError
))
33 report_fatal_error(Twine("Invalid regular expression '") + Val
+
34 "' in -pass-remarks: " + RegexError
,
40 static PassRemarksOpt PassRemarksPassedOptLoc
;
41 static PassRemarksOpt PassRemarksMissedOptLoc
;
42 static PassRemarksOpt PassRemarksAnalysisOptLoc
;
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
);
52 // -pass-remarks-missed
53 // Command line flag to enable emitOptimizationRemarkMissed()
54 static cl::opt
<PassRemarksOpt
, true, cl::parser
<std::string
>> PassRemarksMissed(
55 "pass-remarks-missed", cl::value_desc("pattern"),
56 cl::desc("Enable missed optimization remarks from passes whose name match "
57 "the given regular expression"),
58 cl::Hidden
, cl::location(PassRemarksMissedOptLoc
), cl::ValueRequired
);
60 // -pass-remarks-analysis
61 // Command line flag to enable emitOptimizationRemarkAnalysis()
62 static cl::opt
<PassRemarksOpt
, true, cl::parser
<std::string
>>
64 "pass-remarks-analysis", cl::value_desc("pattern"),
66 "Enable optimization analysis remarks from passes whose name match "
67 "the given regular expression"),
68 cl::Hidden
, cl::location(PassRemarksAnalysisOptLoc
), cl::ValueRequired
);
71 bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName
) const {
72 return (PassRemarksAnalysisOptLoc
.Pattern
&&
73 PassRemarksAnalysisOptLoc
.Pattern
->match(PassName
));
75 bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName
) const {
76 return (PassRemarksMissedOptLoc
.Pattern
&&
77 PassRemarksMissedOptLoc
.Pattern
->match(PassName
));
79 bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName
) const {
80 return (PassRemarksPassedOptLoc
.Pattern
&&
81 PassRemarksPassedOptLoc
.Pattern
->match(PassName
));
84 bool DiagnosticHandler::isAnyRemarkEnabled() const {
85 return (PassRemarksPassedOptLoc
.Pattern
|| PassRemarksMissedOptLoc
.Pattern
||
86 PassRemarksAnalysisOptLoc
.Pattern
);