From e933a8e212dca28019f4f9238e69543c3bfbd7dd Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Thu, 18 Aug 2016 19:08:36 +0000 Subject: [PATCH] [ELF][MIPS] Support R_MIPS_CALL_HI16 / R_MIPS_CALL_LO16 relocations calculation llvm-svn: 279118 --- lld/ELF/Target.cpp | 4 +++ lld/test/ELF/mips-call-hilo.s | 62 +++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 lld/test/ELF/mips-call-hilo.s diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 88461377b4b9..ed44eafcbd09 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1901,6 +1901,8 @@ RelExpr MipsTargetInfo::getRelExpr(uint32_t Type, return R_MIPS_GOT_LOCAL_PAGE; // fallthrough case R_MIPS_CALL16: + case R_MIPS_CALL_HI16: + case R_MIPS_CALL_LO16: case R_MIPS_GOT_DISP: case R_MIPS_TLS_GOTTPREL: return R_MIPS_GOT_OFF; @@ -2128,6 +2130,7 @@ void MipsTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, checkInt<16>(Val, Type); // fallthrough case R_MIPS_CALL16: + case R_MIPS_CALL_LO16: case R_MIPS_GOT_OFST: case R_MIPS_LO16: case R_MIPS_PCLO16: @@ -2136,6 +2139,7 @@ void MipsTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, case R_MIPS_TLS_TPREL_LO16: writeMipsLo16(Loc, Val); break; + case R_MIPS_CALL_HI16: case R_MIPS_HI16: case R_MIPS_PCHI16: case R_MIPS_TLS_DTPREL_HI16: diff --git a/lld/test/ELF/mips-call-hilo.s b/lld/test/ELF/mips-call-hilo.s new file mode 100644 index 000000000000..2504612f9e34 --- /dev/null +++ b/lld/test/ELF/mips-call-hilo.s @@ -0,0 +1,62 @@ +# Check R_MIPS_CALL_HI16 / R_MIPS_CALL_LO16 relocations calculation. + +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o +# RUN: ld.lld %t.o -shared -o %t.so +# RUN: llvm-objdump -d %t.so | FileCheck %s +# RUN: llvm-readobj -r -mips-plt-got %t.so | FileCheck -check-prefix=GOT %s + +# REQUIRES: mips + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: foo: +# CHECK-NEXT: 10000: 3c 02 00 00 lui $2, 0 +# CHECK-NEXT: 10004: 8c 42 80 20 lw $2, -32736($2) +# CHECK-NEXT: 10008: 3c 02 00 00 lui $2, 0 +# CHECK-NEXT: 1000c: 8c 42 80 18 lw $2, -32744($2) +# CHECK-NEXT: 10010: 3c 02 00 00 lui $2, 0 +# CHECK-NEXT: 10014: 8c 42 80 1c lw $2, -32740($2) + +# GOT: Relocations [ +# GOT-NEXT: ] + +# GOT: Primary GOT { +# GOT-NEXT: Canonical gp value: 0x27FF0 +# GOT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x20008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x10018 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x2000C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x1001C +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x20010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: None +# GOT-NEXT: Section: Undefined +# GOT-NEXT: Name: bar +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Number of TLS and multi-GOT entries: 0 +# GOT-NEXT: } + + .text + .global foo +foo: + lui $2, %call_hi(bar) + lw $2, %call_lo(bar)($2) + lui $2, %call_hi(loc1) + lw $2, %call_lo(loc1)($2) + lui $2, %call_hi(loc2) + lw $2, %call_lo(loc2)($2) +loc1: + nop +loc2: + nop