[PATCH] D20748: Handle recursion in LLVMIRGeneration Timer

Davide Italiano via cfe-commits cfe-commits at lists.llvm.org
Fri May 27 13:49:07 PDT 2016


davide created this revision.
davide added reviewers: rafael, vsk.
davide added a subscriber: cfe-commits.

See http://reviews.llvm.org/D20735 for more context.
Implementing this clang-side is not as terrible as I originally thought. Maybe needs a test case, but I wasn't able to reduce one easily (yet). 

http://reviews.llvm.org/D20748

Files:
  clang/lib/CodeGen/CodeGenAction.cpp

Index: clang/lib/CodeGen/CodeGenAction.cpp
===================================================================
--- clang/lib/CodeGen/CodeGenAction.cpp
+++ clang/lib/CodeGen/CodeGenAction.cpp
@@ -50,6 +50,7 @@
     ASTContext *Context;

     Timer LLVMIRGeneration;
+    unsigned LLVMIRGenerationRefCount;

     std::unique_ptr<CodeGenerator> Gen;

@@ -73,6 +74,7 @@
         : Diags(Diags), Action(Action), CodeGenOpts(CodeGenOpts),
           TargetOpts(TargetOpts), LangOpts(LangOpts), AsmOutStream(OS),
           Context(nullptr), LLVMIRGeneration("LLVM IR Generation Time"),
+          LLVMIRGenerationRefCount(0),
           Gen(CreateLLVMCodeGen(Diags, InFile, HeaderSearchOpts, PPOpts,
                                 CodeGenOpts, C, CoverageInfo)) {
       llvm::TimePassesIsEnabled = TimePasses;
@@ -112,13 +114,20 @@
                                      Context->getSourceManager(),
                                      "LLVM IR generation of declaration");

-      if (llvm::TimePassesIsEnabled)
-        LLVMIRGeneration.startTimer();
+      // Recurse.
+      if (llvm::TimePassesIsEnabled) {
+        LLVMIRGenerationRefCount += 1;
+        if (LLVMIRGenerationRefCount == 1)
+          LLVMIRGeneration.startTimer();
+      }

       Gen->HandleTopLevelDecl(D);

-      if (llvm::TimePassesIsEnabled)
-        LLVMIRGeneration.stopTimer();
+      if (llvm::TimePassesIsEnabled) {
+        LLVMIRGenerationRefCount -= 1;
+        if (LLVMIRGenerationRefCount == 0)
+          LLVMIRGeneration.stopTimer();
+      }

       return true;
     }
@@ -139,13 +148,19 @@
     void HandleTranslationUnit(ASTContext &C) override {
       {
         PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
-        if (llvm::TimePassesIsEnabled)
-          LLVMIRGeneration.startTimer();
+        if (llvm::TimePassesIsEnabled) {
+          LLVMIRGenerationRefCount += 1;
+          if (LLVMIRGenerationRefCount == 1)
+            LLVMIRGeneration.startTimer();
+        }

         Gen->HandleTranslationUnit(C);

-        if (llvm::TimePassesIsEnabled)
-          LLVMIRGeneration.stopTimer();
+        if (llvm::TimePassesIsEnabled) {
+          LLVMIRGenerationRefCount -= 1;
+          if (LLVMIRGenerationRefCount == 0)
+            LLVMIRGeneration.stopTimer();
+        }
       }

       // Silently ignore if we weren't initialized for some reason.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20748.58833.patch
Type: text/x-patch
Size: 2377 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160527/643205b4/attachment-0001.bin>


More information about the cfe-commits mailing list