Use DefinedSynthetic for _gp* symbols.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 12 Apr 2016 13:26:51 +0000 (13:26 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 12 Apr 2016 13:26:51 +0000 (13:26 +0000)
The test changes to put _gp* in the .got section matches what both bfd
and gold do.

llvm-svn: 266067

lld/ELF/Symbols.h
lld/ELF/Target.cpp
lld/ELF/Target.h
lld/ELF/Writer.cpp
lld/test/ELF/basic-mips.s
lld/test/ELF/mips-got-relocs.s
lld/test/ELF/mips-gp-disp.s
lld/test/ELF/mips-gp-local.s
lld/test/ELF/mips-gprel32-relocs.s
lld/test/ELF/mips-hilo-gp-disp.s

index b5ade14..1b3cb2d 100644 (file)
@@ -403,10 +403,10 @@ template <class ELFT> struct ElfSym {
   static DefinedRegular<ELFT> *End2;
 
   // The content for _gp symbol for MIPS target.
-  static DefinedRegular<ELFT> *MipsGp;
+  static SymbolBody *MipsGp;
 
-  static DefinedRegular<ELFT> *MipsLocalGp;
-  static DefinedRegular<ELFT> *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 <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::Edata;
 template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::Edata2;
 template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::End;
 template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::End2;
-template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::MipsGp;
-template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::MipsLocalGp;
-template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::MipsGpDisp;
+template <class ELFT> SymbolBody *ElfSym<ELFT>::MipsGp;
+template <class ELFT> SymbolBody *ElfSym<ELFT>::MipsLocalGp;
+template <class ELFT> SymbolBody *ElfSym<ELFT>::MipsGpDisp;
 template <class ELFT> SymbolBody *ElfSym<ELFT>::RelaIpltStart;
 template <class ELFT> SymbolBody *ElfSym<ELFT>::RelaIpltEnd;
 
index bb1297c..ce27273 100644 (file)
@@ -1920,8 +1920,7 @@ bool MipsTargetInfo<ELFT>::isRelRelative(uint32_t Type) const {
 // a location that is relative to GOT. This function returns
 // the value for the symbol.
 template <class ELFT> typename ELFT::uint getMipsGpAddr() {
-  unsigned GPOffset = 0x7ff0;
-  return Out<ELFT>::Got->getVA() + GPOffset;
+  return Out<ELFT>::Got->getVA() + MipsGPOffset;
 }
 
 template uint32_t getMipsGpAddr<ELF32LE>();
index b81db7d..7d23772 100644 (file)
@@ -119,6 +119,7 @@ private:
 
 uint64_t getPPC64TocBase();
 
+const unsigned MipsGPOffset = 0x7ff0;
 template <class ELFT> typename ELFT::uint getMipsGpAddr();
 
 extern TargetInfo *Target;
index d990990..4bbd812 100644 (file)
@@ -795,6 +795,16 @@ bool Writer<ELFT>::isDiscarded(InputSectionBase<ELFT> *S) const {
          Script->isDiscarded(S);
 }
 
+template <class ELFT>
+static SymbolBody *
+addOptionalSynthetic(SymbolTable<ELFT> &Table, StringRef Name,
+                     OutputSectionBase<ELFT> &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<ELFT>::addRelIpltSymbols() {
   if (isOutputDynamic() || !Out<ELFT>::RelaPlt)
     return;
   StringRef S = Config->Rela ? "__rela_iplt_start" : "__rel_iplt_start";
-  if (Symtab.find(S))
-    ElfSym<ELFT>::RelaIpltStart =
-        Symtab.addSynthetic(S, *Out<ELFT>::RelaPlt, 0, STV_HIDDEN);
+  ElfSym<ELFT>::RelaIpltStart =
+      addOptionalSynthetic(Symtab, S, *Out<ELFT>::RelaPlt, 0, STV_HIDDEN);
 
   S = Config->Rela ? "__rela_iplt_end" : "__rel_iplt_end";
-  if (Symtab.find(S))
-    ElfSym<ELFT>::RelaIpltEnd = Symtab.addSynthetic(
-        S, *Out<ELFT>::RelaPlt, DefinedSynthetic<ELFT>::SectionEnd, STV_HIDDEN);
+  ElfSym<ELFT>::RelaIpltEnd =
+      addOptionalSynthetic(Symtab, S, *Out<ELFT>::RelaPlt,
+                           DefinedSynthetic<ELFT>::SectionEnd, STV_HIDDEN);
 }
 
 template <class ELFT> static bool includeInSymtab(const SymbolBody &B) {
@@ -932,16 +941,19 @@ template <class ELFT> void Writer<ELFT>::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<ELFT>::MipsGp = Symtab.addAbsolute("_gp", STV_DEFAULT);
+    ElfSym<ELFT>::MipsGp =
+        Symtab.addSynthetic("_gp", *Out<ELFT>::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<ELFT>::MipsGpDisp = Symtab.addIgnored("_gp_disp");
+    ElfSym<ELFT>::MipsGpDisp = addOptionalSynthetic(
+        Symtab, "_gp_disp", *Out<ELFT>::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<ELFT>::MipsLocalGp = Symtab.addIgnored("__gnu_local_gp");
+    ElfSym<ELFT>::MipsLocalGp = addOptionalSynthetic(
+        Symtab, "__gnu_local_gp", *Out<ELFT>::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 <class ELFT> void Writer<ELFT>::fixAbsoluteSymbols() {
-  // Update MIPS _gp absolute symbol so that it points to the static data.
-
-  if (Config->EMachine == EM_MIPS) {
-    ElfSym<ELFT>::MipsGp->Value = getMipsGpAddr<ELFT>();
-    if (ElfSym<ELFT>::MipsLocalGp)
-      ElfSym<ELFT>::MipsLocalGp->Value = getMipsGpAddr<ELFT>();
-    if (ElfSym<ELFT>::MipsGpDisp)
-      ElfSym<ELFT>::MipsGpDisp->Value = getMipsGpAddr<ELFT>();
-  }
-
   // _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.
index 0a1ff30..1f6dcf2 100644 (file)
@@ -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 [
index 408a085..0933dfe 100644 (file)
@@ -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:
index 2110d7c..823ac5a 100644 (file)
@@ -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: ]
index 50c9865..d8453bc 100644 (file)
@@ -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
index 4f93d50..da0474c 100644 (file)
@@ -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
index 41d09b2..a9c7fd9 100644 (file)
@@ -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