summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenAction.cpp
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-11-30 00:25:36 +0000
committerReid Kleckner <rnk@google.com>2016-11-30 00:25:36 +0000
commit15241ba4dd8009cd89676f6f280d5de870e958ab (patch)
treed2f87cd05daf37f6a660ea9040835e2ced77e834 /clang/lib/CodeGen/CodeGenAction.cpp
parent13b40bcc0322e27eaa61b459dec8f898ea1f069d (diff)
downloadbcm5719-llvm-15241ba4dd8009cd89676f6f280d5de870e958ab.tar.gz
bcm5719-llvm-15241ba4dd8009cd89676f6f280d5de870e958ab.zip
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. llvm-svn: 288221
Diffstat (limited to 'clang/lib/CodeGen/CodeGenAction.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenAction.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp
index da8f372441f..795b3a06f00 100644
--- a/clang/lib/CodeGen/CodeGenAction.cpp
+++ b/clang/lib/CodeGen/CodeGenAction.cpp
@@ -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.
OpenPOWER on IntegriCloud