From b9666655c2d4018a25358ad54dbbb80eda4319fa Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Mon, 12 Dec 2016 14:30:18 +0000 Subject: [PATCH] [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 llvm-svn: 289432 --- lld/ELF/SyntheticSections.cpp | 3 ++- lld/ELF/SyntheticSections.h | 2 +- lld/test/ELF/mips-options.s | 13 ++++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 59d5fe9..69ecc9d 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -610,7 +610,8 @@ template bool MipsGotSection::empty() const { return Config->Relocatable; } -template unsigned MipsGotSection::getGp() const { +template +typename MipsGotSection::uintX_t MipsGotSection::getGp() const { return ElfSym::MipsGp->template getVA(0); } diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index f0932df..f6a8efb 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -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 diff --git a/lld/test/ELF/mips-options.s b/lld/test/ELF/mips-options.s index 30381ae..f48ecad 100644 --- a/lld/test/ELF/mips-options.s +++ b/lld/test/ELF/mips-options.s @@ -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 -- 2.7.4