Skip to content

Commit 51e6fc4

Browse files
committed
[XCOFF][AIX] Emit correct alignment for csect
Summary: This patch tries to emit the correct alignment result for both object file generation path and assembly path. Reviewed by: hubert.reinterpretcast, DiggerLin, daltenty Differential Revision: https://reviews.llvm.org/D79127
1 parent 723c46e commit 51e6fc4

15 files changed

+136
-43
lines changed

llvm/include/llvm/MC/MCSectionXCOFF.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class MCSectionXCOFF final : public MCSection {
3636
XCOFF::SymbolType Type;
3737
XCOFF::StorageClass StorageClass;
3838
MCSymbolXCOFF *const QualName;
39+
static constexpr unsigned DefaultAlignVal = 4;
3940

4041
MCSectionXCOFF(StringRef Name, XCOFF::StorageMappingClass SMC,
4142
XCOFF::SymbolType ST, XCOFF::StorageClass SC, SectionKind K,
@@ -47,8 +48,13 @@ class MCSectionXCOFF final : public MCSection {
4748
assert(QualName != nullptr && "QualName is needed.");
4849
QualName->setStorageClass(SC);
4950
QualName->setRepresentedCsect(this);
51+
// A csect is 4 byte aligned by default, except for undefined symbol csects.
52+
if (Type != XCOFF::XTY_ER)
53+
setAlignment(Align(DefaultAlignVal));
5054
}
5155

56+
void printCsectDirective(raw_ostream &OS) const;
57+
5258
public:
5359
~MCSectionXCOFF();
5460

llvm/lib/MC/MCSectionXCOFF.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ using namespace llvm;
1515

1616
MCSectionXCOFF::~MCSectionXCOFF() = default;
1717

18+
void MCSectionXCOFF::printCsectDirective(raw_ostream &OS) const {
19+
OS << "\t.csect " << QualName->getName() << ", " << Log2_32(getAlignment())
20+
<< '\n';
21+
}
1822

1923
void MCSectionXCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
2024
raw_ostream &OS,
@@ -23,22 +27,22 @@ void MCSectionXCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
2327
if (getMappingClass() != XCOFF::XMC_PR)
2428
report_fatal_error("Unhandled storage-mapping class for .text csect");
2529

26-
OS << "\t.csect " << QualName->getName() << '\n';
30+
printCsectDirective(OS);
2731
return;
2832
}
2933

3034
if (getKind().isReadOnly()) {
3135
if (getMappingClass() != XCOFF::XMC_RO)
3236
report_fatal_error("Unhandled storage-mapping class for .rodata csect.");
33-
OS << "\t.csect " << QualName->getName() << '\n';
37+
printCsectDirective(OS);
3438
return;
3539
}
3640

3741
if (getKind().isData()) {
3842
switch (getMappingClass()) {
3943
case XCOFF::XMC_RW:
4044
case XCOFF::XMC_DS:
41-
OS << "\t.csect " << QualName->getName() << '\n';
45+
printCsectDirective(OS);
4246
break;
4347
case XCOFF::XMC_TC:
4448
break;

llvm/lib/MC/MCXCOFFStreamer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "llvm/MC/MCCodeEmitter.h"
1717
#include "llvm/MC/MCDirectives.h"
1818
#include "llvm/MC/MCObjectWriter.h"
19+
#include "llvm/MC/MCSectionXCOFF.h"
1920
#include "llvm/MC/MCSymbolXCOFF.h"
2021
#include "llvm/Support/TargetRegistry.h"
2122

@@ -60,6 +61,11 @@ void MCXCOFFStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
6061
XCOFF::C_HIDEXT);
6162
Symbol->setCommon(Size, ByteAlignment);
6263

64+
// Default csect align is 4, but common symbols have explicit alignment values
65+
// and we should honor it.
66+
cast<MCSymbolXCOFF>(Symbol)->getRepresentedCsect()->setAlignment(
67+
Align(ByteAlignment));
68+
6369
// Emit the alignment and storage for the variable to the section.
6470
emitValueToAlignment(ByteAlignment);
6571
emitZeros(Size);

llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,7 @@ class PPCAIXAsmPrinter : public PPCAsmPrinter {
159159

160160
StringRef getPassName() const override { return "AIX PPC Assembly Printer"; }
161161

162-
bool doInitialization(Module &M) override {
163-
if (M.alias_size() > 0u)
164-
report_fatal_error(
165-
"module has aliases, which LLVM does not yet support for AIX");
166-
167-
return PPCAsmPrinter::doInitialization(M);
168-
}
162+
bool doInitialization(Module &M) override;
169163

170164
void SetupMachineFunction(MachineFunction &MF) override;
171165

@@ -1725,6 +1719,39 @@ void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
17251719
}
17261720
}
17271721

1722+
bool PPCAIXAsmPrinter::doInitialization(Module &M) {
1723+
if (M.alias_size() > 0u)
1724+
report_fatal_error(
1725+
"module has aliases, which LLVM does not yet support for AIX");
1726+
1727+
const bool Result = PPCAsmPrinter::doInitialization(M);
1728+
1729+
auto setCsectAlignment = [this](const GlobalObject *GO) {
1730+
// Declarations have 0 alignment which is set by default.
1731+
if (GO->isDeclaration())
1732+
return;
1733+
1734+
SectionKind GOKind = getObjFileLowering().getKindForGlobal(GO, TM);
1735+
MCSectionXCOFF *Csect = cast<MCSectionXCOFF>(
1736+
getObjFileLowering().SectionForGlobal(GO, GOKind, TM));
1737+
1738+
Align GOAlign = getGVAlignment(GO, GO->getParent()->getDataLayout());
1739+
if (GOAlign > Csect->getAlignment())
1740+
Csect->setAlignment(GOAlign);
1741+
};
1742+
1743+
// We need to know, up front, the alignment of csects for the assembly path,
1744+
// because once a .csect directive gets emitted, we could not change the
1745+
// alignment value on it.
1746+
for (const auto &G : M.globals())
1747+
setCsectAlignment(&G);
1748+
1749+
for (const auto &F : M)
1750+
setCsectAlignment(&F);
1751+
1752+
return Result;
1753+
}
1754+
17281755
/// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code
17291756
/// for a MachineFunction to the given output stream, in a format that the
17301757
/// Darwin assembler can deal with.

llvm/test/CodeGen/PowerPC/aix-lower-constant-pool-index.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ entry:
4545
; 64LARGE-MIR: renamable $x[[REG2:[0-9]+]] = LDtocL %const.0, killed renamable $x[[REG1]], implicit $x2 :: (load 8 from got)
4646
; 64LARGE-MIR: renamable $f[[REG3:[0-9]+]] = LFS 0, killed renamable $x[[REG2]] :: (load 4 from constant-pool)
4747

48-
; 32SMALL-ASM: .csect .rodata[RO]
48+
; 32SMALL-ASM: .csect .rodata[RO], 2
4949
; 32SMALL-ASM: .align 2
5050
; 32SMALL-ASM: .LCPI0_0:
5151
; 32SMALL-ASM: .long 0x40b00000
@@ -54,7 +54,7 @@ entry:
5454
; 32SMALL-ASM: lfs 1, 0([[REG1]])
5555
; 32SMALL-ASM: blr
5656

57-
; 32LARGE-ASM: .csect .rodata[RO]
57+
; 32LARGE-ASM: .csect .rodata[RO], 2
5858
; 32LARGE-ASM: .align 2
5959
; 32LARGE-ASM: .LCPI0_0:
6060
; 32LARGE-ASM: .long 0x40b00000
@@ -64,7 +64,7 @@ entry:
6464
; 32LARGE-ASM: lfs 1, 0([[REG2]])
6565
; 32LARGE-ASM: blr
6666

67-
; 64SMALL-ASM: .csect .rodata[RO]
67+
; 64SMALL-ASM: .csect .rodata[RO], 2
6868
; 64SMALL-ASM: .align 2
6969
; 64SMALL-ASM: .LCPI0_0:
7070
; 64SMALL-ASM: .long 0x40b00000
@@ -73,7 +73,7 @@ entry:
7373
; 64SMALL-ASM: lfs 1, 0([[REG1]])
7474
; 64SMALL-ASM: blr
7575

76-
; 64LARGE-ASM: .csect .rodata[RO]
76+
; 64LARGE-ASM: .csect .rodata[RO], 2
7777
; 64LARGE-ASM: .align 2
7878
; 64LARGE-ASM: .LCPI0_0:
7979
; 64LARGE-ASM: .long 0x40b00000

llvm/test/CodeGen/PowerPC/aix-lower-jump-table.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
; 32SMALL-ASM: LBB0_6:
9797
; 32SMALL-ASM: li 3, 0
9898
; 32SMALL-ASM: blr
99-
; 32SMALL-ASM: .csect .rodata[RO]
99+
; 32SMALL-ASM: .csect .rodata[RO], 2
100100
; 32SMALL-ASM: .align 2
101101
; 32SMALL-ASM: .LJTI0_0:
102102
; 32SMALL-ASM: .long LBB0_2-.LJTI0_0
@@ -123,7 +123,7 @@
123123
; 32LARGE-ASM: LBB0_6:
124124
; 32LARGE-ASM: li 3, 0
125125
; 32LARGE-ASM: blr
126-
; 32LARGE-ASM: .csect .rodata[RO]
126+
; 32LARGE-ASM: .csect .rodata[RO], 2
127127
; 32LARGE-ASM: .align 2
128128
; 32LARGE-ASM: .LJTI0_0:
129129
; 32LARGE-ASM: .long LBB0_2-.LJTI0_0
@@ -149,7 +149,7 @@
149149
; 64SMALL-ASM: LBB0_6:
150150
; 64SMALL-ASM: li 3, 0
151151
; 64SMALL-ASM: blr
152-
; 64SMALL-ASM: .csect .rodata[RO]
152+
; 64SMALL-ASM: .csect .rodata[RO], 2
153153
; 64SMALL-ASM: .align 2
154154
; 64SMALL-ASM: .LJTI0_0:
155155
; 64SMALL-ASM: .long LBB0_2-.LJTI0_0
@@ -176,7 +176,7 @@
176176
; 64LARGE-ASM: LBB0_6:
177177
; 64LARGE-ASM: li 3, 0
178178
; 64LARGE-ASM: blr
179-
; 64LARGE-ASM: .csect .rodata[RO]
179+
; 64LARGE-ASM: .csect .rodata[RO], 2
180180
; 64LARGE-ASM: .align 2
181181
; 64LARGE-ASM: .LJTI0_0:
182182
; 64LARGE-ASM: .long LBB0_2-.LJTI0_0

llvm/test/CodeGen/PowerPC/aix-readonly-with-relocation.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
@b = constant i32* @a
66

77
;CHECK: .comm a[RW],4,2
8-
;CHECK-NEXT: .csect .data[RW]
8+
;CHECK-NEXT: .csect .data[RW], 2
99
;CHECK-NEXT: .globl b
1010
;CHECK-NEXT: .align 2
1111
;CHECK-NEXT: b:
1212
;CHECK-NEXT: .long a
1313

1414
;CHECK64: .comm a[RW],4,2
15-
;CHECK64-NEXT: .csect .data[RW]
15+
;CHECK64-NEXT: .csect .data[RW], 3
1616
;CHECK64-NEXT: .globl b
1717
;CHECK64-NEXT: .align 3
1818
;CHECK64-NEXT: b:

llvm/test/CodeGen/PowerPC/aix-reference-func-addr-const.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ entry:
1111
}
1212

1313

14-
;CHECK: .csect .data[RW]
14+
;CHECK: .csect .data[RW], 2
1515
;CHECK-NEXT: .globl foo_ptr
1616
;CHECK-NEXT: .align 2
1717
;CHECK-NEXT: foo_ptr:
@@ -22,7 +22,7 @@ entry:
2222
;CHECK-NEXT: .long bar[DS]
2323
;CHECK-NEXT: .extern foo[DS]
2424

25-
;CHECK64: .csect .data[RW]
25+
;CHECK64: .csect .data[RW], 3
2626
;CHECK64-NEXT: .globl foo_ptr
2727
;CHECK64-NEXT: .align 3
2828
;CHECK64-NEXT: foo_ptr:

llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838

3939
; CHECK-NOT: .toc
4040

41-
; CHECK: .csect .text[PR]
41+
; CHECK: .csect .text[PR], 2
4242
; CHECK-NEXT: .file
4343

44-
; CHECK: .csect .data[RW]
44+
; CHECK: .csect .data[RW], 5
4545
; CHECK-NEXT: .globl ivar
4646
; CHECK-NEXT: .align 2
4747
; CHECK-NEXT: ivar:
@@ -186,7 +186,7 @@
186186
; SYMS-NEXT: SectionLen: 0
187187
; SYMS-NEXT: ParameterHashIndex: 0x0
188188
; SYMS-NEXT: TypeChkSectNum: 0x0
189-
; SYMS-NEXT: SymbolAlignmentLog2: 0
189+
; SYMS-NEXT: SymbolAlignmentLog2: 2
190190
; SYMS-NEXT: SymbolType: XTY_SD (0x1)
191191
; SYMS-NEXT: StorageMappingClass: XMC_PR (0x0)
192192
; SYMS-NEXT: StabInfoIndex: 0x0

llvm/test/CodeGen/PowerPC/aix-xcoff-lower-comm.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313

1414

1515
; CHECK: .comm common[RW],4,2
16-
; CHECK-NEXT: .csect .data[RW]
16+
; ASM32-NEXT: .csect .data[RW], 2
17+
; ASM64-NEXT: .csect .data[RW], 3
1718
; CHECK-NEXT: .globl pointer
1819
; ASM32-NEXT: .align 2
1920
; ASM64-NEXT: .align 3

llvm/test/CodeGen/PowerPC/aix-xcoff-mergeable-const.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ entry:
2222
ret i32 0
2323
}
2424

25-
;CHECK: .csect .rodata[RO]
25+
;CHECK: .csect .rodata[RO], 4
2626
;CHECK-NEXT: .align 4
2727
;CHECK-NEXT: .L__const.main.cnst32:
2828
;CHECK-NEXT: .llong 4611686018427387954

llvm/test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,21 @@ entry:
2525
ret i8 %1
2626
}
2727

28-
; CHECK: .csect .rodata.str2.2[RO]
28+
; CHECK: .csect .rodata.str2.2[RO], 2
2929
; CHECK-NEXT: .align 1
3030
; CHECK-NEXT: .Lmagic16:
3131
; CHECK-NEXT: .short 264 # 0x108
3232
; CHECK-NEXT: .short 272 # 0x110
3333
; CHECK-NEXT: .short 213 # 0xd5
3434
; CHECK-NEXT: .short 0 # 0x0
35-
; CHECK-NEXT: .csect .rodata.str4.4[RO]
35+
; CHECK-NEXT: .csect .rodata.str4.4[RO], 2
3636
; CHECK-NEXT: .align 2
3737
; CHECK-NEXT: .Lmagic32:
3838
; CHECK-NEXT: .long 464 # 0x1d0
3939
; CHECK-NEXT: .long 472 # 0x1d8
4040
; CHECK-NEXT: .long 413 # 0x19d
4141
; CHECK-NEXT: .long 0 # 0x0
42-
; CHECK-NEXT: .csect .rodata.str1.1[RO]
42+
; CHECK-NEXT: .csect .rodata.str1.1[RO], 2
4343
; CHECK-NEXT: .LstrA:
4444
; CHECK-NEXT: .byte 104
4545
; CHECK-NEXT: .byte 101

llvm/test/CodeGen/PowerPC/aix-xcoff-rodata.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
@const_chrarray = constant [4 x i8] c"abcd", align 1
2121
@const_dblarr = constant [4 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00], align 8
2222

23-
; CHECK: .csect .rodata[RO]
23+
; CHECK: .csect .rodata[RO], 5
2424
; CHECK-NEXT: .globl const_ivar
2525
; CHECK-NEXT: .align 2
2626
; CHECK-NEXT: const_ivar:

llvm/test/CodeGen/PowerPC/test_func_desc.ll

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,40 +29,43 @@ entry:
2929

3030
; CHECK: .globl foo[DS]
3131
; CHECK: .globl .foo
32-
; CHECK: .csect foo[DS]
33-
; 32BIT: .long .foo
32+
; 32BIT: .csect foo[DS], 2
33+
; 32BIT-NEXT: .long .foo
3434
; 32BIT-NEXT: .long TOC[TC0]
3535
; 32BIT-NEXT: .long 0
36-
; 64BIT: .llong .foo
36+
; 64BIT: .csect foo[DS], 3
37+
; 64BIT-NEXT: .llong .foo
3738
; 64BIT-NEXT: .llong TOC[TC0]
3839
; 64BIT-NEXT: .llong 0
39-
; CHECK-NEXT: .csect .text[PR]
40+
; CHECK-NEXT: .csect .text[PR], 2
4041
; CHECK-LABEL: .foo:
4142

4243
; CHECK: .globl main[DS]
4344
; CHECK: .globl .main
44-
; CHECK: .csect main[DS]
45-
; 32BIT: .long .main
45+
; 32BIT: .csect main[DS], 2
46+
; 32BIT-NEXT: .long .main
4647
; 32BIT-NEXT: .long TOC[TC0]
4748
; 32BIT-NEXT: .long 0
48-
; 64BIT: .llong .main
49+
; 64BIT: .csect main[DS], 3
50+
; 64BIT-NEXT: .llong .main
4951
; 64BIT-NEXT: .llong TOC[TC0]
5052
; 64BIT-NEXT: .llong 0
51-
; CHECK-NEXT: .csect .text[PR]
53+
; CHECK-NEXT: .csect .text[PR], 2
5254
; CHECK-LABEL: .main:
5355
; CHECK: bl .foo
5456
; CHECK: bl .extern_foo
5557
; CHECK: bl .static_foo
5658

5759
; CHECK: .lglobl .static_foo
58-
; CHECK: .csect static_foo[DS]
59-
; 32BIT: .long .static_foo
60+
; 32BIT: .csect static_foo[DS], 2
61+
; 32BIT-NEXT: .long .static_foo
6062
; 32BIT-NEXT: .long TOC[TC0]
6163
; 32BIT-NEXT: .long 0
62-
; 64BIT: .llong .static_foo
64+
; 64BIT: .csect static_foo[DS], 3
65+
; 64BIT-NEXT: .llong .static_foo
6366
; 64BIT-NEXT: .llong TOC[TC0]
6467
; 64BIT-NEXT: .llong 0
65-
; CHECK-NEXT: .csect .text[PR]
68+
; CHECK-NEXT: .csect .text[PR], 2
6669
; CHECK-LABEL: .static_foo:
6770

6871
; CHECK-NOT: .csect extern_foo

0 commit comments

Comments
 (0)