diff --git a/lld/test/ELF/mips-pc64.s b/lld/test/ELF/mips-pc64.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/mips-pc64.s @@ -0,0 +1,26 @@ +# REQUIRES: mips + +# Check handling of 64-bit pc-realtive relocation. + +# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %t.o +# RUN: echo "SECTIONS { \ +# RUN: . = 0x10000; .text ALIGN(0x10000) : { *(.text) } \ +# RUN: . = 0x30000; .data : { *(.data) } \ +# RUN: }" > %t.script +# RUN: ld.lld -shared %t.o -script %t.script -o %t.exe +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: {{.*}} 00000000 0000fff0 00000001 fffeffe8 + + .option pic2 + .text +foo: + nop + .data + .global v0 + .global v1 +v0: + .quad foo+0x1fff0-. +v1: + .quad foo+0x1fffffff0-. diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -234,14 +234,15 @@ case Mips::fixup_Mips_32: case FK_Data_4: return IsPCRel ? ELF::R_MIPS_PC32 : ELF::R_MIPS_32; + case Mips::fixup_Mips_64: + case FK_Data_8: + return IsPCRel + ? setRTypes(ELF::R_MIPS_PC32, ELF::R_MIPS_64, ELF::R_MIPS_NONE) + : ELF::R_MIPS_64; } if (IsPCRel) { switch (Kind) { - case FK_Data_8: - Ctx.reportError(Fixup.getLoc(), - "MIPS does not support 64-bit PC-relative relocations"); - return ELF::R_MIPS_NONE; case Mips::fixup_Mips_Branch_PCRel: case Mips::fixup_Mips_PC16: return ELF::R_MIPS_PC16; @@ -277,9 +278,6 @@ } switch (Kind) { - case Mips::fixup_Mips_64: - case FK_Data_8: - return ELF::R_MIPS_64; case FK_DTPRel_4: return ELF::R_MIPS_TLS_DTPREL32; case FK_DTPRel_8: diff --git a/llvm/test/MC/Mips/relocation-n64.s b/llvm/test/MC/Mips/relocation-n64.s --- a/llvm/test/MC/Mips/relocation-n64.s +++ b/llvm/test/MC/Mips/relocation-n64.s @@ -70,4 +70,6 @@ .word 0 bar: .word 1 + .option pic2 + .quad foo+0x1fffffff0-. // RELOC: R_MIPS_PC32/R_MIPS_64/R_MIPS_NONE foo 0x1FFFFFFF0 // DATA-LABEL: Section { diff --git a/llvm/test/MC/Mips/unsupported-relocation.s b/llvm/test/MC/Mips/unsupported-relocation.s --- a/llvm/test/MC/Mips/unsupported-relocation.s +++ b/llvm/test/MC/Mips/unsupported-relocation.s @@ -11,5 +11,3 @@ # CHECK: :[[@LINE-1]]:17: error: MIPS does not support one byte relocations .byte x+1 # CHECK: :[[@LINE-1]]:17: error: MIPS does not support one byte relocations - .quad x-foo -# CHECK: :[[@LINE-1]]:17: error: MIPS does not support 64-bit PC-relative relocations