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