diff --git a/clang/include/clang/Frontend/FrontendAction.h b/clang/include/clang/Frontend/FrontendAction.h --- a/clang/include/clang/Frontend/FrontendAction.h +++ b/clang/include/clang/Frontend/FrontendAction.h @@ -37,6 +37,7 @@ FrontendInputFile CurrentInput; std::unique_ptr CurrentASTUnit; CompilerInstance *Instance; + bool TimePassesIsEnabled = false; friend class ASTMergeAction; friend class WrapperFrontendAction; @@ -167,6 +168,9 @@ void setCurrentInput(const FrontendInputFile &CurrentInput, std::unique_ptr AST = nullptr); + bool isTimePassesEnabled() { return TimePassesIsEnabled; } + void enableTimePasses() { TimePassesIsEnabled = true; } + /// @} /// @name Supported Modes /// @{ diff --git a/clang/include/clang/Parse/ParseAST.h b/clang/include/clang/Parse/ParseAST.h --- a/clang/include/clang/Parse/ParseAST.h +++ b/clang/include/clang/Parse/ParseAST.h @@ -44,7 +44,8 @@ /// Parse the main file known to the preprocessor, producing an /// abstract syntax tree. void ParseAST(Sema &S, bool PrintStats = false, - bool SkipFunctionBodies = false); + bool SkipFunctionBodies = false, + bool TimePassesIsEnabled = false); } // end namespace clang diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1500,6 +1500,8 @@ { PrettyStackTraceString CrashInfo("Optimizer"); llvm::TimeTraceScope TimeScope("Optimizer"); + llvm::NamedRegionTimer T("Optimizer", "Optimizer", "Clang Compilation", + "Clang Compilation", CodeGenOpts.TimePasses); MPM.run(*TheModule, MAM); } } @@ -1536,6 +1538,9 @@ { PrettyStackTraceString CrashInfo("Code generation"); llvm::TimeTraceScope TimeScope("CodeGenPasses"); + llvm::NamedRegionTimer T("CodeGenPasses", "CodeGenPasses", + "Clang Compilation", "Clang Compilation", + CodeGenOpts.TimePasses); CodeGenPasses.run(*TheModule); } } diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -294,6 +294,9 @@ void HandleTranslationUnit(ASTContext &C) override { { llvm::TimeTraceScope TimeScope("Frontend"); + llvm::NamedRegionTimer T("IR Generation", "IR Generation", + "Clang Compilation", "Clang Compilation", + CodeGenOpts.TimePasses); PrettyStackTraceString CrashInfo("Per-file LLVM IR generation"); if (TimerIsEnabled) { LLVMIRGenerationRefCount += 1; diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -1137,7 +1137,7 @@ CI.createSema(getTranslationUnitKind(), CompletionConsumer); ParseAST(CI.getSema(), CI.getFrontendOpts().ShowStats, - CI.getFrontendOpts().SkipFunctionBodies); + CI.getFrontendOpts().SkipFunctionBodies, isTimePassesEnabled()); } void PluginASTAction::anchor() { } diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp --- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -186,6 +186,9 @@ Act = std::make_unique(std::move(Act), FEOpts.ASTMergeFiles); + if (CI.getCodeGenOpts().TimePasses) + Act->enableTimePasses(); + return Act; } diff --git a/clang/lib/Parse/ParseAST.cpp b/clang/lib/Parse/ParseAST.cpp --- a/clang/lib/Parse/ParseAST.cpp +++ b/clang/lib/Parse/ParseAST.cpp @@ -23,6 +23,7 @@ #include "clang/Sema/TemplateInstCallback.h" #include "llvm/Support/CrashRecoveryContext.h" #include "llvm/Support/TimeProfiler.h" +#include "llvm/Support/Timer.h" #include #include @@ -111,7 +112,8 @@ ParseAST(*S.get(), PrintStats, SkipFunctionBodies); } -void clang::ParseAST(Sema &S, bool PrintStats, bool SkipFunctionBodies) { +void clang::ParseAST(Sema &S, bool PrintStats, bool SkipFunctionBodies, + bool TimePassesIsEnabled) { // Collect global stats on Decls/Stmts (until we have a module streamer). if (PrintStats) { Decl::EnableStatistics(); @@ -152,6 +154,8 @@ if (HaveLexer) { llvm::TimeTraceScope TimeScope("Frontend"); + llvm::NamedRegionTimer T("Parse AST", "Parse AST", "Clang Compilation", + "Clang Compilation", TimePassesIsEnabled); P.Initialize(); Parser::DeclGroupPtrTy ADecl; Sema::ModuleImportState ImportState;