StringRef InFile);
protected:
+ static constexpr const char *GroupName = "factions";
+ static constexpr const char *GroupDescription =
+ "===== Frontend Actions =====";
/// @name Implementation Action Interface
/// @{
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringMap.h"
-#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringSet.h"
#include "llvm/Support/Allocator.h"
+#include "llvm/Support/Timer.h"
#include <cassert>
#include <cstddef>
#include <memory>
#include <utility>
#include <vector>
+static const char *const IncGroupName = "includefiles";
+static const char *const IncGroupDescription = "===== Include Files =====";
+
namespace clang {
class DiagnosticsEngine;
} // end namespace clang
+static const char *const GroupName = "clangparser";
+static const char *const GroupDescription = "===== Clang Parser =====";
#endif
bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
public:
+ static constexpr const char *GroupName = "sema";
+ static constexpr const char *GroupDescription = "===== Sema =====";
+
typedef OpaquePtr<DeclGroupRef> DeclGroupPtrTy;
typedef OpaquePtr<TemplateName> TemplateTy;
typedef OpaquePtr<QualType> TypeTy;
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "clang/Lex/Preprocessor.h"
+#include "clang/Rewrite/Frontend/FrontendActions.h"
#include "llvm/Bitcode/BitcodeReader.h"
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
#include "llvm/IR/DebugInfo.h"
public:
ClangDiagnosticHandler(const CodeGenOptions &CGOpts, BackendConsumer *BCon)
: CodeGenOpts(CGOpts), BackendCon(BCon) {}
-
+
bool handleDiagnostics(const DiagnosticInfo &DI) override;
bool isAnalysisRemarkEnabled(StringRef PassName) const override {
const LangOptions &LangOpts;
std::unique_ptr<raw_pwrite_stream> AsmOutStream;
ASTContext *Context;
-
- Timer LLVMIRGeneration;
- unsigned LLVMIRGenerationRefCount;
+ static constexpr const char *GroupName = "frontend";
+ static constexpr const char *GroupDescription = "===== Frontend =====";
/// True if we've finished generating IR. This prevents us from generating
/// additional LLVM IR after emitting output in HandleTranslationUnit. This
: Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts),
CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts),
AsmOutStream(std::move(OS)), Context(nullptr),
- LLVMIRGeneration("irgen", "LLVM IR Generation Time"),
- LLVMIRGenerationRefCount(0),
Gen(CreateLLVMCodeGen(Diags, InFile, HeaderSearchOpts, PPOpts,
CodeGenOpts, C, CoverageInfo)),
LinkModules(std::move(LinkModules)) {
void Initialize(ASTContext &Ctx) override {
assert(!Context && "initialized multiple times");
-
Context = &Ctx;
-
- if (llvm::TimePassesIsEnabled)
- LLVMIRGeneration.startTimer();
-
+ NamedRegionTimer T("initbackendconsumer", "Init Backend Consumer",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Gen->Initialize(Ctx);
-
- if (llvm::TimePassesIsEnabled)
- LLVMIRGeneration.stopTimer();
}
bool HandleTopLevelDecl(DeclGroupRef D) override {
PrettyStackTraceDecl CrashInfo(*D.begin(), SourceLocation(),
Context->getSourceManager(),
"LLVM IR generation of declaration");
-
- // Recurse.
- if (llvm::TimePassesIsEnabled) {
- LLVMIRGenerationRefCount += 1;
- if (LLVMIRGenerationRefCount == 1)
- LLVMIRGeneration.startTimer();
- }
+ NamedRegionTimer T("handlehophevelhecl", "Handle Top Level Decl",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Gen->HandleTopLevelDecl(D);
-
- if (llvm::TimePassesIsEnabled) {
- LLVMIRGenerationRefCount -= 1;
- if (LLVMIRGenerationRefCount == 0)
- LLVMIRGeneration.stopTimer();
- }
-
return true;
}
PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
Context->getSourceManager(),
"LLVM IR generation of inline function");
- if (llvm::TimePassesIsEnabled)
- LLVMIRGeneration.startTimer();
+ NamedRegionTimer T("handleinlinefunction",
+ "Handle Inline Function Definition", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
Gen->HandleInlineFunctionDefinition(D);
-
- if (llvm::TimePassesIsEnabled)
- LLVMIRGeneration.stopTimer();
}
void HandleInterestingDecl(DeclGroupRef D) override {
// Links each entry in LinkModules into our module. Returns true on error.
bool LinkInModules() {
+ NamedRegionTimer T("linkinmodules", "Link In Modules", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
for (auto &LM : LinkModules) {
if (LM.PropagateAttrs)
for (Function &F : *LM.Module)
void HandleTranslationUnit(ASTContext &C) override {
{
PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
- if (llvm::TimePassesIsEnabled) {
- LLVMIRGenerationRefCount += 1;
- if (LLVMIRGenerationRefCount == 1)
- LLVMIRGeneration.startTimer();
- }
+ NamedRegionTimer T("handletranslationunit", "Handle Translation Unit",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Gen->HandleTranslationUnit(C);
-
- if (llvm::TimePassesIsEnabled) {
- LLVMIRGenerationRefCount -= 1;
- if (LLVMIRGenerationRefCount == 0)
- LLVMIRGeneration.stopTimer();
- }
-
- IRGenFinished = true;
+ IRGenFinished = true;
}
// Silently ignore if we weren't initialized for some reason.
}
void HandleTagDeclRequiredDefinition(const TagDecl *D) override {
+ NamedRegionTimer T("handletagdecl",
+ "Handle Tag Decl Required Definition", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
Gen->HandleTagDeclRequiredDefinition(D);
}
void CompleteTentativeDefinition(VarDecl *D) override {
+ NamedRegionTimer T("completetentative",
+ "Complete Tentative Definition", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
Gen->CompleteTentativeDefinition(D);
}
void AssignInheritanceModel(CXXRecordDecl *RD) override {
+ NamedRegionTimer T("assigninheritance", "Assign Inheritance Model",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Gen->AssignInheritanceModel(RD);
}
void HandleVTable(CXXRecordDecl *RD) override {
+ NamedRegionTimer T("handlevtable", "Handle VTable", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
Gen->HandleVTable(RD);
}
static void InlineAsmDiagHandler(const llvm::SMDiagnostic &SM,void *Context,
unsigned LocCookie) {
+ NamedRegionTimer T("inlineasmhandler", "Inline Asm Diag Handler",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
SourceLocation Loc = SourceLocation::getFromRawEncoding(LocCookie);
((BackendConsumer*)Context)->InlineAsmDiagHandler2(SM, Loc);
}
}
std::unique_ptr<llvm::Module> CodeGenAction::loadModule(MemoryBufferRef MBRef) {
+ NamedRegionTimer T("loadmodule", "Load Module", GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
CompilerInstance &CI = getCompilerInstance();
SourceManager &SM = CI.getSourceManager();
void CodeGenAction::ExecuteAction() {
// If this is an IR file, we have to treat it specially.
if (getCurrentFileKind().getLanguage() == InputKind::LLVM_IR) {
+ NamedRegionTimer T("executeaction", "LLVM_IR ExecuteAction", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
BackendAction BA = static_cast<BackendAction>(Act);
CompilerInstance &CI = getCompilerInstance();
std::unique_ptr<raw_pwrite_stream> OS =
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
-#include "clang/Frontend/ASTUnit.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTDiagnostic.h"
#include "clang/AST/ASTImporter.h"
#include "clang/Basic/Diagnostic.h"
+#include "clang/Frontend/ASTUnit.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendActions.h"
+#include "llvm/Support/Timer.h"
using namespace clang;
}
void ASTMergeAction::ExecuteAction() {
+ llvm::NamedRegionTimer T("astmerge", "AST Merge actions", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
CompilerInstance &CI = getCompilerInstance();
CI.getDiagnostics().getClient()->BeginSourceFile(
CI.getASTContext().getLangOpts());
#include <utility>
using namespace clang;
+static const char *const GroupName = "frontend";
+static const char *const GroupDescription = "===== Frontend =====";
CompilerInstance::CompilerInstance(
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!");
assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!");
+ llvm::NamedRegionTimer T("compilerinstance", "Compiler Instance actions",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
+
// FIXME: Take this as an argument, once all the APIs we used have moved to
// taking it as an input instead of hard-coding llvm::errs.
raw_ostream &OS = llvm::errs();
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/PreprocessorOptions.h"
#include "clang/Parse/ParseAST.h"
+#include "clang/Rewrite/Frontend/FrontendActions.h"
#include "clang/Serialization/ASTDeserializationListener.h"
#include "clang/Serialization/ASTReader.h"
#include "clang/Serialization/GlobalModuleIndex.h"
}
void VerifyPCHAction::ExecuteAction() {
+ llvm::NamedRegionTimer T("verifypch", "Verify PCH actions", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
CompilerInstance &CI = getCompilerInstance();
bool Preamble = CI.getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
const std::string &Sysroot = CI.getHeaderSearchOpts().Sysroot;
}
void PrintPreprocessedAction::ExecuteAction() {
+ llvm::NamedRegionTimer T("printpp", "Print PP actions", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
CompilerInstance &CI = getCompilerInstance();
// Output file may need to be set to 'Binary', to avoid converting Unix style
// line feeds (<LF>) to Microsoft style line feeds (<CR><LF>).
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Pass.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Capacity.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
+#include "llvm/Support/Timer.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
}
Module *HeaderSearch::lookupModule(StringRef ModuleName, bool AllowSearch) {
+ llvm::NamedRegionTimer T("lookupmodule", "Lookup Module", IncGroupName,
+ IncGroupDescription, llvm::TimePassesIsEnabled);
+
// Look in the module map to determine if there is a module by this name.
Module *Module = ModMap.findModule(ModuleName);
if (Module || !AllowSearch || !HSOpts->ImplicitModuleMaps)
}
Module *HeaderSearch::lookupModule(StringRef ModuleName, StringRef SearchName) {
+ llvm::NamedRegionTimer T("lookupmodule", "Lookup Module", IncGroupName,
+ IncGroupDescription, llvm::TimePassesIsEnabled);
Module *Module = nullptr;
// Look through the various header search paths to load any available module
bool &InUserSpecifiedSystemFramework,
bool &HasBeenMapped,
SmallVectorImpl<char> &MappedName) const {
+ llvm::NamedRegionTimer T("lookupfile", "Lookup File", IncGroupName,
+ IncGroupDescription, llvm::TimePassesIsEnabled);
InUserSpecifiedSystemFramework = false;
HasBeenMapped = false;
SmallVectorImpl<char> *RelativePath, Module *RequestingModule,
ModuleMap::KnownHeader *SuggestedModule,
bool &InUserSpecifiedSystemFramework) const {
+ llvm::NamedRegionTimer T("lookupfw", "Lookup Framework", IncGroupName,
+ IncGroupDescription, llvm::TimePassesIsEnabled);
FileManager &FileMgr = HS.getFileMgr();
// Framework names must have a '/' in the filename.
SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath,
Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule,
bool *IsMapped, bool SkipCache, bool BuildSystemModule) {
+ llvm::NamedRegionTimer T("lookupfile2", "Lookup File2", IncGroupName,
+ IncGroupDescription, llvm::TimePassesIsEnabled);
if (IsMapped)
*IsMapped = false;
Module *RequestingModule,
ModuleMap::KnownHeader *SuggestedModule) {
assert(ContextFileEnt && "No context file?");
+ llvm::NamedRegionTimer T("lookupsubfm", "Lookup SubFramework", IncGroupName,
+ IncGroupDescription, llvm::TimePassesIsEnabled);
// Framework names must have a '/' in the filename. Find it.
// FIXME: Should we permit '\' on Windows?
bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP,
const FileEntry *File, bool isImport,
bool ModulesEnabled, Module *M) {
+ llvm::NamedRegionTimer T("shouldenterinc", "Should Enter Include File",
+ IncGroupName, IncGroupDescription,
+ llvm::TimePassesIsEnabled);
++NumIncluded; // Count # of attempted #includes.
// Get information about this file.
bool HeaderSearch::findUsableModuleForHeader(
const FileEntry *File, const DirectoryEntry *Root, Module *RequestingModule,
ModuleMap::KnownHeader *SuggestedModule, bool IsSystemHeaderDir) {
+ llvm::NamedRegionTimer T("findmodule4header", "Find Usable Module For Header",
+ IncGroupName, IncGroupDescription,
+ llvm::TimePassesIsEnabled);
if (File && needModuleLookup(RequestingModule, SuggestedModule)) {
// If there is a module that corresponds to this header, suggest it.
hasModuleMap(File->getName(), Root, IsSystemHeaderDir);
const FileEntry *File, StringRef FrameworkName, Module *RequestingModule,
ModuleMap::KnownHeader *SuggestedModule, bool IsSystemFramework) {
// If we're supposed to suggest a module, look for one now.
+ llvm::NamedRegionTimer T(
+ "findmodule4fwheader", "Find Usable Module For Framework Header",
+ IncGroupName, IncGroupDescription, llvm::TimePassesIsEnabled);
if (needModuleLookup(RequestingModule, SuggestedModule)) {
// Find the top-level framework based on this framework.
SmallVector<std::string, 4> SubmodulePath;
}
void HeaderSearch::collectAllModules(SmallVectorImpl<Module *> &Modules) {
+ llvm::NamedRegionTimer T("allmodules", "Collect All Modules", IncGroupName,
+ IncGroupDescription, llvm::TimePassesIsEnabled);
Modules.clear();
if (HSOpts->ImplicitModuleMaps) {
#include "clang/Lex/LexDiagnostic.h"
#include "clang/Lex/MacroArgs.h"
#include "clang/Lex/MacroInfo.h"
+#include "clang/Lex/PTHLexer.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/PreprocessorLexer.h"
-#include "clang/Lex/PTHLexer.h"
#include "clang/Lex/Token.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
+#include "llvm/Support/Timer.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
using namespace clang;
+static const char *const GroupName = "clangparser";
+static const char *const GroupDescription = "===== Clang Parser =====";
+
MacroDirective *
Preprocessor::getLocalMacroDirectiveHistory(const IdentifierInfo *II) const {
if (!II->hadMacroDefinition())
void Preprocessor::appendMacroDirective(IdentifierInfo *II, MacroDirective *MD){
assert(MD && "MacroDirective should be non-zero!");
assert(!MD->getPrevious() && "Already attached to a MacroDirective history.");
+ llvm::NamedRegionTimer NRT("appendmacro", "PP Append Macro", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
MacroState &StoredMD = CurSubmoduleState->Macros[II];
auto *OldMD = StoredMD.getLatest();
MacroInfo *Macro,
ArrayRef<ModuleMacro *> Overrides,
bool &New) {
+ llvm::NamedRegionTimer NRT("addmodulemacro", "PP Add Module Macro", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
llvm::FoldingSetNodeID ID;
ModuleMacro::Profile(ID, Mod, II);
assert(Info.ActiveModuleMacrosGeneration !=
CurSubmoduleState->VisibleModules.getGeneration() &&
"don't need to update this macro name info");
+ llvm::NamedRegionTimer NRT("updatemodulemacro", "PP Update Module Macro",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Info.ActiveModuleMacrosGeneration =
CurSubmoduleState->VisibleModules.getGeneration();
MacroArgs *Preprocessor::ReadMacroCallArgumentList(Token &MacroName,
MacroInfo *MI,
SourceLocation &MacroEnd) {
+ llvm::NamedRegionTimer NRT("ppmacrocall", "PP Macro Call Args", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
// The number of fixed arguments to parse.
unsigned NumFixedArgsLeft = MI->getNumParams();
bool isVariadic = MI->isVariadic();
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/CrashRecoveryContext.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/Pass.h"
#include "llvm/Support/Compiler.h"
+#include "llvm/Support/CrashRecoveryContext.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/Timer.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <vector>
using namespace clang;
+static const char *const GroupName = "clangparser";
+static const char *const GroupDescription = "===== Clang Parser =====";
// Out-of-line destructor to provide a home for the class.
PragmaHandler::~PragmaHandler() = default;
/// the null handler isn't returned on failure to match.
PragmaHandler *PragmaNamespace::FindHandler(StringRef Name,
bool IgnoreNull) const {
+ llvm::NamedRegionTimer NRT("ppfindhandler", "PP Find Handler", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
if (PragmaHandler *Handler = Handlers.lookup(Name))
return Handler;
return IgnoreNull ? nullptr : Handlers.lookup(StringRef());
/// rest of the pragma, passing it to the registered pragma handlers.
void Preprocessor::HandlePragmaDirective(SourceLocation IntroducerLoc,
PragmaIntroducerKind Introducer) {
+ llvm::NamedRegionTimer NRT("pppragma", "Handle Pragma Directive", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
if (Callbacks)
Callbacks->PragmaDirective(IntroducerLoc, Introducer);
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/ParsedTemplate.h"
#include "clang/Sema/Scope.h"
+#include "llvm/Support/Timer.h"
using namespace clang;
/// \brief Parse a template declaration, explicit instantiation, or
SourceLocation &DeclEnd,
AccessSpecifier AS,
AttributeList *AccessAttrs) {
+ llvm::NamedRegionTimer NRT("parsetemplate", "Parse Template", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
ObjCDeclContextSwitch ObjCDC(*this);
if (Tok.is(tok::kw_template) && NextToken().isNot(tok::less)) {
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/ParsedTemplate.h"
#include "clang/Sema/Scope.h"
+#include "llvm/Support/Timer.h"
using namespace clang;
/// ExitScope - Pop a scope off the scope stack.
void Parser::ExitScope() {
assert(getCurScope() && "Scope imbalance!");
+ llvm::NamedRegionTimer NRT("clangscope", "Scope manipulation", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
// Inform the actions module that this scope is going away if there are any
// decls in it.
/// ParseTopLevelDecl - Parse one top-level declaration, return whatever the
/// action tells us to. This returns true if the EOF was encountered.
bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {
+ llvm::NamedRegionTimer NRT("parsetopleveldecl", "Parse Top Level Decl",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(TemplateIds);
// Skip over the EOF token, flagging end of previous input for incremental
Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,
const ParsedTemplateInfo &TemplateInfo,
LateParsedAttrList *LateParsedAttrs) {
+ llvm::NamedRegionTimer NRT("parsefdef", "Parse Function Definition",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
// Poison SEH identifiers so they are flagged as illegal in function bodies.
PoisonSEHIdentifiersRAIIObject PoisonSEHIdentifiers(*this, true);
const DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
SourceLocation Parser::handleUnexpectedCodeCompletionToken() {
assert(Tok.is(tok::code_completion));
+ llvm::NamedRegionTimer NRT("codecompletion", "Code completion operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
PrevTokLocation = Tok.getLocation();
for (Scope *S = getCurScope(); S; S = S->getParent()) {
// Code-completion pass-through functions
void Parser::CodeCompleteDirective(bool InConditional) {
+ llvm::NamedRegionTimer NRT("codecompletion", "Code completion operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Actions.CodeCompletePreprocessorDirective(InConditional);
}
void Parser::CodeCompleteInConditionalExclusion() {
+ llvm::NamedRegionTimer NRT("codecompletion", "Code completion operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Actions.CodeCompleteInPreprocessorConditionalExclusion(getCurScope());
}
void Parser::CodeCompleteMacroName(bool IsDefinition) {
+ llvm::NamedRegionTimer NRT("codecompletion", "Code completion operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Actions.CodeCompletePreprocessorMacroName(IsDefinition);
}
-void Parser::CodeCompletePreprocessorExpression() {
+void Parser::CodeCompletePreprocessorExpression() {
+ llvm::NamedRegionTimer NRT("codecompletion", "Code completion operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Actions.CodeCompletePreprocessorExpression();
}
void Parser::CodeCompleteMacroArgument(IdentifierInfo *Macro,
MacroInfo *MacroInfo,
unsigned ArgumentIndex) {
+ llvm::NamedRegionTimer NRT("codecompletion", "Code completion operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Actions.CodeCompletePreprocessorMacroArgument(getCurScope(), Macro, MacroInfo,
ArgumentIndex);
}
void Parser::CodeCompleteNaturalLanguage() {
+ llvm::NamedRegionTimer NRT("codecompletion", "Code completion operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
Actions.CodeCompleteNaturalLanguage();
}
///
/// Note that 'partition' is a context-sensitive keyword.
Parser::DeclGroupPtrTy Parser::ParseModuleDecl() {
+ llvm::NamedRegionTimer NRT("moduleoperations", "Module related operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
SourceLocation StartLoc = Tok.getLocation();
Sema::ModuleDeclKind MDK = TryConsumeToken(tok::kw_export)
assert((AtLoc.isInvalid() ? Tok.is(tok::kw_import)
: Tok.isObjCAtKeyword(tok::objc_import)) &&
"Improper start to module import");
+ llvm::NamedRegionTimer NRT("moduleoperations", "Module related operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
SourceLocation ImportLoc = ConsumeToken();
SourceLocation StartLoc = AtLoc.isInvalid() ? ImportLoc : AtLoc;
SourceLocation UseLoc,
SmallVectorImpl<std::pair<IdentifierInfo *, SourceLocation>> &Path,
bool IsImport) {
+ llvm::NamedRegionTimer NRT("moduleoperations", "Module related operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
// Parse the module path.
while (true) {
if (!Tok.is(tok::identifier)) {
/// \returns false if the recover was successful and parsing may be continued, or
/// true if parser must bail out to top level and handle the token there.
bool Parser::parseMisplacedModuleImport() {
+ llvm::NamedRegionTimer NRT("moduleoperations", "Module related operations",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
while (true) {
switch (Tok.getKind()) {
case tok::annot_module_end:
#include "clang/Sema/TemplateInstCallback.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallSet.h"
+#include "llvm/Support/Timer.h"
using namespace clang;
using namespace sema;
/// translation unit when EOF is reached and all but the top-level scope is
/// popped.
void Sema::ActOnEndOfTranslationUnit() {
+ llvm::NamedRegionTimer T(
+ "actoneou1", "Act On End Of Translation Unit: Common case",
+ GroupName, GroupDescription, llvm::TimePassesIsEnabled);
assert(DelayedDiagnostics.getCurrentPool() == nullptr
&& "reached end of translation unit with a pool attached?");
// Complete translation units and modules define vtables and perform implicit
// instantiations. PCH files do not.
if (TUKind != TU_Prefix) {
+ llvm::NamedRegionTimer T(
+ "actoneou2",
+ "Act On End Of Translation Unit: TUKind != TU_Prefix", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
DiagnoseUseOfUnimplementedSelectors();
// If DefinedUsedVTables ends up marking any virtual member functions it
UnusedFileScopedDecls.end());
if (TUKind == TU_Prefix) {
+ llvm::NamedRegionTimer T(
+ "actoneou3",
+ "Act On End Of Translation Unit: TUKind == TU_Prefix", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
// Translation unit prefixes don't need any of the checking below.
if (!PP.isIncrementalProcessingEnabled())
TUScope = nullptr;
}
if (TUKind == TU_Module) {
+ llvm::NamedRegionTimer T(
+ "actoneou4",
+ "Act On End Of Translation Unit: TUKind == TU_Module", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
// If we are building a module interface unit, we need to have seen the
// module declaration by now.
if (getLangOpts().getCompilingModule() ==
/// name, this parameter is populated with the decls of the various overloads.
bool Sema::tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
UnresolvedSetImpl &OverloadSet) {
+ llvm::NamedRegionTimer T("tryascall", "Try Expr As Call", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
+
ZeroArgCallReturnTy = QualType();
OverloadSet.clear();
bool Sema::tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD,
bool ForceComplain,
bool (*IsPlausibleResult)(QualType)) {
+ llvm::NamedRegionTimer T("trytorecover", "Try To Recover With Call",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
SourceLocation Loc = E.get()->getExprLoc();
SourceRange Range = E.get()->getSourceRange();
#include "llvm/Support/Format.h"
#include "llvm/Support/Locale.h"
#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/Timer.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
// Highlight all the excess arguments.
SourceRange range(call->getArg(desiredArgCount)->getLocStart(),
call->getArg(argCount - 1)->getLocEnd());
-
+
return S.Diag(range.getBegin(), diag::err_typecheck_call_too_many_args)
<< 0 /*function call*/ << desiredArgCount << argCount
<< call->getArg(1)->getSourceRange();
}
static void SemaBuiltinMemChkCall(Sema &S, FunctionDecl *FDecl,
- CallExpr *TheCall, unsigned SizeIdx,
+ CallExpr *TheCall, unsigned SizeIdx,
unsigned DstSizeIdx) {
if (TheCall->getNumArgs() <= SizeIdx ||
TheCall->getNumArgs() <= DstSizeIdx)
/// void (^block)(local void*, ...),
/// uint size0, ...)
static bool SemaOpenCLBuiltinEnqueueKernel(Sema &S, CallExpr *TheCall) {
+ llvm::NamedRegionTimer T(
+ "semaopenclbuiltin", "Sema OpenCL Builtin Enqueue Kernel",
+ Sema::GroupName, Sema::GroupDescription, llvm::TimePassesIsEnabled);
unsigned NumArgs = TheCall->getNumArgs();
if (NumArgs < 4) {
ExprResult
Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
CallExpr *TheCall) {
+ llvm::NamedRegionTimer T("checkbuiltinfunction",
+ "Check Builtin Function Call", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
+
ExprResult TheCallResult(TheCall);
// Find out if any arguments are required to be integer constant expressions.
}
bool Sema::CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
+ llvm::NamedRegionTimer T("checkx86builtin",
+ "Check X86 Builtin Function Call", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
if (BuiltinID == X86::BI__builtin_cpu_supports)
return SemaBuiltinCpuSupports(*this, TheCall);
const Expr *ThisArg, ArrayRef<const Expr *> Args,
bool IsMemberFunction, SourceLocation Loc,
SourceRange Range, VariadicCallType CallType) {
+ llvm::NamedRegionTimer T("checkcall", "Check Call", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
// FIXME: We should check as much as we can in the template definition.
if (CurContext->isDependentContext())
return;
/// builtins,
ExprResult
Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {
+ llvm::NamedRegionTimer T("semabuiltinatomic",
+ "Sema Builtin Atomic Overloaded", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
+
CallExpr *TheCall = (CallExpr *)TheCallResult.get();
DeclRefExpr *DRE =cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts());
FunctionDecl *FDecl = cast<FunctionDecl>(DRE->getDecl());
static void
CheckImplicitConversion(Sema &S, Expr *E, QualType T, SourceLocation CC,
bool *ICContext = nullptr) {
+ llvm::NamedRegionTimer NRT("checkimplicit",
+ "Check Implicit Conversion", Sema::GroupName,
+ Sema::GroupDescription, llvm::TimePassesIsEnabled);
+
if (E->isTypeDependent() || E->isValueDependent()) return;
const Type *Source = S.Context.getCanonicalType(E->getType()).getTypePtr();
#include "clang/Sema/Template.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/Triple.h"
+#include "llvm/Support/Timer.h"
#include <algorithm>
#include <cstring>
#include <functional>
SourceLocation NameLoc, const Token &NextToken,
bool IsAddressOfOperand,
std::unique_ptr<CorrectionCandidateCallback> CCC) {
+ llvm::NamedRegionTimer T("classifyname", "Classify Name", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
DeclarationNameInfo NameInfo(Name, NameLoc);
ObjCMethodDecl *CurMethod = getCurMethodDecl();
NamedDecl *Sema::HandleDeclarator(Scope *S, Declarator &D,
MultiTemplateParamsArg TemplateParamLists) {
+ llvm::NamedRegionTimer T("handledeclarator", "Handle Declarator", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
// TODO: consider using NameInfo for diagnostic.
DeclarationNameInfo NameInfo = GetNameForDeclarator(D);
DeclarationName Name = NameInfo.getName();
#include "clang/Sema/SemaInternal.h"
#include "clang/Sema/Template.h"
#include "llvm/Support/ConvertUTF.h"
+#include "llvm/Support/Timer.h"
using namespace clang;
using namespace sema;
Expr *ControllingExpr,
ArrayRef<ParsedType> ArgTypes,
ArrayRef<Expr *> ArgExprs) {
+ llvm::NamedRegionTimer T("actongenericselection",
+ "Act On Generic Selection Expr", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
+
unsigned NumAssocs = ArgTypes.size();
assert(NumAssocs == ArgExprs.size());
ExprResult
Sema::ActOnStringLiteral(ArrayRef<Token> StringToks, Scope *UDLScope) {
assert(!StringToks.empty() && "Must have at least one string!");
+ llvm::NamedRegionTimer T("actonstringliteral", "Act On String Literal",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
StringLiteralParser Literal(StringToks, PP);
if (Literal.hadError)
bool IsInlineAsmIdentifier, Token *KeywordReplacement) {
assert(!(IsAddressOfOperand && HasTrailingLParen) &&
"cannot be direct & operand and have a trailing lparen");
+ llvm::NamedRegionTimer T("actonid", "Act On Id Expression",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
if (SS.isInvalid())
return ExprError();
}
ExprResult Sema::ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind) {
+ llvm::NamedRegionTimer T("actonpredefined", "Act On Predefined Expr",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
+
PredefinedExpr::IdentType IT;
switch (Kind) {
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/Support/Timer.h"
#include <iterator>
using namespace clang;
QualType ObjectType,
bool EnteringContext,
bool &MemberOfUnknownSpecialization) {
+ llvm::NamedRegionTimer T("lookuptemplate", "Lookup Template Name",
+ GroupName, GroupDescription,
+ llvm::TimePassesIsEnabled);
// Determine where to perform name lookup
MemberOfUnknownSpecialization = false;
DeclContext *LookupCtx = nullptr;
const DeclarationNameInfo &NameInfo,
bool isAddressOfOperand,
const TemplateArgumentListInfo *TemplateArgs) {
+ llvm::NamedRegionTimer T("actondependent",
+ "Act On Dependent Id Expression", GroupName,
+ GroupDescription, llvm::TimePassesIsEnabled);
DeclContext *DC = getFunctionLevelDeclContext();
// C++11 [expr.prim.general]p12:
--- /dev/null
+// RUN: %clang %s -S -o - -ftime-report 2>&1 | FileCheck %s
+// RUN: %clang %s -S -o - -fdelayed-template-parsing -DDELAYED_TEMPLATE_PARSING -ftime-report 2>&1 | FileCheck %s
+
+// Template function declarations
+template <typename T>
+void foo();
+template <typename T, typename U>
+void foo();
+
+// Template function definitions.
+template <typename T>
+void foo() {}
+
+// Template class (forward) declarations
+template <typename T>
+struct A;
+template <typename T, typename U>
+struct b;
+template <typename>
+struct C;
+template <typename, typename>
+struct D;
+
+// Forward declarations with default parameters?
+template <typename T = int>
+class X1;
+template <typename = int>
+class X2;
+
+// Forward declarations w/template template parameters
+template <template <typename> class T>
+class TTP1;
+template <template <typename> class>
+class TTP2;
+template <template <typename X, typename Y> class T>
+class TTP5;
+
+// Forward declarations with non-type params
+template <int>
+class NTP0;
+template <int N>
+class NTP1;
+template <int N = 5>
+class NTP2;
+template <int = 10>
+class NTP3;
+template <unsigned int N = 12u>
+class NTP4;
+template <unsigned int = 12u>
+class NTP5;
+template <unsigned = 15u>
+class NTP6;
+template <typename T, T Obj>
+class NTP7;
+
+// Template class declarations
+template <typename T>
+struct A {};
+template <typename T, typename U>
+struct B {};
+
+namespace PR6184 {
+namespace N {
+template <typename T>
+void bar(typename T::x);
+}
+
+template <typename T>
+void N::bar(typename T::x) {}
+}
+
+// This PR occurred only in template parsing mode.
+namespace PR17637 {
+template <int>
+struct L {
+ template <typename T>
+ struct O {
+ template <typename U>
+ static void Fun(U);
+ };
+};
+
+template <int k>
+template <typename T>
+template <typename U>
+void L<k>::O<T>::Fun(U) {}
+
+void Instantiate() { L<0>::O<int>::Fun(0); }
+}
+
+namespace explicit_partial_specializations {
+typedef char (&oneT)[1];
+typedef char (&twoT)[2];
+typedef char (&threeT)[3];
+typedef char (&fourT)[4];
+typedef char (&fiveT)[5];
+typedef char (&sixT)[6];
+
+char one[1];
+char two[2];
+char three[3];
+char four[4];
+char five[5];
+char six[6];
+
+template <bool b>
+struct bool_ { typedef int type; };
+template <>
+struct bool_<false> {};
+
+#define XCAT(x, y) x##y
+#define CAT(x, y) XCAT(x, y)
+#define sassert(_b_) bool_<(_b_)>::type CAT(var, __LINE__);
+
+template <int>
+struct L {
+ template <typename T>
+ struct O {
+ template <typename U>
+ static oneT Fun(U);
+ };
+};
+template <int k>
+template <typename T>
+template <typename U>
+oneT L<k>::O<T>::Fun(U) { return one; }
+
+template <>
+template <>
+template <typename U>
+oneT L<0>::O<char>::Fun(U) { return one; }
+
+void Instantiate() {
+ sassert(sizeof(L<0>::O<int>::Fun(0)) == sizeof(one));
+ sassert(sizeof(L<0>::O<char>::Fun(0)) == sizeof(one));
+}
+}
+
+// CHECK: ===== Clang Parser =====
+// CHECK: ---User Time--- --User+System-- ---Wall Time--- --- Name ---
+// CHECK: Parse Top Level Decl
+// CHECK: Parse Template
+// CHECK: Parse Function Definition
+// CHECK: PP Append Macro
+// CHECK: Scope manipulation
+// CHECK: PP Find Handler
+// CHECK: Total