Skip to content

Commit 188951d

Browse files
dougsonosTNorthover
authored andcommitted
[clang backend] In AArch64's DataLayout, specify a minimum function alignment of 4. (llvm#90702)
This addresses an issue where the explicit alignment of 2 (for C++ ABI reasons) was being propagated to the back end and causing under-aligned functions (in special sections). This is an alternate approach suggested by @efriedma-quic in PR llvm#90415. Fixes llvm#90358
1 parent 74f34b6 commit 188951d

12 files changed

+59
-48
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,11 +1384,11 @@ AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple,
13841384
void AArch64leTargetInfo::setDataLayout() {
13851385
if (getTriple().isOSBinFormatMachO()) {
13861386
if(getTriple().isArch32Bit())
1387-
resetDataLayout("e-m:o-p:32:32-i64:64-i128:128-n32:64-S128", "_");
1387+
resetDataLayout("e-m:o-p:32:32-i64:64-i128:128-n32:64-S128-Fn32", "_");
13881388
else
1389-
resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128", "_");
1389+
resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128-Fn32", "_");
13901390
} else
1391-
resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1391+
resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32");
13921392
}
13931393

13941394
void AArch64leTargetInfo::getTargetDefines(const LangOptions &Opts,
@@ -1411,7 +1411,7 @@ void AArch64beTargetInfo::getTargetDefines(const LangOptions &Opts,
14111411

14121412
void AArch64beTargetInfo::setDataLayout() {
14131413
assert(!getTriple().isOSBinFormatMachO());
1414-
resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1414+
resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32");
14151415
}
14161416

14171417
WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple,
@@ -1434,8 +1434,8 @@ WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple,
14341434

14351435
void WindowsARM64TargetInfo::setDataLayout() {
14361436
resetDataLayout(Triple.isOSBinFormatMachO()
1437-
? "e-m:o-i64:64-i128:128-n32:64-S128"
1438-
: "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128",
1437+
? "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"
1438+
: "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32",
14391439
Triple.isOSBinFormatMachO() ? "_" : "");
14401440
}
14411441

clang/test/CodeGen/aarch64-type-sizes.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// RUN: %clang_cc1 -triple aarch64_be-none-linux-gnu -emit-llvm -w -o - %s | FileCheck %s
22
// char by definition has size 1
33

4-
// CHECK: target datalayout = "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4+
// CHECK: target datalayout = "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
55

66
int check_short(void) {
77
return sizeof(short);

clang/test/CodeGen/coff-aarch64-type-sizes.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %clang_cc1 -triple aarch64-windows -emit-llvm -w -o - %s | FileCheck %s
22

3-
// CHECK: target datalayout = "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128"
3+
// CHECK: target datalayout = "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32"
44
// CHECK: target triple = "aarch64-unknown-windows-msvc"
55

66
int check_short(void) {

clang/test/CodeGen/target-data.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,15 @@
185185

186186
// RUN: %clang_cc1 -triple arm64-unknown -o - -emit-llvm %s | \
187187
// RUN: FileCheck %s -check-prefix=AARCH64
188-
// AARCH64: target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
188+
// AARCH64: target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
189189

190190
// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -o - -emit-llvm %s | \
191191
// RUN: FileCheck %s -check-prefix=AARCH64-ILP32
192-
// AARCH64-ILP32: target datalayout = "e-m:o-p:32:32-i64:64-i128:128-n32:64-S128"
192+
// AARCH64-ILP32: target datalayout = "e-m:o-p:32:32-i64:64-i128:128-n32:64-S128-Fn32"
193193

194194
// RUN: %clang_cc1 -triple arm64-pc-win32-macho -o - -emit-llvm %s | \
195195
// RUN: FileCheck %s -check-prefix=AARCH64-WIN32-MACHO
196-
// AARCH64-WIN32-MACHO: target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
196+
// AARCH64-WIN32-MACHO: target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"
197197

198198
// RUN: %clang_cc1 -triple thumb-unknown-gnueabi -o - -emit-llvm %s | \
199199
// RUN: FileCheck %s -check-prefix=THUMB

clang/test/CodeGenCXX/member-alignment.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
// RUN: %clang_cc1 -emit-llvm -triple ppc64le-unknown-linux-gnu %s -o - | \
66
// RUN: FileCheck -check-prefix CHECK-NOEXTRAALIGN %s
77
// RUN: %clang_cc1 -emit-llvm -triple arm64-unknown-linux-gnu %s -o - | \
8-
// RUN: FileCheck -check-prefix CHECK-EXTRAALIGN %s
8+
// RUN: FileCheck -check-prefix CHECK-NOEXTRAALIGN %s
99
// RUN: %clang_cc1 -emit-llvm -triple arm64-apple-ios %s -o - | \
10-
// RUN: FileCheck -check-prefix CHECK-EXTRAALIGN %s
10+
// RUN: FileCheck -check-prefix CHECK-NOEXTRAALIGN %s
1111
// RUN: %clang_cc1 -emit-llvm -triple aarch64-unknown-linux-gnu %s -o - | \
12-
// RUN: FileCheck -check-prefix CHECK-EXTRAALIGN %s
12+
// RUN: FileCheck -check-prefix CHECK-NOEXTRAALIGN %s
1313
// RUN: %clang_cc1 -emit-llvm -triple mips-unknown-linux-gnu %s -o - | \
1414
// RUN: FileCheck -check-prefix CHECK-EXTRAALIGN %s
1515
// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-fuchsia %s -o - | \

clang/test/CodeGenCXX/ptrauth-member-function-pointer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ typedef void (Derived0::*MethodTy1)();
102102
// CHECK-NEXT: store { i64, i64 } { i64 ptrtoint (ptr @_ZN5Base08virtual1Ev_vfpthunk_.ptrauth.4 to i64), i64 0 }, ptr %[[METHOD7]], align 8
103103
// CHECK: ret void
104104

105-
// CHECK: define linkonce_odr hidden void @_ZN5Base08virtual1Ev_vfpthunk_(ptr noundef %[[THIS:.*]]) {{.*}}align 2
105+
// CHECK: define linkonce_odr hidden void @_ZN5Base08virtual1Ev_vfpthunk_(ptr noundef %[[THIS:.*]]) {{.*}}
106106
// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 8
107107
// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 8
108108
// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align 8
@@ -118,7 +118,7 @@ typedef void (Derived0::*MethodTy1)();
118118
// CHECK-NEXT: musttail call void %[[V5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(8) %[[V0]]) [ "ptrauth"(i32 0, i64 %[[V7]]) ]
119119
// CHECK-NEXT: ret void
120120

121-
// CHECK: define linkonce_odr hidden void @_ZN5Base08virtual3Ev_vfpthunk_(ptr noundef %{{.*}}) {{.*}}align 2
121+
// CHECK: define linkonce_odr hidden void @_ZN5Base08virtual3Ev_vfpthunk_(ptr noundef %{{.*}}) {{.*}}
122122
// CHECK: load ptr, ptr %{{.*}}, align 8
123123
// CHECK: load ptr, ptr %{{.*}}, align 8
124124
// CHECK: %[[VTABLE:.*]] = load ptr, ptr %{{.*}}, align 8
@@ -128,7 +128,7 @@ typedef void (Derived0::*MethodTy1)();
128128
// CHECK: getelementptr inbounds ptr, ptr %[[V4]], i64 1
129129
// CHECK: call i64 @llvm.ptrauth.blend(i64 %{{.*}}, i64 53007)
130130

131-
// CHECK: define linkonce_odr hidden void @_ZN5Base016virtual_variadicEiz_vfpthunk_(ptr noundef %[[THIS:.*]], i32 noundef %0, ...){{.*}} align 2
131+
// CHECK: define linkonce_odr hidden void @_ZN5Base016virtual_variadicEiz_vfpthunk_(ptr noundef %[[THIS:.*]], i32 noundef %0, ...){{.*}}
132132
// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 8
133133
// CHECK-NEXT: %[[_ADDR:.*]] = alloca i32, align 4
134134
// CHECK-NEXT: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 8

clang/test/CodeGenCXX/ptrauth-thunks.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace Test1 {
2121
}
2222
}
2323

24-
// CHECK-LABEL: define linkonce_odr void @_ZTv0_n24_N5Test11DD0Ev(ptr noundef %this){{.*}} align 2
24+
// CHECK-LABEL: define linkonce_odr void @_ZTv0_n24_N5Test11DD0Ev(ptr noundef %this)
2525
// CHECK: %[[This:.*]] = load ptr
2626
// CHECK: %[[SignedVTable:.*]] = load ptr, ptr %[[This]], align 8
2727
// CHECK: %[[SignedVTableAsInt:.*]] = ptrtoint ptr %[[SignedVTable]] to i64

clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2742,7 +2742,7 @@ int main() {
27422742
//
27432743
//
27442744
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SC1El
2745-
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
2745+
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {
27462746
// CHECK9-NEXT: entry:
27472747
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
27482748
// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -2755,7 +2755,7 @@ int main() {
27552755
//
27562756
//
27572757
// CHECK9-LABEL: define {{[^@]+}}@_ZN1ScvcEv
2758-
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat align 2 {
2758+
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat {
27592759
// CHECK9-NEXT: entry:
27602760
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
27612761
// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -3228,7 +3228,7 @@ int main() {
32283228
//
32293229
//
32303230
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SD1Ev
3231-
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat align 2 {
3231+
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat {
32323232
// CHECK9-NEXT: entry:
32333233
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
32343234
// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -3238,7 +3238,7 @@ int main() {
32383238
//
32393239
//
32403240
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SC2El
3241-
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
3241+
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat {
32423242
// CHECK9-NEXT: entry:
32433243
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
32443244
// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -3252,7 +3252,7 @@ int main() {
32523252
//
32533253
//
32543254
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SD2Ev
3255-
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
3255+
// CHECK9-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat {
32563256
// CHECK9-NEXT: entry:
32573257
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
32583258
// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -4001,7 +4001,7 @@ int main() {
40014001
//
40024002
//
40034003
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SC1El
4004-
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
4004+
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {
40054005
// CHECK13-NEXT: entry:
40064006
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
40074007
// CHECK13-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -4014,7 +4014,7 @@ int main() {
40144014
//
40154015
//
40164016
// CHECK13-LABEL: define {{[^@]+}}@_ZN1ScvcEv
4017-
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat align 2 {
4017+
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat {
40184018
// CHECK13-NEXT: entry:
40194019
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
40204020
// CHECK13-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -4487,7 +4487,7 @@ int main() {
44874487
//
44884488
//
44894489
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SD1Ev
4490-
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat align 2 {
4490+
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat {
44914491
// CHECK13-NEXT: entry:
44924492
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
44934493
// CHECK13-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -4497,7 +4497,7 @@ int main() {
44974497
//
44984498
//
44994499
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SC2El
4500-
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
4500+
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 noundef [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat {
45014501
// CHECK13-NEXT: entry:
45024502
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
45034503
// CHECK13-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -5114,7 +5114,7 @@ int main() {
51145114
//
51155115
//
51165116
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SD2Ev
5117-
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
5117+
// CHECK13-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat {
51185118
// CHECK13-NEXT: entry:
51195119
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
51205120
// CHECK13-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8

clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3249,7 +3249,7 @@ int main() {
32493249
//
32503250
//
32513251
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SC1El
3252-
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
3252+
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {
32533253
// CHECK9-NEXT: entry:
32543254
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
32553255
// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -3262,7 +3262,7 @@ int main() {
32623262
//
32633263
//
32643264
// CHECK9-LABEL: define {{[^@]+}}@_ZN1ScvcEv
3265-
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat align 2 {
3265+
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat {
32663266
// CHECK9-NEXT: entry:
32673267
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
32683268
// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -3763,7 +3763,7 @@ int main() {
37633763
//
37643764
//
37653765
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SD1Ev
3766-
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat align 2 {
3766+
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat {
37673767
// CHECK9-NEXT: entry:
37683768
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
37693769
// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -3773,7 +3773,7 @@ int main() {
37733773
//
37743774
//
37753775
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SC2El
3776-
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
3776+
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat {
37773777
// CHECK9-NEXT: entry:
37783778
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
37793779
// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -3787,7 +3787,7 @@ int main() {
37873787
//
37883788
//
37893789
// CHECK9-LABEL: define {{[^@]+}}@_ZN1SD2Ev
3790-
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
3790+
// CHECK9-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat {
37913791
// CHECK9-NEXT: entry:
37923792
// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
37933793
// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -4579,7 +4579,7 @@ int main() {
45794579
//
45804580
//
45814581
// CHECK11-LABEL: define {{[^@]+}}@_ZN1SC1El
4582-
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
4582+
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {
45834583
// CHECK11-NEXT: entry:
45844584
// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
45854585
// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -4592,7 +4592,7 @@ int main() {
45924592
//
45934593
//
45944594
// CHECK11-LABEL: define {{[^@]+}}@_ZN1ScvcEv
4595-
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat align 2 {
4595+
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat {
45964596
// CHECK11-NEXT: entry:
45974597
// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
45984598
// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -4768,7 +4768,7 @@ int main() {
47684768
//
47694769
//
47704770
// CHECK11-LABEL: define {{[^@]+}}@_ZN1SD1Ev
4771-
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR6:[0-9]+]] comdat align 2 {
4771+
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR6:[0-9]+]] comdat {
47724772
// CHECK11-NEXT: entry:
47734773
// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
47744774
// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -4778,7 +4778,7 @@ int main() {
47784778
//
47794779
//
47804780
// CHECK11-LABEL: define {{[^@]+}}@_ZN1SC2El
4781-
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR6]] comdat align 2 {
4781+
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR6]] comdat {
47824782
// CHECK11-NEXT: entry:
47834783
// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
47844784
// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -4792,7 +4792,7 @@ int main() {
47924792
//
47934793
//
47944794
// CHECK11-LABEL: define {{[^@]+}}@_ZN1SD2Ev
4795-
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR6]] comdat align 2 {
4795+
// CHECK11-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR6]] comdat {
47964796
// CHECK11-NEXT: entry:
47974797
// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
47984798
// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -4931,7 +4931,7 @@ int main() {
49314931
//
49324932
//
49334933
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SC1El
4934-
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
4934+
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {
49354935
// CHECK13-NEXT: entry:
49364936
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
49374937
// CHECK13-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -4944,7 +4944,7 @@ int main() {
49444944
//
49454945
//
49464946
// CHECK13-LABEL: define {{[^@]+}}@_ZN1ScvcEv
4947-
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat align 2 {
4947+
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2:[0-9]+]] comdat {
49484948
// CHECK13-NEXT: entry:
49494949
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
49504950
// CHECK13-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -5445,7 +5445,7 @@ int main() {
54455445
//
54465446
//
54475447
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SD1Ev
5448-
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat align 2 {
5448+
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8:[0-9]+]] comdat {
54495449
// CHECK13-NEXT: entry:
54505450
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
54515451
// CHECK13-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
@@ -5455,7 +5455,7 @@ int main() {
54555455
//
54565456
//
54575457
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SC2El
5458-
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
5458+
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]], i64 [[A:%.*]]) unnamed_addr #[[ATTR8]] comdat {
54595459
// CHECK13-NEXT: entry:
54605460
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
54615461
// CHECK13-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
@@ -6128,7 +6128,7 @@ int main() {
61286128
//
61296129
//
61306130
// CHECK13-LABEL: define {{[^@]+}}@_ZN1SD2Ev
6131-
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat align 2 {
6131+
// CHECK13-SAME: (ptr nonnull align 8 dereferenceable(24) [[THIS:%.*]]) unnamed_addr #[[ATTR8]] comdat {
61326132
// CHECK13-NEXT: entry:
61336133
// CHECK13-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
61346134
// CHECK13-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8

llvm/lib/IR/AutoUpgrade.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5318,6 +5318,14 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
53185318
return Res;
53195319
}
53205320

5321+
// AArch64 data layout upgrades.
5322+
if (T.isAArch64()) {
5323+
// Add "-Fn32"
5324+
if (!DL.empty() && !DL.contains("-Fn32"))
5325+
Res.append("-Fn32");
5326+
return Res;
5327+
}
5328+
53215329
if (!T.isX86())
53225330
return Res;
53235331

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,15 +260,15 @@ static std::string computeDataLayout(const Triple &TT,
260260
bool LittleEndian) {
261261
if (TT.isOSBinFormatMachO()) {
262262
if (TT.getArch() == Triple::aarch64_32)
263-
return "e-m:o-p:32:32-i64:64-i128:128-n32:64-S128";
264-
return "e-m:o-i64:64-i128:128-n32:64-S128";
263+
return "e-m:o-p:32:32-i64:64-i128:128-n32:64-S128-Fn32";
264+
return "e-m:o-i64:64-i128:128-n32:64-S128-Fn32";
265265
}
266266
if (TT.isOSBinFormatCOFF())
267-
return "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128";
267+
return "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32";
268268
std::string Endian = LittleEndian ? "e" : "E";
269269
std::string Ptr32 = TT.getEnvironment() == Triple::GNUILP32 ? "-p:32:32" : "";
270270
return Endian + "-m:e" + Ptr32 +
271-
"-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128";
271+
"-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32";
272272
}
273273

274274
static StringRef computeDefaultCPU(const Triple &TT, StringRef CPU) {

0 commit comments

Comments
 (0)