mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Add -print-zero-stats option and use it in ensure_no_astgen.swift
to verify ExportedSourceFileRequest == 0. In release mode only non-zero stats are printed by default now. Fix diagnostic when compiler is built without statistics support.
This commit is contained in:
@@ -175,6 +175,9 @@ private:
|
|||||||
/// record any additional stats until we've finished.
|
/// record any additional stats until we've finished.
|
||||||
bool IsFlushingTracesAndProfiles;
|
bool IsFlushingTracesAndProfiles;
|
||||||
|
|
||||||
|
/// Whether we are printing all stats even if they are zero.
|
||||||
|
bool IsPrintingZeroStats;
|
||||||
|
|
||||||
void publishAlwaysOnStatsToLLVM();
|
void publishAlwaysOnStatsToLLVM();
|
||||||
void printAlwaysOnStatsAndTimers(raw_ostream &OS);
|
void printAlwaysOnStatsAndTimers(raw_ostream &OS);
|
||||||
|
|
||||||
@@ -186,7 +189,8 @@ private:
|
|||||||
bool FineGrainedTimers,
|
bool FineGrainedTimers,
|
||||||
bool TraceEvents,
|
bool TraceEvents,
|
||||||
bool ProfileEvents,
|
bool ProfileEvents,
|
||||||
bool ProfileEntities);
|
bool ProfileEntities,
|
||||||
|
bool PrintZeroStats);
|
||||||
public:
|
public:
|
||||||
UnifiedStatsReporter(StringRef ProgramName,
|
UnifiedStatsReporter(StringRef ProgramName,
|
||||||
StringRef ModuleName,
|
StringRef ModuleName,
|
||||||
@@ -200,7 +204,8 @@ public:
|
|||||||
bool FineGrainedTimers,
|
bool FineGrainedTimers,
|
||||||
bool TraceEvents,
|
bool TraceEvents,
|
||||||
bool ProfileEvents,
|
bool ProfileEvents,
|
||||||
bool ProfileEntities);
|
bool ProfileEntities,
|
||||||
|
bool PrintZeroStats);
|
||||||
~UnifiedStatsReporter();
|
~UnifiedStatsReporter();
|
||||||
|
|
||||||
bool fineGrainedTimers() const { return FineGrainedTimers; }
|
bool fineGrainedTimers() const { return FineGrainedTimers; }
|
||||||
|
|||||||
@@ -232,6 +232,9 @@ public:
|
|||||||
/// runtime overhead.
|
/// runtime overhead.
|
||||||
bool FineGrainedTimers = false;
|
bool FineGrainedTimers = false;
|
||||||
|
|
||||||
|
/// Whether we are printing all stats even if they are zero.
|
||||||
|
bool PrintZeroStats = false;
|
||||||
|
|
||||||
/// Trace changes to stats to files in StatsOutputDir.
|
/// Trace changes to stats to files in StatsOutputDir.
|
||||||
bool TraceStats = false;
|
bool TraceStats = false;
|
||||||
|
|
||||||
|
|||||||
@@ -361,6 +361,9 @@ def driver_time_compilation : Flag<["-"], "driver-time-compilation">,
|
|||||||
def stats_output_dir: Separate<["-"], "stats-output-dir">,
|
def stats_output_dir: Separate<["-"], "stats-output-dir">,
|
||||||
Flags<[FrontendOption, HelpHidden, ArgumentIsPath]>,
|
Flags<[FrontendOption, HelpHidden, ArgumentIsPath]>,
|
||||||
HelpText<"Directory to write unified compilation-statistics files to">;
|
HelpText<"Directory to write unified compilation-statistics files to">;
|
||||||
|
def print_zero_stats: Flag<["-"], "print-zero-stats">,
|
||||||
|
Flags<[FrontendOption, HelpHidden]>,
|
||||||
|
HelpText<"Prints all stats even if they are zero">;
|
||||||
def fine_grained_timers: Flag<["-"], "fine-grained-timers">,
|
def fine_grained_timers: Flag<["-"], "fine-grained-timers">,
|
||||||
Flags<[FrontendOption, HelpHidden]>,
|
Flags<[FrontendOption, HelpHidden]>,
|
||||||
HelpText<"Enable per-request timers">;
|
HelpText<"Enable per-request timers">;
|
||||||
|
|||||||
@@ -322,7 +322,8 @@ UnifiedStatsReporter::UnifiedStatsReporter(StringRef ProgramName,
|
|||||||
bool FineGrainedTimers,
|
bool FineGrainedTimers,
|
||||||
bool TraceEvents,
|
bool TraceEvents,
|
||||||
bool ProfileEvents,
|
bool ProfileEvents,
|
||||||
bool ProfileEntities)
|
bool ProfileEntities,
|
||||||
|
bool PrintZeroStats)
|
||||||
: UnifiedStatsReporter(ProgramName,
|
: UnifiedStatsReporter(ProgramName,
|
||||||
auxName(ModuleName,
|
auxName(ModuleName,
|
||||||
InputName,
|
InputName,
|
||||||
@@ -331,7 +332,8 @@ UnifiedStatsReporter::UnifiedStatsReporter(StringRef ProgramName,
|
|||||||
OptType),
|
OptType),
|
||||||
Directory,
|
Directory,
|
||||||
SM, CSM, FineGrainedTimers,
|
SM, CSM, FineGrainedTimers,
|
||||||
TraceEvents, ProfileEvents, ProfileEntities)
|
TraceEvents, ProfileEvents, ProfileEntities,
|
||||||
|
PrintZeroStats)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -343,7 +345,8 @@ UnifiedStatsReporter::UnifiedStatsReporter(StringRef ProgramName,
|
|||||||
bool FineGrainedTimers,
|
bool FineGrainedTimers,
|
||||||
bool TraceEvents,
|
bool TraceEvents,
|
||||||
bool ProfileEvents,
|
bool ProfileEvents,
|
||||||
bool ProfileEntities)
|
bool ProfileEntities,
|
||||||
|
bool PrintZeroStats)
|
||||||
: currentProcessExitStatusSet(false),
|
: currentProcessExitStatusSet(false),
|
||||||
currentProcessExitStatus(EXIT_FAILURE),
|
currentProcessExitStatus(EXIT_FAILURE),
|
||||||
StatsFilename(Directory),
|
StatsFilename(Directory),
|
||||||
@@ -358,7 +361,8 @@ UnifiedStatsReporter::UnifiedStatsReporter(StringRef ProgramName,
|
|||||||
ClangSourceMgr(CSM),
|
ClangSourceMgr(CSM),
|
||||||
RecursiveTimers(std::make_unique<RecursionSafeTimers>()),
|
RecursiveTimers(std::make_unique<RecursionSafeTimers>()),
|
||||||
FineGrainedTimers(FineGrainedTimers),
|
FineGrainedTimers(FineGrainedTimers),
|
||||||
IsFlushingTracesAndProfiles(false)
|
IsFlushingTracesAndProfiles(false),
|
||||||
|
IsPrintingZeroStats(PrintZeroStats)
|
||||||
{
|
{
|
||||||
path::append(StatsFilename, makeStatsFileName(ProgramName, AuxName));
|
path::append(StatsFilename, makeStatsFileName(ProgramName, AuxName));
|
||||||
path::append(TraceFilename, makeTraceFileName(ProgramName, AuxName));
|
path::append(TraceFilename, makeTraceFileName(ProgramName, AuxName));
|
||||||
@@ -430,7 +434,8 @@ UnifiedStatsReporter::publishAlwaysOnStatsToLLVM() {
|
|||||||
#define FRONTEND_STATISTIC(TY, NAME) \
|
#define FRONTEND_STATISTIC(TY, NAME) \
|
||||||
do { \
|
do { \
|
||||||
static Statistic Stat = {#TY, #NAME, #NAME}; \
|
static Statistic Stat = {#TY, #NAME, #NAME}; \
|
||||||
Stat = 0; \
|
if (IsPrintingZeroStats) \
|
||||||
|
Stat = 0; \
|
||||||
Stat += (C).NAME; \
|
Stat += (C).NAME; \
|
||||||
} while (0);
|
} while (0);
|
||||||
#include "swift/Basic/Statistics.def"
|
#include "swift/Basic/Statistics.def"
|
||||||
@@ -441,7 +446,8 @@ UnifiedStatsReporter::publishAlwaysOnStatsToLLVM() {
|
|||||||
#define DRIVER_STATISTIC(NAME) \
|
#define DRIVER_STATISTIC(NAME) \
|
||||||
do { \
|
do { \
|
||||||
static Statistic Stat = {"Driver", #NAME, #NAME}; \
|
static Statistic Stat = {"Driver", #NAME, #NAME}; \
|
||||||
Stat = 0; \
|
if (IsPrintingZeroStats) \
|
||||||
|
Stat = 0; \
|
||||||
Stat += (C).NAME; \
|
Stat += (C).NAME; \
|
||||||
} while (0);
|
} while (0);
|
||||||
#include "swift/Basic/Statistics.def"
|
#include "swift/Basic/Statistics.def"
|
||||||
@@ -458,7 +464,7 @@ UnifiedStatsReporter::printAlwaysOnStatsAndTimers(raw_ostream &OS) {
|
|||||||
auto &C = getFrontendCounters();
|
auto &C = getFrontendCounters();
|
||||||
#define FRONTEND_STATISTIC(TY, NAME) \
|
#define FRONTEND_STATISTIC(TY, NAME) \
|
||||||
do { \
|
do { \
|
||||||
if (C.NAME) { \
|
if (C.NAME || IsPrintingZeroStats) { \
|
||||||
OS << delim << "\t\"" #TY "." #NAME "\": " << C.NAME; \
|
OS << delim << "\t\"" #TY "." #NAME "\": " << C.NAME; \
|
||||||
delim = ",\n"; \
|
delim = ",\n"; \
|
||||||
} \
|
} \
|
||||||
@@ -470,7 +476,7 @@ UnifiedStatsReporter::printAlwaysOnStatsAndTimers(raw_ostream &OS) {
|
|||||||
auto &C = getDriverCounters();
|
auto &C = getDriverCounters();
|
||||||
#define DRIVER_STATISTIC(NAME) \
|
#define DRIVER_STATISTIC(NAME) \
|
||||||
do { \
|
do { \
|
||||||
if (C.NAME) { \
|
if (C.NAME || IsPrintingZeroStats) { \
|
||||||
OS << delim << "\t\"Driver." #NAME "\": " << C.NAME; \
|
OS << delim << "\t\"Driver." #NAME "\": " << C.NAME; \
|
||||||
delim = ",\n"; \
|
delim = ",\n"; \
|
||||||
} \
|
} \
|
||||||
|
|||||||
@@ -522,6 +522,7 @@ createStatsReporter(const llvm::opt::InputArgList *ArgList,
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
false,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -406,7 +406,8 @@ void ArgsToFrontendOptionsConverter::computePrintStatsOptions() {
|
|||||||
using namespace options;
|
using namespace options;
|
||||||
Opts.PrintStats |= Args.hasArg(OPT_print_stats);
|
Opts.PrintStats |= Args.hasArg(OPT_print_stats);
|
||||||
Opts.PrintClangStats |= Args.hasArg(OPT_print_clang_stats);
|
Opts.PrintClangStats |= Args.hasArg(OPT_print_clang_stats);
|
||||||
#if defined(NDEBUG) && !defined(LLVM_ENABLE_STATS)
|
Opts.PrintZeroStats |= Args.hasArg(OPT_print_zero_stats);
|
||||||
|
#if defined(NDEBUG) && !LLVM_ENABLE_STATS
|
||||||
if (Opts.PrintStats || Opts.PrintClangStats)
|
if (Opts.PrintStats || Opts.PrintClangStats)
|
||||||
Diags.diagnose(SourceLoc(), diag::stats_disabled);
|
Diags.diagnose(SourceLoc(), diag::stats_disabled);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -384,7 +384,8 @@ void CompilerInstance::setupStatsReporter() {
|
|||||||
Invoke.getFrontendOptions().FineGrainedTimers,
|
Invoke.getFrontendOptions().FineGrainedTimers,
|
||||||
Invoke.getFrontendOptions().TraceStats,
|
Invoke.getFrontendOptions().TraceStats,
|
||||||
Invoke.getFrontendOptions().ProfileEvents,
|
Invoke.getFrontendOptions().ProfileEvents,
|
||||||
Invoke.getFrontendOptions().ProfileEntities);
|
Invoke.getFrontendOptions().ProfileEntities,
|
||||||
|
Invoke.getFrontendOptions().PrintZeroStats);
|
||||||
// Hand the stats reporter down to the ASTContext so the rest of the compiler
|
// Hand the stats reporter down to the ASTContext so the rest of the compiler
|
||||||
// can use it.
|
// can use it.
|
||||||
getASTContext().setStatsReporter(Reporter.get());
|
getASTContext().setStatsReporter(Reporter.get());
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -parse-as-library -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -parse-as-library -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||||
|
|
||||||
// RUN: %target-swift-frontend -typecheck -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -stats-output-dir %t/stats-no-lookup -fine-grained-timers -primary-file %t/b.swift %t/a.swift
|
// RUN: %target-swift-frontend -typecheck -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -stats-output-dir %t/stats-no-lookup -fine-grained-timers -print-zero-stats -primary-file %t/b.swift %t/a.swift
|
||||||
// RUN: %target-swift-frontend -typecheck -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -stats-output-dir %t/stats-lookup -fine-grained-timers -primary-file %t/c.swift %t/a.swift
|
// RUN: %target-swift-frontend -typecheck -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -stats-output-dir %t/stats-lookup -fine-grained-timers -print-zero-stats -primary-file %t/c.swift %t/a.swift
|
||||||
|
|
||||||
// We use '<=' here instead of '==' to take account of the fact that in debug
|
// We use '<=' here instead of '==' to take account of the fact that in debug
|
||||||
// builds we'll be doing round-trip checking, which will parse the syntax tree
|
// builds we'll be doing round-trip checking, which will parse the syntax tree
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
// This test ensures we don't attempt to do syntax tree parsing for dependency
|
// This test ensures we don't attempt to do syntax tree parsing for dependency
|
||||||
// scanning.
|
// scanning.
|
||||||
|
|
||||||
// RUN: %target-swift-frontend -scan-dependencies -o %t/deps.json %t/a.swift %t/b.swift -I %t/deps -stats-output-dir %t/stats
|
// RUN: %target-swift-frontend -scan-dependencies -o %t/deps.json %t/a.swift %t/b.swift -I %t/deps -stats-output-dir %t/stats -print-zero-stats
|
||||||
// RUN: %{python} %utils/process-stats-dir.py --evaluate 'ExportedSourceFileRequest == 0' %t/stats
|
// RUN: %{python} %utils/process-stats-dir.py --evaluate 'ExportedSourceFileRequest == 0' %t/stats
|
||||||
|
|
||||||
//--- Foo.swiftinterface
|
//--- Foo.swiftinterface
|
||||||
|
|||||||
Reference in New Issue
Block a user