1*207e5cccSFangrui Song // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s 2*207e5cccSFangrui Song 3*207e5cccSFangrui Song // CHECK: @used_before_default_def = weak_odr ifunc void (), ptr @used_before_default_def.resolver 4*207e5cccSFangrui Song // CHECK: @used_after_default_def = weak_odr ifunc void (), ptr @used_after_default_def.resolver 5*207e5cccSFangrui Song // CHECK-NOT: @used_before_default_decl = weak_odr ifunc void (), ptr @used_before_default_decl.resolver 6*207e5cccSFangrui Song // CHECK-NOT: @used_after_default_decl = weak_odr ifunc void (), ptr @used_after_default_decl.resolver 7*207e5cccSFangrui Song // CHECK-NOT: @used_no_default = weak_odr ifunc void (), ptr @used_no_default.resolver 8*207e5cccSFangrui Song // CHECK-NOT: @not_used_no_default = weak_odr ifunc void (), ptr @not_used_no_default.resolver 9*207e5cccSFangrui Song // CHECK: @not_used_with_default = weak_odr ifunc void (), ptr @not_used_with_default.resolver 10*207e5cccSFangrui Song 11*207e5cccSFangrui Song 12*207e5cccSFangrui Song // Test that an ifunc is generated and used when the default 13*207e5cccSFangrui Song // version is defined after the first use of the function. 14*207e5cccSFangrui Song // 15*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_before_default_def(void) {} 16*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_before_default_def._Maes( 17*207e5cccSFangrui Song // 18*207e5cccSFangrui Song void call_before_def(void) { used_before_default_def(); } 19*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_before_def( 20*207e5cccSFangrui Song // CHECK: call void @used_before_default_def() 21*207e5cccSFangrui Song // 22*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_before_default_def(void) {} 23*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_before_default_def.default( 24*207e5cccSFangrui Song // 25*207e5cccSFangrui Song // CHECK-NOT: declare void @used_before_default_def( 26*207e5cccSFangrui Song 27*207e5cccSFangrui Song 28*207e5cccSFangrui Song // Test that an ifunc is generated and used when the default 29*207e5cccSFangrui Song // version is defined before the first use of the function. 30*207e5cccSFangrui Song // 31*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_after_default_def(void) {} 32*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_after_default_def._Maes( 33*207e5cccSFangrui Song // 34*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_after_default_def(void) {} 35*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_after_default_def.default( 36*207e5cccSFangrui Song // 37*207e5cccSFangrui Song void call_after_def(void) { used_after_default_def(); } 38*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_after_def( 39*207e5cccSFangrui Song // CHECK: call void @used_after_default_def() 40*207e5cccSFangrui Song // 41*207e5cccSFangrui Song // CHECK-NOT: declare void @used_after_default_def( 42*207e5cccSFangrui Song 43*207e5cccSFangrui Song 44*207e5cccSFangrui Song // Test that an unmagled declaration is generated and used when the 45*207e5cccSFangrui Song // default version is declared after the first use of the function. 46*207e5cccSFangrui Song // 47*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_before_default_decl(void) {} 48*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_before_default_decl._Maes( 49*207e5cccSFangrui Song // 50*207e5cccSFangrui Song void call_before_decl(void) { used_before_default_decl(); } 51*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_before_decl( 52*207e5cccSFangrui Song // CHECK: call void @used_before_default_decl() 53*207e5cccSFangrui Song // 54*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_before_default_decl(void); 55*207e5cccSFangrui Song // CHECK: declare void @used_before_default_decl() 56*207e5cccSFangrui Song 57*207e5cccSFangrui Song 58*207e5cccSFangrui Song // Test that an unmagled declaration is generated and used when the 59*207e5cccSFangrui Song // default version is declared before the first use of the function. 60*207e5cccSFangrui Song // 61*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_after_default_decl(void) {} 62*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_after_default_decl._Maes( 63*207e5cccSFangrui Song // 64*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_after_default_decl(void); 65*207e5cccSFangrui Song // CHECK: declare void @used_after_default_decl() 66*207e5cccSFangrui Song // 67*207e5cccSFangrui Song void call_after_decl(void) { used_after_default_decl(); } 68*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_after_decl( 69*207e5cccSFangrui Song // CHECK: call void @used_after_default_decl() 70*207e5cccSFangrui Song 71*207e5cccSFangrui Song 72*207e5cccSFangrui Song // Test that an unmagled declaration is generated and used when 73*207e5cccSFangrui Song // the default version is not present. 74*207e5cccSFangrui Song // 75*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_no_default(void) {} 76*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_no_default._Maes( 77*207e5cccSFangrui Song // 78*207e5cccSFangrui Song void call_no_default(void) { used_no_default(); } 79*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_no_default( 80*207e5cccSFangrui Song // CHECK: call void @used_no_default() 81*207e5cccSFangrui Song // 82*207e5cccSFangrui Song // CHECK: declare void @used_no_default() 83*207e5cccSFangrui Song 84*207e5cccSFangrui Song 85*207e5cccSFangrui Song // Test that neither an ifunc nor a declaration is generated if the default 86*207e5cccSFangrui Song // definition is missing since the versioned function is not used. 87*207e5cccSFangrui Song // 88*207e5cccSFangrui Song __attribute__((target_version("aes"))) void not_used_no_default(void) {} 89*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @not_used_no_default._Maes( 90*207e5cccSFangrui Song // 91*207e5cccSFangrui Song // CHECK-NOT: declare void @not_used_no_default( 92*207e5cccSFangrui Song 93*207e5cccSFangrui Song 94*207e5cccSFangrui Song // Test that an ifunc is generated if the default version is defined but not used. 95*207e5cccSFangrui Song // 96*207e5cccSFangrui Song __attribute__((target_version("aes"))) void not_used_with_default(void) {} 97*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @not_used_with_default._Maes( 98*207e5cccSFangrui Song // 99*207e5cccSFangrui Song __attribute__((target_version("default"))) void not_used_with_default(void) {} 100*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @not_used_with_default.default( 101*207e5cccSFangrui Song // 102*207e5cccSFangrui Song // CHECK-NOT: declare void @not_used_with_default( 103*207e5cccSFangrui Song 104*207e5cccSFangrui Song 105*207e5cccSFangrui Song // CHECK: define weak_odr ptr @used_before_default_def.resolver() 106*207e5cccSFangrui Song // CHECK: define weak_odr ptr @used_after_default_def.resolver() 107*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @used_before_default_decl.resolver( 108*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @used_after_default_decl.resolver( 109*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @used_no_default.resolver( 110*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @not_used_no_default.resolver( 111*207e5cccSFangrui Song // CHECK: define weak_odr ptr @not_used_with_default.resolver() 112