182bfa19fe3be324b13fdbcda46304b52c500f0d4Aaron Ballman// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm < %s | FileCheck %s 2f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov 3f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikovvoid __attribute__((fastcall)) f1(void); 4f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikovvoid __attribute__((stdcall)) f2(void); 5f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid __attribute__((thiscall)) f3(void); 6f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid __attribute__((fastcall)) f4(void) { 7f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor// CHECK: define x86_fastcallcc void @f4() 8f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov f1(); 9d82bf2d86f3e4185b3815e56f23ca0e07c15541dCharles Davis// CHECK: call x86_fastcallcc void @f1() 10f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov} 11f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid __attribute__((stdcall)) f5(void) { 12f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor// CHECK: define x86_stdcallcc void @f5() 13f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov f2(); 14d82bf2d86f3e4185b3815e56f23ca0e07c15541dCharles Davis// CHECK: call x86_stdcallcc void @f2() 15f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov} 16f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid __attribute__((thiscall)) f6(void) { 17f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor// CHECK: define x86_thiscallcc void @f6() 18f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor f3(); 19f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor// CHECK: call x86_thiscallcc void @f3() 20f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor} 21f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov 2216c4f3c7d44289e30f5066dce7ce9efe7ff67bbcCharles Davis// PR5280 2316c4f3c7d44289e30f5066dce7ce9efe7ff67bbcCharles Davisvoid (__attribute__((fastcall)) *pf1)(void) = f1; 2416c4f3c7d44289e30f5066dce7ce9efe7ff67bbcCharles Davisvoid (__attribute__((stdcall)) *pf2)(void) = f2; 25f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid (__attribute__((thiscall)) *pf3)(void) = f3; 26f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid (__attribute__((fastcall)) *pf4)(void) = f4; 27f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid (__attribute__((stdcall)) *pf5)(void) = f5; 28f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid (__attribute__((thiscall)) *pf6)(void) = f6; 2916c4f3c7d44289e30f5066dce7ce9efe7ff67bbcCharles Davis 30f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikovint main(void) { 31f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor f4(); f5(); f6(); 32f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor // CHECK: call x86_fastcallcc void @f4() 33f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor // CHECK: call x86_stdcallcc void @f5() 34f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor // CHECK: call x86_thiscallcc void @f6() 35f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor pf1(); pf2(); pf3(); pf4(); pf5(); pf6(); 3604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall // CHECK: call x86_fastcallcc void %{{.*}}() 3704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall // CHECK: call x86_stdcallcc void %{{.*}}() 38f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor // CHECK: call x86_thiscallcc void %{{.*}}() 3904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall // CHECK: call x86_fastcallcc void %{{.*}}() 4004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall // CHECK: call x86_stdcallcc void %{{.*}}() 41f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor // CHECK: call x86_thiscallcc void %{{.*}}() 42f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov return 0; 43f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov} 44f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov 459a0fcfe659b65e1e1bba4ba5f35a12ffcd088ea0Eli Friedman// PR7117 46f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid __attribute((stdcall)) f7(foo) int foo; {} 47f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregorvoid f8(void) { 48f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor f7(0); 4901f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall // CHECK: call x86_stdcallcc void @f7(i32 0) 509a0fcfe659b65e1e1bba4ba5f35a12ffcd088ea0Eli Friedman} 51b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 52b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo1(int y); 53b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar1(int y) { 54b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar1 55b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo1(i32 inreg % 56b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo1(y); 57b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 58b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 59b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolastruct S1 { 60b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola int x; 61b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola}; 62b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo2(struct S1 y); 63b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar2(struct S1 y) { 64b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar2 65e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola // CHECK: call x86_fastcallcc void @foo2(i32 inreg undef, i32 % 66b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo2(y); 67b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 68b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 69b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo3(int *y); 70b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar3(int *y) { 71b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar3 72b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo3(i32* inreg % 73b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo3(y); 74b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 75b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 76b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolaenum Enum {Eval}; 77b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo4(enum Enum y); 78b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar4(enum Enum y) { 79b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar4 80b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo4(i32 inreg % 81b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo4(y); 82b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 83b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 84b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolastruct S2 { 85b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola int x1; 86b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola double x2; 87b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola double x3; 88b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola}; 89b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo5(struct S2 y); 90b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar5(struct S2 y) { 91b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar5 92b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo5(%struct.S2* byval align 4 % 93b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo5(y); 94b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 95b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 96b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo6(long long y); 97b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar6(long long y) { 98b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar6 99b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo6(i64 % 100b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo6(y); 101b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 102b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 103b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo7(int a, struct S1 b, int c); 104b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar7(int a, struct S1 b, int c) { 105b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar7 106b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo7(i32 inreg %{{.*}}, i32 %{{.*}}, i32 %{{.*}} 107b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo7(a, b, c); 108b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 109b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 110b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo8(struct S1 a, int b); 111b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar8(struct S1 a, int b) { 112b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar8 113e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola // CHECK: call x86_fastcallcc void @foo8(i32 inreg undef, i32 %{{.*}}, i32 inreg % 114b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo8(a, b); 115b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 116b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 117b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo9(struct S2 a, int b); 118b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar9(struct S2 a, int b) { 119b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar9 120b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo9(%struct.S2* byval align 4 %{{.*}}, i32 % 121b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo9(a, b); 122b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 123b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 124b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo10(float y, int x); 125b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar10(float y, int x) { 126b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar10 127b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo10(float %{{.*}}, i32 inreg % 128b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo10(y, x); 129b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 130b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 131b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo11(double y, int x); 132b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar11(double y, int x) { 133b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar11 134b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo11(double %{{.*}}, i32 inreg % 135b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo11(y, x); 136b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 137b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola 138b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolastruct S3 { 139b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola float x; 140b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola}; 141b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid __attribute__((fastcall)) foo12(struct S3 y, int x); 142b6932692234eba2472ef85a38434496e9342fd38Rafael Espindolavoid bar12(struct S3 y, int x) { 143b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: define void @bar12 144b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola // CHECK: call x86_fastcallcc void @foo12(float %{{.*}}, i32 inreg % 145b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola foo12(y, x); 146b6932692234eba2472ef85a38434496e9342fd38Rafael Espindola} 147