Skip to content

Commit 85dda86

Browse files
authored
Merge pull request swiftlang#12071 from graydon/trace-stats-deltas
Trace stats deltas
2 parents 9c5a66a + 5df55e4 commit 85dda86

File tree

9 files changed

+340
-248
lines changed

9 files changed

+340
-248
lines changed

include/swift/Basic/Statistic.h

Lines changed: 49 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "llvm/ADT/SmallString.h"
1717
#include "llvm/ADT/Statistic.h"
18+
#include "swift/Basic/SourceLoc.h"
1819
#include "swift/Basic/Timer.h"
1920

2021
#define SWIFT_FUNC_STAT \
@@ -53,112 +54,84 @@ class UnifiedStatsReporter {
5354
public:
5455
struct AlwaysOnDriverCounters
5556
{
56-
size_t NumDriverJobsRun;
57-
size_t NumDriverJobsSkipped;
58-
59-
size_t DriverDepCascadingTopLevel;
60-
size_t DriverDepCascadingDynamic;
61-
size_t DriverDepCascadingNominal;
62-
size_t DriverDepCascadingMember;
63-
size_t DriverDepCascadingExternal;
64-
65-
size_t DriverDepTopLevel;
66-
size_t DriverDepDynamic;
67-
size_t DriverDepNominal;
68-
size_t DriverDepMember;
69-
size_t DriverDepExternal;
70-
71-
size_t ChildrenMaxRSS;
57+
#define DRIVER_STATISTIC(ID) size_t ID;
58+
#include "Statistics.def"
59+
#undef DRIVER_STATISTIC
7260
};
7361

7462
struct AlwaysOnFrontendCounters
7563
{
76-
size_t NumSourceBuffers;
77-
size_t NumSourceLines;
78-
size_t NumSourceLinesPerSecond;
79-
size_t NumLinkLibraries;
80-
size_t NumLoadedModules;
81-
size_t NumImportedExternalDefinitions;
82-
size_t NumTotalClangImportedEntities;
83-
size_t NumASTBytesAllocated;
84-
size_t NumDependencies;
85-
size_t NumReferencedTopLevelNames;
86-
size_t NumReferencedDynamicNames;
87-
size_t NumReferencedMemberNames;
88-
size_t NumDecls;
89-
size_t NumLocalTypeDecls;
90-
size_t NumObjCMethods;
91-
size_t NumInfixOperators;
92-
size_t NumPostfixOperators;
93-
size_t NumPrefixOperators;
94-
size_t NumPrecedenceGroups;
95-
size_t NumUsedConformances;
96-
97-
size_t NumConformancesDeserialized;
98-
size_t NumConstraintScopes;
99-
size_t NumDeclsDeserialized;
100-
size_t NumDeclsValidated;
101-
size_t NumFunctionsTypechecked;
102-
size_t NumGenericSignatureBuilders;
103-
size_t NumLazyGenericEnvironments;
104-
size_t NumLazyGenericEnvironmentsLoaded;
105-
size_t NumLazyIterableDeclContexts;
106-
size_t NominalTypeLookupDirectCount;
107-
size_t NumTypesDeserialized;
108-
size_t NumTypesValidated;
109-
size_t NumUnloadedLazyIterableDeclContexts;
110-
111-
size_t NumSILGenFunctions;
112-
size_t NumSILGenVtables;
113-
size_t NumSILGenWitnessTables;
114-
size_t NumSILGenDefaultWitnessTables;
115-
size_t NumSILGenGlobalVariables;
116-
117-
size_t NumSILOptFunctions;
118-
size_t NumSILOptVtables;
119-
size_t NumSILOptWitnessTables;
120-
size_t NumSILOptDefaultWitnessTables;
121-
size_t NumSILOptGlobalVariables;
64+
#define FRONTEND_STATISTIC(NAME, ID) size_t ID;
65+
#include "Statistics.def"
66+
#undef FRONTEND_STATISTIC
67+
};
12268

123-
size_t NumIRGlobals;
124-
size_t NumIRFunctions;
125-
size_t NumIRAliases;
126-
size_t NumIRIFuncs;
127-
size_t NumIRNamedMetaData;
128-
size_t NumIRValueSymbols;
129-
size_t NumIRComdatSymbols;
130-
size_t NumIRBasicBlocks;
131-
size_t NumIRInsts;
69+
struct FrontendStatsTracer
70+
{
71+
UnifiedStatsReporter *Reporter;
72+
llvm::TimeRecord SavedTime;
73+
StringRef Name;
74+
SourceRange Range;
75+
FrontendStatsTracer(StringRef Name,
76+
SourceRange const &Range,
77+
UnifiedStatsReporter *Reporter);
78+
FrontendStatsTracer();
79+
FrontendStatsTracer(FrontendStatsTracer&& other);
80+
FrontendStatsTracer& operator=(FrontendStatsTracer&&);
81+
~FrontendStatsTracer();
82+
FrontendStatsTracer(const FrontendStatsTracer&) = delete;
83+
FrontendStatsTracer& operator=(const FrontendStatsTracer&) = delete;
84+
};
13285

133-
size_t NumLLVMBytesOutput;
86+
struct FrontendStatsEvent
87+
{
88+
uint64_t TimeUSec;
89+
uint64_t LiveUSec;
90+
bool IsEntry;
91+
StringRef EventName;
92+
StringRef CounterName;
93+
size_t CounterDelta;
94+
size_t CounterValue;
95+
SourceRange SourceRange;
13496
};
13597

13698
private:
137-
SmallString<128> Filename;
99+
SmallString<128> StatsFilename;
100+
SmallString<128> TraceFilename;
138101
llvm::TimeRecord StartedTime;
139102
std::unique_ptr<llvm::NamedRegionTimer> Timer;
140-
103+
SourceManager *SourceMgr;
141104
std::unique_ptr<AlwaysOnDriverCounters> DriverCounters;
142105
std::unique_ptr<AlwaysOnFrontendCounters> FrontendCounters;
106+
std::unique_ptr<AlwaysOnFrontendCounters> LastTracedFrontendCounters;
107+
std::vector<FrontendStatsEvent> FrontendStatsEvents;
143108

144109
void publishAlwaysOnStatsToLLVM();
145110
void printAlwaysOnStatsAndTimers(llvm::raw_ostream &OS);
146111

147112
UnifiedStatsReporter(StringRef ProgramName,
148113
StringRef AuxName,
149-
StringRef Directory);
114+
StringRef Directory,
115+
SourceManager *SM,
116+
bool TraceEvents);
150117
public:
151118
UnifiedStatsReporter(StringRef ProgramName,
152119
StringRef ModuleName,
153120
StringRef InputName,
154121
StringRef TripleName,
155122
StringRef OutputType,
156123
StringRef OptType,
157-
StringRef Directory);
124+
StringRef Directory,
125+
SourceManager *SM=nullptr,
126+
bool TraceEvents=false);
158127
~UnifiedStatsReporter();
159128

160129
AlwaysOnDriverCounters &getDriverCounters();
161130
AlwaysOnFrontendCounters &getFrontendCounters();
131+
FrontendStatsTracer getStatsTracer(StringRef N,
132+
SourceRange const &R);
133+
void saveAnyFrontendStatsEvents(FrontendStatsTracer const& T,
134+
bool IsEntry);
162135
};
163136

164137
}

include/swift/Basic/Statistics.def

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
//===--- Statistics.def - Statistics Macro Metaprogramming Database -*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
//
13+
// This file defines the database of always-available statistic counters.
14+
//
15+
// DRIVER_STATISTIC(Id)
16+
// - Id is an identifier suitable for use in C++
17+
//
18+
// FRONTEND_STATISTIC(Subsystem, Id)
19+
// - Subsystem is a token to be stringified as a name prefix
20+
// - Id is an identifier suitable for use in C++
21+
//===----------------------------------------------------------------------===//
22+
23+
/// Driver statistics are collected for driver processes
24+
#ifdef DRIVER_STATISTIC
25+
DRIVER_STATISTIC(NumDriverJobsRun)
26+
DRIVER_STATISTIC(NumDriverJobsSkipped)
27+
28+
DRIVER_STATISTIC(DriverDepCascadingTopLevel)
29+
DRIVER_STATISTIC(DriverDepCascadingDynamic)
30+
DRIVER_STATISTIC(DriverDepCascadingNominal)
31+
DRIVER_STATISTIC(DriverDepCascadingMember)
32+
DRIVER_STATISTIC(DriverDepCascadingExternal)
33+
34+
DRIVER_STATISTIC(DriverDepTopLevel)
35+
DRIVER_STATISTIC(DriverDepDynamic)
36+
DRIVER_STATISTIC(DriverDepNominal)
37+
DRIVER_STATISTIC(DriverDepMember)
38+
DRIVER_STATISTIC(DriverDepExternal)
39+
40+
DRIVER_STATISTIC(ChildrenMaxRSS)
41+
#endif
42+
43+
/// Driver statistics are collected for frontend processes
44+
#ifdef FRONTEND_STATISTIC
45+
FRONTEND_STATISTIC(AST, NumSourceBuffers)
46+
FRONTEND_STATISTIC(AST, NumSourceLines)
47+
FRONTEND_STATISTIC(AST, NumSourceLinesPerSecond)
48+
FRONTEND_STATISTIC(AST, NumLinkLibraries)
49+
FRONTEND_STATISTIC(AST, NumLoadedModules)
50+
FRONTEND_STATISTIC(AST, NumImportedExternalDefinitions)
51+
FRONTEND_STATISTIC(AST, NumTotalClangImportedEntities)
52+
FRONTEND_STATISTIC(AST, NumASTBytesAllocated)
53+
FRONTEND_STATISTIC(AST, NumDependencies)
54+
FRONTEND_STATISTIC(AST, NumReferencedTopLevelNames)
55+
FRONTEND_STATISTIC(AST, NumReferencedDynamicNames)
56+
FRONTEND_STATISTIC(AST, NumReferencedMemberNames)
57+
FRONTEND_STATISTIC(AST, NumDecls)
58+
FRONTEND_STATISTIC(AST, NumLocalTypeDecls)
59+
FRONTEND_STATISTIC(AST, NumObjCMethods)
60+
FRONTEND_STATISTIC(AST, NumInfixOperators)
61+
FRONTEND_STATISTIC(AST, NumPostfixOperators)
62+
FRONTEND_STATISTIC(AST, NumPrefixOperators)
63+
FRONTEND_STATISTIC(AST, NumPrecedenceGroups)
64+
FRONTEND_STATISTIC(AST, NumUsedConformances)
65+
66+
FRONTEND_STATISTIC(Sema, NumConformancesDeserialized)
67+
FRONTEND_STATISTIC(Sema, NumConstraintScopes)
68+
FRONTEND_STATISTIC(Sema, NumDeclsDeserialized)
69+
FRONTEND_STATISTIC(Sema, NumDeclsValidated)
70+
FRONTEND_STATISTIC(Sema, NumFunctionsTypechecked)
71+
FRONTEND_STATISTIC(Sema, NumGenericSignatureBuilders)
72+
FRONTEND_STATISTIC(Sema, NumLazyGenericEnvironments)
73+
FRONTEND_STATISTIC(Sema, NumLazyGenericEnvironmentsLoaded)
74+
FRONTEND_STATISTIC(Sema, NumLazyIterableDeclContexts)
75+
FRONTEND_STATISTIC(Sema, NominalTypeLookupDirectCount)
76+
FRONTEND_STATISTIC(Sema, NumTypesDeserialized)
77+
FRONTEND_STATISTIC(Sema, NumTypesValidated)
78+
FRONTEND_STATISTIC(Sema, NumUnloadedLazyIterableDeclContexts)
79+
80+
FRONTEND_STATISTIC(SILModule, NumSILGenFunctions)
81+
FRONTEND_STATISTIC(SILModule, NumSILGenVtables)
82+
FRONTEND_STATISTIC(SILModule, NumSILGenWitnessTables)
83+
FRONTEND_STATISTIC(SILModule, NumSILGenDefaultWitnessTables)
84+
FRONTEND_STATISTIC(SILModule, NumSILGenGlobalVariables)
85+
86+
FRONTEND_STATISTIC(SILModule, NumSILOptFunctions)
87+
FRONTEND_STATISTIC(SILModule, NumSILOptVtables)
88+
FRONTEND_STATISTIC(SILModule, NumSILOptWitnessTables)
89+
FRONTEND_STATISTIC(SILModule, NumSILOptDefaultWitnessTables)
90+
FRONTEND_STATISTIC(SILModule, NumSILOptGlobalVariables)
91+
92+
FRONTEND_STATISTIC(IRModule, NumIRGlobals)
93+
FRONTEND_STATISTIC(IRModule, NumIRFunctions)
94+
FRONTEND_STATISTIC(IRModule, NumIRAliases)
95+
FRONTEND_STATISTIC(IRModule, NumIRIFuncs)
96+
FRONTEND_STATISTIC(IRModule, NumIRNamedMetaData)
97+
FRONTEND_STATISTIC(IRModule, NumIRValueSymbols)
98+
FRONTEND_STATISTIC(IRModule, NumIRComdatSymbols)
99+
FRONTEND_STATISTIC(IRModule, NumIRBasicBlocks)
100+
FRONTEND_STATISTIC(IRModule, NumIRInsts)
101+
102+
FRONTEND_STATISTIC(LLVM, NumLLVMBytesOutput)
103+
#endif

include/swift/Frontend/FrontendOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,9 @@ class FrontendOptions {
222222
/// The path to which we should output statistics files.
223223
std::string StatsOutputDir;
224224

225+
/// Trace changes to stats to files in StatsOutputDir.
226+
bool TraceStats = false;
227+
225228
/// Indicates whether function body parsing should be delayed
226229
/// until the end of all files.
227230
bool DelayedFunctionBodyParsing = false;

include/swift/Option/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,9 @@ def driver_time_compilation : Flag<["-"], "driver-time-compilation">,
194194
def stats_output_dir: Separate<["-"], "stats-output-dir">,
195195
Flags<[FrontendOption, HelpHidden]>,
196196
HelpText<"Directory to write unified compilation-statistics files to">;
197+
def trace_stats_events: Flag<["-"], "trace-stats-events">,
198+
Flags<[FrontendOption, HelpHidden]>,
199+
HelpText<"Trace changes to stats in -stats-output-dir">;
197200

198201
def emit_dependencies : Flag<["-"], "emit-dependencies">,
199202
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>,

0 commit comments

Comments
 (0)