Index: ELF/Arch/Mips.cpp =================================================================== --- ELF/Arch/Mips.cpp +++ ELF/Arch/Mips.cpp @@ -501,21 +501,21 @@ writeMicroRelocation32(Loc, Val, 16, 0); } break; + case R_MIPS_CALL16: case R_MIPS_GOT_DISP: case R_MIPS_GOT_PAGE: case R_MIPS_GPREL16: case R_MIPS_TLS_GD: + case R_MIPS_TLS_GOTTPREL: case R_MIPS_TLS_LDM: checkInt<16>(Loc, Val, Type); LLVM_FALLTHROUGH; - case R_MIPS_CALL16: case R_MIPS_CALL_LO16: case R_MIPS_GOT_LO16: case R_MIPS_GOT_OFST: case R_MIPS_LO16: case R_MIPS_PCLO16: case R_MIPS_TLS_DTPREL_LO16: - case R_MIPS_TLS_GOTTPREL: case R_MIPS_TLS_TPREL_LO16: writeRelocation(Loc, Val, 16, 0); break; Index: test/ELF/mips-out-of-bounds-call16-reloc.s =================================================================== --- /dev/null +++ test/ELF/mips-out-of-bounds-call16-reloc.s @@ -0,0 +1,29 @@ +# Check that we create an error on an out-of-bounds R_MIPS_CALL_16 + +# REQUIRES: mips +# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %t1.o +# RUN: not ld.lld %t1.o -o %t.exe 2>&1 | FileCheck %s + +# CHECK: relocation R_MIPS_CALL16 out of range + +.macro generate_values + .irp i, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .irp j, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .irp k, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .irp l, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .text + .globl sym_\i\j\k\l + sym_\i\j\k\l: + nop + lw $25,%call16(sym_\i\j\k\l)($28) + .endr + .endr + .endr + .endr +.endm + +generate_values + +.globl __start +__start: + nop