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
15using namespace llvm;
16
17namespace {
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).
24struct 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
40static PassRemarksOpt PassRemarksPassedOptLoc;
41static PassRemarksOpt PassRemarksMissedOptLoc;
42static PassRemarksOpt PassRemarksAnalysisOptLoc;
43
44// -pass-remarks
45//    Command line flag to enable emitOptimizationRemark()
46static 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()
55static 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()
64static 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
74bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const {
75  return (PassRemarksAnalysisOptLoc.Pattern &&
76          PassRemarksAnalysisOptLoc.Pattern->match(PassName));
77}
78bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const {
79  return (PassRemarksMissedOptLoc.Pattern &&
80          PassRemarksMissedOptLoc.Pattern->match(PassName));
81}
82bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const {
83  return (PassRemarksPassedOptLoc.Pattern &&
84          PassRemarksPassedOptLoc.Pattern->match(PassName));
85}
86
87bool DiagnosticHandler::isAnyRemarkEnabled() const {
88  return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern ||
89          PassRemarksAnalysisOptLoc.Pattern);
90}
91