Nice! -Hal
----- Original Message ----- > From: "Matthias Braun via cfe-commits" <cfe-commits@lists.llvm.org> > To: cfe-commits@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@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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits