[PATCH] D19115: [ELF][MIPS] Make R_MIPS_LO16 a relative relocation if it references _gp_disp symbol
Simon Atanasyan via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 14 14:15:52 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL266368: [ELF][MIPS] Make R_MIPS_LO16 a relative relocation if it references _gp_disp… (authored by atanasyan).
Changed prior to commit:
http://reviews.llvm.org/D19115?vs=53722&id=53784#toc
Repository:
rL LLVM
http://reviews.llvm.org/D19115
Files:
lld/trunk/ELF/Target.cpp
lld/trunk/ELF/Writer.cpp
lld/trunk/test/ELF/mips-hilo-gp-disp.s
Index: lld/trunk/ELF/Writer.cpp
===================================================================
--- lld/trunk/ELF/Writer.cpp
+++ lld/trunk/ELF/Writer.cpp
@@ -462,14 +462,22 @@
if (auto *S = dyn_cast<SharedSymbol<ELFT>>(&Body))
S->File->IsUsed = true;
+ RelExpr Expr = Target->getRelExpr(Type, Body);
uintX_t Addend = getAddend<ELFT>(RI);
const uint8_t *BufLoc = Buf + RI.r_offset;
if (!RelTy::IsRela)
Addend += Target->getImplicitAddend(BufLoc, Type);
- if (Config->EMachine == EM_MIPS)
+ if (Config->EMachine == EM_MIPS) {
Addend += findMipsPairedAddend<ELFT>(Buf, BufLoc, Body, &RI, E);
+ if (Type == R_MIPS_LO16 && Expr == R_PC)
+ // R_MIPS_LO16 expression has R_PC type iif the target is _gp_disp
+ // symbol. In that case we should use the following formula for
+ // calculation "AHL + GP – P + 4". Let's add 4 right here.
+ // For details see p. 4-19 at
+ // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
+ Addend += 4;
+ }
- RelExpr Expr = Target->getRelExpr(Type, Body);
if (unsigned Processed =
handleTlsRelocation<ELFT>(Type, Body, C, Offset, Addend, Expr)) {
I += (Processed - 1);
Index: lld/trunk/ELF/Target.cpp
===================================================================
--- lld/trunk/ELF/Target.cpp
+++ lld/trunk/ELF/Target.cpp
@@ -1579,6 +1579,7 @@
default:
return R_ABS;
case R_MIPS_HI16:
+ case R_MIPS_LO16:
// MIPS _gp_disp designates offset between start of function and 'gp'
// pointer into GOT. __gnu_local_gp is equal to the current value of
// the 'gp'. Therefore any relocations against them do not require
Index: lld/trunk/test/ELF/mips-hilo-gp-disp.s
===================================================================
--- lld/trunk/test/ELF/mips-hilo-gp-disp.s
+++ lld/trunk/test/ELF/mips-hilo-gp-disp.s
@@ -16,27 +16,40 @@
lui $t0,%hi(_gp_disp)
addi $t0,$t0,%lo(_gp_disp)
lw $v0,%call16(_foo)($gp)
+bar:
+ lui $t0,%hi(_gp_disp)
+ addi $t0,$t0,%lo(_gp_disp)
# EXE: Disassembly of section .text:
# EXE-NEXT: __start:
# EXE-NEXT: 20000: 3c 08 00 01 lui $8, 1
# ^-- %hi(0x37ff0-0x20000)
# EXE-NEXT: 20004: 21 08 7f f0 addi $8, $8, 32752
# ^-- %lo(0x37ff0-0x20004+4)
+# EXE: bar:
+# EXE-NEXT: 2000c: 3c 08 00 01 lui $8, 1
+# ^-- %hi(0x37ff0-0x2000c)
+# EXE-NEXT: 20010: 21 08 7f e4 addi $8, $8, 32740
+# ^-- %lo(0x37ff0-0x20010+4)
# EXE: SYMBOL TABLE:
+# EXE: 0002000c .text 00000000 bar
# EXE: 00037ff0 .got 00000000 .hidden _gp
# EXE: 00020000 .text 00000000 __start
-# EXE: 00020010 .text 00000000 _foo
# SO: Disassembly of section .text:
# SO-NEXT: __start:
# SO-NEXT: 10000: 3c 08 00 01 lui $8, 1
# ^-- %hi(0x27ff0-0x10000)
# SO-NEXT: 10004: 21 08 7f f0 addi $8, $8, 32752
# ^-- %lo(0x27ff0-0x10004+4)
+# SO: bar:
+# SO-NEXT: 1000c: 3c 08 00 01 lui $8, 1
+# ^-- %hi(0x27ff0-0x1000c)
+# SO-NEXT: 10010: 21 08 7f e4 addi $8, $8, 32740
+# ^-- %lo(0x27ff0-0x10010+4)
# SO: SYMBOL TABLE:
+# SO: 0001000c .text 00000000 bar
# SO: 00027ff0 .got 00000000 .hidden _gp
# SO: 00010000 .text 00000000 __start
-# SO: 00010010 .text 00000000 _foo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19115.53784.patch
Type: text/x-patch
Size: 3710 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160414/c1b61b81/attachment.bin>
More information about the llvm-commits
mailing list