diff options
author | Reid Kleckner <rnk@google.com> | 2017-01-10 21:27:03 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2017-01-10 21:27:03 +0000 |
commit | 0d15738f3b5578f6b43c0ac25818f42a7d3e8760 (patch) | |
tree | 98fb93a12817a021933327c85fe070926c3df533 | |
parent | cbddae74f501f6a2ad13c86672dda3af834bc250 (diff) | |
download | bcm5719-llvm-0d15738f3b5578f6b43c0ac25818f42a7d3e8760.tar.gz bcm5719-llvm-0d15738f3b5578f6b43c0ac25818f42a7d3e8760.zip |
Serialize the UsesSEH bit on FunctionDecl
Fixes PR31539
llvm-svn: 291600
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriterDecl.cpp | 2 | ||||
-rw-r--r-- | clang/test/PCH/uses-seh.cpp | 29 |
3 files changed, 32 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 6e18b208a9a..c6919193391 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -748,6 +748,7 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { FD->IsExplicitlyDefaulted = Record.readInt(); FD->HasImplicitReturnZero = Record.readInt(); FD->IsConstexpr = Record.readInt(); + FD->UsesSEHTry = Record.readInt(); FD->HasSkippedBody = Record.readInt(); FD->IsLateTemplateParsed = Record.readInt(); FD->setCachedLinkage(Linkage(Record.readInt())); diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 8e1480739a5..d8466e9cbf3 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -529,6 +529,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) { Record.push_back(D->IsExplicitlyDefaulted); Record.push_back(D->HasImplicitReturnZero); Record.push_back(D->IsConstexpr); + Record.push_back(D->UsesSEHTry); Record.push_back(D->HasSkippedBody); Record.push_back(D->IsLateTemplateParsed); Record.push_back(D->getLinkageInternal()); @@ -2032,6 +2033,7 @@ void ASTWriter::WriteDeclAbbrevs() { Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ExplicitlyDefaulted Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ImplicitReturnZero Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Constexpr + Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // UsesSEHTry Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // SkippedBody Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // LateParsed Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // Linkage diff --git a/clang/test/PCH/uses-seh.cpp b/clang/test/PCH/uses-seh.cpp new file mode 100644 index 00000000000..6fbfc9766c4 --- /dev/null +++ b/clang/test/PCH/uses-seh.cpp @@ -0,0 +1,29 @@ +// Make SEH works in PCH +// +// Test this without pch. +// RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -std=c++11 -include %s -emit-llvm -o - %s | FileCheck %s + +// Test with pch. +// RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -std=c++11 -include-pch %t -emit-llvm -o - %s | FileCheck %s + +#ifndef HEADER +#define HEADER + +int shouldCatch(); +inline int f() { + __try { + } __except (shouldCatch()) { + } + return 0; +} +int x = f(); + +// CHECK: define linkonce_odr i32 @"\01?f@@YAHXZ"() +// CHECK: define internal i32 @"\01?filt$0@0@f@@"({{.*}}) + +#else + +// empty + +#endif |