88 lines · cpp
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-exception6//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 the20/// -pass-remarks* command line flags. Passes whose name matches this regexp21/// will emit a diagnostic when calling the associated diagnostic function22/// (emitOptimizationRemark, emitOptimizationRemarkMissed or23/// 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(Twine("Invalid regular expression '") + Val +34 "' in -pass-remarks: " + RegexError,35 false);36 }37 }38};39} // namespace40 41static PassRemarksOpt PassRemarksPassedOptLoc;42static PassRemarksOpt PassRemarksMissedOptLoc;43static PassRemarksOpt PassRemarksAnalysisOptLoc;44 45// -pass-remarks46// Command line flag to enable emitOptimizationRemark()47static 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 53// -pass-remarks-missed54// 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 61// -pass-remarks-analysis62// Command line flag to enable emitOptimizationRemarkAnalysis()63static cl::opt<PassRemarksOpt, true, cl::parser<std::string>>64 PassRemarksAnalysis(65 "pass-remarks-analysis", cl::value_desc("pattern"),66 cl::desc(67 "Enable optimization analysis remarks from passes whose name match "68 "the given regular expression"),69 cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired);70 71bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const {72 return (PassRemarksAnalysisOptLoc.Pattern &&73 PassRemarksAnalysisOptLoc.Pattern->match(PassName));74}75bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const {76 return (PassRemarksMissedOptLoc.Pattern &&77 PassRemarksMissedOptLoc.Pattern->match(PassName));78}79bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const {80 return (PassRemarksPassedOptLoc.Pattern &&81 PassRemarksPassedOptLoc.Pattern->match(PassName));82}83 84bool DiagnosticHandler::isAnyRemarkEnabled() const {85 return (PassRemarksPassedOptLoc.Pattern || PassRemarksMissedOptLoc.Pattern ||86 PassRemarksAnalysisOptLoc.Pattern);87}88