Skip to content

Commit 860b6ed

Browse files
authored
MIPS: fix emitDirectiveCpsetup on N32 (#80534)
In gas, .cpsetup may expand to one of two code sequences (one is related to `__gnu_local_gp`), depending on -mno-shared and -msym32. Since Clang doesn't support -mno-shared or -msym32, .cpsetup expands to one code sequence. The N32 condition incorrectly leads to the incorrect `__gnu_local_gp` code sequence. ``` 00000000 <t1>: 0: ffbc0008 sd gp,8(sp) 4: 3c1c0000 lui gp,0x0 4: R_MIPS_HI16 __gnu_local_gp 8: 279c0000 addiu gp,gp,0 8: R_MIPS_LO16 __gnu_local_gp ``` Fixes: #52785
1 parent 113052b commit 860b6ed

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,9 @@ void MipsTargetELFStreamer::emitDirectiveCpsetup(unsigned RegNo,
12551255
emitRRI(Mips::SD, GPReg, Mips::SP, RegOrOffset, SMLoc(), &STI);
12561256
}
12571257

1258-
if (getABI().IsN32()) {
1258+
#if 0
1259+
// We haven't support -mabicalls -mno-shared yet.
1260+
if (-mno-shared) {
12591261
MCSymbol *GPSym = MCA.getContext().getOrCreateSymbol("__gnu_local_gp");
12601262
const MipsMCExpr *HiExpr = MipsMCExpr::create(
12611263
MipsMCExpr::MEK_HI, MCSymbolRefExpr::create(GPSym, MCA.getContext()),
@@ -1273,6 +1275,7 @@ void MipsTargetELFStreamer::emitDirectiveCpsetup(unsigned RegNo,
12731275

12741276
return;
12751277
}
1278+
#endif
12761279

12771280
const MipsMCExpr *HiExpr = MipsMCExpr::createGpOff(
12781281
MipsMCExpr::MEK_HI, MCSymbolRefExpr::create(&Sym, MCA.getContext()),
@@ -1288,8 +1291,11 @@ void MipsTargetELFStreamer::emitDirectiveCpsetup(unsigned RegNo,
12881291
emitRRX(Mips::ADDiu, GPReg, GPReg, MCOperand::createExpr(LoExpr), SMLoc(),
12891292
&STI);
12901293

1291-
// daddu $gp, $gp, $funcreg
1292-
emitRRR(Mips::DADDu, GPReg, GPReg, RegNo, SMLoc(), &STI);
1294+
// (d)addu $gp, $gp, $funcreg
1295+
if (getABI().IsN32())
1296+
emitRRR(Mips::ADDu, GPReg, GPReg, RegNo, SMLoc(), &STI);
1297+
else
1298+
emitRRR(Mips::DADDu, GPReg, GPReg, RegNo, SMLoc(), &STI);
12931299
}
12941300

12951301
void MipsTargetELFStreamer::emitDirectiveCpreturn(unsigned SaveLocation,

llvm/test/MC/Mips/cpsetup.s

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
# RUN: llvm-mc -triple mips-unknown-linux -target-abi o32 %s | \
55
# RUN: FileCheck -check-prefixes=ASM,ASM-O32 %s
66

7-
# FIXME: Now we check .cpsetup expansion for `-mno-shared` case only.
8-
# We also need to implement/check the `-mshared` case.
97
# RUN: llvm-mc -triple mips64-unknown-linux -target-abi n32 -filetype=obj -o - %s | \
108
# RUN: llvm-objdump --no-print-imm-hex -d -r -z - | \
119
# RUN: FileCheck -check-prefixes=ALL,NXX,N32 %s
@@ -35,11 +33,16 @@ t1:
3533

3634
# NXX-NEXT: sd $gp, 8($sp)
3735
# NXX-NEXT: lui $gp, 0
38-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
3936
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
37+
# N32-NEXT: R_MIPS_GPREL16 __cerror
38+
# N32-NEXT: R_MIPS_SUB
39+
# N32-NEXT: R_MIPS_HI16
4040
# NXX-NEXT: addiu $gp, $gp, 0
41-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
4241
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
42+
# N32-NEXT: R_MIPS_GPREL16 __cerror
43+
# N32-NEXT: R_MIPS_SUB
44+
# N32-NEXT: R_MIPS_LO16
45+
# N32-NEXT: addu $gp, $gp, $25
4346
# N64-NEXT: daddu $gp, $gp, $25
4447

4548
# ASM-NEXT: .cpsetup $25, 8, __cerror
@@ -64,11 +67,16 @@ t2:
6467

6568
# NXX-NEXT: move $2, $gp
6669
# NXX-NEXT: lui $gp, 0
67-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
6870
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
71+
# N32-NEXT: R_MIPS_GPREL16 __cerror
72+
# N32-NEXT: R_MIPS_SUB
73+
# N32-NEXT: R_MIPS_HI16
6974
# NXX-NEXT: addiu $gp, $gp, 0
70-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
7175
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
76+
# N32-NEXT: R_MIPS_GPREL16 __cerror
77+
# N32-NEXT: R_MIPS_SUB
78+
# N32-NEXT: R_MIPS_LO16
79+
# N32-NEXT: addu $gp, $gp, $25
7280
# N64-NEXT: daddu $gp, $gp, $25
7381

7482
# ASM-NEXT: .cpsetup $25, $2, __cerror
@@ -101,11 +109,16 @@ t3:
101109

102110
# NXX-NEXT: move $2, $gp
103111
# NXX-NEXT: lui $gp, 0
104-
# N32-NEXT: {{^ *0+}}38: R_MIPS_HI16 __gnu_local_gp
105112
# N64-NEXT: {{^ *0+}}40: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 .text
113+
# N32-NEXT: {{^ *0+}}40: R_MIPS_GPREL16 .text
114+
# N32-NEXT: R_MIPS_SUB
115+
# N32-NEXT: R_MIPS_HI16
106116
# NXX-NEXT: addiu $gp, $gp, 0
107-
# N32-NEXT: {{^ *0+}}3c: R_MIPS_LO16 __gnu_local_gp
108117
# N64-NEXT: {{^ *0+}}44: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 .text
118+
# N32-NEXT: {{^ *0+}}44: R_MIPS_GPREL16 .text
119+
# N32-NEXT: R_MIPS_SUB
120+
# N32-NEXT: R_MIPS_LO16
121+
# N32-NEXT: addu $gp, $gp, $25
109122
# N64-NEXT: daddu $gp, $gp, $25
110123
# NXX-NEXT: nop
111124
# NXX-NEXT: sub $3, $3, $2
@@ -158,11 +171,16 @@ t5:
158171

159172
# NXX-NEXT: sd $gp, 8($sp)
160173
# NXX-NEXT: lui $gp, 0
161-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
162174
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
175+
# N32-NEXT: R_MIPS_GPREL16 __cerror
176+
# N32-NEXT: R_MIPS_SUB
177+
# N32-NEXT: R_MIPS_HI16
163178
# NXX-NEXT: addiu $gp, $gp, 0
164-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
165179
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
180+
# N32-NEXT: R_MIPS_GPREL16 __cerror
181+
# N32-NEXT: R_MIPS_SUB
182+
# N32-NEXT: R_MIPS_LO16
183+
# N32-NEXT: addu $gp, $gp, $25
166184
# N64-NEXT: daddu $gp, $gp, $25
167185

168186
# ASM-NEXT: .cpsetup $25, 8, __cerror
@@ -184,11 +202,16 @@ IMM_8 = 8
184202

185203
# NXX-NEXT: sd $gp, 8($sp)
186204
# NXX-NEXT: lui $gp, 0
187-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
188205
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
206+
# N32-NEXT: R_MIPS_GPREL16 __cerror
207+
# N32-NEXT: R_MIPS_SUB
208+
# N32-NEXT: R_MIPS_HI16
189209
# NXX-NEXT: addiu $gp, $gp, 0
190-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
191210
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
211+
# N32-NEXT: R_MIPS_GPREL16 __cerror
212+
# N32-NEXT: R_MIPS_SUB
213+
# N32-NEXT: R_MIPS_LO16
214+
# N32-NEXT: addu $gp, $gp, $25
192215
# N64-NEXT: daddu $gp, $gp, $25
193216

194217
# ASM-NEXT: .cpsetup $25, 8, __cerror

0 commit comments

Comments
 (0)