diff options
author | Diego Novillo <dnovillo@google.com> | 2014-04-08 16:42:38 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@google.com> | 2014-04-08 16:42:38 +0000 |
commit | 35d647b6f371265519df465ad1e7b28de7515185 (patch) | |
tree | ad63e722df8f390fd5ad581e07aebba71c5bb7e9 /lib | |
parent | ccbf1d2a05a63f18bedbeddffe930cc70d5f5823 (diff) | |
download | llvm-35d647b6f371265519df465ad1e7b28de7515185.tar.gz llvm-35d647b6f371265519df465ad1e7b28de7515185.tar.bz2 llvm-35d647b6f371265519df465ad1e7b28de7515185.tar.xz |
Add -pass-remarks flag to 'opt'.
Summary:
This adds support in 'opt' to filter pass remarks emitted by
optimization passes. A new flag -pass-remarks specifies which
passes should emit a diagnostic when LLVMContext::emitOptimizationRemark
is invoked.
This will allow the front end to simply pass along the regular
expression from its own -Rpass flag when launching the backend.
Depends on D3227.
Reviewers: qcolombet
CC: llvm-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D3291
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205775 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/IR/LLVMContext.cpp | 3 | ||||
-rw-r--r-- | lib/IR/LLVMContextImpl.cpp | 55 | ||||
-rw-r--r-- | lib/IR/LLVMContextImpl.h | 4 |
3 files changed, 61 insertions, 1 deletions
diff --git a/lib/IR/LLVMContext.cpp b/lib/IR/LLVMContext.cpp index 3f05561a2c..0c922005b7 100644 --- a/lib/IR/LLVMContext.cpp +++ b/lib/IR/LLVMContext.cpp @@ -160,7 +160,8 @@ void LLVMContext::emitOptimizationRemark(const char *PassName, const Function &Fn, const DebugLoc &DLoc, const Twine &Msg) { - diagnose(DiagnosticInfoOptimizationRemark(PassName, Fn, DLoc, Msg)); + if (pImpl->optimizationRemarksEnabledFor(PassName)) + diagnose(DiagnosticInfoOptimizationRemark(PassName, Fn, DLoc, Msg)); } //===----------------------------------------------------------------------===// diff --git a/lib/IR/LLVMContextImpl.cpp b/lib/IR/LLVMContextImpl.cpp index ebff9d3a51..d34f5b4841 100644 --- a/lib/IR/LLVMContextImpl.cpp +++ b/lib/IR/LLVMContextImpl.cpp @@ -15,6 +15,8 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/Module.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Regex.h" #include <algorithm> using namespace llvm; @@ -43,6 +45,59 @@ LLVMContextImpl::LLVMContextImpl(LLVMContext &C) } namespace { + +/// \brief Regular expression corresponding to the value given in the +/// command line flag -pass-remarks. Passes whose name matches this +/// regexp will emit a diagnostic when calling +/// LLVMContext::emitOptimizationRemark. +static Regex *OptimizationRemarkPattern = 0; + +/// \brief String to hold all the values passed via -pass-remarks. Every +/// instance of -pass-remarks on the command line will be concatenated +/// to this string. Values are stored inside braces and concatenated with +/// the '|' operator. This implements the expected semantics that multiple +/// -pass-remarks are additive. +static std::string OptimizationRemarkExpr; + +struct PassRemarksOpt { + void operator=(const std::string &Val) const { + // Create a regexp object to match pass names for emitOptimizationRemark. + if (!Val.empty()) { + if (!OptimizationRemarkExpr.empty()) + OptimizationRemarkExpr += "|"; + OptimizationRemarkExpr += "(" + Val + ")"; + delete OptimizationRemarkPattern; + OptimizationRemarkPattern = new Regex(OptimizationRemarkExpr); + std::string RegexError; + if (!OptimizationRemarkPattern->isValid(RegexError)) + report_fatal_error("Invalid regular expression '" + Val + + "' in -pass-remarks: " + RegexError, + false); + } + }; +}; + +static PassRemarksOpt PassRemarksOptLoc; + +// -pass-remarks +// Command line flag to enable LLVMContext::emitOptimizationRemark() +// and LLVMContext::emitOptimizationNote() calls. +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(PassRemarksOptLoc), cl::ValueRequired, + cl::ZeroOrMore); +} + +bool +LLVMContextImpl::optimizationRemarksEnabledFor(const char *PassName) const { + return OptimizationRemarkPattern && + OptimizationRemarkPattern->match(PassName); +} + + +namespace { struct DropReferences { // Takes the value_type of a ConstantUniqueMap's internal map, whose 'second' // is a Constant*. diff --git a/lib/IR/LLVMContextImpl.h b/lib/IR/LLVMContextImpl.h index dc77d291f4..48b3511367 100644 --- a/lib/IR/LLVMContextImpl.h +++ b/lib/IR/LLVMContextImpl.h @@ -368,6 +368,10 @@ public: typedef DenseMap<const Function *, ReturnInst *> PrefixDataMapTy; PrefixDataMapTy PrefixDataMap; + /// \brief Return true if the given pass name should emit optimization + /// remarks. + bool optimizationRemarksEnabledFor(const char *PassName) const; + int getOrAddScopeRecordIdxEntry(MDNode *N, int ExistingIdx); int getOrAddScopeInlinedAtIdxEntry(MDNode *Scope, MDNode *IA,int ExistingIdx); |