Skip to content

Commit 7866442

Browse files
committed
[XCOFF] Adjust .rename emission sequence
Summary: AIX assembler does not generate correct relocation when .rename appear between tc entry label and .tc directive. So only emit .rename after .tc/.comm or other linkage is emitted. Reviewed By: daltenty, hubert.reinterpretcast Differential Revision: https://reviews.llvm.org/D85317
1 parent b129c9d commit 7866442

File tree

3 files changed

+29
-26
lines changed

3 files changed

+29
-26
lines changed

llvm/lib/MC/MCAsmStreamer.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -800,11 +800,6 @@ void MCAsmStreamer::emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym,
800800

801801
void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
802802
MCSymbol *Symbol, MCSymbolAttr Linkage, MCSymbolAttr Visibility) {
803-
// Print symbol's rename (original name contains invalid character(s)) if
804-
// there is one.
805-
if (cast<MCSymbolXCOFF>(Symbol)->hasRename())
806-
emitXCOFFRenameDirective(Symbol,
807-
cast<MCSymbolXCOFF>(Symbol)->getSymbolTableName());
808803

809804
switch (Linkage) {
810805
case MCSA_Global:
@@ -839,6 +834,12 @@ void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
839834
report_fatal_error("unexpected value for Visibility type");
840835
}
841836
EmitEOL();
837+
838+
// Print symbol's rename (original name contains invalid character(s)) if
839+
// there is one.
840+
if (cast<MCSymbolXCOFF>(Symbol)->hasRename())
841+
emitXCOFFRenameDirective(Symbol,
842+
cast<MCSymbolXCOFF>(Symbol)->getSymbolTableName());
842843
}
843844

844845
void MCAsmStreamer::emitXCOFFRenameDirective(const MCSymbol *Name,
@@ -868,12 +869,6 @@ void MCAsmStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
868869

869870
void MCAsmStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
870871
unsigned ByteAlignment) {
871-
// Print symbol's rename (original name contains invalid character(s)) if
872-
// there is one.
873-
MCSymbolXCOFF *XSym = dyn_cast<MCSymbolXCOFF>(Symbol);
874-
if (XSym && XSym->hasRename())
875-
emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
876-
877872
OS << "\t.comm\t";
878873
Symbol->print(OS, MAI);
879874
OS << ',' << Size;
@@ -885,6 +880,13 @@ void MCAsmStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
885880
OS << ',' << Log2_32(ByteAlignment);
886881
}
887882
EmitEOL();
883+
884+
// Print symbol's rename (original name contains invalid character(s)) if
885+
// there is one.
886+
MCSymbolXCOFF *XSym = dyn_cast<MCSymbolXCOFF>(Symbol);
887+
if (XSym && XSym->hasRename())
888+
emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
889+
888890
}
889891

890892
void MCAsmStreamer::emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,

llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,10 @@ class PPCTargetAsmStreamer : public PPCTargetStreamer {
124124
MCSymbolXCOFF *TCSym =
125125
cast<MCSymbolXCOFF>(Streamer.getContext().getOrCreateSymbol(
126126
XSym->getSymbolTableName() + "[TC]"));
127+
OS << "\t.tc " << TCSym->getName() << "," << XSym->getName() << '\n';
128+
127129
if (TCSym->hasRename())
128130
Streamer.emitXCOFFRenameDirective(TCSym, TCSym->getSymbolTableName());
129-
OS << "\t.tc " << TCSym->getName() << "," << XSym->getName() << '\n';
130131
return;
131132
}
132133

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ entry:
4040
; This is f@o
4141
declare i32 @"f\40o"(...)
4242

43-
; ASM: .rename _Renamed..24f_o[DS],"f$o" # -- Begin function f$o
44-
; ASM-NEXT: .lglobl _Renamed..24f_o[DS]
45-
; ASM-NEXT: .rename ._Renamed..24f_o,".f$o"
43+
; ASM: .lglobl _Renamed..24f_o[DS] # -- Begin function f$o
44+
; ASM-NEXT: .rename _Renamed..24f_o[DS],"f$o"
4645
; ASM-NEXT: .lglobl ._Renamed..24f_o
46+
; ASM-NEXT: .rename ._Renamed..24f_o,".f$o"
4747
; ASM-NEXT: .align 4
4848
; ASM-NEXT: .csect _Renamed..24f_o[DS],2
4949
; ASM-NEXT: .vbyte 4, ._Renamed..24f_o # @"f$o"
@@ -53,10 +53,10 @@ declare i32 @"f\40o"(...)
5353
; ASM-NEXT: ._Renamed..24f_o:
5454
; ASM: bl ._Renamed..40f_o
5555
; ASM-NEXT: nop
56-
; ASM: .rename _Renamed..26f_o[DS],"f&o" # -- Begin function f&o
57-
; ASM-NEXT: .globl _Renamed..26f_o[DS]
58-
; ASM-NEXT: .rename ._Renamed..26f_o,".f&o"
56+
; ASM: .globl _Renamed..26f_o[DS] # -- Begin function f&o
57+
; ASM-NEXT: .rename _Renamed..26f_o[DS],"f&o"
5958
; ASM-NEXT: .globl ._Renamed..26f_o
59+
; ASM-NEXT: .rename ._Renamed..26f_o,".f&o"
6060
; ASM-NEXT: .align 4
6161
; ASM-NEXT: .csect _Renamed..26f_o[DS],2
6262
; ASM-NEXT: .vbyte 4, ._Renamed..26f_o # @"f&o"
@@ -65,10 +65,10 @@ declare i32 @"f\40o"(...)
6565
; ASM-NEXT: .csect .text[PR],2
6666
; ASM-NEXT: ._Renamed..26f_o:
6767
; ASM: bl ._Renamed..24f_o
68-
; ASM: .rename _Renamed..265ff__o[DS],"f&_o" # -- Begin function f&_o
69-
; ASM-NEXT: .globl _Renamed..265ff__o[DS]
70-
; ASM-NEXT: .rename ._Renamed..265ff__o,".f&_o"
68+
; ASM: .globl _Renamed..265ff__o[DS] # -- Begin function f&_o
69+
; ASM-NEXT: .rename _Renamed..265ff__o[DS],"f&_o"
7170
; ASM-NEXT: .globl ._Renamed..265ff__o
71+
; ASM-NEXT: .rename ._Renamed..265ff__o,".f&_o"
7272
; ASM-NEXT: .align 4
7373
; ASM-NEXT: .csect _Renamed..265ff__o[DS],2
7474
; ASM-NEXT: .vbyte 4, ._Renamed..265ff__o # @"f&_o"
@@ -77,21 +77,21 @@ declare i32 @"f\40o"(...)
7777
; ASM-NEXT: .csect .text[PR],2
7878
; ASM-NEXT: ._Renamed..265ff__o:
7979
; ASM: .csect .data[RW],2
80-
; ASM-NEXT: .rename _Renamed..60f_o,"f`o"
8180
; ASM-NEXT: .globl _Renamed..60f_o
81+
; ASM-NEXT: .rename _Renamed..60f_o,"f`o"
8282
; ASM-NEXT: .align 2
8383
; ASM-NEXT: _Renamed..60f_o:
8484
; ASM-NEXT: .vbyte 4, 10 # 0xa
85-
; ASM-NEXT: .rename _Renamed..2222f_o_[RW],"f""o"""
8685
; ASM-NEXT: .comm _Renamed..2222f_o_[RW],4,2
87-
; ASM-NEXT: .rename ._Renamed..40f_o,".f@o"
86+
; ASM-NEXT: .rename _Renamed..2222f_o_[RW],"f""o"""
8887
; ASM-NEXT: .extern ._Renamed..40f_o
89-
; ASM-NEXT: .rename _Renamed..40f_o[DS],"f@o"
88+
; ASM-NEXT: .rename ._Renamed..40f_o,".f@o"
9089
; ASM-NEXT: .extern _Renamed..40f_o[DS]
90+
; ASM-NEXT: .rename _Renamed..40f_o[DS],"f@o"
9191
; ASM-NEXT: .toc
9292
; ASM-NEXT: L..C0:
93-
; ASM-NEXT: .rename _Renamed..40f_o[TC],"f@o"
9493
; ASM-NEXT: .tc _Renamed..40f_o[TC],_Renamed..40f_o[DS]
94+
; ASM-NEXT: .rename _Renamed..40f_o[TC],"f@o"
9595

9696
; OBJ: Disassembly of section .text:
9797
; OBJ-EMPTY:

0 commit comments

Comments
 (0)