[lld] r289432 - [ELF][MIPS] Fix .MIPS.options ri_gp_value on MIPS64

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 12 06:30:18 PST 2016


Author: atanasyan
Date: Mon Dec 12 08:30:18 2016
New Revision: 289432

URL: http://llvm.org/viewvc/llvm-project?rev=289432&view=rev
Log:
[ELF][MIPS] Fix .MIPS.options ri_gp_value on MIPS64

The VA of _gp was being truncated to 32 bits when calling getVa(), but
for 64bit MIPS we need to write a 64 bit value to .MIPS.options.

Patch by Alexander Richardson.

Differential revision: https://reviews.llvm.org/D27672

Modified:
    lld/trunk/ELF/SyntheticSections.cpp
    lld/trunk/ELF/SyntheticSections.h
    lld/trunk/test/ELF/mips-options.s

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=289432&r1=289431&r2=289432&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Mon Dec 12 08:30:18 2016
@@ -610,7 +610,8 @@ template <class ELFT> bool MipsGotSectio
   return Config->Relocatable;
 }
 
-template <class ELFT> unsigned MipsGotSection<ELFT>::getGp() const {
+template <class ELFT>
+typename MipsGotSection<ELFT>::uintX_t MipsGotSection<ELFT>::getGp() const {
   return ElfSym<ELFT>::MipsGp->template getVA<ELFT>(0);
 }
 

Modified: lld/trunk/ELF/SyntheticSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=289432&r1=289431&r2=289432&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.h (original)
+++ lld/trunk/ELF/SyntheticSections.h Mon Dec 12 08:30:18 2016
@@ -124,7 +124,7 @@ public:
 
   uint32_t getTlsIndexOff() const { return TlsIndexOff; }
 
-  unsigned getGp() const;
+  uintX_t getGp() const;
 
 private:
   // MIPS GOT consists of three parts: local, global and tls. Each part

Modified: lld/trunk/test/ELF/mips-options.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/mips-options.s?rev=289432&r1=289431&r2=289432&view=diff
==============================================================================
--- lld/trunk/test/ELF/mips-options.s (original)
+++ lld/trunk/test/ELF/mips-options.s Mon Dec 12 08:30:18 2016
@@ -3,7 +3,10 @@
 # RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %t1.o
 # RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux \
 # RUN:         %S/Inputs/mips-dynamic.s -o %t2.o
-# RUN: ld.lld %t1.o %t2.o -shared -o %t.so
+# RUN: echo "SECTIONS { \
+# RUN:          . = 0x100000000; \
+# RUN:          .got  : { *(.got) } }" > %t.rel.script
+# RUN: ld.lld %t1.o %t2.o --script %t.rel.script -shared -o %t.so
 # RUN: llvm-readobj -symbols -mips-options %t.so | FileCheck %s
 
 # REQUIRES: mips
@@ -11,15 +14,15 @@
   .text
   .globl  __start
 __start:
-    lw   $t0,%call16(g1)($gp)
+    lui  $gp, %hi(%neg(%gp_rel(g1)))
 
 # CHECK:      Name: _gp
-# CHECK-NEXT: Value: 0x[[GP:[0-9A-F]+]]
+# CHECK-NEXT: Value: 0x100008250
 
 # CHECK:      MIPS Options {
 # CHECK-NEXT:   ODK_REGINFO {
-# CHECK-NEXT:     GP: 0x[[GP]]
-# CHECK-NEXT:     General Mask: 0x10001001
+# CHECK-NEXT:     GP: 0x100008250
+# CHECK-NEXT:     General Mask: 0x10000001
 # CHECK-NEXT:     Co-Proc Mask0: 0x0
 # CHECK-NEXT:     Co-Proc Mask1: 0x0
 # CHECK-NEXT:     Co-Proc Mask2: 0x0




More information about the llvm-commits mailing list