[PATCH] D56463: [SEH] Pass the frame pointer from SEH finally to finally functions
Sanjin Sijaric via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 11 11:34:22 PST 2019
ssijaric updated this revision to Diff 181337.
ssijaric added a comment.
Address formatting comments.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56463/new/
https://reviews.llvm.org/D56463
Files:
lib/CodeGen/CGException.cpp
test/CodeGen/exceptions-seh-nested-finally.c
Index: test/CodeGen/exceptions-seh-nested-finally.c
===================================================================
--- /dev/null
+++ test/CodeGen/exceptions-seh-nested-finally.c
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm -o - \
+// RUN: | FileCheck %s
+// RUN: %clang_cc1 %s -triple i686-pc-win32 -fms-extensions -emit-llvm -o - \
+// RUN: | FileCheck %s
+// RUN: %clang_cc1 %s -triple aarch64-windows -fms-extensions -emit-llvm -o - \
+// RUN: | FileCheck %s
+
+// Check that the first finally block passes the enclosing function's frame
+// pointer to the second finally block, instead of generating it via localaddr.
+
+// CHECK-LABEL: define internal void @"?fin$0 at 0@main@@"({{i8( zeroext)?}} %abnormal_termination, i8* %frame_pointer)
+// CHECK: call void @"?fin$1 at 0@main@@"({{i8( zeroext)?}} 0, i8* %frame_pointer)
+int
+main() {
+ int Check = 0;
+ __try {
+ Check = 3;
+ } __finally {
+ __try {
+ Check += 2;
+ } __finally {
+ Check += 4;
+ }
+ }
+ return Check;
+}
Index: lib/CodeGen/CGException.cpp
===================================================================
--- lib/CodeGen/CGException.cpp
+++ lib/CodeGen/CGException.cpp
@@ -1627,8 +1627,16 @@
// Compute the two argument values.
QualType ArgTys[2] = {Context.UnsignedCharTy, Context.VoidPtrTy};
- llvm::Value *LocalAddrFn = CGM.getIntrinsic(llvm::Intrinsic::localaddress);
- llvm::Value *FP = CGF.Builder.CreateCall(LocalAddrFn);
+ llvm::Value *FP = nullptr;
+ // If CFG.IsOutlinedSEHHelper is true, then we are within a finally block.
+ if (CGF.IsOutlinedSEHHelper) {
+ FP = &CGF.CurFn->arg_begin()[1];
+ } else {
+ llvm::Value *LocalAddrFn =
+ CGM.getIntrinsic(llvm::Intrinsic::localaddress);
+ FP = CGF.Builder.CreateCall(LocalAddrFn);
+ }
+
llvm::Value *IsForEH =
llvm::ConstantInt::get(CGF.ConvertType(ArgTys[0]), F.isForEHCleanup());
Args.add(RValue::get(IsForEH), ArgTys[0]);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56463.181337.patch
Type: text/x-patch
Size: 2033 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190111/8d85c36e/attachment-0001.bin>
More information about the cfe-commits
mailing list