1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -triple i386-linux-gnu -o %t %s 2*67e74705SXin Li // RUN: FileCheck --input-file=%t %s 3*67e74705SXin Li 4*67e74705SXin Li // CHECK: @t5 = weak global i32 2 5*67e74705SXin Li int t5 __attribute__((weak)) = 2; 6*67e74705SXin Li 7*67e74705SXin Li // CHECK: @t13 = global %struct.s0 zeroinitializer, section "SECT" 8*67e74705SXin Li struct s0 { int x; }; 9*67e74705SXin Li struct s0 t13 __attribute__((section("SECT"))) = { 0 }; 10*67e74705SXin Li 11*67e74705SXin Li // CHECK: @t14.x = internal global i32 0, section "SECT" t14(void)12*67e74705SXin Livoid t14(void) { 13*67e74705SXin Li static int x __attribute__((section("SECT"))) = 0; 14*67e74705SXin Li } 15*67e74705SXin Li 16*67e74705SXin Li // CHECK: @t18 = global i32 1, align 4 17*67e74705SXin Li extern int t18 __attribute__((weak_import)); 18*67e74705SXin Li int t18 = 1; 19*67e74705SXin Li 20*67e74705SXin Li // CHECK: @t16 = extern_weak global i32 21*67e74705SXin Li extern int t16 __attribute__((weak_import)); 22*67e74705SXin Li 23*67e74705SXin Li // CHECK: @t6 = common protected global i32 0 24*67e74705SXin Li int t6 __attribute__((visibility("protected"))); 25*67e74705SXin Li 26*67e74705SXin Li // CHECK: @t12 = global i32 0, section "SECT" 27*67e74705SXin Li int t12 __attribute__((section("SECT"))); 28*67e74705SXin Li 29*67e74705SXin Li // CHECK: @t9 = weak alias void (...), bitcast (void ()* @__t8 to void (...)*) __t8()30*67e74705SXin Livoid __t8() {} 31*67e74705SXin Li void t9() __attribute__((weak, alias("__t8"))); 32*67e74705SXin Li 33*67e74705SXin Li // CHECK: declare extern_weak i32 @t15() 34*67e74705SXin Li int __attribute__((weak_import)) t15(void); t17()35*67e74705SXin Liint t17() { 36*67e74705SXin Li return t15() + t16; 37*67e74705SXin Li } 38*67e74705SXin Li 39*67e74705SXin Li // CHECK: define void @t1() [[NR:#[0-9]+]] { 40*67e74705SXin Li void t1() __attribute__((noreturn)); t1()41*67e74705SXin Livoid t1() { while (1) {} } 42*67e74705SXin Li 43*67e74705SXin Li // CHECK: define void @t2() [[NUW:#[0-9]+]] { 44*67e74705SXin Li void t2() __attribute__((nothrow)); t2()45*67e74705SXin Livoid t2() {} 46*67e74705SXin Li 47*67e74705SXin Li // CHECK: define weak void @t3() [[NUW]] { 48*67e74705SXin Li void t3() __attribute__((weak)); t3()49*67e74705SXin Livoid t3() {} 50*67e74705SXin Li 51*67e74705SXin Li // CHECK: define hidden void @t4() [[NUW]] { 52*67e74705SXin Li void t4() __attribute__((visibility("hidden"))); t4()53*67e74705SXin Livoid t4() {} 54*67e74705SXin Li 55*67e74705SXin Li // CHECK: define void @t7() [[NR]] { 56*67e74705SXin Li void t7() __attribute__((noreturn, nothrow)); t7()57*67e74705SXin Livoid t7() { while (1) {} } 58*67e74705SXin Li 59*67e74705SXin Li // CHECK: define void @t10() [[NUW]] section "SECT" { 60*67e74705SXin Li void t10(void) __attribute__((section("SECT"))); t10(void)61*67e74705SXin Livoid t10(void) {} 62*67e74705SXin Li // CHECK: define void @t11() [[NUW]] section "SECT" { t11(void)63*67e74705SXin Livoid __attribute__((section("SECT"))) t11(void) {} 64*67e74705SXin Li 65*67e74705SXin Li // CHECK: define i32 @t19() [[NUW]] { 66*67e74705SXin Li extern int t19(void) __attribute__((weak_import)); t19(void)67*67e74705SXin Liint t19(void) { 68*67e74705SXin Li return 10; 69*67e74705SXin Li } 70*67e74705SXin Li 71*67e74705SXin Li // CHECK:define void @t20() [[NUW]] { 72*67e74705SXin Li // CHECK: call void @abort() 73*67e74705SXin Li // CHECK-NEXT: unreachable t20(void)74*67e74705SXin Livoid t20(void) { 75*67e74705SXin Li __builtin_abort(); 76*67e74705SXin Li } 77*67e74705SXin Li 78*67e74705SXin Li void (__attribute__((fastcall)) *fptr)(int); t21(void)79*67e74705SXin Livoid t21(void) { 80*67e74705SXin Li fptr(10); 81*67e74705SXin Li } 82*67e74705SXin Li // CHECK: [[FPTRVAR:%[a-z0-9]+]] = load void (i32)*, void (i32)** @fptr 83*67e74705SXin Li // CHECK-NEXT: call x86_fastcallcc void [[FPTRVAR]](i32 inreg 10) 84*67e74705SXin Li 85*67e74705SXin Li 86*67e74705SXin Li // PR9356: We might want to err on this, but for now at least make sure we 87*67e74705SXin Li // use the section in the definition. 88*67e74705SXin Li void __attribute__((section(".foo"))) t22(void); t22(void)89*67e74705SXin Livoid __attribute__((section(".bar"))) t22(void) {} 90*67e74705SXin Li 91*67e74705SXin Li // CHECK: define void @t22() [[NUW]] section ".bar" 92*67e74705SXin Li 93*67e74705SXin Li // CHECK: attributes [[NUW]] = { nounwind{{.*}} } 94*67e74705SXin Li // CHECK: attributes [[NR]] = { noreturn nounwind{{.*}} } 95