r234618 - [SEH] Add test for inline functions using SEH helpers

Reid Kleckner reid at kleckner.net
Fri Apr 10 11:07:38 PDT 2015


Author: rnk
Date: Fri Apr 10 13:07:38 2015
New Revision: 234618

URL: http://llvm.org/viewvc/llvm-project?rev=234618&view=rev
Log:
[SEH] Add test for inline functions using SEH helpers

Such helpers should always be comdat with the parent function and have
internal linkage.

Modified:
    cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp

Modified: cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp?rev=234618&r1=234617&r2=234618&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp Fri Apr 10 13:07:38 2015
@@ -5,6 +5,7 @@
 // RUN:         -o - -mconstructor-aliases -O1 -disable-llvm-optzns | \
 // RUN:         FileCheck %s --check-prefix=CHECK --check-prefix=NOCXX
 
+extern "C" unsigned long _exception_code();
 extern "C" void might_throw();
 
 struct HasCleanup {
@@ -95,4 +96,47 @@ void use_seh_in_lambda() {
 // CHECK: invoke void @might_throw() #[[NOINLINE]]
 // CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
 
+static int my_unique_global;
+
+extern "C" inline void use_seh_in_inline_func() {
+  __try {
+    might_throw();
+  } __except(_exception_code() == 424242) {
+  }
+  __try {
+    might_throw();
+  } __finally {
+    my_unique_global = 1234;
+  }
+}
+
+void use_inline() {
+  use_seh_in_inline_func();
+}
+
+// CHECK-LABEL: define linkonce_odr void @use_seh_in_inline_func() #{{[0-9]+}} comdat {
+// CHECK: invoke void @might_throw()
+//
+// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
+// CHECK-NEXT: catch i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0 at 0@use_seh_in_inline_func@@" to i8*)
+//
+// CHECK: invoke void @might_throw()
+//
+// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
+// CHECK: call void @"\01?fin$0 at 0@use_seh_in_inline_func@@"(i1 zeroext false, i8* %[[fp]])
+// CHECK: ret void
+//
+// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
+// CHECK-NEXT: cleanup
+// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0)
+// CHECK: call void @"\01?fin$0 at 0@use_seh_in_inline_func@@"(i1 zeroext true, i8* %[[fp]])
+
+// CHECK-LABEL: define internal i32 @"\01?filt$0 at 0@use_seh_in_inline_func@@"(i8* %exception_pointers, i8* %frame_pointer) #{{[0-9]+}} comdat($use_seh_in_inline_func)
+// CHECK: icmp eq i32 %{{.*}}, 424242
+// CHECK: zext i1 %{{.*}} to i32
+// CHECK: ret i32
+
+// CHECK-LABEL: define internal void @"\01?fin$0 at 0@use_seh_in_inline_func@@"(i1 zeroext %abnormal_termination, i8* %frame_pointer) #{{[0-9]+}} comdat($use_seh_in_inline_func)
+// CHECK: store i32 1234, i32* @my_unique_global
+
 // CHECK: attributes #[[NOINLINE]] = { {{.*noinline.*}} }





More information about the cfe-commits mailing list