1326938Sdim//===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===//
2326938Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6326938Sdim//
7326938Sdim//===----------------------------------------------------------------------===//
8326938Sdim//
9326938Sdim//
10326938Sdim//===----------------------------------------------------------------------===//
11326938Sdim#include "llvm/IR/DiagnosticHandler.h"
12326938Sdim#include "llvm/Support/CommandLine.h"
13326938Sdim#include "llvm/Support/Regex.h"
14326938Sdim
15326938Sdimusing namespace llvm;
16326938Sdim
17326938Sdimnamespace {
18326938Sdim
19341825Sdim/// Regular expression corresponding to the value given in one of the
20326938Sdim/// -pass-remarks* command line flags. Passes whose name matches this regexp
21326938Sdim/// will emit a diagnostic when calling the associated diagnostic function
22326938Sdim/// (emitOptimizationRemark, emitOptimizationRemarkMissed or
23326938Sdim/// emitOptimizationRemarkAnalysis).
24326938Sdimstruct PassRemarksOpt {
25326938Sdim  std::shared_ptr<Regex> Pattern;
26326938Sdim
27326938Sdim  void operator=(const std::string &Val) {
28326938Sdim    // Create a regexp object to match pass names for emitOptimizationRemark.
29326938Sdim    if (!Val.empty()) {
30326938Sdim      Pattern = std::make_shared<Regex>(Val);
31326938Sdim      std::string RegexError;
32326938Sdim      if (!Pattern->isValid(RegexError))
33326938Sdim        report_fatal_error("Invalid regular expression '" + Val +
34326938Sdim                               "' in -pass-remarks: " + RegexError,
35326938Sdim                           false);
36326938Sdim    }
37326938Sdim  }
38326938Sdim};
39326938Sdim
40326938Sdimstatic PassRemarksOpt PassRemarksPassedOptLoc;
41326938Sdimstatic PassRemarksOpt PassRemarksMissedOptLoc;
42326938Sdimstatic PassRemarksOpt PassRemarksAnalysisOptLoc;
43326938Sdim
44326938Sdim// -pass-remarks
45326938Sdim//    Command line flag to enable emitOptimizationRemark()
46326938Sdimstatic cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarks(
47326938Sdim    "pass-remarks", cl::value_desc("pattern"),
48326938Sdim    cl::desc("Enable optimization remarks from passes whose name match "
49326938Sdim             "the given regular expression"),
50326938Sdim    cl::Hidden, cl::location(PassRemarksPassedOptLoc), cl::ValueRequired,
51326938Sdim    cl::ZeroOrMore);
52326938Sdim
53326938Sdim// -pass-remarks-missed
54326938Sdim//    Command line flag to enable emitOptimizationRemarkMissed()
55326938Sdimstatic cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed(
56326938Sdim    "pass-remarks-missed", cl::value_desc("pattern"),
57326938Sdim    cl::desc("Enable missed optimization remarks from passes whose name match "
58326938Sdim             "the given regular expression"),
59326938Sdim    cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired,
60326938Sdim    cl::ZeroOrMore);
61326938Sdim
62326938Sdim// -pass-remarks-analysis
63326938Sdim//    Command line flag to enable emitOptimizationRemarkAnalysis()
64326938Sdimstatic cl::opt<PassRemarksOpt, true, cl::parser<std::string>>
65326938Sdim    PassRemarksAnalysis(
66326938Sdim        "pass-remarks-analysis", cl::value_desc("pattern"),
67326938Sdim        cl::desc(
68326938Sdim            "Enable optimization analysis remarks from passes whose name match "
69326938Sdim            "the given regular expression"),
70326938Sdim        cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired,
71326938Sdim        cl::ZeroOrMore);
72326938Sdim}
73326938Sdim
74326938Sdimbool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const {
75326938Sdim  return (PassRemarksAnalysisOptLoc.Pattern &&
76326938Sdim          PassRemarksAnalysisOptLoc.Pattern->match(PassName));
77326938Sdim}
78326938Sdimbool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const {
79326938Sdim  return (PassRemarksMissedOptLoc.Pattern &&
80326938Sdim          PassRemarksMissedOptLoc.Pattern->match(PassName));
81326938Sdim}
82326938Sdimbool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const {
83326938Sdim  return (PassRemarksPassedOptLoc.Pattern &&
84326938Sdim          PassRemarksPassedOptLoc.Pattern->match(PassName));
85326938Sdim}
86326938Sdim
87326938Sdimbool DiagnosticHandler::isAnyRemarkEnabled() const {
88326938Sdim  return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern ||
89326938Sdim          PassRemarksAnalysisOptLoc.Pattern);
90326938Sdim}
91