r357340 - Adds `-ftime-trace` option to clang that produces Chrome `chrome://tracing` compatible JSON profiling output dumps.
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 12 05:19:19 PDT 2019
I haven't tried -ftime-report here. I tried it in the past and found it
difficult to interpret, as the blog post you link to correctly says :) I
thought -ftime-trace was supposed to be more usable, so I figured I'd try
that instead. And for frontend stuff, it does look much better!
Ideas on how to improve the backend situation:
- Let FPPassManager::runOnFunction() call
if (ProfileTime)
llvm::timeTraceProfilerBegin("RunPass", FP->getPassName());
for each pass so that it's visible which path the time goes into
- Have a thing _somewhere_ (in clang? in chrome's about:tracing? a
standalone tool?) that makes it possible to look at a flame graph view of
the trace. A flame graph is a trace that's sorted by call stack, not by
time, so that all the same stacks are next to each other, which makes it
easy to see things like "30% of time is spent in function X" – together
with the first suggestion it'd make the slowest path visible.
I haven't actually tried doing this, so I'm not sure it'd help, but I could
imagine it would :)
On Fri, Apr 12, 2019 at 2:41 AM Anton Afanasyev <anton.a.afanasyev at gmail.com>
wrote:
> Hi Nico,
> yes, you are right, current implementation is mostly focused on frontend.
> Yes, I can impove BE time output after getting feedback like yours one. Do
> you need detailed info about BE passes times? Btw, did you try
> -ftime-report option? It could give you detailed info on BE passes
> bottlenecks, though its implementation is a little bit messy for now (as
> Aras noted here:
> http://aras-p.info/blog/2019/01/12/Investigating-compile-times-and-Clang-ftime-report/
> ).
> Thanks,
> Anton
>
> пт, 12 апр. 2019 г. в 00:22, Nico Weber <thakis at chromium.org>:
>
>> I tried using this to see why X86ISelLowering.cpp takes so long to build
>> on my system. The output json produced by this flag is at
>> http://s000.tinyupload.com/?file_id=00019982161870973700
>>
>> It looks like this produces lots of useful information for frontend time,
>> but in this case most time is spent in the backend, where this doesn't
>> produce very useful output. Are there any plans to improve output for
>> backend time?
>>
>> On Sat, Mar 30, 2019 at 9:38 AM Anton Afanasyev via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>> Author: anton-afanasyev
>>> Date: Sat Mar 30 01:42:48 2019
>>> New Revision: 357340
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=357340&view=rev
>>> Log:
>>> Adds `-ftime-trace` option to clang that produces Chrome
>>> `chrome://tracing` compatible JSON profiling output dumps.
>>>
>>> This change adds hierarchical "time trace" profiling blocks that can be
>>> visualized in Chrome, in a "flame chart" style. Each profiling block can
>>> have a "detail" string that for example indicates the file being processed,
>>> template name being instantiated, function being optimized etc.
>>>
>>> This is taken from GitHub PR:
>>> https://github.com/aras-p/llvm-project-20170507/pull/2
>>>
>>> Patch by Aras Pranckevičius.
>>>
>>> Differential Revision: https://reviews.llvm.org/D58675
>>>
>>> Modified:
>>> cfe/trunk/include/clang/Basic/CodeGenOptions.def
>>> cfe/trunk/include/clang/Driver/Options.td
>>> cfe/trunk/include/clang/Frontend/FrontendOptions.h
>>> cfe/trunk/lib/CodeGen/BackendUtil.cpp
>>> cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>>> cfe/trunk/lib/Driver/ToolChains/Clang.cpp
>>> cfe/trunk/lib/Frontend/CompilerInstance.cpp
>>> cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>> cfe/trunk/lib/Parse/ParseAST.cpp
>>> cfe/trunk/lib/Parse/ParseDeclCXX.cpp
>>> cfe/trunk/lib/Parse/ParseTemplate.cpp
>>> cfe/trunk/lib/Sema/Sema.cpp
>>> cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
>>> cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>>> cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp
>>> cfe/trunk/tools/driver/cc1_main.cpp
>>>
>>> Modified: cfe/trunk/include/clang/Basic/CodeGenOptions.def
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/CodeGenOptions.def?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Basic/CodeGenOptions.def (original)
>>> +++ cfe/trunk/include/clang/Basic/CodeGenOptions.def Sat Mar 30 01:42:48
>>> 2019
>>> @@ -224,6 +224,7 @@ CODEGENOPT(FineGrainedBitfieldAccesses,
>>> CODEGENOPT(StrictEnums , 1, 0) ///< Optimize based on strict enum
>>> definition.
>>> CODEGENOPT(StrictVTablePointers, 1, 0) ///< Optimize based on the
>>> strict vtable pointers
>>> CODEGENOPT(TimePasses , 1, 0) ///< Set when -ftime-report is
>>> enabled.
>>> +CODEGENOPT(TimeTrace , 1, 0) ///< Set when -ftime-trace is
>>> enabled.
>>> CODEGENOPT(UnrollLoops , 1, 0) ///< Control whether loops are
>>> unrolled.
>>> CODEGENOPT(RerollLoops , 1, 0) ///< Control whether loops are
>>> rerolled.
>>> CODEGENOPT(NoUseJumpTables , 1, 0) ///< Set when -fno-jump-tables is
>>> enabled.
>>>
>>> Modified: cfe/trunk/include/clang/Driver/Options.td
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Driver/Options.td (original)
>>> +++ cfe/trunk/include/clang/Driver/Options.td Sat Mar 30 01:42:48 2019
>>> @@ -1745,6 +1745,7 @@ def Wframe_larger_than_EQ : Joined<["-"]
>>> def : Flag<["-"], "fterminated-vtables">, Alias<fapple_kext>;
>>> def fthreadsafe_statics : Flag<["-"], "fthreadsafe-statics">,
>>> Group<f_Group>;
>>> def ftime_report : Flag<["-"], "ftime-report">, Group<f_Group>,
>>> Flags<[CC1Option]>;
>>> +def ftime_trace : Flag<["-"], "ftime-trace">, Group<f_Group>,
>>> Flags<[CC1Option]>;
>>> def ftlsmodel_EQ : Joined<["-"], "ftls-model=">, Group<f_Group>,
>>> Flags<[CC1Option]>;
>>> def ftrapv : Flag<["-"], "ftrapv">, Group<f_Group>, Flags<[CC1Option]>,
>>> HelpText<"Trap on integer overflow">;
>>>
>>> Modified: cfe/trunk/include/clang/Frontend/FrontendOptions.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendOptions.h?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Frontend/FrontendOptions.h (original)
>>> +++ cfe/trunk/include/clang/Frontend/FrontendOptions.h Sat Mar 30
>>> 01:42:48 2019
>>> @@ -256,6 +256,9 @@ public:
>>> /// Show timers for individual actions.
>>> unsigned ShowTimers : 1;
>>>
>>> + /// Output time trace profile.
>>> + unsigned TimeTrace : 1;
>>> +
>>> /// Show the -version text.
>>> unsigned ShowVersion : 1;
>>>
>>> @@ -437,13 +440,14 @@ public:
>>> public:
>>> FrontendOptions()
>>> : DisableFree(false), RelocatablePCH(false), ShowHelp(false),
>>> - ShowStats(false), ShowTimers(false), ShowVersion(false),
>>> - FixWhatYouCan(false), FixOnlyWarnings(false),
>>> FixAndRecompile(false),
>>> - FixToTemporaries(false), ARCMTMigrateEmitARCErrors(false),
>>> - SkipFunctionBodies(false), UseGlobalModuleIndex(true),
>>> - GenerateGlobalModuleIndex(true), ASTDumpDecls(false),
>>> - ASTDumpLookups(false), BuildingImplicitModule(false),
>>> - ModulesEmbedAllFiles(false), IncludeTimestamps(true) {}
>>> + ShowStats(false), ShowTimers(false), TimeTrace(false),
>>> + ShowVersion(false), FixWhatYouCan(false),
>>> FixOnlyWarnings(false),
>>> + FixAndRecompile(false), FixToTemporaries(false),
>>> + ARCMTMigrateEmitARCErrors(false), SkipFunctionBodies(false),
>>> + UseGlobalModuleIndex(true), GenerateGlobalModuleIndex(true),
>>> + ASTDumpDecls(false), ASTDumpLookups(false),
>>> + BuildingImplicitModule(false), ModulesEmbedAllFiles(false),
>>> + IncludeTimestamps(true) {}
>>>
>>> /// getInputKindForExtension - Return the appropriate input kind for
>>> a file
>>> /// extension. For example, "c" would return InputKind::C.
>>>
>>> Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original)
>>> +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Sat Mar 30 01:42:48 2019
>>> @@ -42,6 +42,7 @@
>>> #include "llvm/Support/MemoryBuffer.h"
>>> #include "llvm/Support/PrettyStackTrace.h"
>>> #include "llvm/Support/TargetRegistry.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>> #include "llvm/Support/Timer.h"
>>> #include "llvm/Support/raw_ostream.h"
>>> #include "llvm/Target/TargetMachine.h"
>>> @@ -1382,6 +1383,9 @@ void clang::EmitBackendOutput(Diagnostic
>>> const llvm::DataLayout &TDesc, Module *M,
>>> BackendAction Action,
>>> std::unique_ptr<raw_pwrite_stream> OS) {
>>> +
>>> + llvm::TimeTraceScope TimeScope("Backend", StringRef(""));
>>> +
>>> std::unique_ptr<llvm::Module> EmptyModule;
>>> if (!CGOpts.ThinLTOIndexFile.empty()) {
>>> // If we are performing a ThinLTO importing compile, load the
>>> function index
>>>
>>> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
>>> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sat Mar 30 01:42:48 2019
>>> @@ -58,6 +58,7 @@
>>> #include "llvm/Support/ConvertUTF.h"
>>> #include "llvm/Support/ErrorHandling.h"
>>> #include "llvm/Support/MD5.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>>
>>> using namespace clang;
>>> using namespace CodeGen;
>>> @@ -2482,6 +2483,9 @@ void CodeGenModule::EmitGlobalDefinition
>>> if (!shouldEmitFunction(GD))
>>> return;
>>>
>>> + llvm::TimeTraceScope TimeScope(
>>> + "CodeGen Function", [&]() { return
>>> FD->getQualifiedNameAsString(); });
>>> +
>>> if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
>>> // Make sure to emit the definition(s) before we emit the thunks.
>>> // This is necessary for the generation of certain thunks.
>>>
>>> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
>>> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Sat Mar 30 01:42:48 2019
>>> @@ -4548,6 +4548,7 @@ void Clang::ConstructJob(Compilation &C,
>>> Args.AddLastArg(CmdArgs,
>>> options::OPT_fdiagnostics_print_source_range_info);
>>> Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
>>> Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
>>> + Args.AddLastArg(CmdArgs, options::OPT_ftime_trace);
>>> Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
>>> Args.AddLastArg(CmdArgs, options::OPT_malign_double);
>>>
>>>
>>> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
>>> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Sat Mar 30 01:42:48 2019
>>> @@ -46,6 +46,7 @@
>>> #include "llvm/Support/Path.h"
>>> #include "llvm/Support/Program.h"
>>> #include "llvm/Support/Signals.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>> #include "llvm/Support/Timer.h"
>>> #include "llvm/Support/raw_ostream.h"
>>> #include <sys/stat.h>
>>> @@ -1025,6 +1026,8 @@ compileModuleImpl(CompilerInstance &Impo
>>> [](CompilerInstance &) {},
>>> llvm::function_ref<void(CompilerInstance &)>
>>> PostBuildStep =
>>> [](CompilerInstance &) {}) {
>>> + llvm::TimeTraceScope TimeScope("Module Compile", ModuleName);
>>> +
>>> // Construct a compiler invocation for creating this module.
>>> auto Invocation =
>>>
>>> std::make_shared<CompilerInvocation>(ImportingInstance.getInvocation());
>>> @@ -1701,6 +1704,7 @@ CompilerInstance::loadModule(SourceLocat
>>> Timer.init("loading." + ModuleFileName, "Loading " +
>>> ModuleFileName,
>>> *FrontendTimerGroup);
>>> llvm::TimeRegion TimeLoading(FrontendTimerGroup ? &Timer : nullptr);
>>> + llvm::TimeTraceScope TimeScope("Module Load", ModuleName);
>>>
>>> // Try to load the module file. If we are not trying to load from
>>> the
>>> // module cache, we don't know how to rebuild modules.
>>>
>>> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
>>> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Sat Mar 30 01:42:48
>>> 2019
>>> @@ -1717,6 +1717,7 @@ static InputKind ParseFrontendArgs(Front
>>> Opts.ShowHelp = Args.hasArg(OPT_help);
>>> Opts.ShowStats = Args.hasArg(OPT_print_stats);
>>> Opts.ShowTimers = Args.hasArg(OPT_ftime_report);
>>> + Opts.TimeTrace = Args.hasArg(OPT_ftime_trace);
>>> Opts.ShowVersion = Args.hasArg(OPT_version);
>>> Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge);
>>> Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);
>>>
>>> Modified: cfe/trunk/lib/Parse/ParseAST.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseAST.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Parse/ParseAST.cpp (original)
>>> +++ cfe/trunk/lib/Parse/ParseAST.cpp Sat Mar 30 01:42:48 2019
>>> @@ -22,6 +22,7 @@
>>> #include "clang/Sema/SemaConsumer.h"
>>> #include "clang/Sema/TemplateInstCallback.h"
>>> #include "llvm/Support/CrashRecoveryContext.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>> #include <cstdio>
>>> #include <memory>
>>>
>>> @@ -150,6 +151,7 @@ void clang::ParseAST(Sema &S, bool Print
>>> bool HaveLexer = S.getPreprocessor().getCurrentLexer();
>>>
>>> if (HaveLexer) {
>>> + llvm::TimeTraceScope TimeScope("Frontend", StringRef(""));
>>> P.Initialize();
>>> Parser::DeclGroupPtrTy ADecl;
>>> for (bool AtEOF = P.ParseFirstTopLevelDecl(ADecl); !AtEOF;
>>>
>>> Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
>>> +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Sat Mar 30 01:42:48 2019
>>> @@ -24,6 +24,7 @@
>>> #include "clang/Sema/ParsedTemplate.h"
>>> #include "clang/Sema/Scope.h"
>>> #include "llvm/ADT/SmallString.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>>
>>> using namespace clang;
>>>
>>> @@ -3114,6 +3115,12 @@ void Parser::ParseCXXMemberSpecification
>>> TagType == DeclSpec::TST_union ||
>>> TagType == DeclSpec::TST_class) && "Invalid TagType!");
>>>
>>> + llvm::TimeTraceScope TimeScope("ParseClass", [&]() {
>>> + if (auto *TD = dyn_cast_or_null<NamedDecl>(TagDecl))
>>> + return TD->getQualifiedNameAsString();
>>> + return std::string("<anonymous>");
>>> + });
>>> +
>>> PrettyDeclStackTraceEntry CrashInfo(Actions.Context, TagDecl,
>>> RecordLoc,
>>> "parsing struct/union/class
>>> body");
>>>
>>>
>>> Modified: cfe/trunk/lib/Parse/ParseTemplate.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTemplate.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Parse/ParseTemplate.cpp (original)
>>> +++ cfe/trunk/lib/Parse/ParseTemplate.cpp Sat Mar 30 01:42:48 2019
>>> @@ -18,6 +18,7 @@
>>> #include "clang/Sema/DeclSpec.h"
>>> #include "clang/Sema/ParsedTemplate.h"
>>> #include "clang/Sema/Scope.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>> using namespace clang;
>>>
>>> /// Parse a template declaration, explicit instantiation, or
>>> @@ -231,6 +232,12 @@ Decl *Parser::ParseSingleDeclarationAfte
>>> return nullptr;
>>> }
>>>
>>> + llvm::TimeTraceScope TimeScope("ParseTemplate", [&]() {
>>> + return DeclaratorInfo.getIdentifier() != nullptr
>>> + ? DeclaratorInfo.getIdentifier()->getName()
>>> + : "<unknown>";
>>> + });
>>> +
>>> LateParsedAttrList LateParsedAttrs(true);
>>> if (DeclaratorInfo.isFunctionDeclarator())
>>> MaybeParseGNUAttributes(DeclaratorInfo, &LateParsedAttrs);
>>>
>>> Modified: cfe/trunk/lib/Sema/Sema.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/Sema.cpp (original)
>>> +++ cfe/trunk/lib/Sema/Sema.cpp Sat Mar 30 01:42:48 2019
>>> @@ -39,6 +39,8 @@
>>> #include "clang/Sema/TemplateInstCallback.h"
>>> #include "llvm/ADT/DenseMap.h"
>>> #include "llvm/ADT/SmallSet.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>> +
>>> using namespace clang;
>>> using namespace sema;
>>>
>>> @@ -92,6 +94,12 @@ public:
>>> SourceManager &SM = S->getSourceManager();
>>> SourceLocation IncludeLoc = SM.getIncludeLoc(SM.getFileID(Loc));
>>> if (IncludeLoc.isValid()) {
>>> + if (llvm::timeTraceProfilerEnabled()) {
>>> + const FileEntry *FE = SM.getFileEntryForID(SM.getFileID(Loc));
>>> + llvm::timeTraceProfilerBegin(
>>> + "Source", FE != nullptr ? FE->getName() :
>>> StringRef("<unknown>"));
>>> + }
>>> +
>>> IncludeStack.push_back(IncludeLoc);
>>> S->DiagnoseNonDefaultPragmaPack(
>>> Sema::PragmaPackDiagnoseKind::NonDefaultStateAtInclude,
>>> IncludeLoc);
>>> @@ -99,10 +107,14 @@ public:
>>> break;
>>> }
>>> case ExitFile:
>>> - if (!IncludeStack.empty())
>>> + if (!IncludeStack.empty()) {
>>> + if (llvm::timeTraceProfilerEnabled())
>>> + llvm::timeTraceProfilerEnd();
>>> +
>>> S->DiagnoseNonDefaultPragmaPack(
>>> Sema::PragmaPackDiagnoseKind::ChangedStateAtExit,
>>> IncludeStack.pop_back_val());
>>> + }
>>> break;
>>> default:
>>> break;
>>> @@ -914,7 +926,11 @@ void Sema::ActOnEndOfTranslationUnit() {
>>> Pending.begin(), Pending.end());
>>> }
>>>
>>> - PerformPendingInstantiations();
>>> + {
>>> + llvm::TimeTraceScope TimeScope("PerformPendingInstantiations",
>>> + StringRef(""));
>>> + PerformPendingInstantiations();
>>> + }
>>>
>>> assert(LateParsedInstantiations.empty() &&
>>> "end of TU template instantiation should not create more "
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Sat Mar 30 01:42:48
>>> 2019
>>> @@ -25,6 +25,7 @@
>>> #include "clang/Sema/Template.h"
>>> #include "clang/Sema/TemplateDeduction.h"
>>> #include "clang/Sema/TemplateInstCallback.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>>
>>> using namespace clang;
>>> using namespace sema;
>>> @@ -2008,6 +2009,11 @@ Sema::InstantiateClass(SourceLocation Po
>>>
>>> Instantiation->getInstantiatedFromMemberClass(),
>>> Pattern, PatternDef, TSK,
>>> Complain))
>>> return true;
>>> +
>>> + llvm::TimeTraceScope TimeScope("InstantiateClass", [&]() {
>>> + return Instantiation->getQualifiedNameAsString();
>>> + });
>>> +
>>> Pattern = PatternDef;
>>>
>>> // Record the point of instantiation.
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Sat Mar 30
>>> 01:42:48 2019
>>> @@ -23,6 +23,7 @@
>>> #include "clang/Sema/Lookup.h"
>>> #include "clang/Sema/Template.h"
>>> #include "clang/Sema/TemplateInstCallback.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>>
>>> using namespace clang;
>>>
>>> @@ -4124,6 +4125,10 @@ void Sema::InstantiateFunctionDefinition
>>> return;
>>> }
>>>
>>> + llvm::TimeTraceScope TimeScope("InstantiateFunction", [&]() {
>>> + return Function->getQualifiedNameAsString();
>>> + });
>>> +
>>> // If we're performing recursive template instantiation, create our
>>> own
>>> // queue of pending implicit instantiations that we will instantiate
>>> later,
>>> // while we're still within our own instantiation context.
>>>
>>> Modified: cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp (original)
>>> +++ cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp Sat Mar 30
>>> 01:42:48 2019
>>> @@ -10,6 +10,7 @@
>>> //
>>>
>>> //===----------------------------------------------------------------------===//
>>>
>>> +
>>> #include "ASTReaderInternals.h"
>>> #include "clang/Basic/FileManager.h"
>>> #include "clang/Lex/HeaderSearch.h"
>>> @@ -28,6 +29,7 @@
>>> #include "llvm/Support/MemoryBuffer.h"
>>> #include "llvm/Support/OnDiskHashTable.h"
>>> #include "llvm/Support/Path.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>> #include <cstdio>
>>> using namespace clang;
>>> using namespace serialization;
>>> @@ -126,6 +128,7 @@ GlobalModuleIndex::GlobalModuleIndex(std
>>> llvm::BitstreamCursor Cursor)
>>> : Buffer(std::move(Buffer)), IdentifierIndex(),
>>> NumIdentifierLookups(),
>>> NumIdentifierLookupHits() {
>>> + llvm::TimeTraceScope TimeScope("Module LoadIndex", StringRef(""));
>>> // Read the global index.
>>> bool InGlobalIndexBlock = false;
>>> bool Done = false;
>>> @@ -739,6 +742,7 @@ bool GlobalModuleIndexBuilder::writeInde
>>> }
>>>
>>> using namespace llvm;
>>> + llvm::TimeTraceScope TimeScope("Module WriteIndex", StringRef(""));
>>>
>>> // Emit the file header.
>>> Stream.Emit((unsigned)'B', 8);
>>>
>>> Modified: cfe/trunk/tools/driver/cc1_main.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/cc1_main.cpp?rev=357340&r1=357339&r2=357340&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/tools/driver/cc1_main.cpp (original)
>>> +++ cfe/trunk/tools/driver/cc1_main.cpp Sat Mar 30 01:42:48 2019
>>> @@ -34,8 +34,10 @@
>>> #include "llvm/Support/Compiler.h"
>>> #include "llvm/Support/ErrorHandling.h"
>>> #include "llvm/Support/ManagedStatic.h"
>>> +#include "llvm/Support/Path.h"
>>> #include "llvm/Support/Signals.h"
>>> #include "llvm/Support/TargetSelect.h"
>>> +#include "llvm/Support/TimeProfiler.h"
>>> #include "llvm/Support/Timer.h"
>>> #include "llvm/Support/raw_ostream.h"
>>> #include <cstdio>
>>> @@ -194,6 +196,9 @@ int cc1_main(ArrayRef<const char *> Argv
>>> bool Success = CompilerInvocation::CreateFromArgs(
>>> Clang->getInvocation(), Argv.begin(), Argv.end(), Diags);
>>>
>>> + if (Clang->getFrontendOpts().TimeTrace)
>>> + llvm::timeTraceProfilerInitialize();
>>> +
>>> // Infer the builtin include path if unspecified.
>>> if (Clang->getHeaderSearchOpts().UseBuiltinIncludes &&
>>> Clang->getHeaderSearchOpts().ResourceDir.empty())
>>> @@ -215,12 +220,29 @@ int cc1_main(ArrayRef<const char *> Argv
>>> return 1;
>>>
>>> // Execute the frontend actions.
>>> - Success = ExecuteCompilerInvocation(Clang.get());
>>> + {
>>> + llvm::TimeTraceScope TimeScope("ExecuteCompiler", StringRef(""));
>>> + Success = ExecuteCompilerInvocation(Clang.get());
>>> + }
>>>
>>> // If any timers were active but haven't been destroyed yet, print
>>> their
>>> // results now. This happens in -disable-free mode.
>>> llvm::TimerGroup::printAll(llvm::errs());
>>>
>>> + if (llvm::timeTraceProfilerEnabled()) {
>>> + SmallString<128> Path(Clang->getFrontendOpts().OutputFile);
>>> + llvm::sys::path::replace_extension(Path, "json");
>>> + auto profilerOutput =
>>> + Clang->createOutputFile(Path.str(),
>>> + /*Binary=*/false,
>>> + /*RemoveFileOnSignal=*/false, "",
>>> + /*Extension=*/"json",
>>> + /*useTemporary=*/false);
>>> +
>>> + llvm::timeTraceProfilerWrite(profilerOutput);
>>> + llvm::timeTraceProfilerCleanup();
>>> + }
>>> +
>>> // Our error handler depends on the Diagnostics object, which we're
>>> // potentially about to delete. Uninstall the handler now so that any
>>> // later errors use the default handling behavior instead.
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190412/67036f23/attachment-0001.html>
More information about the cfe-commits
mailing list