1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00

[RISCV] Add R_RISCV_RELAX relocation to all possible relax candidates.

Summary:
Add R_RISCV_RELAX relocation to all possible relax candidates and
update corresponding testcase.

Reviewers: asb, apazos

Differential Revision: https://reviews.llvm.org/D46677

llvm-svn: 351723
This commit is contained in:
Kito Cheng 2019-01-21 05:27:09 +00:00
parent e3d6fdcccf
commit 28868a45d5
4 changed files with 73 additions and 16 deletions

View File

@ -204,6 +204,7 @@ unsigned RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
const MCExpr *Expr = MO.getExpr(); const MCExpr *Expr = MO.getExpr();
MCExpr::ExprKind Kind = Expr->getKind(); MCExpr::ExprKind Kind = Expr->getKind();
RISCV::Fixups FixupKind = RISCV::fixup_riscv_invalid; RISCV::Fixups FixupKind = RISCV::fixup_riscv_invalid;
bool RelaxCandidate = false;
if (Kind == MCExpr::Target) { if (Kind == MCExpr::Target) {
const RISCVMCExpr *RVExpr = cast<RISCVMCExpr>(Expr); const RISCVMCExpr *RVExpr = cast<RISCVMCExpr>(Expr);
@ -218,9 +219,11 @@ unsigned RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
FixupKind = RISCV::fixup_riscv_lo12_s; FixupKind = RISCV::fixup_riscv_lo12_s;
else else
llvm_unreachable("VK_RISCV_LO used with unexpected instruction format"); llvm_unreachable("VK_RISCV_LO used with unexpected instruction format");
RelaxCandidate = true;
break; break;
case RISCVMCExpr::VK_RISCV_HI: case RISCVMCExpr::VK_RISCV_HI:
FixupKind = RISCV::fixup_riscv_hi20; FixupKind = RISCV::fixup_riscv_hi20;
RelaxCandidate = true;
break; break;
case RISCVMCExpr::VK_RISCV_PCREL_LO: case RISCVMCExpr::VK_RISCV_PCREL_LO:
if (MIFrm == RISCVII::InstFormatI) if (MIFrm == RISCVII::InstFormatI)
@ -230,12 +233,15 @@ unsigned RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
else else
llvm_unreachable( llvm_unreachable(
"VK_RISCV_PCREL_LO used with unexpected instruction format"); "VK_RISCV_PCREL_LO used with unexpected instruction format");
RelaxCandidate = true;
break; break;
case RISCVMCExpr::VK_RISCV_PCREL_HI: case RISCVMCExpr::VK_RISCV_PCREL_HI:
FixupKind = RISCV::fixup_riscv_pcrel_hi20; FixupKind = RISCV::fixup_riscv_pcrel_hi20;
RelaxCandidate = true;
break; break;
case RISCVMCExpr::VK_RISCV_CALL: case RISCVMCExpr::VK_RISCV_CALL:
FixupKind = RISCV::fixup_riscv_call; FixupKind = RISCV::fixup_riscv_call;
RelaxCandidate = true;
break; break;
} }
} else if (Kind == MCExpr::SymbolRef && } else if (Kind == MCExpr::SymbolRef &&
@ -257,13 +263,15 @@ unsigned RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
MCFixup::create(0, Expr, MCFixupKind(FixupKind), MI.getLoc())); MCFixup::create(0, Expr, MCFixupKind(FixupKind), MI.getLoc()));
++MCNumFixups; ++MCNumFixups;
if (EnableRelax) { // Ensure an R_RISCV_RELAX relocation will be emitted if linker relaxation is
if (FixupKind == RISCV::fixup_riscv_call) { // enabled and the current fixup will result in a relocation that may be
Fixups.push_back( // relaxed.
MCFixup::create(0, Expr, MCFixupKind(RISCV::fixup_riscv_relax), if (EnableRelax && RelaxCandidate) {
MI.getLoc())); const MCConstantExpr *Dummy = MCConstantExpr::create(0, Ctx);
++MCNumFixups; Fixups.push_back(
} MCFixup::create(0, Dummy, MCFixupKind(RISCV::fixup_riscv_relax),
MI.getLoc()));
++MCNumFixups;
} }
return 0; return 0;

View File

@ -18,9 +18,58 @@ call foo
# NORELAX-RELOC: R_RISCV_CALL foo 0x0 # NORELAX-RELOC: R_RISCV_CALL foo 0x0
# NORELAX-RELOC-NOT: R_RISCV_RELAX # NORELAX-RELOC-NOT: R_RISCV_RELAX
# RELAX-RELOC: R_RISCV_CALL foo 0x0 # RELAX-RELOC: R_RISCV_CALL foo 0x0
# RELAX-RELOC: R_RISCV_RELAX foo 0x0 # RELAX-RELOC: R_RISCV_RELAX - 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_call # RELAX-FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_call
# RELAX-FIXUP: fixup B - offset: 0, value: foo, kind: fixup_riscv_relax # RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
beq s1, s1, .L1 beq s1, s1, .L1
# RELAX-RELOC: R_RISCV_BRANCH .L1 0x0 # RELAX-RELOC: R_RISCV_BRANCH .L1 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: .L1, kind: fixup_riscv_branch # RELAX-FIXUP: fixup A - offset: 0, value: .L1, kind: fixup_riscv_branch
# RELAX-FIXUP-NOT: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
lui t1, %hi(foo)
# NORELAX-RELOC: R_RISCV_HI20 foo 0x0
# NORELAX-RELOC-NOT: R_RISCV_RELAX
# RELOC: R_RISCV_HI20 foo 0x0
# RELAX-RELOC: R_RISCV_RELAX - 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: %hi(foo), kind: fixup_riscv_hi20
# RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
addi t1, t1, %lo(foo)
# NORELAX-RELOC: R_RISCV_LO12_I foo 0x0
# NORELAX-RELOC-NOT: R_RISCV_RELAX
# RELOC: R_RISCV_LO12_I foo 0x0
# RELAX-RELOC: R_RISCV_RELAX - 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: %lo(foo), kind: fixup_riscv_lo12_i
# RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
sb t1, %lo(foo)(a2)
# NORELAX-RELOC: R_RISCV_LO12_S foo 0x0
# NORELAX-RELOC-NOT: R_RISCV_RELAX
# RELOC: R_RISCV_LO12_S foo 0x0
# RELAX-RELOC: R_RISCV_RELAX - 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: %lo(foo), kind: fixup_riscv_lo12_s
# RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
auipc t1, %pcrel_hi(foo)
# NORELAX-RELOC: R_RISCV_PCREL_HI20 foo 0x0
# NORELAX-RELOC-NOT: R_RISCV_RELAX
# RELOC: R_RISCV_PCREL_HI20 foo 0x0
# RELAX-RELOC: R_RISCV_RELAX - 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: %pcrel_hi(foo), kind: fixup_riscv_pcrel_hi20
# RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
addi t1, t1, %pcrel_lo(foo)
# NORELAX-RELOC: R_RISCV_PCREL_LO12_I foo 0x0
# NORELAX-RELOC-NOT: R_RISCV_RELAX
# RELOC: R_RISCV_PCREL_LO12_I foo 0x0
# RELAX-RELOC: R_RISCV_RELAX - 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: %pcrel_lo(foo), kind: fixup_riscv_pcrel_lo12_i
# RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
sb t1, %pcrel_lo(foo)(a2)
# NORELAX-RELOC: R_RISCV_PCREL_LO12_S foo 0x0
# NORELAX-RELOC-NOT: R_RISCV_RELAX
# RELOC: R_RISCV_PCREL_LO12_S foo 0x0
# RELAX-RELOC: R_RISCV_RELAX - 0x0
# RELAX-FIXUP: fixup A - offset: 0, value: %pcrel_lo(foo), kind: fixup_riscv_pcrel_lo12_s
# RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax

View File

@ -21,7 +21,7 @@
# CHECK-INST: call foo # CHECK-INST: call foo
# CHECK-RELOC: R_RISCV_CALL foo 0x0 # CHECK-RELOC: R_RISCV_CALL foo 0x0
# CHECK-RELOC-NOT: R_RISCV_RELAX foo 0x0 # CHECK-RELOC-NOT: R_RISCV_RELAX - 0x0
call foo call foo
# CHECK-INST: addi s0, sp, 1020 # CHECK-INST: addi s0, sp, 1020
@ -36,7 +36,7 @@ addi s0, sp, 1020
# CHECK-INST: .option relax # CHECK-INST: .option relax
# CHECK-INST: call bar # CHECK-INST: call bar
# CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0 # CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0
# CHECK-RELOC-NEXT: R_RISCV_RELAX bar 0x0 # CHECK-RELOC-NEXT: R_RISCV_RELAX - 0x0
call bar call bar
.option push # Push relax=true, rvc=false .option push # Push relax=true, rvc=false
@ -58,14 +58,14 @@ addi s0, sp, 1020
# CHECK-INST: call bar # CHECK-INST: call bar
# CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0 # CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0
# CHECK-RELOC-NEXT: R_RISCV_RELAX bar 0x0 # CHECK-RELOC-NEXT: R_RISCV_RELAX - 0x0
call bar call bar
.option pop # Pop relax=false, rvc=false .option pop # Pop relax=false, rvc=false
# CHECK-INST: .option pop # CHECK-INST: .option pop
# CHECK-INST: call baz # CHECK-INST: call baz
# CHECK-RELOC: R_RISCV_CALL baz 0x0 # CHECK-RELOC: R_RISCV_CALL baz 0x0
# CHECK-RELOC-NOT: R_RISCV_RELAX baz 0x0 # CHECK-RELOC-NOT: R_RISCV_RELAX - 0x0
call baz call baz
# CHECK-INST: addi s0, sp, 1020 # CHECK-INST: addi s0, sp, 1020

View File

@ -21,7 +21,7 @@
# CHECK-INST: call foo # CHECK-INST: call foo
# CHECK-RELOC: R_RISCV_CALL foo 0x0 # CHECK-RELOC: R_RISCV_CALL foo 0x0
# CHECK-RELOC-NOT: R_RISCV_RELAX foo 0x0 # CHECK-RELOC-NOT: R_RISCV_RELAX - 0x0
call foo call foo
# CHECK-RELOC-NEXT: R_RISCV_ADD64 # CHECK-RELOC-NEXT: R_RISCV_ADD64
@ -38,7 +38,7 @@ beq s1, s1, .L1
# CHECK-INST: call bar # CHECK-INST: call bar
# CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0 # CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0
# CHECK-RELOC-NEXT: R_RISCV_RELAX bar 0x0 # CHECK-RELOC-NEXT: R_RISCV_RELAX - 0x0
call bar call bar
# CHECK-RELOC-NEXT: R_RISCV_ADD64 # CHECK-RELOC-NEXT: R_RISCV_ADD64
@ -54,7 +54,7 @@ beq s1, s1, .L1
# CHECK-INST: call baz # CHECK-INST: call baz
# CHECK-RELOC-NEXT: R_RISCV_CALL baz 0x0 # CHECK-RELOC-NEXT: R_RISCV_CALL baz 0x0
# CHECK-RELOC-NOT: R_RISCV_RELAX baz 0x0 # CHECK-RELOC-NOT: R_RISCV_RELAX - 0x0
call baz call baz
# CHECK-RELOC-NEXT: R_RISCV_ADD64 # CHECK-RELOC-NEXT: R_RISCV_ADD64