summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenAction.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2018-04-10 18:53:28 +0000
committerNico Weber <nicolasweber@gmx.de>2018-04-10 18:53:28 +0000
commitade321e7ddf76483ea8b9fd2921216e026c9dc1b (patch)
tree9d0f22b8eec20831e79785ad0ec7f366197fd6e3 /clang/lib/CodeGen/CodeGenAction.cpp
parent298e1712d827a05b2cbb2936a9fc67745fa68c13 (diff)
downloadbcm5719-llvm-ade321e7ddf76483ea8b9fd2921216e026c9dc1b.tar.gz
bcm5719-llvm-ade321e7ddf76483ea8b9fd2921216e026c9dc1b.zip
Revert r329684 (and follow-ups 329693, 329714). See discussion on https://reviews.llvm.org/D43578.
llvm-svn: 329739
Diffstat (limited to 'clang/lib/CodeGen/CodeGenAction.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenAction.cpp83
1 files changed, 46 insertions, 37 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp
index 16811306577..ac2548e6a52 100644
--- a/clang/lib/CodeGen/CodeGenAction.cpp
+++ b/clang/lib/CodeGen/CodeGenAction.cpp
@@ -23,7 +23,6 @@
#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"
@@ -52,7 +51,7 @@ namespace clang {
public:
ClangDiagnosticHandler(const CodeGenOptions &CGOpts, BackendConsumer *BCon)
: CodeGenOpts(CGOpts), BackendCon(BCon) {}
-
+
bool handleDiagnostics(const DiagnosticInfo &DI) override;
bool isAnalysisRemarkEnabled(StringRef PassName) const override {
@@ -91,8 +90,9 @@ namespace clang {
const LangOptions &LangOpts;
std::unique_ptr<raw_pwrite_stream> AsmOutStream;
ASTContext *Context;
- static constexpr const char *GroupName = "frontend";
- static constexpr const char *GroupDescription = "===== Frontend =====";
+
+ Timer LLVMIRGeneration;
+ unsigned LLVMIRGenerationRefCount;
/// True if we've finished generating IR. This prevents us from generating
/// additional LLVM IR after emitting output in HandleTranslationUnit. This
@@ -121,6 +121,8 @@ namespace clang {
: 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)) {
@@ -139,22 +141,38 @@ namespace clang {
void Initialize(ASTContext &Ctx) override {
assert(!Context && "initialized multiple times");
+
Context = &Ctx;
- NamedRegionTimer T("initbackendconsumer", "Init Backend Consumer",
- GroupName, GroupDescription,
- llvm::TimePassesIsEnabled);
+
+ if (llvm::TimePassesIsEnabled)
+ LLVMIRGeneration.startTimer();
+
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");
- NamedRegionTimer T("handlehophevelhecl", "Handle Top Level Decl",
- GroupName, GroupDescription,
- llvm::TimePassesIsEnabled);
+
+ // Recurse.
+ if (llvm::TimePassesIsEnabled) {
+ LLVMIRGenerationRefCount += 1;
+ if (LLVMIRGenerationRefCount == 1)
+ LLVMIRGeneration.startTimer();
+ }
Gen->HandleTopLevelDecl(D);
+
+ if (llvm::TimePassesIsEnabled) {
+ LLVMIRGenerationRefCount -= 1;
+ if (LLVMIRGenerationRefCount == 0)
+ LLVMIRGeneration.stopTimer();
+ }
+
return true;
}
@@ -162,11 +180,13 @@ namespace clang {
PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
Context->getSourceManager(),
"LLVM IR generation of inline function");
- NamedRegionTimer T("handleinlinefunction",
- "Handle Inline Function Definition", GroupName,
- GroupDescription, llvm::TimePassesIsEnabled);
+ if (llvm::TimePassesIsEnabled)
+ LLVMIRGeneration.startTimer();
Gen->HandleInlineFunctionDefinition(D);
+
+ if (llvm::TimePassesIsEnabled)
+ LLVMIRGeneration.stopTimer();
}
void HandleInterestingDecl(DeclGroupRef D) override {
@@ -177,8 +197,6 @@ namespace clang {
// 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)
@@ -209,12 +227,21 @@ namespace clang {
void HandleTranslationUnit(ASTContext &C) override {
{
PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
- NamedRegionTimer T("handletranslationunit", "Handle Translation Unit",
- GroupName, GroupDescription,
- llvm::TimePassesIsEnabled);
+ if (llvm::TimePassesIsEnabled) {
+ LLVMIRGenerationRefCount += 1;
+ if (LLVMIRGenerationRefCount == 1)
+ LLVMIRGeneration.startTimer();
+ }
Gen->HandleTranslationUnit(C);
- IRGenFinished = true;
+
+ if (llvm::TimePassesIsEnabled) {
+ LLVMIRGenerationRefCount -= 1;
+ if (LLVMIRGenerationRefCount == 0)
+ LLVMIRGeneration.stopTimer();
+ }
+
+ IRGenFinished = true;
}
// Silently ignore if we weren't initialized for some reason.
@@ -282,37 +309,23 @@ namespace clang {
}
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);
}
@@ -919,8 +932,6 @@ static void BitcodeInlineAsmDiagHandler(const llvm::SMDiagnostic &SM,
}
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();
@@ -988,8 +999,6 @@ std::unique_ptr<llvm::Module> CodeGenAction::loadModule(MemoryBufferRef MBRef) {
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 =
OpenPOWER on IntegriCloud