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
Thu Apr 11 14:22:03 PDT 2019


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/20190411/bbfe8e87/attachment-0001.html>


More information about the cfe-commits mailing list