summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen/ifunc.c
diff options
context:
space:
mode:
authorDmitry Polukhin <dmitry.polukhin@gmail.com>2016-04-11 07:48:59 +0000
committerDmitry Polukhin <dmitry.polukhin@gmail.com>2016-04-11 07:48:59 +0000
commit85eda12d093714bfc9f266d50254e82888c9e8c3 (patch)
tree9216c6a571a665d295ab1d8f783c27e121c349a4 /clang/test/CodeGen/ifunc.c
parentbbffeac569e89a61201ce159790f68b8493042b6 (diff)
downloadbcm5719-llvm-85eda12d093714bfc9f266d50254e82888c9e8c3.tar.gz
bcm5719-llvm-85eda12d093714bfc9f266d50254e82888c9e8c3.zip
[GCC] Attribute ifunc support in clang
This patch add support for GCC attribute((ifunc("resolver"))) for targets that use ELF as object file format. In general ifunc is a special kind of function alias with type @gnu_indirect_function. LLVM patch http://reviews.llvm.org/D15525 Differential Revision: http://reviews.llvm.org/D15524 llvm-svn: 265917
Diffstat (limited to 'clang/test/CodeGen/ifunc.c')
-rw-r--r--clang/test/CodeGen/ifunc.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/test/CodeGen/ifunc.c b/clang/test/CodeGen/ifunc.c
new file mode 100644
index 00000000000..a88bb1878f2
--- /dev/null
+++ b/clang/test/CodeGen/ifunc.c
@@ -0,0 +1,41 @@
+// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -O2 -emit-llvm -o - %s | FileCheck %s
+
+int foo(int) __attribute__ ((ifunc("foo_ifunc")));
+
+static int f1(int i) {
+ return i + 1;
+}
+
+static int f2(int i) {
+ return i + 2;
+}
+
+typedef int (*foo_t)(int);
+
+int global;
+
+static foo_t foo_ifunc() {
+ return global ? f1 : f2;
+}
+
+int bar() {
+ return foo(1);
+}
+
+extern void goo(void);
+
+void bar2(void) {
+ goo();
+}
+
+extern void goo(void) __attribute__ ((ifunc("goo_ifunc")));
+
+void* goo_ifunc(void) {
+ return 0;
+}
+// CHECK: @foo = ifunc i32 (i32), bitcast (i32 (i32)* ()* @foo_ifunc to i32 (i32)*)
+// CHECK: @goo = ifunc void (), bitcast (i8* ()* @goo_ifunc to void ()*)
+
+// CHECK: call i32 @foo(i32
+// CHECK: call void @goo()
OpenPOWER on IntegriCloud