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