llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen Author: Benjamin Stott (BStott6) <details> <summary>Changes</summary> - Fixes https://github.com/llvm/llvm-project/issues/163369 - Segmentation fault occurred because resolver was calling TSan instrumentation functions (__tsan_func_entry, __tsan_func_exit) but as the resolver is run by the dynamic linker at load time, TSan is not initialized yet so the current thread pointer is null. - This PR adds the DisableSanitizerInstrumentation attribute to the multiversion function resolvers to avoid issues like this. - Added regression test for TSan segfault. --- Patch is 87.31 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/167516.diff 26 Files Affected: - (modified) clang/lib/CodeGen/CodeGenModule.cpp (+5) - (modified) clang/test/CodeGen/AArch64/fmv-detection.c (+1-1) - (modified) clang/test/CodeGen/AArch64/fmv-mix-explicit-implicit-default.c (+8-4) - (modified) clang/test/CodeGen/AArch64/fmv-priority.c (+2-4) - (modified) clang/test/CodeGen/AArch64/fmv-resolver-emission.c (+15-7) - (modified) clang/test/CodeGen/AArch64/mixed-target-attributes.c (+6-3) - (modified) clang/test/CodeGen/AArch64/resolver-attributes.c (+12-9) - (modified) clang/test/CodeGen/attr-cpuspecific.c (+25-24) - (modified) clang/test/CodeGen/attr-target-clones-aarch64.c (+26-12) - (modified) clang/test/CodeGen/attr-target-clones-riscv.c (+18-9) - (modified) clang/test/CodeGen/attr-target-clones.c (+24-23) - (modified) clang/test/CodeGen/attr-target-mv-va-args.c (+5-5) - (modified) clang/test/CodeGen/attr-target-mv.c (+21-19) - (modified) clang/test/CodeGen/attr-target-version-riscv.c (+14-7) - (modified) clang/test/CodeGenCXX/attr-cpuspecific.cpp (+7-5) - (modified) clang/test/CodeGenCXX/attr-target-clones-aarch64.cpp (+4-2) - (modified) clang/test/CodeGenCXX/attr-target-clones-riscv.cpp (+19-9) - (modified) clang/test/CodeGenCXX/attr-target-clones.cpp (+56-87) - (modified) clang/test/CodeGenCXX/attr-target-mv-diff-ns.cpp (+4-4) - (modified) clang/test/CodeGenCXX/attr-target-mv-member-funcs.cpp (+2-1) - (modified) clang/test/CodeGenCXX/attr-target-mv-out-of-line-defs.cpp (+2-1) - (modified) clang/test/CodeGenCXX/attr-target-mv-overloads.cpp (+4-2) - (modified) clang/test/CodeGenCXX/attr-target-version-riscv.cpp (+14-7) - (modified) clang/test/CodeGenCXX/attr-target-version.cpp (+13-6) - (modified) clang/test/CodeGenCXX/fmv-namespace.cpp (+5-2) - (added) compiler-rt/test/tsan/target_clones_segfault.c (+10) ``````````diff diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 0fea57b2e1799..eff00a8d1510b 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4936,6 +4936,11 @@ void CodeGenModule::setMultiVersionResolverAttributes(llvm::Function *Resolver, setDSOLocal(Resolver); + // The resolver must be exempt from sanitizer instrumentation, as it can run + // before the sanitizer is initialized. + // (https://github.com/llvm/llvm-project/issues/163369) + Resolver->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation); + // Set the default target-specific attributes, such as PAC and BTI ones on // AArch64. Not passing Decl to prevent setting unrelated attributes, // as Resolver can be shared by multiple declarations. diff --git a/clang/test/CodeGen/AArch64/fmv-detection.c b/clang/test/CodeGen/AArch64/fmv-detection.c index e585140a1eb08..a6761ffd4bb1e 100644 --- a/clang/test/CodeGen/AArch64/fmv-detection.c +++ b/clang/test/CodeGen/AArch64/fmv-detection.c @@ -437,7 +437,7 @@ int caller() { // CHECK-NEXT: ret i32 [[CALL]] // // -// CHECK-LABEL: define {{[^@]+}}@fmv.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@fmv.resolver() {{[#0-9]* }}comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 diff --git a/clang/test/CodeGen/AArch64/fmv-mix-explicit-implicit-default.c b/clang/test/CodeGen/AArch64/fmv-mix-explicit-implicit-default.c index dcc5e1c5886e2..a6d6509ca7de0 100644 --- a/clang/test/CodeGen/AArch64/fmv-mix-explicit-implicit-default.c +++ b/clang/test/CodeGen/AArch64/fmv-mix-explicit-implicit-default.c @@ -107,22 +107,26 @@ int caller6(void) { return no_def_explicit_default_first(); } // CHECK-NEXT: ret i32 [[CALL]] // // -// CHECK-LABEL: define {{[^@]+}}@implicit_default_decl_first.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@implicit_default_decl_first.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER:[0-9]+]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: ret ptr @implicit_default_decl_first.default // // -// CHECK-LABEL: define {{[^@]+}}@explicit_default_def_first.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@explicit_default_def_first.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: ret ptr @explicit_default_def_first.default // // -// CHECK-LABEL: define {{[^@]+}}@implicit_default_def_first.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@implicit_default_def_first.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: ret ptr @implicit_default_def_first.default // // -// CHECK-LABEL: define {{[^@]+}}@explicit_default_decl_first.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@explicit_default_decl_first.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: ret ptr @explicit_default_decl_first.default // diff --git a/clang/test/CodeGen/AArch64/fmv-priority.c b/clang/test/CodeGen/AArch64/fmv-priority.c index c92e0c4e9c3db..84c84df5a2fa0 100644 --- a/clang/test/CodeGen/AArch64/fmv-priority.c +++ b/clang/test/CodeGen/AArch64/fmv-priority.c @@ -2,13 +2,10 @@ // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s // Priority biskmasks after feature dependency expansion: -// // MSB LSB -// // sme2 | wfxt | sme | bf16 | | | fp16 | simd | fp // -----+------+-----+------+-------+------+------+------+--- // sme2 | | sme | bf16 | rcpc2 | rcpc | fp16 | simd | fp -// // Dependencies should not affect priorities, since a // feature can only depend on lower priority features: // https://github.com/ARM-software/acle/pull/376 @@ -32,7 +29,8 @@ int call() { return fn(); } // CHECK-NEXT: ret i32 [[CALL]] // // -// CHECK-LABEL: define weak_odr ptr @fn.resolver() comdat { +// CHECK-LABEL: define weak_odr ptr @fn.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER:[0-9]+]] comdat { // CHECK-NEXT: [[RESOLVER_ENTRY:.*:]] // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 diff --git a/clang/test/CodeGen/AArch64/fmv-resolver-emission.c b/clang/test/CodeGen/AArch64/fmv-resolver-emission.c index 591625d4d0da1..beebbb2166edf 100644 --- a/clang/test/CodeGen/AArch64/fmv-resolver-emission.c +++ b/clang/test/CodeGen/AArch64/fmv-resolver-emission.c @@ -258,7 +258,8 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK-NEXT: ret void // // -// CHECK-LABEL: define {{[^@]+}}@used_before_default_def.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@used_before_default_def.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER:[0-9]+]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -272,7 +273,8 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK-NEXT: ret ptr @used_before_default_def.default // // -// CHECK-LABEL: define {{[^@]+}}@used_after_default_def.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@used_after_default_def.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -286,7 +288,8 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK-NEXT: ret ptr @used_after_default_def.default // // -// CHECK-LABEL: define {{[^@]+}}@not_used_with_default.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@not_used_with_default.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -300,7 +303,8 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK-NEXT: ret ptr @not_used_with_default.default // // -// CHECK-LABEL: define {{[^@]+}}@indirect_use.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@indirect_use.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -328,7 +332,8 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK-NEXT: ret void // // -// CHECK-LABEL: define {{[^@]+}}@internal_func.resolver() { +// CHECK-LABEL: define {{[^@]+}}@internal_func.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -356,7 +361,8 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK-NEXT: ret void // // -// CHECK-LABEL: define {{[^@]+}}@linkonce_func.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@linkonce_func.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -370,7 +376,8 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK-NEXT: ret ptr @linkonce_func.default // // -// CHECK-LABEL: define {{[^@]+}}@clones_with_default.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@clones_with_default.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -383,6 +390,7 @@ __attribute__((target_clones("aes"))) void clones_without_default(void) {} // CHECK: resolver_else: // CHECK-NEXT: ret ptr @clones_with_default.default // +// CHECK: attributes #[[ATTR_RESOLVER]] = { disable_sanitizer_instrumentation } //. // CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} // CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"} diff --git a/clang/test/CodeGen/AArch64/mixed-target-attributes.c b/clang/test/CodeGen/AArch64/mixed-target-attributes.c index ef47c8a3bc737..480c010b92d96 100644 --- a/clang/test/CodeGen/AArch64/mixed-target-attributes.c +++ b/clang/test/CodeGen/AArch64/mixed-target-attributes.c @@ -127,7 +127,8 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void // CHECK-NEXT: ret i32 0 // // -// CHECK-LABEL: define {{[^@]+}}@implicit_default.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@implicit_default.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER:[0-9]+]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -165,7 +166,8 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void // CHECK-NEXT: ret ptr @implicit_default.default // // -// CHECK-LABEL: define {{[^@]+}}@explicit_default.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@explicit_default.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 @@ -203,7 +205,8 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void // CHECK-NEXT: ret ptr @explicit_default.default // // -// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.resolver() comdat { +// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.resolver() +// CHECK-SAME: #[[ATTR_RESOLVER]] comdat { // CHECK-NEXT: resolver_entry: // CHECK-NEXT: call void @__init_cpu_features_resolver() // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 diff --git a/clang/test/CodeGen/AArch64/resolver-attributes.c b/clang/test/CodeGen/AArch64/resolver-attributes.c index 6e4497cdc8611..b53da46354c34 100644 --- a/clang/test/CodeGen/AArch64/resolver-attributes.c +++ b/clang/test/CodeGen/AArch64/resolver-attributes.c @@ -46,17 +46,20 @@ __attribute__((ifunc("ifunc_resolver"))) int ifunc(void); // BTI: define internal ptr @static_target_clones.resolver() #[[ATTR_RESOLVER]] // BTI: define internal ptr @static_target_version.resolver() #[[ATTR_RESOLVER]] -// In NOBTI case, no attribute groups are assigned to the resolver functions: -// NOBTI: define weak_odr ptr @global_target_clones.resolver(){{( comdat)?}} { -// NOBTI: define weak_odr ptr @global_target_version.resolver(){{( comdat)?}} { -// NOBTI: define internal ptr @static_target_clones.resolver() { -// NOBTI: define internal ptr @static_target_version.resolver() { +// In NOBTI case, only "no_sanitizer_instrumentation" attributes are added to the resolver -// HIDDEN: define weak_odr hidden ptr @global_target_clones.resolver(){{( comdat)?}} { -// HIDDEN: define weak_odr hidden ptr @global_target_version.resolver(){{( comdat)?}} { -// HIDDEN: define internal ptr @static_target_clones.resolver() { -// HIDDEN: define internal ptr @static_target_version.resolver() { +// NOBTI: define weak_odr ptr @global_target_clones.resolver() [[ATTR_RESOLVER:(#[0-9]+)?]]{{( comdat)?}} +// NOBTI: define weak_odr ptr @global_target_version.resolver() [[ATTR_RESOLVER]]{{( comdat)?}} +// NOBTI: define internal ptr @static_target_clones.resolver() [[ATTR_RESOLVER]] +// NOBTI: define internal ptr @static_target_version.resolver() [[ATTR_RESOLVER]] + +// HIDDEN: define weak_odr hidden ptr @global_target_clones.resolver() [[ATTR_RESOLVER:(#[0-9]+)?]]{{( comdat)?}} +// HIDDEN: define weak_odr hidden ptr @global_target_version.resolver() [[ATTR_RESOLVER]]{{( comdat)?}} +// HIDDEN: define internal ptr @static_target_clones.resolver() [[ATTR_RESOLVER]] +// HIDDEN: define internal ptr @static_target_version.resolver() [[ATTR_RESOLVER]] // ELF: attributes #[[ATTR_IFUNC_RESOLVER]] = { {{.*}}"branch-target-enforcement"{{.*}} } // BTI: attributes #[[ATTR_RESOLVER]] = { {{.*}}"branch-target-enforcement"{{.*}} } +// +// NOBTI: attributes [[ATTR_RESOLVER]] = { disable_sanitizer_instrumentation } diff --git a/clang/test/CodeGen/attr-cpuspecific.c b/clang/test/CodeGen/attr-cpuspecific.c index 44f51887be389..7d086adeef4bf 100644 --- a/clang/test/CodeGen/attr-cpuspecific.c +++ b/clang/test/CodeGen/attr-cpuspecific.c @@ -42,7 +42,7 @@ void SingleVersion(void){} ATTR(cpu_dispatch(ivybridge)) void SingleVersion(void); -// LINUX: define weak_odr ptr @SingleVersion.resolver() +// LINUX: define weak_odr ptr @SingleVersion.resolver() #[[ATTR_RESOLVER:[0-9]+]] // LINUX: call void @__cpu_indicator_init // LINUX: %[[FEAT_INIT:.+]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 3, i32 0), align 4 // LINUX: %[[FEAT_JOIN:.+]] = and i32 %[[FEAT_INIT]], 525311 @@ -51,7 +51,7 @@ void SingleVersion(void); // LINUX: call void @llvm.trap // LINUX: unreachable -// WINDOWS: define weak_odr dso_local void @SingleVersion() comdat +// WINDOWS: define weak_odr dso_local void @SingleVersion() #[[ATTR_RESOLVER:[0-9]+]] comdat // WINDOWS: call void @__cpu_indicator_init() // WINDOWS: %[[FEAT_INIT:.+]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 3, i32 0), align 4 // WINDOWS: %[[FEAT_JOIN:.+]] = and i32 %[[FEAT_INIT]], 525311 @@ -72,7 +72,7 @@ void TwoVersions(void); ATTR(cpu_dispatch(ivybridge, knl)) void TwoVersions(void); -// LINUX: define weak_odr ptr @TwoVersions.resolver() +// LINUX: define weak_odr ptr @TwoVersions.resolver() #[[ATTR_RESOLVER]] // LINUX: call void @__cpu_indicator_init // LINUX: %[[FEAT_INIT:.+]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 3, i32 0), align 4 // LINUX: %[[FEAT_JOIN:.+]] = and i32 %[[FEAT_INIT]], 9422847 @@ -82,7 +82,7 @@ void TwoVersions(void); // LINUX: call void @llvm.trap // LINUX: unreachable -// WINDOWS: define weak_odr dso_local void @TwoVersions() comdat +// WINDOWS: define weak_odr dso_local void @TwoVersions() #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @__cpu_indicator_init() // WINDOWS: %[[FEAT_INIT:.+]] = load i32, ptr getelementptr inbounds ({ i32, i32, i32, [1 x i32] }, ptr @__cpu_model, i32 0, i32 3, i32 0), align 4 // WINDOWS: %[[FEAT_JOIN:.+]] = and i32 %[[FEAT_INIT]], 9422847 @@ -119,13 +119,13 @@ void CpuSpecificNoDispatch(void) {} ATTR(cpu_dispatch(knl)) void OrderDispatchUsageSpecific(void); -// LINUX: define weak_odr ptr @OrderDispatchUsageSpecific.resolver() +// LINUX: define weak_odr ptr @OrderDispatchUsageSpecific.resolver() #[[ATTR_RESOLVER]] // LINUX: call void @__cpu_indicator_init // LINUX: ret ptr @OrderDispatchUsageSpecific.Z // LINUX: call void @llvm.trap // LINUX: unreachable -// WINDOWS: define weak_odr dso_local void @OrderDispatchUsageSpecific() comdat +// WINDOWS: define weak_odr dso_local void @OrderDispatchUsageSpecific() #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @__cpu_indicator_init() // WINDOWS: call void @OrderDispatchUsageSpecific.Z() // WINDOWS-NEXT: ret void @@ -173,14 +173,14 @@ void usages(void) { // has an extra config to emit! ATTR(cpu_dispatch(ivybridge, knl, atom)) void TwoVersionsSameAttr(void); -// LINUX: define weak_odr ptr @TwoVersionsSameAttr.resolver() +// LINUX: define weak_odr ptr @TwoVersionsSameAttr.resolver() #[[ATTR_RESOLVER]] // LINUX: ret ptr @TwoVersionsSameAttr.Z // LINUX: ret ptr @TwoVersionsSameAttr.S // LINUX: ret ptr @TwoVersionsSameAttr.O // LINUX: call void @llvm.trap // LINUX: unreachable -// WINDOWS: define weak_odr dso_local void @TwoVersionsSameAttr() comdat +// WINDOWS: define weak_odr dso_local void @TwoVersionsSameAttr() #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @TwoVersionsSameAttr.Z // WINDOWS-NEXT: ret void // WINDOWS: call void @TwoVersionsSameAttr.S @@ -192,7 +192,7 @@ void TwoVersionsSameAttr(void); ATTR(cpu_dispatch(atom, ivybridge, knl)) void ThreeVersionsSameAttr(void){} -// LINUX: define weak_odr ptr @ThreeVersionsSameAttr.resolver() +// LINUX: define weak_odr ptr @ThreeVersionsSameAttr.resolver() #[[ATTR_RESOLVER]] // LINUX: call void @__cpu_indicator_init // LINUX: ret ptr @ThreeVersionsSameAttr.Z // LINUX: ret ptr @ThreeVersionsSameAttr.S @@ -200,7 +200,7 @@ void ThreeVersionsSameAttr(void){} // LINUX: call void @llvm.trap // LINUX: unreachable -// WINDOWS: define weak_odr dso_local void @ThreeVersionsSameAttr() comdat +// WINDOWS: define weak_odr dso_local void @ThreeVersionsSameAttr() #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @__cpu_indicator_init // WINDOWS: call void @ThreeVersionsSameAttr.Z // WINDOWS-NEXT: ret void @@ -213,10 +213,10 @@ void ThreeVersionsSameAttr(void){} ATTR(cpu_dispatch(knl)) void OrderSpecificUsageDispatch(void); -// LINUX: define weak_odr ptr @OrderSpecificUsageDispatch.resolver() +// LINUX: define weak_odr ptr @OrderSpecificUsageDispatch.resolver() #[[ATTR_RESOLVER]] // LINUX: ret ptr @OrderSpecificUsageDispatch.Z -// WINDOWS: define weak_odr dso_local void @OrderSpecificUsageDispatch() comdat +// WINDOWS: define weak_odr dso_local void @OrderSpecificUsageDispatch() #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @__cpu_indicator_init // WINDOWS: call void @OrderSpecificUsageDispatch.Z // WINDOWS-NEXT: ret void @@ -224,7 +224,7 @@ void OrderSpecificUsageDispatch(void); // No Cpu Specific options. ATTR(cpu_dispatch(atom, ivybridge, knl)) void NoSpecifics(void); -// LINUX: define weak_odr ptr @NoSpecifics.resolver() +// LINUX: define weak_odr ptr @NoSpecifics.resolver() #[[ATTR_RESOLVER]] // LINUX: call void @__cpu_indicator_init // LINUX: ret ptr @NoSpecifics.Z // LINUX: ret ptr @NoSpecifics.S @@ -232,7 +232,7 @@ void NoSpecifics(void); // LINUX: call void @llvm.trap // LINUX: unreachable -// WINDOWS: define weak_odr dso_local void @NoSpecifics() comdat +// WINDOWS: define weak_odr dso_local void @NoSpecifics() #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @__cpu_indicator_init // WINDOWS: call void @NoSpecifics.Z // WINDOWS-NEXT: ret void @@ -245,7 +245,7 @@ void NoSpecifics(void); ATTR(cpu_dispatch(atom, generic, ivybridge, knl)) void HasGeneric(void); -// LINUX: define weak_odr ptr @HasGeneric.resolver() +// LINUX: define weak_odr ptr @HasGeneric.resolver() #[[ATTR_RESOLVER]] // LINUX: call void @__cpu_indicator_init // LINUX: ret ptr @HasGeneric.Z // LINUX: ret ptr @HasGeneric.S @@ -253,7 +253,7 @@ void HasGeneric(void); // LINUX: ret ptr @HasGeneric.A // LINUX-NOT: call void @llvm.trap -// WINDOWS: define weak_odr dso_local void @HasGeneric() comdat +// WINDOWS: define weak_odr dso_local void @HasGeneric() #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @__cpu_indicator_init // WINDOWS: call void @HasGeneric.Z // WINDOWS-NEXT: ret void @@ -267,7 +267,7 @@ void HasGeneric(void); ATTR(cpu_dispatch(atom, generic, ivybridge, knl)) void HasParams(int i, double d); -// LINUX: define weak_odr ptr @HasParams.resolver() +// LINUX: define weak_odr ptr @HasParams.resolver() #[[ATTR_RESOLVER]] // LINUX: call void @__cpu_indicator_init // LINUX: ret ptr @HasParams.Z // LINUX: ret ptr @HasParams.S @@ -275,7 +275,7 @@ void HasParams(int i, double d); // LINUX: ret ptr @HasParams.A // LINUX-NOT: call void @llvm.trap -// WINDOWS: define weak_odr dso_local void @HasParams(i32 %0, double %1) comdat +// WINDOWS: define weak_odr dso_local void @HasParams(i32 %0, double %1) #[[ATTR_RESOLVER]] comdat // WINDOWS: call void @__cpu_indicator_init // WINDOWS: call void @HasParams.Z(i32 %0, double %1) // WINDOWS-NEXT: ret void @@ -289,7 +289,7 @@ void HasParams(int i, double d); ATTR(cpu_dispatch(atom, generic, ivybridge, knl)) int HasParamsAndReturn(int i, double d); -// LINUX: define weak_odr ptr @HasParamsAndReturn.resolver() +// LINUX: define weak_odr ptr @HasParamsAndReturn.resolver() #[[ATTR_RESOLVER]] ... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/167516 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
