r288221 - Stop handling interesting deserialized decls after HandleTranslationUnit

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 29 16:25:36 PST 2016


Author: rnk
Date: Tue Nov 29 18:25:36 2016
New Revision: 288221

URL: http://llvm.org/viewvc/llvm-project?rev=288221&view=rev
Log:
Stop handling interesting deserialized decls after HandleTranslationUnit

Other AST consumers can deserialize interesting decls that we might
codegen, but they won't make it to the final object file and can trigger
assertions in debug information generation after finalization.

Added:
    cfe/trunk/test/Frontend/plugin-vs-debug-info.cpp
Modified:
    cfe/trunk/lib/CodeGen/CodeGenAction.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=288221&r1=288220&r2=288221&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Tue Nov 29 18:25:36 2016
@@ -53,6 +53,11 @@ namespace clang {
     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
+    /// can happen when Clang plugins trigger additional AST deserialization.
+    bool IRGenFinished = false;
+
     std::unique_ptr<CodeGenerator> Gen;
 
     SmallVector<std::pair<unsigned, std::unique_ptr<llvm::Module>>, 4>
@@ -147,6 +152,12 @@ namespace clang {
         LLVMIRGeneration.stopTimer();
     }
 
+    void HandleInterestingDecl(DeclGroupRef D) {
+      // Ignore interesting decls from the AST reader after IRGen is finished.
+      if (!IRGenFinished)
+        HandleTopLevelDecl(D);
+    }
+
     void HandleTranslationUnit(ASTContext &C) override {
       {
         PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
@@ -163,6 +174,8 @@ namespace clang {
           if (LLVMIRGenerationRefCount == 0)
             LLVMIRGeneration.stopTimer();
         }
+
+	IRGenFinished = true;
       }
 
       // Silently ignore if we weren't initialized for some reason.

Added: cfe/trunk/test/Frontend/plugin-vs-debug-info.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/plugin-vs-debug-info.cpp?rev=288221&view=auto
==============================================================================
--- cfe/trunk/test/Frontend/plugin-vs-debug-info.cpp (added)
+++ cfe/trunk/test/Frontend/plugin-vs-debug-info.cpp Tue Nov 29 18:25:36 2016
@@ -0,0 +1,30 @@
+// This test uses PrintFunctionNames with -fdelayed-template-parsing because it
+// happens to use a RecursiveASTVisitor that forces deserialization of AST
+// files.
+//
+// RUN: %clang_cc1 -fdelayed-template-parsing -std=c++14 -emit-pch -o %t.pch %s
+// RUN: %clang_cc1 -load %llvmshlibdir/PrintFunctionNames%pluginext \
+// RUN:     -add-plugin print-fns -std=c++14 -include-pch %t.pch %s -emit-llvm \
+// RUN:     -fdelayed-template-parsing -debug-info-kind=limited \
+// RUN:     -o %t.ll 2>&1 | FileCheck --check-prefix=DECLS %s
+// RUN: FileCheck --check-prefix=IR %s < %t.ll
+//
+// REQUIRES: plugins, examples
+
+// DECLS: top-level-decl: "func"
+
+// IR: define {{.*}}void @_Z4funcv()
+
+#ifndef HEADER
+#define HEADER
+
+struct nullopt_t {
+  constexpr explicit nullopt_t(int) {}
+};
+constexpr nullopt_t nullopt(0);
+
+#else
+
+void func() { }
+
+#endif




More information about the cfe-commits mailing list