Skip to content

Commit 8d2e9fc

Browse files
committed
[PowerPC] Add function pointer alignment to DataLayout
The alignment of function pointers was added to the Datalayout by D57335 but currently is unset for the Power target. This will cause us to compute a conservative minimum alignment of one if places like Value::getPointerAlignment. This patch implements the function pointer alignment in the Datalayout for the Power backend and Power targets in clang, so we can query the value for a particular Power target. We come up with the correct value one of two ways: - If the target uses function descriptor objects (i.e. ELFv1 & AIX ABIs), then a function pointer points to the descriptor, so use the alignment we would emit the descriptor with. - If the target doesn't use function descriptor objects (i.e. ELFv2), a function pointer points to the global entry point, so use the minimum alignment for code on Power (i.e. 4-bytes). Reviewed By: nemanjai Differential Revision: https://reviews.llvm.org/D147016
1 parent 2213509 commit 8d2e9fc

File tree

6 files changed

+48
-33
lines changed

6 files changed

+48
-33
lines changed

clang/lib/Basic/Targets/OSTargets.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo : public OSTargetInfo<Target> {
519519
this->IntMaxType = TargetInfo::SignedLongLong;
520520
this->Int64Type = TargetInfo::SignedLongLong;
521521
this->SizeType = TargetInfo::UnsignedInt;
522-
this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
522+
this->resetDataLayout("E-m:e-p:32:32-Fi64-i64:64-n32:64");
523523
}
524524
};
525525

clang/lib/Basic/Targets/PPC.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -363,11 +363,11 @@ class LLVM_LIBRARY_VISIBILITY PPC32TargetInfo : public PPCTargetInfo {
363363
PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
364364
: PPCTargetInfo(Triple, Opts) {
365365
if (Triple.isOSAIX())
366-
resetDataLayout("E-m:a-p:32:32-i64:64-n32");
366+
resetDataLayout("E-m:a-p:32:32-Fi32-i64:64-n32");
367367
else if (Triple.getArch() == llvm::Triple::ppcle)
368-
resetDataLayout("e-m:e-p:32:32-i64:64-n32");
368+
resetDataLayout("e-m:e-p:32:32-Fn32-i64:64-n32");
369369
else
370-
resetDataLayout("E-m:e-p:32:32-i64:64-n32");
370+
resetDataLayout("E-m:e-p:32:32-Fn32-i64:64-n32");
371371

372372
switch (getTriple().getOS()) {
373373
case llvm::Triple::Linux:
@@ -418,19 +418,23 @@ class LLVM_LIBRARY_VISIBILITY PPC64TargetInfo : public PPCTargetInfo {
418418

419419
if (Triple.isOSAIX()) {
420420
// TODO: Set appropriate ABI for AIX platform.
421-
DataLayout = "E-m:a-i64:64-n32:64";
421+
DataLayout = "E-m:a-Fi64-i64:64-n32:64";
422422
LongDoubleWidth = 64;
423423
LongDoubleAlign = DoubleAlign = 32;
424424
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
425425
} else if ((Triple.getArch() == llvm::Triple::ppc64le)) {
426-
DataLayout = "e-m:e-i64:64-n32:64";
426+
DataLayout = "e-m:e-Fn32-i64:64-n32:64";
427427
ABI = "elfv2";
428428
} else {
429-
DataLayout = "E-m:e-i64:64-n32:64";
430-
if (Triple.isPPC64ELFv2ABI())
429+
DataLayout = "E-m:e";
430+
if (Triple.isPPC64ELFv2ABI()) {
431431
ABI = "elfv2";
432-
else
432+
DataLayout += "-Fn32";
433+
} else {
433434
ABI = "elfv1";
435+
DataLayout += "-Fi64";
436+
}
437+
DataLayout += "-i64:64-n32:64";
434438
}
435439

436440
if (Triple.isOSFreeBSD() || Triple.isOSOpenBSD() || Triple.isMusl()) {

clang/test/CodeGen/target-data.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888

8989
// RUN: %clang_cc1 -triple powerpc64-lv2 -o - -emit-llvm %s | \
9090
// RUN: FileCheck %s -check-prefix=PS3
91-
// PS3: target datalayout = "E-m:e-p:32:32-i64:64-n32:64"
91+
// PS3: target datalayout = "E-m:e-p:32:32-Fi64-i64:64-n32:64"
9292

9393
// RUN: %clang_cc1 -triple i686-nacl -o - -emit-llvm %s | \
9494
// RUN: FileCheck %s -check-prefix=I686-NACL
@@ -120,43 +120,43 @@
120120

121121
// RUN: %clang_cc1 -triple powerpc-unknown -o - -emit-llvm %s | \
122122
// RUN: FileCheck %s -check-prefix=PPC
123-
// PPC: target datalayout = "E-m:e-p:32:32-i64:64-n32"
123+
// PPC: target datalayout = "E-m:e-p:32:32-Fn32-i64:64-n32"
124124

125125
// RUN: %clang_cc1 -triple powerpcle-unknown -o - -emit-llvm %s | \
126126
// RUN: FileCheck %s -check-prefix=PPCLE
127-
// PPCLE: target datalayout = "e-m:e-p:32:32-i64:64-n32"
127+
// PPCLE: target datalayout = "e-m:e-p:32:32-Fn32-i64:64-n32"
128128

129129
// RUN: %clang_cc1 -triple powerpc64-freebsd -o - -emit-llvm %s | \
130130
// RUN: FileCheck %s -check-prefix=PPC64-FREEBSD
131-
// PPC64-FREEBSD: target datalayout = "E-m:e-i64:64-n32:64"
131+
// PPC64-FREEBSD: target datalayout = "E-m:e-Fn32-i64:64-n32:64"
132132

133133
// RUN: %clang_cc1 -triple powerpc64le-freebsd -o - -emit-llvm %s | \
134134
// RUN: FileCheck %s -check-prefix=PPC64LE-FREEBSD
135-
// PPC64LE-FREEBSD: target datalayout = "e-m:e-i64:64-n32:64"
135+
// PPC64LE-FREEBSD: target datalayout = "e-m:e-Fn32-i64:64-n32:64"
136136

137137
// RUN: %clang_cc1 -triple powerpc64-linux -o - -emit-llvm %s | \
138138
// RUN: FileCheck %s -check-prefix=PPC64-LINUX
139-
// PPC64-LINUX: target datalayout = "E-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
139+
// PPC64-LINUX: target datalayout = "E-m:e-Fi64-i64:64-n32:64-S128-v256:256:256-v512:512:512"
140140

141141
// RUN: %clang_cc1 -triple powerpc64-linux -o - -emit-llvm -target-cpu future %s | \
142142
// RUN: FileCheck %s -check-prefix=PPC64-FUTURE
143-
// PPC64-FUTURE: target datalayout = "E-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
143+
// PPC64-FUTURE: target datalayout = "E-m:e-Fi64-i64:64-n32:64-S128-v256:256:256-v512:512:512"
144144

145145
// RUN: %clang_cc1 -triple powerpc64-linux -o - -emit-llvm -target-cpu pwr10 %s | \
146146
// RUN: FileCheck %s -check-prefix=PPC64-P10
147-
// PPC64-P10: target datalayout = "E-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
147+
// PPC64-P10: target datalayout = "E-m:e-Fi64-i64:64-n32:64-S128-v256:256:256-v512:512:512"
148148

149149
// RUN: %clang_cc1 -triple powerpc64le-linux -o - -emit-llvm %s | \
150150
// RUN: FileCheck %s -check-prefix=PPC64LE-LINUX
151-
// PPC64LE-LINUX: target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
151+
// PPC64LE-LINUX: target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
152152

153153
// RUN: %clang_cc1 -triple powerpc64le-linux -o - -emit-llvm -target-cpu future %s | \
154154
// RUN: FileCheck %s -check-prefix=PPC64LE-FUTURE
155-
// PPC64LE-FUTURE: target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
155+
// PPC64LE-FUTURE: target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
156156

157157
// RUN: %clang_cc1 -triple powerpc64le-linux -o - -emit-llvm -target-cpu pwr10 %s | \
158158
// RUN: FileCheck %s -check-prefix=PPC64LE-P10
159-
// PPC64LE-P10: target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
159+
// PPC64LE-P10: target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
160160

161161
// RUN: %clang_cc1 -triple nvptx-unknown -o - -emit-llvm %s | \
162162
// RUN: FileCheck %s -check-prefix=NVPTX

llvm/lib/Target/PowerPC/PPCTargetMachine.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,17 @@ static std::string getDataLayoutString(const Triple &T) {
161161
if (!is64Bit || T.getOS() == Triple::Lv2)
162162
Ret += "-p:32:32";
163163

164+
// If the target ABI uses function descriptors, then the alignment of function
165+
// pointers depends on the alignment used to emit the descriptor. Otherwise,
166+
// function pointers are aligned to 32 bits because the instructions must be.
167+
if ((T.getArch() == Triple::ppc64 && !T.isPPC64ELFv2ABI())) {
168+
Ret += "-Fi64";
169+
} else if (T.isOSAIX()) {
170+
Ret += is64Bit ? "-Fi64" : "-Fi32";
171+
} else {
172+
Ret += "-Fn32";
173+
}
174+
164175
// Note, the alignment values for f64 and i64 on ppc64 in Darwin
165176
// documentation are wrong; these are correct (i.e. "what gcc does").
166177
Ret += "-i64:64";

llvm/test/CodeGen/PowerPC/pr45301.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@ define dso_local void @g(ptr %agg.result) local_unnamed_addr #0 {
1212
; CHECK-NEXT: bl i
1313
; CHECK-NEXT: nop
1414
; CHECK-NEXT: addis r4, r2, g@toc@ha
15-
; CHECK-NEXT: addi r4, r4, g@toc@l
16-
; CHECK-NEXT: ld r5, 16(r4)
17-
; CHECK-NEXT: std r5, 16(r3)
18-
; CHECK-NEXT: ld r6, 0(r4)
19-
; CHECK-NEXT: std r6, 0(r3)
20-
; CHECK-NEXT: rldicl r6, r6, 32, 32
21-
; CHECK-NEXT: ld r7, 8(r4)
15+
; CHECK-NEXT: addi r5, r4, g@toc@l
16+
; CHECK-NEXT: ld r6, 16(r5)
17+
; CHECK-NEXT: std r6, 16(r3)
18+
; CHECK-NEXT: ld r4, g@toc@l(r4)
19+
; CHECK-NEXT: std r4, 0(r3)
20+
; CHECK-NEXT: rldicl r4, r4, 32, 32
21+
; CHECK-NEXT: ld r7, 8(r5)
2222
; CHECK-NEXT: std r7, 8(r3)
23-
; CHECK-NEXT: ld r7, 24(r4)
23+
; CHECK-NEXT: ld r7, 24(r5)
2424
; CHECK-NEXT: std r7, 24(r3)
25-
; CHECK-NEXT: ld r4, 32(r4)
26-
; CHECK-NEXT: std r4, 32(r3)
25+
; CHECK-NEXT: ld r5, 32(r5)
26+
; CHECK-NEXT: std r5, 32(r3)
27+
; CHECK-NEXT: stwbrx r4, 0, r3
2728
; CHECK-NEXT: li r4, 20
28-
; CHECK-NEXT: stwbrx r6, 0, r3
29-
; CHECK-NEXT: stwbrx r5, r3, r4
29+
; CHECK-NEXT: stwbrx r6, r3, r4
3030
; CHECK-NEXT: addi r1, r1, 112
3131
; CHECK-NEXT: ld r0, 16(r1)
3232
; CHECK-NEXT: mtlr r0

llvm/test/ThinLTO/X86/builtin-nostrip-aix.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
; CHECK-NM: D __ssp_canary_word
3131
; CHECK-NM: T __stack_chk_fail
3232

33-
target datalayout = "E-m:a-p:32:32-i64:64-n32"
33+
target datalayout = "E-m:a-p:32:32-Fi32-i64:64-n32"
3434
target triple = "powerpc-ibm-aix-xcoff"
3535

3636
define void @bar() {

0 commit comments

Comments
 (0)