Skip to content

Commit 46bc99d

Browse files
committed
MIPS: fix emitDirectiveCpsetup on N32
In the current code, we don't support -mno-shared yet, and for N32, .cpsetup is expand as the style -f -mno-shared. It will generate bad code for PIC binaries like: 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 In fact which style of .cpsetup is used should be determined by -m(no-)shared option instead of -mabi=n32 option. Fixes: #52785
1 parent 78b4e7c commit 46bc99d

File tree

2 files changed

+24
-25
lines changed

2 files changed

+24
-25
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: 15 additions & 22 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,10 @@ t1:
3533

3634
# NXX-NEXT: sd $gp, 8($sp)
3735
# NXX-NEXT: lui $gp, 0
38-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
39-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
36+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
4037
# NXX-NEXT: addiu $gp, $gp, 0
41-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
42-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
38+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
39+
# N32-NEXT: addu $gp, $gp, $25
4340
# N64-NEXT: daddu $gp, $gp, $25
4441

4542
# ASM-NEXT: .cpsetup $25, 8, __cerror
@@ -64,11 +61,10 @@ t2:
6461

6562
# NXX-NEXT: move $2, $gp
6663
# NXX-NEXT: lui $gp, 0
67-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
68-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
64+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
6965
# NXX-NEXT: addiu $gp, $gp, 0
70-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
71-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
66+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
67+
# N32-NEXT: addu $gp, $gp, $25
7268
# N64-NEXT: daddu $gp, $gp, $25
7369

7470
# ASM-NEXT: .cpsetup $25, $2, __cerror
@@ -101,11 +97,10 @@ t3:
10197

10298
# NXX-NEXT: move $2, $gp
10399
# NXX-NEXT: lui $gp, 0
104-
# N32-NEXT: {{^ *0+}}38: R_MIPS_HI16 __gnu_local_gp
105-
# N64-NEXT: {{^ *0+}}40: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 .text
100+
# NXX-NEXT: {{^ *0+}}40: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 .text
106101
# NXX-NEXT: addiu $gp, $gp, 0
107-
# N32-NEXT: {{^ *0+}}3c: R_MIPS_LO16 __gnu_local_gp
108-
# N64-NEXT: {{^ *0+}}44: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 .text
102+
# NXX-NEXT: {{^ *0+}}44: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 .text
103+
# N32-NEXT: addu $gp, $gp, $25
109104
# N64-NEXT: daddu $gp, $gp, $25
110105
# NXX-NEXT: nop
111106
# NXX-NEXT: sub $3, $3, $2
@@ -158,11 +153,10 @@ t5:
158153

159154
# NXX-NEXT: sd $gp, 8($sp)
160155
# NXX-NEXT: lui $gp, 0
161-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
162-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
156+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
163157
# NXX-NEXT: addiu $gp, $gp, 0
164-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
165-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
158+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
159+
# N64-NEXT: addu $gp, $gp, $25
166160
# N64-NEXT: daddu $gp, $gp, $25
167161

168162
# ASM-NEXT: .cpsetup $25, 8, __cerror
@@ -184,11 +178,10 @@ IMM_8 = 8
184178

185179
# NXX-NEXT: sd $gp, 8($sp)
186180
# NXX-NEXT: lui $gp, 0
187-
# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
188-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
181+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 __cerror
189182
# NXX-NEXT: addiu $gp, $gp, 0
190-
# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
191-
# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
183+
# NXX-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 __cerror
184+
# N32-NEXT: addu $gp, $gp, $25
192185
# N64-NEXT: daddu $gp, $gp, $25
193186

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

0 commit comments

Comments
 (0)