diff options
author | Dmitry Polukhin <dmitry.polukhin@gmail.com> | 2016-04-11 07:48:59 +0000 |
---|---|---|
committer | Dmitry Polukhin <dmitry.polukhin@gmail.com> | 2016-04-11 07:48:59 +0000 |
commit | 85eda12d093714bfc9f266d50254e82888c9e8c3 (patch) | |
tree | 9216c6a571a665d295ab1d8f783c27e121c349a4 /clang/test/CodeGen/ifunc.c | |
parent | bbffeac569e89a61201ce159790f68b8493042b6 (diff) | |
download | bcm5719-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.c | 41 |
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() |