Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
      2 // RUN: %clang_cc1 -triple i386-unknown-linux-gnu -O2 -emit-llvm -o - %s | FileCheck %s
      3 
      4 int foo(int) __attribute__ ((ifunc("foo_ifunc")));
      5 
      6 static int f1(int i) {
      7   return i + 1;
      8 }
      9 
     10 static int f2(int i) {
     11   return i + 2;
     12 }
     13 
     14 typedef int (*foo_t)(int);
     15 
     16 int global;
     17 
     18 static foo_t foo_ifunc() {
     19   return global ? f1 : f2;
     20 }
     21 
     22 int bar() {
     23   return foo(1);
     24 }
     25 
     26 extern void goo(void);
     27 
     28 void bar2(void) {
     29   goo();
     30 }
     31 
     32 extern void goo(void) __attribute__ ((ifunc("goo_ifunc")));
     33 
     34 void* goo_ifunc(void) {
     35   return 0;
     36 }
     37 // CHECK: @foo = ifunc i32 (i32), bitcast (i32 (i32)* ()* @foo_ifunc to i32 (i32)*)
     38 // CHECK: @goo = ifunc void (), bitcast (i8* ()* @goo_ifunc to void ()*)
     39 
     40 // CHECK: call i32 @foo(i32
     41 // CHECK: call void @goo()
     42