/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/lib/IR/DiagnosticHandler.cpp
Line | Count | Source |
1 | | //===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | // |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | #include "llvm/IR/DiagnosticHandler.h" |
13 | | #include "llvm/Support/CommandLine.h" |
14 | | #include "llvm/Support/Regex.h" |
15 | | |
16 | | using namespace llvm; |
17 | | |
18 | | namespace { |
19 | | |
20 | | /// \brief Regular expression corresponding to the value given in one of the |
21 | | /// -pass-remarks* command line flags. Passes whose name matches this regexp |
22 | | /// will emit a diagnostic when calling the associated diagnostic function |
23 | | /// (emitOptimizationRemark, emitOptimizationRemarkMissed or |
24 | | /// emitOptimizationRemarkAnalysis). |
25 | | struct PassRemarksOpt { |
26 | | std::shared_ptr<Regex> Pattern; |
27 | | |
28 | 251 | void operator=(const std::string &Val) { |
29 | 251 | // Create a regexp object to match pass names for emitOptimizationRemark. |
30 | 251 | if (!Val.empty()251 ) { |
31 | 251 | Pattern = std::make_shared<Regex>(Val); |
32 | 251 | std::string RegexError; |
33 | 251 | if (!Pattern->isValid(RegexError)) |
34 | 1 | report_fatal_error("Invalid regular expression '" + Val + |
35 | 1 | "' in -pass-remarks: " + RegexError, |
36 | 1 | false); |
37 | 250 | } |
38 | 251 | } |
39 | | }; |
40 | | |
41 | | static PassRemarksOpt PassRemarksPassedOptLoc; |
42 | | static PassRemarksOpt PassRemarksMissedOptLoc; |
43 | | static PassRemarksOpt PassRemarksAnalysisOptLoc; |
44 | | |
45 | | // -pass-remarks |
46 | | // Command line flag to enable emitOptimizationRemark() |
47 | | static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarks( |
48 | | "pass-remarks", cl::value_desc("pattern"), |
49 | | cl::desc("Enable optimization remarks from passes whose name match " |
50 | | "the given regular expression"), |
51 | | cl::Hidden, cl::location(PassRemarksPassedOptLoc), cl::ValueRequired, |
52 | | cl::ZeroOrMore); |
53 | | |
54 | | // -pass-remarks-missed |
55 | | // Command line flag to enable emitOptimizationRemarkMissed() |
56 | | static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed( |
57 | | "pass-remarks-missed", cl::value_desc("pattern"), |
58 | | cl::desc("Enable missed optimization remarks from passes whose name match " |
59 | | "the given regular expression"), |
60 | | cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired, |
61 | | cl::ZeroOrMore); |
62 | | |
63 | | // -pass-remarks-analysis |
64 | | // Command line flag to enable emitOptimizationRemarkAnalysis() |
65 | | static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> |
66 | | PassRemarksAnalysis( |
67 | | "pass-remarks-analysis", cl::value_desc("pattern"), |
68 | | cl::desc( |
69 | | "Enable optimization analysis remarks from passes whose name match " |
70 | | "the given regular expression"), |
71 | | cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired, |
72 | | cl::ZeroOrMore); |
73 | | } |
74 | | |
75 | 3.96M | bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const { |
76 | 3.96M | return (PassRemarksAnalysisOptLoc.Pattern && |
77 | 295 | PassRemarksAnalysisOptLoc.Pattern->match(PassName)); |
78 | 3.96M | } |
79 | 3.39M | bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const { |
80 | 3.39M | return (PassRemarksMissedOptLoc.Pattern && |
81 | 386 | PassRemarksMissedOptLoc.Pattern->match(PassName)); |
82 | 3.39M | } |
83 | 4.49M | bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const { |
84 | 4.49M | return (PassRemarksPassedOptLoc.Pattern && |
85 | 161 | PassRemarksPassedOptLoc.Pattern->match(PassName)); |
86 | 4.49M | } |
87 | | |
88 | 1.44M | bool DiagnosticHandler::isAnyRemarkEnabled() const { |
89 | 1.44M | return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern || |
90 | 1.44M | PassRemarksAnalysisOptLoc.Pattern); |
91 | 1.44M | } |