r282426 - CC1: Add -save-stats option

Hal Finkel via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 26 12:05:40 PDT 2016


Nice!

 -Hal

----- Original Message -----
> From: "Matthias Braun via cfe-commits" <cfe-commits at lists.llvm.org>
> To: cfe-commits at lists.llvm.org
> Sent: Monday, September 26, 2016 1:53:34 PM
> Subject: r282426 - CC1: Add -save-stats option
> 
> Author: matze
> Date: Mon Sep 26 13:53:34 2016
> New Revision: 282426
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=282426&view=rev
> Log:
> CC1: Add -save-stats option
> 
> This option behaves in a similar spirit as -save-temps and writes
> internal llvm statistics in json format to a file.
> 
> Differential Revision: https://reviews.llvm.org/D24820
> 
> Added:
>     cfe/trunk/test/Driver/save-stats.c
>     cfe/trunk/test/Frontend/stats-file.c
> Modified:
>     cfe/trunk/docs/CommandGuide/clang.rst
>     cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
>     cfe/trunk/include/clang/Driver/CC1Options.td
>     cfe/trunk/include/clang/Driver/Options.td
>     cfe/trunk/include/clang/Frontend/FrontendOptions.h
>     cfe/trunk/lib/Driver/Tools.cpp
>     cfe/trunk/lib/Frontend/CompilerInstance.cpp
>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>     cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>     cfe/trunk/test/Misc/warning-flags.c
> 
> Modified: cfe/trunk/docs/CommandGuide/clang.rst
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/CommandGuide/clang.rst?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/docs/CommandGuide/clang.rst (original)
> +++ cfe/trunk/docs/CommandGuide/clang.rst Mon Sep 26 13:53:34 2016
> @@ -408,6 +408,12 @@ Driver Options
>  
>    Save intermediate compilation results.
>  
> +.. option:: -save-stats, -save-stats=cwd, -save-stats=obj
> +
> +  Save internal code generation (LLVM) statistics to a file in the
> current
> +  directory (:option:`-save-stats`/:option:`-save-stats=cwd`) or the
> directory
> +  of the output file (:option:`-save-state=obj`).
> +
>  .. option:: -integrated-as, -no-integrated-as
>  
>    Used to enable and disable, respectively, the use of the
>    integrated
> 
> Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Mon Sep
> 26 13:53:34 2016
> @@ -107,6 +107,8 @@ def warn_fe_cc_print_header_failure : Wa
>      "unable to open CC_PRINT_HEADERS file: %0 (using stderr)">;
>  def warn_fe_cc_log_diagnostics_failure : Warning<
>      "unable to open CC_LOG_DIAGNOSTICS file: %0 (using stderr)">;
> +def warn_fe_unable_to_open_stats_file : Warning<
> +    "unable to open statistics output file '%0': '%1'">;
>  def err_fe_no_pch_in_dir : Error<
>      "no suitable precompiled header file found in directory '%0'">;
>  def err_fe_action_not_available : Error<
> 
> Modified: cfe/trunk/include/clang/Driver/CC1Options.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
> +++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Sep 26 13:53:34
> 2016
> @@ -509,6 +509,8 @@ def arcmt_migrate : Flag<["-"], "arcmt-m
>  
>  def print_stats : Flag<["-"], "print-stats">,
>    HelpText<"Print performance metrics and statistics">;
> +def stats_file : Joined<["-"], "stats-file=">,
> +  HelpText<"Filename to write statistics to">;
>  def fdump_record_layouts : Flag<["-"], "fdump-record-layouts">,
>    HelpText<"Dump record layout information">;
>  def fdump_record_layouts_simple : Flag<["-"],
>  "fdump-record-layouts-simple">,
> 
> Modified: cfe/trunk/include/clang/Driver/Options.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Options.td (original)
> +++ cfe/trunk/include/clang/Driver/Options.td Mon Sep 26 13:53:34
> 2016
> @@ -1876,6 +1876,11 @@ def save_temps_EQ : Joined<["-", "--"],
>  def save_temps : Flag<["-", "--"], "save-temps">,
>  Flags<[DriverOption]>,
>    Alias<save_temps_EQ>, AliasArgs<["cwd"]>,
>    HelpText<"Save intermediate compilation results">;
> +def save_stats_EQ : Joined<["-", "--"], "save-stats=">,
> Flags<[DriverOption]>,
> +  HelpText<"Save llvm statistics.">;
> +def save_stats : Flag<["-", "--"], "save-stats">,
> Flags<[DriverOption]>,
> +  Alias<save_stats_EQ>, AliasArgs<["cwd"]>,
> +  HelpText<"Save llvm statistics.">;
>  def via_file_asm : Flag<["-", "--"], "via-file-asm">,
>  InternalDebugOpt,
>    HelpText<"Write assembly to file for input to assemble jobs">;
>  def sectalign : MultiArg<["-"], "sectalign", 3>;
> 
> Modified: cfe/trunk/include/clang/Frontend/FrontendOptions.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendOptions.h?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/FrontendOptions.h (original)
> +++ cfe/trunk/include/clang/Frontend/FrontendOptions.h Mon Sep 26
> 13:53:34 2016
> @@ -273,6 +273,9 @@ public:
>    // included by this file.
>    std::string FindPchSource;
>  
> +  /// Filename to write statistics to.
> +  std::string StatsFile;
> +
>  public:
>    FrontendOptions() :
>      DisableFree(false), RelocatablePCH(false), ShowHelp(false),
> 
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Mon Sep 26 13:53:34 2016
> @@ -6107,6 +6107,33 @@ void Clang::ConstructJob(Compilation &C,
>      A->claim();
>    }
>  
> +  // Setup statistics file output.
> +  if (const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ)) {
> +    StringRef SaveStats = A->getValue();
> +
> +    SmallString<128> StatsFile;
> +    bool DoSaveStats = false;
> +    if (SaveStats == "obj") {
> +      if (Output.isFilename()) {
> +        StatsFile.assign(Output.getFilename());
> +        llvm::sys::path::remove_filename(StatsFile);
> +      }
> +      DoSaveStats = true;
> +    } else if (SaveStats == "cwd") {
> +      DoSaveStats = true;
> +    } else {
> +      D.Diag(diag::err_drv_invalid_value) << A->getAsString(Args) <<
> SaveStats;
> +    }
> +
> +    if (DoSaveStats) {
> +      StringRef BaseName =
> llvm::sys::path::filename(Input.getBaseInput());
> +      llvm::sys::path::append(StatsFile, BaseName);
> +      llvm::sys::path::replace_extension(StatsFile, "stats");
> +      CmdArgs.push_back(Args.MakeArgString(Twine("-stats-file=") +
> +                                           StatsFile));
> +    }
> +  }
> +
>    // Forward -Xclang arguments to -cc1, and -mllvm arguments to the
>    LLVM option
>    // parser.
>    Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
> 
> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Mon Sep 26 13:53:34
> 2016
> @@ -858,7 +858,7 @@ bool CompilerInstance::ExecuteAction(Fro
>    if (getFrontendOpts().ShowTimers)
>      createFrontendTimer();
>  
> -  if (getFrontendOpts().ShowStats)
> +  if (getFrontendOpts().ShowStats ||
> !getFrontendOpts().StatsFile.empty())
>      llvm::EnableStatistics();
>  
>    for (const FrontendInputFile &FIF : getFrontendOpts().Inputs) {
> @@ -892,9 +892,24 @@ bool CompilerInstance::ExecuteAction(Fro
>        OS << " generated.\n";
>    }
>  
> -  if (getFrontendOpts().ShowStats && hasFileManager()) {
> -    getFileManager().PrintStats();
> -    OS << "\n";
> +  if (getFrontendOpts().ShowStats) {
> +    if (hasFileManager()) {
> +      getFileManager().PrintStats();
> +      OS << '\n';
> +    }
> +    llvm::PrintStatistics(OS);
> +  }
> +  StringRef StatsFile = getFrontendOpts().StatsFile;
> +  if (!StatsFile.empty()) {
> +    std::error_code EC;
> +    auto StatS = llvm::make_unique<llvm::raw_fd_ostream>(StatsFile,
> EC,
> +
>                                                         llvm::sys::fs::F_Text);
> +    if (EC) {
> +
>      getDiagnostics().Report(diag::warn_fe_unable_to_open_stats_file)
> +          << StatsFile << EC.message();
> +    } else {
> +      llvm::PrintStatisticsJSON(*StatS);
> +    }
>    }
>  
>    return !getDiagnostics().getClient()->getNumErrors();
> 
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Sep 26 13:53:34
> 2016
> @@ -1252,6 +1252,7 @@ static InputKind ParseFrontendArgs(Front
>    Opts.AuxTriple =
>        llvm::Triple::normalize(Args.getLastArgValue(OPT_aux_triple));
>    Opts.FindPchSource = Args.getLastArgValue(OPT_find_pch_source_EQ);
> +  Opts.StatsFile = Args.getLastArgValue(OPT_stats_file);
>  
>    if (const Arg *A = Args.getLastArg(OPT_arcmt_check,
>                                       OPT_arcmt_modify,
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp Mon
> Sep 26 13:53:34 2016
> @@ -194,8 +194,10 @@ public:
>    }
>  
>    ~AnalysisConsumer() override {
> -    if (Opts->PrintStats)
> +    if (Opts->PrintStats) {
>        delete TUTotalTimer;
> +      llvm::PrintStatistics();
> +    }
>    }
>  
>    void DigestAnalyzerOptions() {
> 
> Added: cfe/trunk/test/Driver/save-stats.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/save-stats.c?rev=282426&view=auto
> ==============================================================================
> --- cfe/trunk/test/Driver/save-stats.c (added)
> +++ cfe/trunk/test/Driver/save-stats.c Mon Sep 26 13:53:34 2016
> @@ -0,0 +1,20 @@
> +// RUN: %clang -target x86_64-apple-darwin -save-stats %s -### 2>&1
> | FileCheck %s
> +// RUN: %clang -target x86_64-apple-darwin -save-stats=cwd %s -###
> 2>&1 | FileCheck %s
> +// CHECK: "-stats-file=save-stats.stats"
> +// CHECK: "{{.*}}save-stats.c"
> +
> +// RUN: %clang -target x86_64-apple-darwin -S %s -### 2>&1 |
> FileCheck %s -check-prefix=NO-STATS
> +// NO-STATS-NO: -stats-file
> +// NO-STATS: "{{.*}}save-stats.c"
> +// NO-STATS-NO: -stats-file
> +
> +// RUN: %clang -target x86_64-apple-darwin -save-stats=obj -c -o
> obj/dir/save-stats.o %s -### 2>&1 | FileCheck %s
> -check-prefix=CHECK-OBJ
> +// CHECK-OBJ: "-stats-file=obj/dir{{.}}save-stats.stats"
> +// CHECK-OBJ: "-o" "obj/dir{{.}}save-stats.o"
> +
> +// RUN: %clang -target x86_64-apple-darwin -save-stats=obj -c %s
> -### 2>&1 | FileCheck %s -check-prefix=CHECK-OBJ-NOO
> +// CHECK-OBJ-NOO: "-stats-file=save-stats.stats"
> +// CHECK-OBJ-NOO: "-o" "save-stats.o"
> +
> +// RUN: %clang -target x86_64-apple-darwin -save-stats=bla -c %s
> -### 2>&1 | FileCheck %s -check-prefix=CHECK-INVALID
> +// CHECK-INVALID: invalid value 'bla' in '-save-stats=bla'
> 
> Added: cfe/trunk/test/Frontend/stats-file.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/stats-file.c?rev=282426&view=auto
> ==============================================================================
> --- cfe/trunk/test/Frontend/stats-file.c (added)
> +++ cfe/trunk/test/Frontend/stats-file.c Mon Sep 26 13:53:34 2016
> @@ -0,0 +1,8 @@
> +// RUN: %clang_cc1 -emit-llvm -o /dev/null -stats-file=%t %s
> +// RUN: FileCheck -input-file=%t %s
> +// CHECK: {
> +//  ... here come some json values ...
> +// CHECK: }
> +
> +// RUN: %clang_cc1 -emit-llvm -o %t -stats-file=%S/doesnotexist/bla
> %s 2>&1 | FileCheck -check-prefix=OUTPUTFAIL %s
> +// OUTPUTFAIL: warning: unable to open statistics output file
> '{{.*}}doesnotexist{{.}}bla': '{{[Nn]}}o such file or directory'
> 
> Modified: cfe/trunk/test/Misc/warning-flags.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/warning-flags.c?rev=282426&r1=282425&r2=282426&view=diff
> ==============================================================================
> --- cfe/trunk/test/Misc/warning-flags.c (original)
> +++ cfe/trunk/test/Misc/warning-flags.c Mon Sep 26 13:53:34 2016
> @@ -18,7 +18,7 @@ This test serves two purposes:
>  
>  The list of warnings below should NEVER grow.  It should gradually
>  shrink to 0.
>  
> -CHECK: Warnings without flags (84):
> +CHECK: Warnings without flags (85):
>  CHECK-NEXT:   ext_excess_initializers
>  CHECK-NEXT:   ext_excess_initializers_in_char_array_initializer
>  CHECK-NEXT:   ext_expected_semi_decl_list
> @@ -66,6 +66,7 @@ CHECK-NEXT:   warn_extraneous_char_const
>  CHECK-NEXT:   warn_fe_cc_log_diagnostics_failure
>  CHECK-NEXT:   warn_fe_cc_print_header_failure
>  CHECK-NEXT:   warn_fe_macro_contains_embedded_newline
> +CHECK-NEXT:   warn_fe_unable_to_open_stats_file
>  CHECK-NEXT:   warn_file_asm_volatile
>  CHECK-NEXT:   warn_ignoring_ftabstop_value
>  CHECK-NEXT:   warn_implements_nscopying
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> 

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory


More information about the cfe-commits mailing list