[clang] [compiler-rt] [Clang][CodeGen] Add disable_sanitizer_instrumentation attribute to multiversion resolvers (PR #167516)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 11 07:02:30 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-compiler-rt-sanitizer
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
More information about the llvm-commits
mailing list