[ELF][MIPS] Fix .MIPS.options ri_gp_value on MIPS64
authorSimon Atanasyan <simon@atanasyan.com>
Mon, 12 Dec 2016 14:30:18 +0000 (14:30 +0000)
committerSimon Atanasyan <simon@atanasyan.com>
Mon, 12 Dec 2016 14:30:18 +0000 (14:30 +0000)
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

llvm-svn: 289432

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

index 59d5fe9..69ecc9d 100644 (file)
@@ -610,7 +610,8 @@ template <class ELFT> bool MipsGotSection<ELFT>::empty() const {
   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);
 }
 
index f0932df..f6a8efb 100644 (file)
@@ -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
index 30381ae..f48ecad 100644 (file)
@@ -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
   .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