From 6f92e14ce2a7ea84f43622adb50f5d086bef0c4f Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 12 Apr 2016 13:26:51 +0000 Subject: [PATCH] Use DefinedSynthetic for _gp* symbols. The test changes to put _gp* in the .got section matches what both bfd and gold do. llvm-svn: 266067 --- lld/ELF/Symbols.h | 12 ++++++------ lld/ELF/Target.cpp | 3 +-- lld/ELF/Target.h | 1 + lld/ELF/Writer.cpp | 40 ++++++++++++++++++++------------------ lld/test/ELF/basic-mips.s | 2 +- lld/test/ELF/mips-got-relocs.s | 4 ++-- lld/test/ELF/mips-gp-disp.s | 2 +- lld/test/ELF/mips-gp-local.s | 2 +- lld/test/ELF/mips-gprel32-relocs.s | 2 +- lld/test/ELF/mips-hilo-gp-disp.s | 4 ++-- 10 files changed, 37 insertions(+), 35 deletions(-) diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index b5ade14..1b3cb2d 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -403,10 +403,10 @@ template struct ElfSym { static DefinedRegular *End2; // The content for _gp symbol for MIPS target. - static DefinedRegular *MipsGp; + static SymbolBody *MipsGp; - static DefinedRegular *MipsLocalGp; - static DefinedRegular *MipsGpDisp; + static SymbolBody *MipsLocalGp; + static SymbolBody *MipsGpDisp; // __rel_iplt_start/__rel_iplt_end for signaling // where R_[*]_IRELATIVE relocations do live. @@ -420,9 +420,9 @@ template DefinedRegular *ElfSym::Edata; template DefinedRegular *ElfSym::Edata2; template DefinedRegular *ElfSym::End; template DefinedRegular *ElfSym::End2; -template DefinedRegular *ElfSym::MipsGp; -template DefinedRegular *ElfSym::MipsLocalGp; -template DefinedRegular *ElfSym::MipsGpDisp; +template SymbolBody *ElfSym::MipsGp; +template SymbolBody *ElfSym::MipsLocalGp; +template SymbolBody *ElfSym::MipsGpDisp; template SymbolBody *ElfSym::RelaIpltStart; template SymbolBody *ElfSym::RelaIpltEnd; diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index bb1297c..ce27273 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1920,8 +1920,7 @@ bool MipsTargetInfo::isRelRelative(uint32_t Type) const { // a location that is relative to GOT. This function returns // the value for the symbol. template typename ELFT::uint getMipsGpAddr() { - unsigned GPOffset = 0x7ff0; - return Out::Got->getVA() + GPOffset; + return Out::Got->getVA() + MipsGPOffset; } template uint32_t getMipsGpAddr(); diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index b81db7d..7d23772 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -119,6 +119,7 @@ private: uint64_t getPPC64TocBase(); +const unsigned MipsGPOffset = 0x7ff0; template typename ELFT::uint getMipsGpAddr(); extern TargetInfo *Target; diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index d990990..4bbd812 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -795,6 +795,16 @@ bool Writer::isDiscarded(InputSectionBase *S) const { Script->isDiscarded(S); } +template +static SymbolBody * +addOptionalSynthetic(SymbolTable &Table, StringRef Name, + OutputSectionBase &Sec, typename ELFT::uint Val, + uint8_t Visibility) { + if (!Table.find(Name)) + return nullptr; + return Table.addSynthetic(Name, Sec, Val, Visibility); +} + // The beginning and the ending of .rel[a].plt section are marked // with __rel[a]_iplt_{start,end} symbols if it is a statically linked // executable. The runtime needs these symbols in order to resolve @@ -806,14 +816,13 @@ void Writer::addRelIpltSymbols() { if (isOutputDynamic() || !Out::RelaPlt) return; StringRef S = Config->Rela ? "__rela_iplt_start" : "__rel_iplt_start"; - if (Symtab.find(S)) - ElfSym::RelaIpltStart = - Symtab.addSynthetic(S, *Out::RelaPlt, 0, STV_HIDDEN); + ElfSym::RelaIpltStart = + addOptionalSynthetic(Symtab, S, *Out::RelaPlt, 0, STV_HIDDEN); S = Config->Rela ? "__rela_iplt_end" : "__rel_iplt_end"; - if (Symtab.find(S)) - ElfSym::RelaIpltEnd = Symtab.addSynthetic( - S, *Out::RelaPlt, DefinedSynthetic::SectionEnd, STV_HIDDEN); + ElfSym::RelaIpltEnd = + addOptionalSynthetic(Symtab, S, *Out::RelaPlt, + DefinedSynthetic::SectionEnd, STV_HIDDEN); } template static bool includeInSymtab(const SymbolBody &B) { @@ -932,16 +941,19 @@ template void Writer::addReservedSymbols() { // so that it points to an absolute address which is relative to GOT. // See "Global Data Symbols" in Chapter 6 in the following document: // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf - ElfSym::MipsGp = Symtab.addAbsolute("_gp", STV_DEFAULT); + ElfSym::MipsGp = + Symtab.addSynthetic("_gp", *Out::Got, MipsGPOffset, STV_DEFAULT); // On MIPS O32 ABI, _gp_disp is a magic symbol designates offset between // start of function and 'gp' pointer into GOT. - ElfSym::MipsGpDisp = Symtab.addIgnored("_gp_disp"); + ElfSym::MipsGpDisp = addOptionalSynthetic( + Symtab, "_gp_disp", *Out::Got, MipsGPOffset, STV_HIDDEN); // The __gnu_local_gp is a magic symbol equal to the current value of 'gp' // pointer. This symbol is used in the code generated by .cpload pseudo-op // in case of using -mno-shared option. // https://sourceware.org/ml/binutils/2004-12/msg00094.html - ElfSym::MipsLocalGp = Symtab.addIgnored("__gnu_local_gp"); + ElfSym::MipsLocalGp = addOptionalSynthetic( + Symtab, "__gnu_local_gp", *Out::Got, MipsGPOffset, STV_HIDDEN); } // In the assembly for 32 bit x86 the _GLOBAL_OFFSET_TABLE_ symbol @@ -1515,16 +1527,6 @@ static uint16_t getELFType() { // to each section. This function fixes some predefined absolute // symbol values that depend on section address and size. template void Writer::fixAbsoluteSymbols() { - // Update MIPS _gp absolute symbol so that it points to the static data. - - if (Config->EMachine == EM_MIPS) { - ElfSym::MipsGp->Value = getMipsGpAddr(); - if (ElfSym::MipsLocalGp) - ElfSym::MipsLocalGp->Value = getMipsGpAddr(); - if (ElfSym::MipsGpDisp) - ElfSym::MipsGpDisp->Value = getMipsGpAddr(); - } - // _etext is the first location after the last read-only loadable segment. // _edata is the first location after the last read-write loadable segment. // _end is the first location after the uninitialized data region. diff --git a/lld/test/ELF/basic-mips.s b/lld/test/ELF/basic-mips.s index 0a1ff30..1f6dcf2 100644 --- a/lld/test/ELF/basic-mips.s +++ b/lld/test/ELF/basic-mips.s @@ -219,7 +219,7 @@ __start: # CHECK-NEXT: Binding: Global # CHECK-NEXT: Type: None (0x0) # CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: Absolute (0xFFF1) +# CHECK-NEXT: Section: .got # CHECK-NEXT: } # CHECK-NEXT: ] # CHECK-NEXT: ProgramHeaders [ diff --git a/lld/test/ELF/mips-got-relocs.s b/lld/test/ELF/mips-got-relocs.s index 408a085..0933dfe 100644 --- a/lld/test/ELF/mips-got-relocs.s +++ b/lld/test/ELF/mips-got-relocs.s @@ -48,7 +48,7 @@ v1: # EXE_SYM: .got 0000000c 0000000000030000 DATA # EXE_SYM: SYMBOL TABLE: # EXE_SYM: 00040000 g .data 00000004 v1 -# EXE_SYM: 00037ff0 *ABS* 00000000 _gp +# EXE_SYM: 00037ff0 .got 00000000 _gp # ^-- .got + GP offset (0x7ff0) @@ -72,7 +72,7 @@ v1: # DSO_SYM: .got 0000000c 0000000000020000 DATA # DSO_SYM: SYMBOL TABLE: # DSO_SYM: 00030000 g .data 00000004 v1 -# DSO_SYM: 00027ff0 *ABS* 00000000 _gp +# DSO_SYM: 00027ff0 .got 00000000 _gp # ^-- .got + GP offset (0x7ff0) # DSO_GOT_BE: Contents of section .got: diff --git a/lld/test/ELF/mips-gp-disp.s b/lld/test/ELF/mips-gp-disp.s index 2110d7c..823ac5a 100644 --- a/lld/test/ELF/mips-gp-disp.s +++ b/lld/test/ELF/mips-gp-disp.s @@ -24,7 +24,7 @@ # DIS-NEXT: 10000: 3c 08 00 01 lui $8, 1 # DIS-NEXT: 10004: 21 08 7f f0 addi $8, $8, 32752 # ^-- 0x37ff0 & 0xffff -# DIS: 00027ff0 *ABS* 00000000 _gp +# DIS: 00027ff0 .got 00000000 _gp # REL: Relocations [ # REL-NEXT: ] diff --git a/lld/test/ELF/mips-gp-local.s b/lld/test/ELF/mips-gp-local.s index 50c9865..d8453bc 100644 --- a/lld/test/ELF/mips-gp-local.s +++ b/lld/test/ELF/mips-gp-local.s @@ -11,7 +11,7 @@ # CHECK-NEXT: 20000: 3c 08 00 03 lui $8, 3 # CHECK-NEXT: 20004: 21 08 7f f0 addi $8, $8, 32752 -# CHECK: 00037ff0 *ABS* 00000000 _gp +# CHECK: 00037ff0 .got 00000000 _gp .text .globl __start diff --git a/lld/test/ELF/mips-gprel32-relocs.s b/lld/test/ELF/mips-gprel32-relocs.s index 4f93d50..da0474c 100644 --- a/lld/test/ELF/mips-gprel32-relocs.s +++ b/lld/test/ELF/mips-gprel32-relocs.s @@ -28,4 +28,4 @@ v1: # CHECK: SYMBOL TABLE: # CHECK: 00010008 .text 00000000 bar # CHECK: 00010004 .text 00000000 foo -# CHECK: 00027ff0 *ABS* 00000000 _gp +# CHECK: 00027ff0 .got 00000000 _gp diff --git a/lld/test/ELF/mips-hilo-gp-disp.s b/lld/test/ELF/mips-hilo-gp-disp.s index 41d09b2..a9c7fd9 100644 --- a/lld/test/ELF/mips-hilo-gp-disp.s +++ b/lld/test/ELF/mips-hilo-gp-disp.s @@ -27,7 +27,7 @@ __start: # EXE: SYMBOL TABLE: # EXE: 00020000 .text 00000000 __start # EXE: 00020010 .text 00000000 _foo -# EXE: 00037ff0 *ABS* 00000000 _gp +# EXE: 00037ff0 .got 00000000 _gp # SO: Disassembly of section .text: # SO-NEXT: __start: @@ -39,4 +39,4 @@ __start: # SO: SYMBOL TABLE: # SO: 00010000 .text 00000000 __start # SO: 00010010 .text 00000000 _foo -# SO: 00027ff0 *ABS* 00000000 _gp +# SO: 00027ff0 .got 00000000 _gp -- 2.7.4