diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 | 
| commit | 044eb2f6afba375a914ac9d8024f8f5142bb912e (patch) | |
| tree | 1475247dc9f9fe5be155ebd4c9069c75aadf8c20 /lib/IR/DiagnosticHandler.cpp | |
| parent | eb70dddbd77e120e5d490bd8fbe7ff3f8fa81c6b (diff) | |
Notes
Diffstat (limited to 'lib/IR/DiagnosticHandler.cpp')
| -rw-r--r-- | lib/IR/DiagnosticHandler.cpp | 91 | 
1 files changed, 91 insertions, 0 deletions
diff --git a/lib/IR/DiagnosticHandler.cpp b/lib/IR/DiagnosticHandler.cpp new file mode 100644 index 000000000000..fb1ac438ffbe --- /dev/null +++ b/lib/IR/DiagnosticHandler.cpp @@ -0,0 +1,91 @@ +//===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// +//===----------------------------------------------------------------------===// +#include "llvm/IR/DiagnosticHandler.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Regex.h" + +using namespace llvm; + +namespace { + +/// \brief Regular expression corresponding to the value given in one of the +/// -pass-remarks* command line flags. Passes whose name matches this regexp +/// will emit a diagnostic when calling the associated diagnostic function +/// (emitOptimizationRemark, emitOptimizationRemarkMissed or +/// emitOptimizationRemarkAnalysis). +struct PassRemarksOpt { +  std::shared_ptr<Regex> Pattern; + +  void operator=(const std::string &Val) { +    // Create a regexp object to match pass names for emitOptimizationRemark. +    if (!Val.empty()) { +      Pattern = std::make_shared<Regex>(Val); +      std::string RegexError; +      if (!Pattern->isValid(RegexError)) +        report_fatal_error("Invalid regular expression '" + Val + +                               "' in -pass-remarks: " + RegexError, +                           false); +    } +  } +}; + +static PassRemarksOpt PassRemarksPassedOptLoc; +static PassRemarksOpt PassRemarksMissedOptLoc; +static PassRemarksOpt PassRemarksAnalysisOptLoc; + +// -pass-remarks +//    Command line flag to enable emitOptimizationRemark() +static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarks( +    "pass-remarks", cl::value_desc("pattern"), +    cl::desc("Enable optimization remarks from passes whose name match " +             "the given regular expression"), +    cl::Hidden, cl::location(PassRemarksPassedOptLoc), cl::ValueRequired, +    cl::ZeroOrMore); + +// -pass-remarks-missed +//    Command line flag to enable emitOptimizationRemarkMissed() +static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed( +    "pass-remarks-missed", cl::value_desc("pattern"), +    cl::desc("Enable missed optimization remarks from passes whose name match " +             "the given regular expression"), +    cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired, +    cl::ZeroOrMore); + +// -pass-remarks-analysis +//    Command line flag to enable emitOptimizationRemarkAnalysis() +static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> +    PassRemarksAnalysis( +        "pass-remarks-analysis", cl::value_desc("pattern"), +        cl::desc( +            "Enable optimization analysis remarks from passes whose name match " +            "the given regular expression"), +        cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired, +        cl::ZeroOrMore); +} + +bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const { +  return (PassRemarksAnalysisOptLoc.Pattern && +          PassRemarksAnalysisOptLoc.Pattern->match(PassName)); +} +bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const { +  return (PassRemarksMissedOptLoc.Pattern && +          PassRemarksMissedOptLoc.Pattern->match(PassName)); +} +bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const { +  return (PassRemarksPassedOptLoc.Pattern && +          PassRemarksPassedOptLoc.Pattern->match(PassName)); +} + +bool DiagnosticHandler::isAnyRemarkEnabled() const { +  return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern || +          PassRemarksAnalysisOptLoc.Pattern); +}  | 
