diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 7e53e4b1cc88..fb6a0712d9de 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -4018,6 +4018,7 @@ const MCExpr *MipsAsmParser::evaluateRelocExpr(const MCExpr *Expr, Val = MCE->getValue() & 0xffff; break; case MCSymbolRefExpr::VK_Mips_ABS_HI: + case MCSymbolRefExpr::VK_Mips_GOT: // Get the 2nd 16-bits. Also add 1 if bit 15 is 1, to compensate for low // 16 bits being negative. Val = ((MCE->getValue() + 0x8000) >> 16) & 0xffff; diff --git a/llvm/test/MC/Mips/got-rel-expr.s b/llvm/test/MC/Mips/got-rel-expr.s new file mode 100644 index 000000000000..01c364e5dc35 --- /dev/null +++ b/llvm/test/MC/Mips/got-rel-expr.s @@ -0,0 +1,20 @@ +# Check that llvm-mc accepts arithmetic expression +# as an argument of the %got relocation. + +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s \ +# RUN: | llvm-objdump -d -r - | FileCheck %s + + .text +foo: + lw $t0,%got($loc+0x10004)($gp) +# CHECK: 0: 8f 88 00 01 lw $8, 1($gp) +# CHECK: 00000000: R_MIPS_GOT16 $loc + addi $t0,$t0,%lo($loc+0x10004) +# CHECK: 4: 21 08 00 04 addi $8, $8, 4 +# CHECK: 00000004: R_MIPS_LO16 $loc + + .data +$loc: + .word 0 + .space 0x10000 + .word 0