Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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