Skip to content

Commit 4b1254e

Browse files
[AIX] In assembly file, create a dummy text renamed to an empty string (#73052)
This works around an AIX assembler and linker bug. If the -fno-integrated-as and -frecord-command-line options are used but there's no actual code in the source file, the assembler creates an object file with only an .info section. The AIX linker rejects such an object file.
1 parent 3d718d0 commit 4b1254e

21 files changed

+68
-39
lines changed

llvm/include/llvm/MC/MCSectionXCOFF.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ class MCSectionXCOFF final : public MCSection {
115115
bool useCodeAlign() const override;
116116
bool isVirtualSection() const override;
117117
StringRef getSymbolTableName() const { return SymbolTableName; }
118+
void setSymbolTableName(StringRef STN) { SymbolTableName = STN; }
118119
bool isMultiSymbolsAllowed() const { return MultiSymbolsAllowed; }
119120
bool isCsect() const { return CsectProp.has_value(); }
120121
bool isDwarfSect() const { return DwarfSubtypeFlags.has_value(); }

llvm/include/llvm/MC/MCSymbolXCOFF.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,12 @@ class MCSymbolXCOFF : public MCSymbol {
5252

5353
XCOFF::VisibilityType getVisibilityType() const { return VisibilityType; }
5454

55-
bool hasRename() const { return !SymbolTableName.empty(); }
55+
bool hasRename() const { return HasRename; }
5656

57-
void setSymbolTableName(StringRef STN) { SymbolTableName = STN; }
57+
void setSymbolTableName(StringRef STN) {
58+
SymbolTableName = STN;
59+
HasRename = true;
60+
}
5861

5962
StringRef getSymbolTableName() const {
6063
if (hasRename())
@@ -67,6 +70,7 @@ class MCSymbolXCOFF : public MCSymbol {
6770
MCSectionXCOFF *RepresentedCsect = nullptr;
6871
XCOFF::VisibilityType VisibilityType = XCOFF::SYM_V_UNSPECIFIED;
6972
StringRef SymbolTableName;
73+
bool HasRename = false;
7074
};
7175

7276
} // end namespace llvm

llvm/include/llvm/MC/MCXCOFFStreamer.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@ class MCXCOFFStreamer : public MCObjectStreamer {
3333
MCSymbolAttr Visibility) override;
3434
void emitXCOFFRefDirective(const MCSymbol *Symbol) override;
3535
void emitXCOFFRenameDirective(const MCSymbol *Name,
36-
StringRef Rename) override {
37-
report_fatal_error("emitXCOFFRenameDirective is not implemented yet on "
38-
"object generation path");
39-
}
36+
StringRef Rename) override;
4037
void emitXCOFFExceptDirective(const MCSymbol *Symbol, const MCSymbol *Trap,
4138
unsigned Lang, unsigned Reason,
4239
unsigned FunctionSize, bool hasDebug) override;

llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
#include "llvm/MC/MCSectionCOFF.h"
9494
#include "llvm/MC/MCSectionELF.h"
9595
#include "llvm/MC/MCSectionMachO.h"
96+
#include "llvm/MC/MCSectionXCOFF.h"
9697
#include "llvm/MC/MCStreamer.h"
9798
#include "llvm/MC/MCSubtargetInfo.h"
9899
#include "llvm/MC/MCSymbol.h"
@@ -444,7 +445,7 @@ bool AsmPrinter::doInitialization(Module &M) {
444445
.getModuleMetadata(M);
445446

446447
// On AIX, we delay emitting any section information until
447-
// after emitting the .file pseudo-op. This allows additional
448+
// after emitting the .file pseudo-op. This allows additional
448449
// information (such as the embedded command line) to be associated
449450
// with all sections in the object file rather than a single section.
450451
if (!TM.getTargetTriple().isOSBinFormatXCOFF())
@@ -496,8 +497,18 @@ bool AsmPrinter::doInitialization(Module &M) {
496497
// C_INFO symbol is preserved if any csect is kept by the linker.
497498
if (TM.getTargetTriple().isOSBinFormatXCOFF()) {
498499
emitModuleCommandLines(M);
499-
// Now we can generate section information
500+
// Now we can generate section information.
500501
OutStreamer->initSections(false, *TM.getMCSubtargetInfo());
502+
503+
// To work around an AIX assembler and/or linker bug, generate
504+
// a rename for the default text-section symbol name. This call has
505+
// no effect when generating object code directly.
506+
MCSection *TextSection =
507+
OutStreamer->getContext().getObjectFileInfo()->getTextSection();
508+
MCSymbolXCOFF *XSym =
509+
static_cast<MCSectionXCOFF *>(TextSection)->getQualNameSymbol();
510+
if (XSym->hasRename())
511+
OutStreamer->emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
501512
}
502513

503514
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();

llvm/lib/MC/MCObjectFileInfo.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,10 +933,16 @@ void MCObjectFileInfo::initXCOFFMCObjectFileInfo(const Triple &T) {
933933
// the ABI or object file format, but various tools rely on the section
934934
// name being empty (considering named symbols to be "user symbol names").
935935
TextSection = Ctx->getXCOFFSection(
936-
"", SectionKind::getText(),
936+
"..text..", // Use a non-null name to work around an AIX assembler bug...
937+
SectionKind::getText(),
937938
XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_PR, XCOFF::XTY_SD),
938939
/* MultiSymbolsAllowed*/ true);
939940

941+
// ... but use a null name when generating the symbol table.
942+
MCSectionXCOFF *TS = static_cast<MCSectionXCOFF *>(TextSection);
943+
TS->getQualNameSymbol()->setSymbolTableName("");
944+
TS->setSymbolTableName("");
945+
940946
DataSection = Ctx->getXCOFFSection(
941947
".data", SectionKind::getData(),
942948
XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RW, XCOFF::XTY_SD),

llvm/lib/MC/MCStreamer.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,10 +1190,7 @@ void MCStreamer::emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol,
11901190
}
11911191

11921192
void MCStreamer::emitXCOFFRenameDirective(const MCSymbol *Name,
1193-
StringRef Rename) {
1194-
llvm_unreachable("emitXCOFFRenameDirective is only supported on "
1195-
"XCOFF targets");
1196-
}
1193+
StringRef Rename) {}
11971194

11981195
void MCStreamer::emitXCOFFRefDirective(const MCSymbol *Symbol) {
11991196
llvm_unreachable("emitXCOFFRefDirective is only supported on XCOFF targets");

llvm/lib/MC/MCXCOFFStreamer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ void MCXCOFFStreamer::emitXCOFFRefDirective(const MCSymbol *Symbol) {
9696
DF->getFixups().push_back(Fixup);
9797
}
9898

99+
void MCXCOFFStreamer::emitXCOFFRenameDirective(const MCSymbol *Name,
100+
StringRef Rename) {
101+
const MCSymbolXCOFF *Symbol = cast<const MCSymbolXCOFF>(Name);
102+
if (!Symbol->hasRename())
103+
report_fatal_error("Only explicit .rename is supported for XCOFF.");
104+
}
105+
99106
void MCXCOFFStreamer::emitXCOFFExceptDirective(const MCSymbol *Symbol,
100107
const MCSymbol *Trap,
101108
unsigned Lang, unsigned Reason,

llvm/test/CodeGen/PowerPC/aix-alias.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ entry:
5555
; ASM-NEXT: .csect fun[DS]
5656
; ASM-NEXT: fun_weak: # @fun
5757
; ASM-NEXT: fun_hidden:
58-
; ASM: .csect [PR],5
58+
; ASM: .csect ..text..[PR],5
5959
; ASM-NEXT: .fun:
6060
; ASM-NEXT: .fun_weak:
6161
; ASM-NEXT: .fun_hidden:
6262
; ASM-NEXT: # %bb.0:
6363
; ASM-NEXT: li 3, 0
6464
; ASM-NEXT: blr
6565
; ASM-NEXT: # -- End function
66-
; ASM: .csect [PR],5
66+
; ASM: .csect ..text..[PR],5
6767
; ASM-NEXT: .test:
6868
; ASM-NEXT: # %bb.0: # %entry
6969
; ASM: bl .fun

llvm/test/CodeGen/PowerPC/aix-emit-tracebacktable-clobber-register.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ entry:
9999
; COMMON-NEXT: .align 2
100100
; COMMON-NEXT: .vbyte 4, 0
101101
; COMMON-NEXT: .vbyte 4, 0
102-
; CHECK-ASM-NEXT: .csect [PR],5
102+
; CHECK-ASM-NEXT: .csect ..text..[PR],5
103103
; CHECK-FUNC-NEXT: .csect .foov[PR],5
104104
; COMMON-NEXT: # -- End function
105105
; COMMON: .toc

llvm/test/CodeGen/PowerPC/aix-extern-weak.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ declare extern_weak void @foo_ext_weak(ptr)
4141
; BIT64-NEXT: .vbyte 8, .main # @main
4242
; BIT64-NEXT: .vbyte 8, TOC[TC0]
4343
; BIT64-NEXT: .vbyte 8, 0
44-
; COMMON-NEXT: .csect [PR]
44+
; COMMON-NEXT: .csect ..text..[PR]
4545
; COMMON-NEXT: .main:
4646

4747
; COMMON: .csect .data[RW]

llvm/test/CodeGen/PowerPC/aix-extern.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ declare i32 @bar_extern(ptr)
5151
; BIT64-NEXT: .vbyte 8, .foo # @foo
5252
; BIT64-NEXT: .vbyte 8, TOC[TC0]
5353
; BIT64-NEXT: .vbyte 8, 0
54-
; COMMON-NEXT: .csect [PR]
54+
; COMMON-NEXT: .csect ..text..[PR]
5555
; COMMON-NEXT: .foo:
5656

5757
; COMMON: .globl main[DS] # -- Begin function main
@@ -64,7 +64,7 @@ declare i32 @bar_extern(ptr)
6464
; BIT64-NEXT: .vbyte 8, .main # @main
6565
; BIT64-NEXT: .vbyte 8, TOC[TC0]
6666
; BIT64-NEXT: .vbyte 8, 0
67-
; COMMON-NEXT: .csect [PR]
67+
; COMMON-NEXT: .csect ..text..[PR]
6868
; COMMON-NEXT: .main:
6969

7070
; COMMON: .csect .data[RW]

llvm/test/CodeGen/PowerPC/aix-func-align.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ entry:
2323
ret i32 0
2424
}
2525

26-
; CHECK: .csect [PR],6
26+
; CHECK: .csect ..text..[PR],6
2727
; CHECK-NEXT: .foo:
2828

29-
; CHECK: .csect [PR],6
29+
; CHECK: .csect ..text..[PR],6
3030
; CHECK-NEXT: .bar:
3131

3232
; SYMS: Symbol {{[{][[:space:]] *}}Index: [[#INDX:]]{{[[:space:]] *Name: $}}

llvm/test/CodeGen/PowerPC/aix-personality-alias.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ declare void @_Z3barv()
5656
; SYM64: .vbyte 8, .__gxx_personality_v0
5757
; SYM64: .vbyte 8, TOC[TC0]
5858
; SYM64: .vbyte 8, 0
59-
; SYM: .csect [PR],5
59+
; SYM: .csect ..text..[PR],5
6060
; SYM: .__gxx_personality_v0:
6161
; SYM: .__xlcxx_personality_v1:
6262
; SYM: # %bb.0: # %entry

llvm/test/CodeGen/PowerPC/aix-weak.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ entry:
5050
; BIT64-NEXT: .vbyte 8, .foo_weak # @foo_weak
5151
; BIT64-NEXT: .vbyte 8, TOC[TC0]
5252
; BIT64-NEXT: .vbyte 8, 0
53-
; COMMON-NEXT: .csect [PR]
53+
; COMMON-NEXT: .csect ..text..[PR]
5454
; COMMON-NEXT: .foo_weak:
5555

5656
; COMMON: .weak foo_ref_weak[DS] # -- Begin function foo_ref_weak
@@ -63,7 +63,7 @@ entry:
6363
; BIT64-NEXT: .vbyte 8, .foo_ref_weak # @foo_ref_weak
6464
; BIT64-NEXT: .vbyte 8, TOC[TC0]
6565
; BIT64-NEXT: .vbyte 8, 0
66-
; COMMON-NEXT: .csect [PR]
66+
; COMMON-NEXT: .csect ..text..[PR]
6767
; COMMON-NEXT: .foo_ref_weak:
6868

6969
; COMMON: .globl main[DS] # -- Begin function main
@@ -76,7 +76,7 @@ entry:
7676
; BIT64-NEXT: .vbyte 8, .main # @main
7777
; BIT64-NEXT: .vbyte 8, TOC[TC0]
7878
; BIT64-NEXT: .vbyte 8, 0
79-
; COMMON-NEXT: .csect [PR]
79+
; COMMON-NEXT: .csect ..text..[PR]
8080
; COMMON-NEXT: .main:
8181

8282
; COMMON: .csect .data[RW]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
; CHECK-NOT: .toc
4747

4848
; CHECK: .file
49-
; CHECK-NEXT: .csect [PR],5
49+
; CHECK-NEXT: .csect ..text..[PR],5
5050

5151
; CHECK: .csect .data[RW],5
5252
; CHECK-NEXT: .globl ivar

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ entry:
5050
ret void
5151
}
5252

53+
; ASM: .csect ..text..[PR],5
54+
; ASM-NEXT: .rename ..text..[PR],""
5355
; ASM: .csect .foo[PR],5
5456
; ASM-NEXT: .globl foo[DS] # -- Begin function foo
5557
; ASM-NEXT: .globl .foo[PR]

llvm/test/CodeGen/PowerPC/aix-xcoff-symbol-rename.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ declare i32 @"f\40o"(...)
5454
; ASM-NEXT: .vbyte 4, ._Renamed..24f_o # @"f$o"
5555
; ASM-NEXT: .vbyte 4, TOC[TC0]
5656
; ASM-NEXT: .vbyte 4, 0
57-
; ASM-NEXT: .csect [PR],5
57+
; ASM-NEXT: .csect ..text..[PR],5
5858
; ASM-NEXT: ._Renamed..24f_o:
5959
; ASM: bl ._Renamed..40f_o[PR]
6060
; ASM-NEXT: nop
@@ -67,7 +67,7 @@ declare i32 @"f\40o"(...)
6767
; ASM-NEXT: .vbyte 4, ._Renamed..26f_o # @"f&o"
6868
; ASM-NEXT: .vbyte 4, TOC[TC0]
6969
; ASM-NEXT: .vbyte 4, 0
70-
; ASM-NEXT: .csect [PR],5
70+
; ASM-NEXT: .csect ..text..[PR],5
7171
; ASM-NEXT: ._Renamed..26f_o:
7272
; ASM: bl ._Renamed..24f_o
7373
; ASM: .globl _Renamed..265ff__o[DS] # -- Begin function f&_o
@@ -79,7 +79,7 @@ declare i32 @"f\40o"(...)
7979
; ASM-NEXT: .vbyte 4, ._Renamed..265ff__o # @"f&_o"
8080
; ASM-NEXT: .vbyte 4, TOC[TC0]
8181
; ASM-NEXT: .vbyte 4, 0
82-
; ASM-NEXT: .csect [PR],5
82+
; ASM-NEXT: .csect ..text..[PR],5
8383
; ASM-NEXT: ._Renamed..265ff__o:
8484
; ASM: .csect .data[RW],2
8585
; ASM-NEXT: .globl _Renamed..60f_o

llvm/test/CodeGen/PowerPC/test_func_desc.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ entry:
3737
; 64BIT-NEXT: .vbyte 8, .foo
3838
; 64BIT-NEXT: .vbyte 8, TOC[TC0]
3939
; 64BIT-NEXT: .vbyte 8, 0
40-
; CHECK-NEXT: .csect [PR],5
40+
; CHECK-NEXT: .csect ..text..[PR],5
4141
; CHECK-LABEL: .foo:
4242

4343
; CHECK: .globl main[DS]
@@ -50,7 +50,7 @@ entry:
5050
; 64BIT-NEXT: .vbyte 8, .main
5151
; 64BIT-NEXT: .vbyte 8, TOC[TC0]
5252
; 64BIT-NEXT: .vbyte 8, 0
53-
; CHECK-NEXT: .csect [PR],5
53+
; CHECK-NEXT: .csect ..text..[PR],5
5454
; CHECK-LABEL: .main:
5555
; CHECK: bl .foo
5656
; CHECK: bl .extern_foo
@@ -66,7 +66,7 @@ entry:
6666
; 64BIT-NEXT: .vbyte 8, .static_foo
6767
; 64BIT-NEXT: .vbyte 8, TOC[TC0]
6868
; 64BIT-NEXT: .vbyte 8, 0
69-
; CHECK-NEXT: .csect [PR],5
69+
; CHECK-NEXT: .csect ..text..[PR],5
7070
; CHECK-LABEL: .static_foo:
7171

7272
; CHECK-NOT: .csect extern_foo

llvm/test/DebugInfo/XCOFF/empty.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,16 @@ entry:
3636
!12 = !DILocation(line: 3, column: 3, scope: !8)
3737

3838
; ASM32: .file "1.c"
39-
; ASM32-NEXT: .csect [PR],5
39+
; ASM32-NEXT: .csect ..text..[PR],5
40+
; ASM32-NEXT: .rename ..text..[PR],""
4041
; ASM32-NEXT: .globl main[DS] # -- Begin function main
4142
; ASM32-NEXT: .globl .main
4243
; ASM32-NEXT: .align 2
4344
; ASM32-NEXT: .csect main[DS],2
4445
; ASM32-NEXT: .vbyte 4, .main # @main
4546
; ASM32-NEXT: .vbyte 4, TOC[TC0]
4647
; ASM32-NEXT: .vbyte 4, 0
47-
; ASM32-NEXT: .csect [PR],5
48+
; ASM32-NEXT: .csect ..text..[PR],5
4849
; ASM32-NEXT: .main:
4950
; ASM32-NEXT: L..func_begin0:
5051
; ASM32-NEXT: # %bb.0: # %entry
@@ -237,15 +238,16 @@ entry:
237238
; ASM32-NEXT: L..debug_line_end0:
238239

239240
; ASM64: .file "1.c"
240-
; ASM64-NEXT: .csect [PR],5
241+
; ASM64-NEXT: .csect ..text..[PR],5
242+
; ASM64-NEXT: .rename ..text..[PR],""
241243
; ASM64-NEXT: .globl main[DS] # -- Begin function main
242244
; ASM64-NEXT: .globl .main
243245
; ASM64-NEXT: .align 2
244246
; ASM64-NEXT: .csect main[DS],3
245247
; ASM64-NEXT: .vbyte 8, .main # @main
246248
; ASM64-NEXT: .vbyte 8, TOC[TC0]
247249
; ASM64-NEXT: .vbyte 8, 0
248-
; ASM64-NEXT: .csect [PR],5
250+
; ASM64-NEXT: .csect ..text..[PR],5
249251
; ASM64-NEXT: .main:
250252
; ASM64-NEXT: L..func_begin0:
251253
; ASM64-NEXT: # %bb.0: # %entry

llvm/test/DebugInfo/XCOFF/explicit-section.ll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,16 @@ entry:
4343
!16 = !DILocation(line: 3, column: 3, scope: !14)
4444

4545
; CHECK: .file "2.c"
46-
; CHECK-NEXT: .csect [PR],5
46+
; CHECK-NEXT: .csect ..text..[PR],5
47+
; CHECK-NEXT: .rename ..text..[PR],""
4748
; CHECK-NEXT: .globl bar[DS] # -- Begin function bar
4849
; CHECK-NEXT: .globl .bar
4950
; CHECK-NEXT: .align 2
5051
; CHECK-NEXT: .csect bar[DS],2
5152
; CHECK-NEXT: .vbyte 4, .bar # @bar
5253
; CHECK-NEXT: .vbyte 4, TOC[TC0]
5354
; CHECK-NEXT: .vbyte 4, 0
54-
; CHECK-NEXT: .csect [PR],5
55+
; CHECK-NEXT: .csect ..text..[PR],5
5556
; CHECK-NEXT: .bar:
5657
; CHECK-NEXT: L..func_begin0:
5758
; CHECK-NEXT: # %bb.0: # %entry

llvm/test/DebugInfo/XCOFF/function-sections.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ entry:
3838
!14 = !DILocation(line: 8, column: 3, scope: !13)
3939

4040
; CHECK: .file "1.c"
41-
; CHECK-NEXT: .csect [PR],5
41+
; CHECK-NEXT: .csect ..text..[PR],5
42+
; CHECK-NEXT: .rename ..text..[PR],""
4243
; CHECK-NEXT: .csect .foo[PR],5
4344
; CHECK-NEXT: .globl foo[DS] # -- Begin function foo
4445
; CHECK-NEXT: .globl .foo[PR]

0 commit comments

Comments
 (0)