Skip to content

Commit 3d80792

Browse files
authored
[clang][AArch64][FMV] Stop emitting alias to ifunc. (#96221)
Long story short the interaction of two optimizations happening in GlobalOpt results in a crash. For more details look at the issue #96197. I will be fixing this in GlobalOpt but it is a conservative solution since it won't allow us to optimize resolvers which return a pointer to a function whose definition is in another TU when compiling without LTO: ``` __attribute__((target_version("simd"))) void bar(void); __attribute__((target_version("default"))) void bar(void); int foo() { bar(); } ``` fixes: #96197
1 parent a66900b commit 3d80792

8 files changed

+7
-47
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,17 @@ ABI Changes in This Version
9595
- Fixed Microsoft calling convention when returning classes that have a deleted
9696
copy assignment operator. Such a class should be returned indirectly.
9797

98+
- Removed the global alias that was pointing to AArch64 Function Multiversioning
99+
ifuncs. Its purpose was to preserve backwards compatibility when the ".ifunc"
100+
suffix got removed from the name mangling. The alias interacts badly with
101+
GlobalOpt (see the issue #96197).
102+
98103
- Fixed Microsoft name mangling for auto non-type template arguments of pointer
99104
type for MSVC 1920+. This change resolves incompatibilities with code compiled
100105
by MSVC 1920+ but will introduce incompatibilities with code compiled by
101106
earlier versions of Clang unless such code is built with the compiler option
102107
`-fms-compatibility-version=19.14` to imitate the MSVC 1914 mangling behavior.
103108

104-
105109
AST Dumping Potentially Breaking Changes
106110
----------------------------------------
107111

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4259,8 +4259,8 @@ void CodeGenModule::emitMultiVersionFunctions() {
42594259
llvm::Constant *ResolverConstant = GetOrCreateMultiVersionResolver(GD);
42604260
if (auto *IFunc = dyn_cast<llvm::GlobalIFunc>(ResolverConstant)) {
42614261
ResolverConstant = IFunc->getResolver();
4262-
if (FD->isTargetClonesMultiVersion() ||
4263-
FD->isTargetVersionMultiVersion()) {
4262+
if (FD->isTargetClonesMultiVersion() &&
4263+
!getTarget().getTriple().isAArch64()) {
42644264
std::string MangledName = getMangledNameImpl(
42654265
*this, GD, FD, /*OmitMultiVersionMangling=*/true);
42664266
if (!GetGlobalValue(MangledName + ".ifunc")) {

clang/test/CodeGen/aarch64-mixed-target-attributes.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
3030

3131
//.
3232
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
33-
// CHECK: @explicit_default.ifunc = weak_odr alias i32 (), ptr @explicit_default
34-
// CHECK: @implicit_default.ifunc = weak_odr alias i32 (), ptr @implicit_default
35-
// CHECK: @default_def_with_version_decls.ifunc = weak_odr alias i32 (), ptr @default_def_with_version_decls
3633
// CHECK: @explicit_default = weak_odr ifunc i32 (), ptr @explicit_default.resolver
3734
// CHECK: @implicit_default = weak_odr ifunc i32 (), ptr @implicit_default.resolver
3835
// CHECK: @default_def_with_version_decls = weak_odr ifunc i32 (), ptr @default_def_with_version_decls.resolver

clang/test/CodeGen/attr-target-clones-aarch64.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
2727

2828
//.
2929
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
30-
// CHECK: @ftc.ifunc = weak_odr alias i32 (), ptr @ftc
31-
// CHECK: @ftc_def.ifunc = weak_odr alias i32 (), ptr @ftc_def
32-
// CHECK: @ftc_dup1.ifunc = weak_odr alias i32 (), ptr @ftc_dup1
33-
// CHECK: @ftc_dup2.ifunc = weak_odr alias i32 (), ptr @ftc_dup2
34-
// CHECK: @ftc_dup3.ifunc = weak_odr alias i32 (), ptr @ftc_dup3
35-
// CHECK: @ftc_inline2.ifunc = weak_odr alias i32 (), ptr @ftc_inline2
36-
// CHECK: @ftc_inline1.ifunc = weak_odr alias i32 (), ptr @ftc_inline1
37-
// CHECK: @ftc_inline3.ifunc = weak_odr alias i32 (), ptr @ftc_inline3
3830
// CHECK: @ftc = weak_odr ifunc i32 (), ptr @ftc.resolver
3931
// CHECK: @ftc_def = weak_odr ifunc i32 (), ptr @ftc_def.resolver
4032
// CHECK: @ftc_dup1 = weak_odr ifunc i32 (), ptr @ftc_dup1.resolver
@@ -45,14 +37,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
4537
// CHECK: @ftc_inline3 = weak_odr ifunc i32 (), ptr @ftc_inline3.resolver
4638
//.
4739
// CHECK-MTE-BTI: @__aarch64_cpu_features = external dso_local global { i64 }
48-
// CHECK-MTE-BTI: @ftc.ifunc = weak_odr alias i32 (), ptr @ftc
49-
// CHECK-MTE-BTI: @ftc_def.ifunc = weak_odr alias i32 (), ptr @ftc_def
50-
// CHECK-MTE-BTI: @ftc_dup1.ifunc = weak_odr alias i32 (), ptr @ftc_dup1
51-
// CHECK-MTE-BTI: @ftc_dup2.ifunc = weak_odr alias i32 (), ptr @ftc_dup2
52-
// CHECK-MTE-BTI: @ftc_dup3.ifunc = weak_odr alias i32 (), ptr @ftc_dup3
53-
// CHECK-MTE-BTI: @ftc_inline2.ifunc = weak_odr alias i32 (), ptr @ftc_inline2
54-
// CHECK-MTE-BTI: @ftc_inline1.ifunc = weak_odr alias i32 (), ptr @ftc_inline1
55-
// CHECK-MTE-BTI: @ftc_inline3.ifunc = weak_odr alias i32 (), ptr @ftc_inline3
5640
// CHECK-MTE-BTI: @ftc = weak_odr ifunc i32 (), ptr @ftc.resolver
5741
// CHECK-MTE-BTI: @ftc_def = weak_odr ifunc i32 (), ptr @ftc_def.resolver
5842
// CHECK-MTE-BTI: @ftc_dup1 = weak_odr ifunc i32 (), ptr @ftc_dup1.resolver

clang/test/CodeGen/attr-target-version.c

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -137,19 +137,6 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
137137

138138
//.
139139
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
140-
// CHECK: @fmv.ifunc = weak_odr alias i32 (), ptr @fmv
141-
// CHECK: @fmv_one.ifunc = weak_odr alias i32 (), ptr @fmv_one
142-
// CHECK: @fmv_two.ifunc = weak_odr alias i32 (), ptr @fmv_two
143-
// CHECK: @fmv_e.ifunc = weak_odr alias i32 (), ptr @fmv_e
144-
// CHECK: @fmv_d.ifunc = internal alias i32 (), ptr @fmv_d
145-
// CHECK: @fmv_c.ifunc = weak_odr alias void (), ptr @fmv_c
146-
// CHECK: @fmv_inline.ifunc = weak_odr alias i32 (), ptr @fmv_inline
147-
// CHECK: @unused_with_default_def.ifunc = weak_odr alias i32 (), ptr @unused_with_default_def
148-
// CHECK: @unused_with_implicit_default_def.ifunc = weak_odr alias i32 (), ptr @unused_with_implicit_default_def
149-
// CHECK: @unused_with_implicit_forward_default_def.ifunc = weak_odr alias i32 (), ptr @unused_with_implicit_forward_default_def
150-
// CHECK: @default_def_with_version_decls.ifunc = weak_odr alias i32 (), ptr @default_def_with_version_decls
151-
// CHECK: @used_def_without_default_decl.ifunc = weak_odr alias i32 (), ptr @used_def_without_default_decl
152-
// CHECK: @used_decl_without_default_decl.ifunc = weak_odr alias i32 (), ptr @used_decl_without_default_decl
153140
// CHECK: @fmv = weak_odr ifunc i32 (), ptr @fmv.resolver
154141
// CHECK: @fmv_one = weak_odr ifunc i32 (), ptr @fmv_one.resolver
155142
// CHECK: @fmv_two = weak_odr ifunc i32 (), ptr @fmv_two.resolver

clang/test/CodeGenCXX/attr-target-clones-aarch64.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@ void run_foo_tml() {
4040

4141
//.
4242
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
43-
// CHECK: @_Z7foo_ovli.ifunc = weak_odr alias i32 (i32), ptr @_Z7foo_ovli
44-
// CHECK: @_Z7foo_ovlv.ifunc = weak_odr alias i32 (), ptr @_Z7foo_ovlv
45-
// CHECK: @_ZN7MyClassIssE7foo_tmlEv.ifunc = weak_odr alias i32 (ptr), ptr @_ZN7MyClassIssE7foo_tmlEv
46-
// CHECK: @_ZN7MyClassIisE7foo_tmlEv.ifunc = weak_odr alias i32 (ptr), ptr @_ZN7MyClassIisE7foo_tmlEv
4743
// CHECK: @_Z7foo_ovli = weak_odr ifunc i32 (i32), ptr @_Z7foo_ovli.resolver
4844
// CHECK: @_Z7foo_ovlv = weak_odr ifunc i32 (), ptr @_Z7foo_ovlv.resolver
4945
// CHECK: @_ZN7MyClassIssE7foo_tmlEv = weak_odr ifunc i32 (ptr), ptr @_ZN7MyClassIssE7foo_tmlEv.resolver

clang/test/CodeGenCXX/attr-target-version.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ int bar() {
6262

6363
//.
6464
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
65-
// CHECK: @_Z3fooi.ifunc = weak_odr alias i32 (i32), ptr @_Z3fooi
66-
// CHECK: @_Z3foov.ifunc = weak_odr alias i32 (), ptr @_Z3foov
67-
// CHECK: @_ZN7MyClass3gooEi.ifunc = weak_odr alias i32 (ptr, i32), ptr @_ZN7MyClass3gooEi
68-
// CHECK: @_ZN7MyClass23unused_with_default_defEv.ifunc = weak_odr alias i32 (ptr), ptr @_ZN7MyClass23unused_with_default_defEv
69-
// CHECK: @_ZN7MyClass32unused_with_implicit_default_defEv.ifunc = weak_odr alias i32 (ptr), ptr @_ZN7MyClass32unused_with_implicit_default_defEv
70-
// CHECK: @_ZN7MyClass40unused_with_implicit_forward_default_defEv.ifunc = weak_odr alias i32 (ptr), ptr @_ZN7MyClass40unused_with_implicit_forward_default_defEv
7165
// CHECK: @_ZN7MyClass3gooEi = weak_odr ifunc i32 (ptr, i32), ptr @_ZN7MyClass3gooEi.resolver
7266
// CHECK: @_Z3fooi = weak_odr ifunc i32 (i32), ptr @_Z3fooi.resolver
7367
// CHECK: @_Z3foov = weak_odr ifunc i32 (), ptr @_Z3foov.resolver

clang/test/CodeGenCXX/fmv-namespace.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ int baz() { return OtherName::foo(); }
1919

2020
//.
2121
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
22-
// CHECK: @_ZN4Name3fooEv.ifunc = weak_odr alias i32 (), ptr @_ZN4Name3fooEv
23-
// CHECK: @_ZN9OtherName3fooEv.ifunc = weak_odr alias i32 (), ptr @_ZN9OtherName3fooEv
2422
// CHECK: @_ZN4Name3fooEv = weak_odr ifunc i32 (), ptr @_ZN4Name3fooEv.resolver
2523
// CHECK: @_ZN9OtherName3fooEv = weak_odr ifunc i32 (), ptr @_ZN9OtherName3fooEv.resolver
2624
//.

0 commit comments

Comments
 (0)