forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
#include "llvm/IR/DiagnosticHandler.h"
 | 
						|
#include "llvm/Support/CommandLine.h"
 | 
						|
#include "llvm/Support/Regex.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
namespace {
 | 
						|
 | 
						|
/// 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);
 | 
						|
}
 |