Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGen/AArch64/fmv-detection.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 8 additions & 4 deletions clang/test/CodeGen/AArch64/fmv-mix-explicit-implicit-default.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
//
Expand Down
6 changes: 2 additions & 4 deletions clang/test/CodeGen/AArch64/fmv-priority.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
22 changes: 15 additions & 7 deletions clang/test/CodeGen/AArch64/fmv-resolver-emission.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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 {{.*}}"}
Expand Down
9 changes: 6 additions & 3 deletions clang/test/CodeGen/AArch64/mixed-target-attributes.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
21 changes: 12 additions & 9 deletions clang/test/CodeGen/AArch64/resolver-attributes.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Loading
Loading