diff options
| author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-03-12 21:22:27 +0000 | 
|---|---|---|
| committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-03-12 21:22:27 +0000 | 
| commit | dd42236c6c126b39ccf79fb7e07068d244ae1b70 (patch) | |
| tree | 45331f35889d99eb9133729592053de2055ae54d /llvm/lib/LTO | |
| parent | b7605585179995cb73aa800b9b023919df8456a7 (diff) | |
| download | bcm5719-llvm-dd42236c6c126b39ccf79fb7e07068d244ae1b70.tar.gz bcm5719-llvm-dd42236c6c126b39ccf79fb7e07068d244ae1b70.zip  | |
Reland "[Remarks] Add -foptimization-record-passes to filter remark emission"
Currently we have -Rpass for filtering the remarks that are displayed as
diagnostics, but when using -fsave-optimization-record, there is no way
to filter the remarks while generating them.
This adds support for filtering remarks by passes using a regex.
Ex: `clang -fsave-optimization-record -foptimization-record-passes=inline`
will only emit the remarks coming from the pass `inline`.
This adds:
* `-fsave-optimization-record` to the driver
* `-opt-record-passes` to cc1
* `-lto-pass-remarks-filter` to the LTOCodeGenerator
* `--opt-remarks-passes` to lld
* `-pass-remarks-filter` to llc, opt, llvm-lto, llvm-lto2
* `-opt-remarks-passes` to gold-plugin
Differential Revision: https://reviews.llvm.org/D59268
Original llvm-svn: 355964
llvm-svn: 355984
Diffstat (limited to 'llvm/lib/LTO')
| -rw-r--r-- | llvm/lib/LTO/LTO.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/LTO/LTOBackend.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/LTO/LTOCodeGenerator.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 4 | 
4 files changed, 21 insertions, 5 deletions
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index f6e34c5d061..99318c19a89 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -1312,6 +1312,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache) {  Expected<std::unique_ptr<ToolOutputFile>>  lto::setupOptimizationRemarks(LLVMContext &Context,                                StringRef LTORemarksFilename, +                              StringRef LTORemarksPasses,                                bool LTOPassRemarksWithHotness, int Count) {    if (LTOPassRemarksWithHotness)      Context.setDiagnosticsHotnessRequested(true); @@ -1329,6 +1330,11 @@ lto::setupOptimizationRemarks(LLVMContext &Context,      return errorCodeToError(EC);    Context.setRemarkStreamer(        llvm::make_unique<RemarkStreamer>(Filename, DiagnosticFile->os())); + +  if (!LTORemarksPasses.empty()) +    if (Error E = Context.getRemarkStreamer()->setFilter(LTORemarksPasses)) +      return std::move(E); +    DiagnosticFile->keep();    return std::move(DiagnosticFile);  } diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp index 0595771bd00..64c596931fa 100644 --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -429,8 +429,9 @@ Error lto::backend(Config &C, AddStreamFn AddStream,    std::unique_ptr<TargetMachine> TM = createTargetMachine(C, *TOrErr, *Mod);    // Setup optimization remarks. -  auto DiagFileOrErr = lto::setupOptimizationRemarks( -      Mod->getContext(), C.RemarksFilename, C.RemarksWithHotness); +  auto DiagFileOrErr = +      lto::setupOptimizationRemarks(Mod->getContext(), C.RemarksFilename, +                                    C.RemarksPasses, C.RemarksWithHotness);    if (!DiagFileOrErr)      return DiagFileOrErr.takeError();    auto DiagnosticOutputFile = std::move(*DiagFileOrErr); @@ -484,7 +485,8 @@ Error lto::thinBackend(Config &Conf, unsigned Task, AddStreamFn AddStream,    // Setup optimization remarks.    auto DiagFileOrErr = lto::setupOptimizationRemarks( -      Mod.getContext(), Conf.RemarksFilename, Conf.RemarksWithHotness, Task); +      Mod.getContext(), Conf.RemarksFilename, Conf.RemarksPasses, +      Conf.RemarksWithHotness, Task);    if (!DiagFileOrErr)      return DiagFileOrErr.takeError();    auto DiagnosticOutputFile = std::move(*DiagFileOrErr); diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index 1b1de2ba187..f02907f7a86 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -85,6 +85,12 @@ cl::opt<std::string>                         cl::desc("Output filename for pass remarks"),                         cl::value_desc("filename")); +cl::opt<std::string> +    LTORemarksPasses("lto-pass-remarks-filter", +                     cl::desc("Only record optimization remarks from passes " +                              "whose names match the given regular expression"), +                     cl::value_desc("regex")); +  cl::opt<bool> LTOPassRemarksWithHotness(      "lto-pass-remarks-with-hotness",      cl::desc("With PGO, include profile count in optimization remarks"), @@ -505,7 +511,7 @@ bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline,      return false;    auto DiagFileOrErr = lto::setupOptimizationRemarks( -      Context, LTORemarksFilename, LTOPassRemarksWithHotness); +      Context, LTORemarksFilename, LTORemarksPasses, LTOPassRemarksWithHotness);    if (!DiagFileOrErr) {      errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";      report_fatal_error("Can't get an output file for the remarks"); diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp index 557afd6c360..d4ee66a53e0 100644 --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -70,6 +70,7 @@ namespace llvm {  // Flags -discard-value-names, defined in LTOCodeGenerator.cpp  extern cl::opt<bool> LTODiscardValueNames;  extern cl::opt<std::string> LTORemarksFilename; +extern cl::opt<std::string> LTORemarksPasses;  extern cl::opt<bool> LTOPassRemarksWithHotness;  } @@ -972,7 +973,8 @@ void ThinLTOCodeGenerator::run() {          Context.setDiscardValueNames(LTODiscardValueNames);          Context.enableDebugTypeODRUniquing();          auto DiagFileOrErr = lto::setupOptimizationRemarks( -            Context, LTORemarksFilename, LTOPassRemarksWithHotness, count); +            Context, LTORemarksFilename, LTORemarksPasses, +            LTOPassRemarksWithHotness, count);          if (!DiagFileOrErr) {            errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";            report_fatal_error("ThinLTO: Can't get an output file for the "  | 

