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