summaryrefslogtreecommitdiff
path: root/test/CodeGenObjC/stret_lookup.m
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2013-07-26 00:53:29 +0000
committerEli Friedman <eli.friedman@gmail.com>2013-07-26 00:53:29 +0000
commit11311eaf6093a5374f94047df354d4c62d68c611 (patch)
tree06a0a59bb6ef84d12db8f5c1a39a60723825524b /test/CodeGenObjC/stret_lookup.m
parent34f3bcf7f2907f618f7a10d919bda47e53db60dd (diff)
downloadclang-11311eaf6093a5374f94047df354d4c62d68c611.tar.gz
Fix GNU ObjC ABI for a message returning a struct.
This allows the ObjFW runtime to correctly implement message forwarding for messages which return a struct. Patch by Jonathan Schleifer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187174 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenObjC/stret_lookup.m')
-rw-r--r--test/CodeGenObjC/stret_lookup.m29
1 files changed, 29 insertions, 0 deletions
diff --git a/test/CodeGenObjC/stret_lookup.m b/test/CodeGenObjC/stret_lookup.m
new file mode 100644
index 0000000000..c9ac7131eb
--- /dev/null
+++ b/test/CodeGenObjC/stret_lookup.m
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -DSTRET -triple x86_64-pc-linux-gnu -fobjc-runtime=objfw -emit-llvm -o - %s | FileCheck -check-prefix=HASSTRET %s
+// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fobjc-runtime=gcc -emit-llvm -o - %s | FileCheck -check-prefix=NOSTRET %s
+
+// Test stret lookup
+
+struct test {
+ char test[1024];
+};
+@interface Test0
++ (struct test)test;
+@end
+void test0(void) {
+ struct test t;
+#if (defined(STRET) && __has_feature(objc_msg_lookup_stret)) || \
+ (!defined(STRET) && !__has_feature(objc_msg_lookup_stret))
+ t = [Test0 test];
+#endif
+ (void)t;
+}
+
+// HASSTRET: define void @test0()
+// HASSTRET: [[T0:%.*]] = call i8* (i8*, i8*, ...)* (i8*, i8*)* @objc_msg_lookup_stret(i8* bitcast (i64* @_OBJC_CLASS_Test0 to i8*),
+// HASSTRET-NEXT: [[T1:%.*]] = bitcast i8* (i8*, i8*, ...)* [[T0]] to void (%struct.test*, i8*, i8*)*
+// HASSTRET-NEXT: call void [[T1]](%struct.test* sret %tmp, i8* bitcast (i64* @_OBJC_CLASS_Test0 to i8*),
+
+// NOSTRET: define void @test0()
+// NOSTRET: [[T0:%.*]] = call i8* (i8*, i8*, ...)* (i8*, i8*)* @objc_msg_lookup(i8* %0,
+// NOSTRET-NEXT: [[T1:%.*]] = bitcast i8* (i8*, i8*, ...)* [[T0]] to void (%struct.test*, i8*, i8*)*
+// NOSTRET-NEXT: call void [[T1]](%struct.test* sret %tmp, i8* %0, i8* bitcast ([2 x { i8*, i8* }]*