sparc.cc revision 1.1.1.4
1// sparc.cc -- sparc target support for gold.
2
3// Copyright (C) 2008-2015 Free Software Foundation, Inc.
4// Written by David S. Miller <davem@davemloft.net>.
5
6// This file is part of gold.
7
8// This program is free software; you can redistribute it and/or modify
9// it under the terms of the GNU General Public License as published by
10// the Free Software Foundation; either version 3 of the License, or
11// (at your option) any later version.
12
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21// MA 02110-1301, USA.
22
23#include "gold.h"
24
25#include <cstdlib>
26#include <cstdio>
27#include <cstring>
28
29#include "elfcpp.h"
30#include "parameters.h"
31#include "reloc.h"
32#include "sparc.h"
33#include "object.h"
34#include "symtab.h"
35#include "layout.h"
36#include "output.h"
37#include "copy-relocs.h"
38#include "target.h"
39#include "target-reloc.h"
40#include "target-select.h"
41#include "tls.h"
42#include "errors.h"
43#include "gc.h"
44
45namespace
46{
47
48using namespace gold;
49
50template<int size, bool big_endian>
51class Output_data_plt_sparc;
52
53template<int size, bool big_endian>
54class Target_sparc : public Sized_target<size, big_endian>
55{
56 public:
57  typedef Output_data_reloc<elfcpp::SHT_RELA, true, size, big_endian> Reloc_section;
58
59  Target_sparc()
60    : Sized_target<size, big_endian>(&sparc_info),
61      got_(NULL), plt_(NULL), rela_dyn_(NULL), rela_ifunc_(NULL),
62      copy_relocs_(elfcpp::R_SPARC_COPY),
63      got_mod_index_offset_(-1U), tls_get_addr_sym_(NULL),
64      elf_machine_(sparc_info.machine_code), elf_flags_(0),
65      elf_flags_set_(false)
66  {
67  }
68
69  // Process the relocations to determine unreferenced sections for
70  // garbage collection.
71  void
72  gc_process_relocs(Symbol_table* symtab,
73		    Layout* layout,
74		    Sized_relobj_file<size, big_endian>* object,
75		    unsigned int data_shndx,
76		    unsigned int sh_type,
77		    const unsigned char* prelocs,
78		    size_t reloc_count,
79		    Output_section* output_section,
80		    bool needs_special_offset_handling,
81		    size_t local_symbol_count,
82		    const unsigned char* plocal_symbols);
83
84  // Scan the relocations to look for symbol adjustments.
85  void
86  scan_relocs(Symbol_table* symtab,
87	      Layout* layout,
88	      Sized_relobj_file<size, big_endian>* object,
89	      unsigned int data_shndx,
90	      unsigned int sh_type,
91	      const unsigned char* prelocs,
92	      size_t reloc_count,
93	      Output_section* output_section,
94	      bool needs_special_offset_handling,
95	      size_t local_symbol_count,
96	      const unsigned char* plocal_symbols);
97  // Finalize the sections.
98  void
99  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
100
101  // Return the value to use for a dynamic which requires special
102  // treatment.
103  uint64_t
104  do_dynsym_value(const Symbol*) const;
105
106  // Relocate a section.
107  void
108  relocate_section(const Relocate_info<size, big_endian>*,
109		   unsigned int sh_type,
110		   const unsigned char* prelocs,
111		   size_t reloc_count,
112		   Output_section* output_section,
113		   bool needs_special_offset_handling,
114		   unsigned char* view,
115		   typename elfcpp::Elf_types<size>::Elf_Addr view_address,
116		   section_size_type view_size,
117		   const Reloc_symbol_changes*);
118
119  // Scan the relocs during a relocatable link.
120  void
121  scan_relocatable_relocs(Symbol_table* symtab,
122			  Layout* layout,
123			  Sized_relobj_file<size, big_endian>* object,
124			  unsigned int data_shndx,
125			  unsigned int sh_type,
126			  const unsigned char* prelocs,
127			  size_t reloc_count,
128			  Output_section* output_section,
129			  bool needs_special_offset_handling,
130			  size_t local_symbol_count,
131			  const unsigned char* plocal_symbols,
132			  Relocatable_relocs*);
133
134  // Emit relocations for a section.
135  void
136  relocate_relocs(const Relocate_info<size, big_endian>*,
137		  unsigned int sh_type,
138		  const unsigned char* prelocs,
139		  size_t reloc_count,
140		  Output_section* output_section,
141		  typename elfcpp::Elf_types<size>::Elf_Off
142                    offset_in_output_section,
143		  const Relocatable_relocs*,
144		  unsigned char* view,
145		  typename elfcpp::Elf_types<size>::Elf_Addr view_address,
146		  section_size_type view_size,
147		  unsigned char* reloc_view,
148		  section_size_type reloc_view_size);
149
150  // Return whether SYM is defined by the ABI.
151  bool
152  do_is_defined_by_abi(const Symbol* sym) const
153  {
154    // XXX Really need to support this better...
155    if (sym->type() == elfcpp::STT_SPARC_REGISTER)
156      return 1;
157
158    return strcmp(sym->name(), "___tls_get_addr") == 0;
159  }
160
161  // Return the PLT address to use for a global symbol.
162  uint64_t
163  do_plt_address_for_global(const Symbol* gsym) const
164  { return this->plt_section()->address_for_global(gsym); }
165
166  uint64_t
167  do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const
168  { return this->plt_section()->address_for_local(relobj, symndx); }
169
170  // Return whether there is a GOT section.
171  bool
172  has_got_section() const
173  { return this->got_ != NULL; }
174
175  // Return the size of the GOT section.
176  section_size_type
177  got_size() const
178  {
179    gold_assert(this->got_ != NULL);
180    return this->got_->data_size();
181  }
182
183  // Return the number of entries in the GOT.
184  unsigned int
185  got_entry_count() const
186  {
187    if (this->got_ == NULL)
188      return 0;
189    return this->got_size() / (size / 8);
190  }
191
192  // Return the address of the GOT.
193  uint64_t
194  got_address() const
195  {
196    if (this->got_ == NULL)
197      return 0;
198    return this->got_->address();
199  }
200
201  // Return the number of entries in the PLT.
202  unsigned int
203  plt_entry_count() const;
204
205  // Return the offset of the first non-reserved PLT entry.
206  unsigned int
207  first_plt_entry_offset() const;
208
209  // Return the size of each PLT entry.
210  unsigned int
211  plt_entry_size() const;
212
213 protected:
214  // Make an ELF object.
215  Object*
216  do_make_elf_object(const std::string&, Input_file*, off_t,
217		     const elfcpp::Ehdr<size, big_endian>& ehdr);
218
219  void
220  do_adjust_elf_header(unsigned char* view, int len);
221
222 private:
223
224  // The class which scans relocations.
225  class Scan
226  {
227  public:
228    Scan()
229      : issued_non_pic_error_(false)
230    { }
231
232    static inline int
233    get_reference_flags(unsigned int r_type);
234
235    inline void
236    local(Symbol_table* symtab, Layout* layout, Target_sparc* target,
237	  Sized_relobj_file<size, big_endian>* object,
238	  unsigned int data_shndx,
239	  Output_section* output_section,
240	  const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
241	  const elfcpp::Sym<size, big_endian>& lsym,
242	  bool is_discarded);
243
244    inline void
245    global(Symbol_table* symtab, Layout* layout, Target_sparc* target,
246	   Sized_relobj_file<size, big_endian>* object,
247	   unsigned int data_shndx,
248	   Output_section* output_section,
249	   const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
250	   Symbol* gsym);
251
252    inline bool
253    local_reloc_may_be_function_pointer(Symbol_table* , Layout* ,
254					Target_sparc* ,
255					Sized_relobj_file<size, big_endian>* ,
256					unsigned int ,
257					Output_section* ,
258					const elfcpp::Rela<size, big_endian>& ,
259					unsigned int ,
260					const elfcpp::Sym<size, big_endian>&)
261    { return false; }
262
263    inline bool
264    global_reloc_may_be_function_pointer(Symbol_table* , Layout* ,
265					 Target_sparc* ,
266					 Sized_relobj_file<size, big_endian>* ,
267					 unsigned int ,
268					 Output_section* ,
269					 const elfcpp::Rela<size,
270							    big_endian>& ,
271					 unsigned int , Symbol*)
272    { return false; }
273
274
275  private:
276    static void
277    unsupported_reloc_local(Sized_relobj_file<size, big_endian>*,
278			    unsigned int r_type);
279
280    static void
281    unsupported_reloc_global(Sized_relobj_file<size, big_endian>*,
282			     unsigned int r_type, Symbol*);
283
284    static void
285    generate_tls_call(Symbol_table* symtab, Layout* layout,
286		      Target_sparc* target);
287
288    void
289    check_non_pic(Relobj*, unsigned int r_type);
290
291    bool
292    reloc_needs_plt_for_ifunc(Sized_relobj_file<size, big_endian>*,
293			      unsigned int r_type);
294
295    // Whether we have issued an error about a non-PIC compilation.
296    bool issued_non_pic_error_;
297  };
298
299  // The class which implements relocation.
300  class Relocate
301  {
302   public:
303    Relocate()
304      : ignore_gd_add_(false), reloc_adjust_addr_(NULL)
305    { }
306
307    ~Relocate()
308    {
309      if (this->ignore_gd_add_)
310	{
311	  // FIXME: This needs to specify the location somehow.
312	  gold_error(_("missing expected TLS relocation"));
313	}
314    }
315
316    // Do a relocation.  Return false if the caller should not issue
317    // any warnings about this relocation.
318    inline bool
319    relocate(const Relocate_info<size, big_endian>*, Target_sparc*,
320	     Output_section*, size_t relnum,
321	     const elfcpp::Rela<size, big_endian>&,
322	     unsigned int r_type, const Sized_symbol<size>*,
323	     const Symbol_value<size>*,
324	     unsigned char*,
325	     typename elfcpp::Elf_types<size>::Elf_Addr,
326	     section_size_type);
327
328   private:
329    // Do a TLS relocation.
330    inline void
331    relocate_tls(const Relocate_info<size, big_endian>*, Target_sparc* target,
332		 size_t relnum, const elfcpp::Rela<size, big_endian>&,
333		 unsigned int r_type, const Sized_symbol<size>*,
334		 const Symbol_value<size>*,
335		 unsigned char*,
336		 typename elfcpp::Elf_types<size>::Elf_Addr,
337		 section_size_type);
338
339    inline void
340    relax_call(Target_sparc<size, big_endian>* target,
341	       unsigned char* view,
342	       const elfcpp::Rela<size, big_endian>& rela,
343	       section_size_type view_size);
344
345    // Ignore the next relocation which should be R_SPARC_TLS_GD_ADD
346    bool ignore_gd_add_;
347
348    // If we hit a reloc at this view address, adjust it back by 4 bytes.
349    unsigned char *reloc_adjust_addr_;
350  };
351
352  // A class which returns the size required for a relocation type,
353  // used while scanning relocs during a relocatable link.
354  class Relocatable_size_for_reloc
355  {
356   public:
357    unsigned int
358    get_size_for_reloc(unsigned int, Relobj*);
359  };
360
361  // Get the GOT section, creating it if necessary.
362  Output_data_got<size, big_endian>*
363  got_section(Symbol_table*, Layout*);
364
365  // Create the PLT section.
366  void
367  make_plt_section(Symbol_table* symtab, Layout* layout);
368
369  // Create a PLT entry for a global symbol.
370  void
371  make_plt_entry(Symbol_table*, Layout*, Symbol*);
372
373  // Create a PLT entry for a local STT_GNU_IFUNC symbol.
374  void
375  make_local_ifunc_plt_entry(Symbol_table*, Layout*,
376			     Sized_relobj_file<size, big_endian>* relobj,
377			     unsigned int local_sym_index);
378
379  // Create a GOT entry for the TLS module index.
380  unsigned int
381  got_mod_index_entry(Symbol_table* symtab, Layout* layout,
382		      Sized_relobj_file<size, big_endian>* object);
383
384  // Return the gsym for "__tls_get_addr".  Cache if not already
385  // cached.
386  Symbol*
387  tls_get_addr_sym(Symbol_table* symtab)
388  {
389    if (!this->tls_get_addr_sym_)
390      this->tls_get_addr_sym_ = symtab->lookup("__tls_get_addr", NULL);
391    gold_assert(this->tls_get_addr_sym_);
392    return this->tls_get_addr_sym_;
393  }
394
395  // Get the PLT section.
396  Output_data_plt_sparc<size, big_endian>*
397  plt_section() const
398  {
399    gold_assert(this->plt_ != NULL);
400    return this->plt_;
401  }
402
403  // Get the dynamic reloc section, creating it if necessary.
404  Reloc_section*
405  rela_dyn_section(Layout*);
406
407  // Get the section to use for IFUNC relocations.
408  Reloc_section*
409  rela_ifunc_section(Layout*);
410
411  // Copy a relocation against a global symbol.
412  void
413  copy_reloc(Symbol_table* symtab, Layout* layout,
414	     Sized_relobj_file<size, big_endian>* object,
415	     unsigned int shndx, Output_section* output_section,
416	     Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
417  {
418    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
419    this->copy_relocs_.copy_reloc(symtab, layout,
420				  symtab->get_sized_symbol<size>(sym),
421				  object, shndx, output_section,
422				  r_type, reloc.get_r_offset(),
423				  reloc.get_r_addend(),
424				  this->rela_dyn_section(layout));
425  }
426
427  // Information about this specific target which we pass to the
428  // general Target structure.
429  static Target::Target_info sparc_info;
430
431  // The types of GOT entries needed for this platform.
432  // These values are exposed to the ABI in an incremental link.
433  // Do not renumber existing values without changing the version
434  // number of the .gnu_incremental_inputs section.
435  enum Got_type
436  {
437    GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
438    GOT_TYPE_TLS_OFFSET = 1,    // GOT entry for TLS offset
439    GOT_TYPE_TLS_PAIR = 2,      // GOT entry for TLS module/offset pair
440  };
441
442  // The GOT section.
443  Output_data_got<size, big_endian>* got_;
444  // The PLT section.
445  Output_data_plt_sparc<size, big_endian>* plt_;
446  // The dynamic reloc section.
447  Reloc_section* rela_dyn_;
448  // The section to use for IFUNC relocs.
449  Reloc_section* rela_ifunc_;
450  // Relocs saved to avoid a COPY reloc.
451  Copy_relocs<elfcpp::SHT_RELA, size, big_endian> copy_relocs_;
452  // Offset of the GOT entry for the TLS module index;
453  unsigned int got_mod_index_offset_;
454  // Cached pointer to __tls_get_addr symbol
455  Symbol* tls_get_addr_sym_;
456  // Accumulated elf machine type
457  elfcpp::Elf_Half elf_machine_;
458  // Accumulated elf header flags
459  elfcpp::Elf_Word elf_flags_;
460  // Whether elf_flags_ has been set for the first time yet
461  bool elf_flags_set_;
462};
463
464template<>
465Target::Target_info Target_sparc<32, true>::sparc_info =
466{
467  32,			// size
468  true,			// is_big_endian
469  elfcpp::EM_SPARC,	// machine_code
470  false,		// has_make_symbol
471  false,		// has_resolve
472  false,		// has_code_fill
473  true,			// is_default_stack_executable
474  false,		// can_icf_inline_merge_sections
475  '\0',			// wrap_char
476  "/usr/lib/ld.so.1",	// dynamic_linker
477  0x00010000,		// default_text_segment_address
478  64 * 1024,		// abi_pagesize (overridable by -z max-page-size)
479  8 * 1024,		// common_pagesize (overridable by -z common-page-size)
480  false,                // isolate_execinstr
481  0,                    // rosegment_gap
482  elfcpp::SHN_UNDEF,	// small_common_shndx
483  elfcpp::SHN_UNDEF,	// large_common_shndx
484  0,			// small_common_section_flags
485  0,			// large_common_section_flags
486  NULL,			// attributes_section
487  NULL,			// attributes_vendor
488  "_start",		// entry_symbol_name
489  32,			// hash_entry_size
490};
491
492template<>
493Target::Target_info Target_sparc<64, true>::sparc_info =
494{
495  64,			// size
496  true,			// is_big_endian
497  elfcpp::EM_SPARCV9,	// machine_code
498  false,		// has_make_symbol
499  false,		// has_resolve
500  false,		// has_code_fill
501  true,			// is_default_stack_executable
502  false,		// can_icf_inline_merge_sections
503  '\0',			// wrap_char
504  "/usr/lib/sparcv9/ld.so.1",	// dynamic_linker
505  0x100000,		// default_text_segment_address
506  64 * 1024,		// abi_pagesize (overridable by -z max-page-size)
507  8 * 1024,		// common_pagesize (overridable by -z common-page-size)
508  false,                // isolate_execinstr
509  0,                    // rosegment_gap
510  elfcpp::SHN_UNDEF,	// small_common_shndx
511  elfcpp::SHN_UNDEF,	// large_common_shndx
512  0,			// small_common_section_flags
513  0,			// large_common_section_flags
514  NULL,			// attributes_section
515  NULL,			// attributes_vendor
516  "_start",		// entry_symbol_name
517  32,			// hash_entry_size
518};
519
520// We have to take care here, even when operating in little-endian
521// mode, sparc instructions are still big endian.
522template<int size, bool big_endian>
523class Sparc_relocate_functions
524{
525private:
526  // Do a simple relocation with the addend in the relocation.
527  template<int valsize>
528  static inline void
529  rela(unsigned char* view,
530       unsigned int right_shift,
531       typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask,
532       typename elfcpp::Swap<size, big_endian>::Valtype value,
533       typename elfcpp::Swap<size, big_endian>::Valtype addend)
534  {
535    typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
536    Valtype* wv = reinterpret_cast<Valtype*>(view);
537    Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv);
538    Valtype reloc = ((value + addend) >> right_shift);
539
540    val &= ~dst_mask;
541    reloc &= dst_mask;
542
543    elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc);
544  }
545
546  // Do a simple relocation using a symbol value with the addend in
547  // the relocation.
548  template<int valsize>
549  static inline void
550  rela(unsigned char* view,
551       unsigned int right_shift,
552       typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask,
553       const Sized_relobj_file<size, big_endian>* object,
554       const Symbol_value<size>* psymval,
555       typename elfcpp::Swap<valsize, big_endian>::Valtype addend)
556  {
557    typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
558    Valtype* wv = reinterpret_cast<Valtype*>(view);
559    Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv);
560    Valtype reloc = (psymval->value(object, addend) >> right_shift);
561
562    val &= ~dst_mask;
563    reloc &= dst_mask;
564
565    elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc);
566  }
567
568  // Do a simple relocation using a symbol value with the addend in
569  // the relocation, unaligned.
570  template<int valsize>
571  static inline void
572  rela_ua(unsigned char* view,
573	  unsigned int right_shift, elfcpp::Elf_Xword dst_mask,
574	  const Sized_relobj_file<size, big_endian>* object,
575	  const Symbol_value<size>* psymval,
576	  typename elfcpp::Swap<size, big_endian>::Valtype addend)
577  {
578    typedef typename elfcpp::Swap_unaligned<valsize,
579	    big_endian>::Valtype Valtype;
580    unsigned char* wv = view;
581    Valtype val = elfcpp::Swap_unaligned<valsize, big_endian>::readval(wv);
582    Valtype reloc = (psymval->value(object, addend) >> right_shift);
583
584    val &= ~dst_mask;
585    reloc &= dst_mask;
586
587    elfcpp::Swap_unaligned<valsize, big_endian>::writeval(wv, val | reloc);
588  }
589
590  // Do a simple PC relative relocation with a Symbol_value with the
591  // addend in the relocation.
592  template<int valsize>
593  static inline void
594  pcrela(unsigned char* view,
595	 unsigned int right_shift,
596	 typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask,
597	 const Sized_relobj_file<size, big_endian>* object,
598	 const Symbol_value<size>* psymval,
599	 typename elfcpp::Swap<size, big_endian>::Valtype addend,
600	 typename elfcpp::Elf_types<size>::Elf_Addr address)
601  {
602    typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
603    Valtype* wv = reinterpret_cast<Valtype*>(view);
604    Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv);
605    Valtype reloc = ((psymval->value(object, addend) - address)
606		     >> right_shift);
607
608    val &= ~dst_mask;
609    reloc &= dst_mask;
610
611    elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc);
612  }
613
614  template<int valsize>
615  static inline void
616  pcrela_unaligned(unsigned char* view,
617		   const Sized_relobj_file<size, big_endian>* object,
618		   const Symbol_value<size>* psymval,
619		   typename elfcpp::Swap<size, big_endian>::Valtype addend,
620		   typename elfcpp::Elf_types<size>::Elf_Addr address)
621  {
622    typedef typename elfcpp::Swap_unaligned<valsize,
623	    big_endian>::Valtype Valtype;
624    unsigned char* wv = view;
625    Valtype reloc = (psymval->value(object, addend) - address);
626
627    elfcpp::Swap_unaligned<valsize, big_endian>::writeval(wv, reloc);
628  }
629
630  typedef Sparc_relocate_functions<size, big_endian> This;
631  typedef Sparc_relocate_functions<size, true> This_insn;
632
633public:
634  // R_SPARC_WDISP30: (Symbol + Addend - Address) >> 2
635  static inline void
636  wdisp30(unsigned char* view,
637	   const Sized_relobj_file<size, big_endian>* object,
638	   const Symbol_value<size>* psymval,
639	   typename elfcpp::Elf_types<size>::Elf_Addr addend,
640	   typename elfcpp::Elf_types<size>::Elf_Addr address)
641  {
642    This_insn::template pcrela<32>(view, 2, 0x3fffffff, object,
643				   psymval, addend, address);
644  }
645
646  // R_SPARC_WDISP22: (Symbol + Addend - Address) >> 2
647  static inline void
648  wdisp22(unsigned char* view,
649	   const Sized_relobj_file<size, big_endian>* object,
650	   const Symbol_value<size>* psymval,
651	   typename elfcpp::Elf_types<size>::Elf_Addr addend,
652	   typename elfcpp::Elf_types<size>::Elf_Addr address)
653  {
654    This_insn::template pcrela<32>(view, 2, 0x003fffff, object,
655				   psymval, addend, address);
656  }
657
658  // R_SPARC_WDISP19: (Symbol + Addend - Address) >> 2
659  static inline void
660  wdisp19(unsigned char* view,
661	  const Sized_relobj_file<size, big_endian>* object,
662	  const Symbol_value<size>* psymval,
663	  typename elfcpp::Elf_types<size>::Elf_Addr addend,
664	  typename elfcpp::Elf_types<size>::Elf_Addr address)
665  {
666    This_insn::template pcrela<32>(view, 2, 0x0007ffff, object,
667				   psymval, addend, address);
668  }
669
670  // R_SPARC_WDISP16: (Symbol + Addend - Address) >> 2
671  static inline void
672  wdisp16(unsigned char* view,
673	  const Sized_relobj_file<size, big_endian>* object,
674	  const Symbol_value<size>* psymval,
675	  typename elfcpp::Elf_types<size>::Elf_Addr addend,
676	  typename elfcpp::Elf_types<size>::Elf_Addr address)
677  {
678    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
679    Valtype* wv = reinterpret_cast<Valtype*>(view);
680    Valtype val = elfcpp::Swap<32, true>::readval(wv);
681    Valtype reloc = ((psymval->value(object, addend) - address)
682		     >> 2);
683
684    // The relocation value is split between the low 14 bits,
685    // and bits 20-21.
686    val &= ~((0x3 << 20) | 0x3fff);
687    reloc = (((reloc & 0xc000) << (20 - 14))
688	     | (reloc & 0x3ffff));
689
690    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
691  }
692
693  // R_SPARC_WDISP10: (Symbol + Addend - Address) >> 2
694  static inline void
695  wdisp10(unsigned char* view,
696	  const Sized_relobj_file<size, big_endian>* object,
697	  const Symbol_value<size>* psymval,
698	  typename elfcpp::Elf_types<size>::Elf_Addr addend,
699	  typename elfcpp::Elf_types<size>::Elf_Addr address)
700  {
701    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
702    Valtype* wv = reinterpret_cast<Valtype*>(view);
703    Valtype val = elfcpp::Swap<32, true>::readval(wv);
704    Valtype reloc = ((psymval->value(object, addend) - address)
705		     >> 2);
706
707    // The relocation value is split between the low bits 5-12,
708    // and high bits 19-20.
709    val &= ~((0x3 << 19) | (0xff << 5));
710    reloc = (((reloc & 0x300) << (19 - 8))
711	     | ((reloc & 0xff) << (5 - 0)));
712
713    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
714  }
715
716  // R_SPARC_PC22: (Symbol + Addend - Address) >> 10
717  static inline void
718  pc22(unsigned char* view,
719       const Sized_relobj_file<size, big_endian>* object,
720       const Symbol_value<size>* psymval,
721       typename elfcpp::Elf_types<size>::Elf_Addr addend,
722       typename elfcpp::Elf_types<size>::Elf_Addr address)
723  {
724    This_insn::template pcrela<32>(view, 10, 0x003fffff, object,
725				   psymval, addend, address);
726  }
727
728  // R_SPARC_PC10: (Symbol + Addend - Address) & 0x3ff
729  static inline void
730  pc10(unsigned char* view,
731       const Sized_relobj_file<size, big_endian>* object,
732       const Symbol_value<size>* psymval,
733       typename elfcpp::Elf_types<size>::Elf_Addr addend,
734       typename elfcpp::Elf_types<size>::Elf_Addr address)
735  {
736    This_insn::template pcrela<32>(view, 0, 0x000003ff, object,
737				   psymval, addend, address);
738  }
739
740  // R_SPARC_HI22: (Symbol + Addend) >> 10
741  static inline void
742  hi22(unsigned char* view,
743       typename elfcpp::Elf_types<size>::Elf_Addr value,
744       typename elfcpp::Elf_types<size>::Elf_Addr addend)
745  {
746    This_insn::template rela<32>(view, 10, 0x003fffff, value, addend);
747  }
748
749  // R_SPARC_HI22: (Symbol + Addend) >> 10
750  static inline void
751  hi22(unsigned char* view,
752       const Sized_relobj_file<size, big_endian>* object,
753       const Symbol_value<size>* psymval,
754       typename elfcpp::Elf_types<size>::Elf_Addr addend)
755  {
756    This_insn::template rela<32>(view, 10, 0x003fffff, object, psymval, addend);
757  }
758
759  // R_SPARC_PCPLT22: (Symbol + Addend - Address) >> 10
760  static inline void
761  pcplt22(unsigned char* view,
762	  const Sized_relobj_file<size, big_endian>* object,
763	  const Symbol_value<size>* psymval,
764	  typename elfcpp::Elf_types<size>::Elf_Addr addend,
765	  typename elfcpp::Elf_types<size>::Elf_Addr address)
766  {
767    This_insn::template pcrela<32>(view, 10, 0x003fffff, object,
768				   psymval, addend, address);
769  }
770
771  // R_SPARC_LO10: (Symbol + Addend) & 0x3ff
772  static inline void
773  lo10(unsigned char* view,
774       typename elfcpp::Elf_types<size>::Elf_Addr value,
775       typename elfcpp::Elf_types<size>::Elf_Addr addend)
776  {
777    This_insn::template rela<32>(view, 0, 0x000003ff, value, addend);
778  }
779
780  // R_SPARC_LO10: (Symbol + Addend) & 0x3ff
781  static inline void
782  lo10(unsigned char* view,
783       const Sized_relobj_file<size, big_endian>* object,
784       const Symbol_value<size>* psymval,
785       typename elfcpp::Elf_types<size>::Elf_Addr addend)
786  {
787    This_insn::template rela<32>(view, 0, 0x000003ff, object, psymval, addend);
788  }
789
790  // R_SPARC_LO10: (Symbol + Addend) & 0x3ff
791  static inline void
792  lo10(unsigned char* view,
793       const Sized_relobj_file<size, big_endian>* object,
794       const Symbol_value<size>* psymval,
795       typename elfcpp::Elf_types<size>::Elf_Addr addend,
796       typename elfcpp::Elf_types<size>::Elf_Addr address)
797  {
798    This_insn::template pcrela<32>(view, 0, 0x000003ff, object,
799				   psymval, addend, address);
800  }
801
802  // R_SPARC_OLO10: ((Symbol + Addend) & 0x3ff) + Addend2
803  static inline void
804  olo10(unsigned char* view,
805	const Sized_relobj_file<size, big_endian>* object,
806	const Symbol_value<size>* psymval,
807	typename elfcpp::Elf_types<size>::Elf_Addr addend,
808	typename elfcpp::Elf_types<size>::Elf_Addr addend2)
809  {
810    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
811    Valtype* wv = reinterpret_cast<Valtype*>(view);
812    Valtype val = elfcpp::Swap<32, true>::readval(wv);
813    Valtype reloc = psymval->value(object, addend);
814
815    val &= ~0x1fff;
816    reloc &= 0x3ff;
817    reloc += addend2;
818    reloc &= 0x1fff;
819
820    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
821  }
822
823  // R_SPARC_22: (Symbol + Addend)
824  static inline void
825  rela32_22(unsigned char* view,
826	    const Sized_relobj_file<size, big_endian>* object,
827	    const Symbol_value<size>* psymval,
828	    typename elfcpp::Elf_types<size>::Elf_Addr addend)
829  {
830    This_insn::template rela<32>(view, 0, 0x003fffff, object, psymval, addend);
831  }
832
833  // R_SPARC_13: (Symbol + Addend)
834  static inline void
835  rela32_13(unsigned char* view,
836	    typename elfcpp::Elf_types<size>::Elf_Addr value,
837	    typename elfcpp::Elf_types<size>::Elf_Addr addend)
838  {
839    This_insn::template rela<32>(view, 0, 0x00001fff, value, addend);
840  }
841
842  // R_SPARC_13: (Symbol + Addend)
843  static inline void
844  rela32_13(unsigned char* view,
845	    const Sized_relobj_file<size, big_endian>* object,
846	    const Symbol_value<size>* psymval,
847	    typename elfcpp::Elf_types<size>::Elf_Addr addend)
848  {
849    This_insn::template rela<32>(view, 0, 0x00001fff, object, psymval, addend);
850  }
851
852  // R_SPARC_UA16: (Symbol + Addend)
853  static inline void
854  ua16(unsigned char* view,
855       const Sized_relobj_file<size, big_endian>* object,
856       const Symbol_value<size>* psymval,
857       typename elfcpp::Elf_types<size>::Elf_Addr addend)
858  {
859    This::template rela_ua<16>(view, 0, 0xffff, object, psymval, addend);
860  }
861
862  // R_SPARC_UA32: (Symbol + Addend)
863  static inline void
864  ua32(unsigned char* view,
865       const Sized_relobj_file<size, big_endian>* object,
866       const Symbol_value<size>* psymval,
867       typename elfcpp::Elf_types<size>::Elf_Addr addend)
868  {
869    This::template rela_ua<32>(view, 0, 0xffffffff, object, psymval, addend);
870  }
871
872  // R_SPARC_UA64: (Symbol + Addend)
873  static inline void
874  ua64(unsigned char* view,
875       const Sized_relobj_file<size, big_endian>* object,
876       const Symbol_value<size>* psymval,
877       typename elfcpp::Elf_types<size>::Elf_Addr addend)
878  {
879    This::template rela_ua<64>(view, 0, ~(elfcpp::Elf_Xword) 0,
880			       object, psymval, addend);
881  }
882
883  // R_SPARC_DISP8: (Symbol + Addend - Address)
884  static inline void
885  disp8(unsigned char* view,
886	const Sized_relobj_file<size, big_endian>* object,
887	const Symbol_value<size>* psymval,
888	typename elfcpp::Elf_types<size>::Elf_Addr addend,
889	typename elfcpp::Elf_types<size>::Elf_Addr address)
890  {
891    This::template pcrela_unaligned<8>(view, object, psymval,
892				       addend, address);
893  }
894
895  // R_SPARC_DISP16: (Symbol + Addend - Address)
896  static inline void
897  disp16(unsigned char* view,
898	 const Sized_relobj_file<size, big_endian>* object,
899	 const Symbol_value<size>* psymval,
900	 typename elfcpp::Elf_types<size>::Elf_Addr addend,
901	 typename elfcpp::Elf_types<size>::Elf_Addr address)
902  {
903    This::template pcrela_unaligned<16>(view, object, psymval,
904					addend, address);
905  }
906
907  // R_SPARC_DISP32: (Symbol + Addend - Address)
908  static inline void
909  disp32(unsigned char* view,
910	 const Sized_relobj_file<size, big_endian>* object,
911	 const Symbol_value<size>* psymval,
912	 typename elfcpp::Elf_types<size>::Elf_Addr addend,
913	 typename elfcpp::Elf_types<size>::Elf_Addr address)
914  {
915    This::template pcrela_unaligned<32>(view, object, psymval,
916					addend, address);
917  }
918
919  // R_SPARC_DISP64: (Symbol + Addend - Address)
920  static inline void
921  disp64(unsigned char* view,
922	 const Sized_relobj_file<size, big_endian>* object,
923	 const Symbol_value<size>* psymval,
924	 elfcpp::Elf_Xword addend,
925	 typename elfcpp::Elf_types<size>::Elf_Addr address)
926  {
927    This::template pcrela_unaligned<64>(view, object, psymval,
928					addend, address);
929  }
930
931  // R_SPARC_H34: (Symbol + Addend) >> 12
932  static inline void
933  h34(unsigned char* view,
934      const Sized_relobj_file<size, big_endian>* object,
935      const Symbol_value<size>* psymval,
936      typename elfcpp::Elf_types<size>::Elf_Addr  addend)
937  {
938    This_insn::template rela<32>(view, 12, 0x003fffff, object, psymval, addend);
939  }
940
941  // R_SPARC_H44: (Symbol + Addend) >> 22
942  static inline void
943  h44(unsigned char* view,
944      const Sized_relobj_file<size, big_endian>* object,
945      const Symbol_value<size>* psymval,
946      typename elfcpp::Elf_types<size>::Elf_Addr  addend)
947  {
948    This_insn::template rela<32>(view, 22, 0x003fffff, object, psymval, addend);
949  }
950
951  // R_SPARC_M44: ((Symbol + Addend) >> 12) & 0x3ff
952  static inline void
953  m44(unsigned char* view,
954      const Sized_relobj_file<size, big_endian>* object,
955      const Symbol_value<size>* psymval,
956      typename elfcpp::Elf_types<size>::Elf_Addr  addend)
957  {
958    This_insn::template rela<32>(view, 12, 0x000003ff, object, psymval, addend);
959  }
960
961  // R_SPARC_L44: (Symbol + Addend) & 0xfff
962  static inline void
963  l44(unsigned char* view,
964      const Sized_relobj_file<size, big_endian>* object,
965      const Symbol_value<size>* psymval,
966      typename elfcpp::Elf_types<size>::Elf_Addr  addend)
967  {
968    This_insn::template rela<32>(view, 0, 0x00000fff, object, psymval, addend);
969  }
970
971  // R_SPARC_HH22: (Symbol + Addend) >> 42
972  static inline void
973  hh22(unsigned char* view,
974       const Sized_relobj_file<size, big_endian>* object,
975       const Symbol_value<size>* psymval,
976       typename elfcpp::Elf_types<size>::Elf_Addr addend)
977  {
978    This_insn::template rela<32>(view, 42, 0x003fffff, object, psymval, addend);
979  }
980
981  // R_SPARC_PC_HH22: (Symbol + Addend - Address) >> 42
982  static inline void
983  pc_hh22(unsigned char* view,
984	  const Sized_relobj_file<size, big_endian>* object,
985	  const Symbol_value<size>* psymval,
986	  typename elfcpp::Elf_types<size>::Elf_Addr addend,
987	  typename elfcpp::Elf_types<size>::Elf_Addr address)
988  {
989    This_insn::template pcrela<32>(view, 42, 0x003fffff, object,
990				   psymval, addend, address);
991  }
992
993  // R_SPARC_HM10: ((Symbol + Addend) >> 32) & 0x3ff
994  static inline void
995  hm10(unsigned char* view,
996       const Sized_relobj_file<size, big_endian>* object,
997       const Symbol_value<size>* psymval,
998       typename elfcpp::Elf_types<size>::Elf_Addr addend)
999  {
1000    This_insn::template rela<32>(view, 32, 0x000003ff, object, psymval, addend);
1001  }
1002
1003  // R_SPARC_PC_HM10: ((Symbol + Addend - Address) >> 32) & 0x3ff
1004  static inline void
1005  pc_hm10(unsigned char* view,
1006	  const Sized_relobj_file<size, big_endian>* object,
1007	  const Symbol_value<size>* psymval,
1008	  typename elfcpp::Elf_types<size>::Elf_Addr addend,
1009	  typename elfcpp::Elf_types<size>::Elf_Addr address)
1010  {
1011    This_insn::template pcrela<32>(view, 32, 0x000003ff, object,
1012				   psymval, addend, address);
1013  }
1014
1015  // R_SPARC_11: (Symbol + Addend)
1016  static inline void
1017  rela32_11(unsigned char* view,
1018	    const Sized_relobj_file<size, big_endian>* object,
1019	    const Symbol_value<size>* psymval,
1020	    typename elfcpp::Elf_types<size>::Elf_Addr addend)
1021  {
1022    This_insn::template rela<32>(view, 0, 0x000007ff, object, psymval, addend);
1023  }
1024
1025  // R_SPARC_10: (Symbol + Addend)
1026  static inline void
1027  rela32_10(unsigned char* view,
1028	    const Sized_relobj_file<size, big_endian>* object,
1029	    const Symbol_value<size>* psymval,
1030	    typename elfcpp::Elf_types<size>::Elf_Addr addend)
1031  {
1032    This_insn::template rela<32>(view, 0, 0x000003ff, object, psymval, addend);
1033  }
1034
1035  // R_SPARC_7: (Symbol + Addend)
1036  static inline void
1037  rela32_7(unsigned char* view,
1038	   const Sized_relobj_file<size, big_endian>* object,
1039	   const Symbol_value<size>* psymval,
1040	   typename elfcpp::Elf_types<size>::Elf_Addr addend)
1041  {
1042    This_insn::template rela<32>(view, 0, 0x0000007f, object, psymval, addend);
1043  }
1044
1045  // R_SPARC_6: (Symbol + Addend)
1046  static inline void
1047  rela32_6(unsigned char* view,
1048	   const Sized_relobj_file<size, big_endian>* object,
1049	   const Symbol_value<size>* psymval,
1050	   typename elfcpp::Elf_types<size>::Elf_Addr addend)
1051  {
1052    This_insn::template rela<32>(view, 0, 0x0000003f, object, psymval, addend);
1053  }
1054
1055  // R_SPARC_5: (Symbol + Addend)
1056  static inline void
1057  rela32_5(unsigned char* view,
1058	   const Sized_relobj_file<size, big_endian>* object,
1059	   const Symbol_value<size>* psymval,
1060	   typename elfcpp::Elf_types<size>::Elf_Addr addend)
1061  {
1062    This_insn::template rela<32>(view, 0, 0x0000001f, object, psymval, addend);
1063  }
1064
1065  // R_SPARC_TLS_LDO_HIX22: @dtpoff(Symbol + Addend) >> 10
1066  static inline void
1067  ldo_hix22(unsigned char* view,
1068	    typename elfcpp::Elf_types<size>::Elf_Addr value,
1069	    typename elfcpp::Elf_types<size>::Elf_Addr addend)
1070  {
1071    This_insn::hi22(view, value, addend);
1072  }
1073
1074  // R_SPARC_TLS_LDO_LOX10: @dtpoff(Symbol + Addend) & 0x3ff
1075  static inline void
1076  ldo_lox10(unsigned char* view,
1077	    typename elfcpp::Elf_types<size>::Elf_Addr value,
1078	    typename elfcpp::Elf_types<size>::Elf_Addr addend)
1079  {
1080    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
1081    Valtype* wv = reinterpret_cast<Valtype*>(view);
1082    Valtype val = elfcpp::Swap<32, true>::readval(wv);
1083    Valtype reloc = (value + addend);
1084
1085    val &= ~0x1fff;
1086    reloc &= 0x3ff;
1087
1088    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
1089  }
1090
1091  // R_SPARC_TLS_LE_HIX22: (@tpoff(Symbol + Addend) ^ 0xffffffffffffffff) >> 10
1092  static inline void
1093  hix22(unsigned char* view,
1094	typename elfcpp::Elf_types<size>::Elf_Addr value,
1095	typename elfcpp::Elf_types<size>::Elf_Addr addend)
1096  {
1097    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
1098    Valtype* wv = reinterpret_cast<Valtype*>(view);
1099    Valtype val = elfcpp::Swap<32, true>::readval(wv);
1100    Valtype reloc = (value + addend);
1101
1102    val &= ~0x3fffff;
1103
1104    reloc ^= ~(Valtype)0;
1105    reloc >>= 10;
1106
1107    reloc &= 0x3fffff;
1108
1109    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
1110  }
1111
1112  // R_SPARC_GOTDATA_OP_HIX22: @gdopoff(Symbol + Addend) >> 10
1113  static inline void
1114  gdop_hix22(unsigned char* view,
1115	     typename elfcpp::Elf_types<size>::Elf_Addr value)
1116  {
1117    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
1118    Valtype* wv = reinterpret_cast<Valtype*>(view);
1119    Valtype val = elfcpp::Swap<32, true>::readval(wv);
1120    int32_t reloc = static_cast<int32_t>(value);
1121
1122    val &= ~0x3fffff;
1123
1124    if (reloc < 0)
1125      reloc ^= ~static_cast<int32_t>(0);
1126    reloc >>= 10;
1127
1128    reloc &= 0x3fffff;
1129
1130    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
1131  }
1132
1133  // R_SPARC_HIX22: ((Symbol + Addend) ^ 0xffffffffffffffff) >> 10
1134  static inline void
1135  hix22(unsigned char* view,
1136	const Sized_relobj_file<size, big_endian>* object,
1137	const Symbol_value<size>* psymval,
1138	typename elfcpp::Elf_types<size>::Elf_Addr addend)
1139  {
1140    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
1141    Valtype* wv = reinterpret_cast<Valtype*>(view);
1142    Valtype val = elfcpp::Swap<32, true>::readval(wv);
1143    Valtype reloc = psymval->value(object, addend);
1144
1145    val &= ~0x3fffff;
1146
1147    reloc ^= ~(Valtype)0;
1148    reloc >>= 10;
1149
1150    reloc &= 0x3fffff;
1151
1152    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
1153  }
1154
1155
1156  // R_SPARC_TLS_LE_LOX10: (@tpoff(Symbol + Addend) & 0x3ff) | 0x1c00
1157  static inline void
1158  lox10(unsigned char* view,
1159	typename elfcpp::Elf_types<size>::Elf_Addr value,
1160	typename elfcpp::Elf_types<size>::Elf_Addr addend)
1161  {
1162    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
1163    Valtype* wv = reinterpret_cast<Valtype*>(view);
1164    Valtype val = elfcpp::Swap<32, true>::readval(wv);
1165    Valtype reloc = (value + addend);
1166
1167    val &= ~0x1fff;
1168    reloc &= 0x3ff;
1169    reloc |= 0x1c00;
1170
1171    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
1172  }
1173
1174  // R_SPARC_GOTDATA_OP_LOX10: (@gdopoff(Symbol + Addend) & 0x3ff) | 0x1c00
1175  static inline void
1176  gdop_lox10(unsigned char* view,
1177	     typename elfcpp::Elf_types<size>::Elf_Addr value)
1178  {
1179    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
1180    Valtype* wv = reinterpret_cast<Valtype*>(view);
1181    Valtype val = elfcpp::Swap<32, true>::readval(wv);
1182    int32_t reloc = static_cast<int32_t>(value);
1183
1184    if (reloc < 0)
1185      reloc = (reloc & 0x3ff) | 0x1c00;
1186    else
1187      reloc = (reloc & 0x3ff);
1188
1189    val &= ~0x1fff;
1190    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
1191  }
1192
1193  // R_SPARC_LOX10: ((Symbol + Addend) & 0x3ff) | 0x1c00
1194  static inline void
1195  lox10(unsigned char* view,
1196	const Sized_relobj_file<size, big_endian>* object,
1197	const Symbol_value<size>* psymval,
1198	typename elfcpp::Elf_types<size>::Elf_Addr addend)
1199  {
1200    typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
1201    Valtype* wv = reinterpret_cast<Valtype*>(view);
1202    Valtype val = elfcpp::Swap<32, true>::readval(wv);
1203    Valtype reloc = psymval->value(object, addend);
1204
1205    val &= ~0x1fff;
1206    reloc &= 0x3ff;
1207    reloc |= 0x1c00;
1208
1209    elfcpp::Swap<32, true>::writeval(wv, val | reloc);
1210  }
1211};
1212
1213// Get the GOT section, creating it if necessary.
1214
1215template<int size, bool big_endian>
1216Output_data_got<size, big_endian>*
1217Target_sparc<size, big_endian>::got_section(Symbol_table* symtab,
1218					    Layout* layout)
1219{
1220  if (this->got_ == NULL)
1221    {
1222      gold_assert(symtab != NULL && layout != NULL);
1223
1224      this->got_ = new Output_data_got<size, big_endian>();
1225
1226      layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
1227				      (elfcpp::SHF_ALLOC
1228				       | elfcpp::SHF_WRITE),
1229				      this->got_, ORDER_RELRO, true);
1230
1231      // Define _GLOBAL_OFFSET_TABLE_ at the start of the .got section.
1232      symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
1233				    Symbol_table::PREDEFINED,
1234				    this->got_,
1235				    0, 0, elfcpp::STT_OBJECT,
1236				    elfcpp::STB_LOCAL,
1237				    elfcpp::STV_HIDDEN, 0,
1238				    false, false);
1239    }
1240
1241  return this->got_;
1242}
1243
1244// Get the dynamic reloc section, creating it if necessary.
1245
1246template<int size, bool big_endian>
1247typename Target_sparc<size, big_endian>::Reloc_section*
1248Target_sparc<size, big_endian>::rela_dyn_section(Layout* layout)
1249{
1250  if (this->rela_dyn_ == NULL)
1251    {
1252      gold_assert(layout != NULL);
1253      this->rela_dyn_ = new Reloc_section(parameters->options().combreloc());
1254      layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA,
1255				      elfcpp::SHF_ALLOC, this->rela_dyn_,
1256				      ORDER_DYNAMIC_RELOCS, false);
1257    }
1258  return this->rela_dyn_;
1259}
1260
1261// Get the section to use for IFUNC relocs, creating it if
1262// necessary.  These go in .rela.dyn, but only after all other dynamic
1263// relocations.  They need to follow the other dynamic relocations so
1264// that they can refer to global variables initialized by those
1265// relocs.
1266
1267template<int size, bool big_endian>
1268typename Target_sparc<size, big_endian>::Reloc_section*
1269Target_sparc<size, big_endian>::rela_ifunc_section(Layout* layout)
1270{
1271  if (this->rela_ifunc_ == NULL)
1272    {
1273      // Make sure we have already created the dynamic reloc section.
1274      this->rela_dyn_section(layout);
1275      this->rela_ifunc_ = new Reloc_section(false);
1276      layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA,
1277				      elfcpp::SHF_ALLOC, this->rela_ifunc_,
1278				      ORDER_DYNAMIC_RELOCS, false);
1279      gold_assert(this->rela_dyn_->output_section()
1280		  == this->rela_ifunc_->output_section());
1281    }
1282  return this->rela_ifunc_;
1283}
1284
1285// A class to handle the PLT data.
1286
1287template<int size, bool big_endian>
1288class Output_data_plt_sparc : public Output_section_data
1289{
1290 public:
1291  typedef Output_data_reloc<elfcpp::SHT_RELA, true,
1292			    size, big_endian> Reloc_section;
1293
1294  Output_data_plt_sparc(Layout*);
1295
1296  // Add an entry to the PLT.
1297  void add_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym);
1298
1299  // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
1300  unsigned int
1301  add_local_ifunc_entry(Symbol_table*, Layout*,
1302			Sized_relobj_file<size, big_endian>* relobj,
1303			unsigned int local_sym_index);
1304
1305  // Return the .rela.plt section data.
1306  const Reloc_section* rel_plt() const
1307  {
1308    return this->rel_;
1309  }
1310
1311  // Return where the IFUNC relocations should go.
1312  Reloc_section*
1313  rela_ifunc(Symbol_table*, Layout*);
1314
1315  void
1316  emit_pending_ifunc_relocs();
1317
1318  // Return whether we created a section for IFUNC relocations.
1319  bool
1320  has_ifunc_section() const
1321  { return this->ifunc_rel_ != NULL; }
1322
1323  // Return the number of PLT entries.
1324  unsigned int
1325  entry_count() const
1326  { return this->count_ + this->ifunc_count_; }
1327
1328  // Return the offset of the first non-reserved PLT entry.
1329  static unsigned int
1330  first_plt_entry_offset()
1331  { return 4 * base_plt_entry_size; }
1332
1333  // Return the size of a PLT entry.
1334  static unsigned int
1335  get_plt_entry_size()
1336  { return base_plt_entry_size; }
1337
1338  // Return the PLT address to use for a global symbol.
1339  uint64_t
1340  address_for_global(const Symbol*);
1341
1342  // Return the PLT address to use for a local symbol.
1343  uint64_t
1344  address_for_local(const Relobj*, unsigned int symndx);
1345
1346 protected:
1347  void do_adjust_output_section(Output_section* os);
1348
1349  // Write to a map file.
1350  void
1351  do_print_to_mapfile(Mapfile* mapfile) const
1352  { mapfile->print_output_data(this, _("** PLT")); }
1353
1354 private:
1355  // The size of an entry in the PLT.
1356  static const int base_plt_entry_size = (size == 32 ? 12 : 32);
1357
1358  static const unsigned int plt_entries_per_block = 160;
1359  static const unsigned int plt_insn_chunk_size = 24;
1360  static const unsigned int plt_pointer_chunk_size = 8;
1361  static const unsigned int plt_block_size =
1362    (plt_entries_per_block
1363     * (plt_insn_chunk_size + plt_pointer_chunk_size));
1364
1365  section_offset_type
1366  plt_index_to_offset(unsigned int index)
1367  {
1368    section_offset_type offset;
1369
1370    if (size == 32 || index < 32768)
1371      offset = index * base_plt_entry_size;
1372    else
1373      {
1374	unsigned int ext_index = index - 32768;
1375
1376	offset = (32768 * base_plt_entry_size)
1377	  + ((ext_index / plt_entries_per_block)
1378	     * plt_block_size)
1379	  + ((ext_index % plt_entries_per_block)
1380	     * plt_insn_chunk_size);
1381      }
1382    return offset;
1383  }
1384
1385  // Set the final size.
1386  void
1387  set_final_data_size()
1388  {
1389    unsigned int full_count = this->entry_count() + 4;
1390    unsigned int extra = (size == 32 ? 4 : 0);
1391    section_offset_type sz = plt_index_to_offset(full_count) + extra;
1392
1393    return this->set_data_size(sz);
1394  }
1395
1396  // Write out the PLT data.
1397  void
1398  do_write(Output_file*);
1399
1400  struct Global_ifunc
1401  {
1402    Reloc_section* rel;
1403    Symbol* gsym;
1404    unsigned int plt_index;
1405  };
1406
1407  struct Local_ifunc
1408  {
1409    Reloc_section* rel;
1410    Sized_relobj_file<size, big_endian>* object;
1411    unsigned int local_sym_index;
1412    unsigned int plt_index;
1413  };
1414
1415  // The reloc section.
1416  Reloc_section* rel_;
1417  // The IFUNC relocations, if necessary.  These must follow the
1418  // regular relocations.
1419  Reloc_section* ifunc_rel_;
1420  // The number of PLT entries.
1421  unsigned int count_;
1422  // The number of PLT entries for IFUNC symbols.
1423  unsigned int ifunc_count_;
1424  // Global STT_GNU_IFUNC symbols.
1425  std::vector<Global_ifunc> global_ifuncs_;
1426  // Local STT_GNU_IFUNC symbols.
1427  std::vector<Local_ifunc> local_ifuncs_;
1428};
1429
1430// Define the constants as required by C++ standard.
1431
1432template<int size, bool big_endian>
1433const int Output_data_plt_sparc<size, big_endian>::base_plt_entry_size;
1434
1435template<int size, bool big_endian>
1436const unsigned int
1437Output_data_plt_sparc<size, big_endian>::plt_entries_per_block;
1438
1439template<int size, bool big_endian>
1440const unsigned int Output_data_plt_sparc<size, big_endian>::plt_insn_chunk_size;
1441
1442template<int size, bool big_endian>
1443const unsigned int
1444Output_data_plt_sparc<size, big_endian>::plt_pointer_chunk_size;
1445
1446template<int size, bool big_endian>
1447const unsigned int Output_data_plt_sparc<size, big_endian>::plt_block_size;
1448
1449// Create the PLT section.  The ordinary .got section is an argument,
1450// since we need to refer to the start.
1451
1452template<int size, bool big_endian>
1453Output_data_plt_sparc<size, big_endian>::Output_data_plt_sparc(Layout* layout)
1454  : Output_section_data(size == 32 ? 4 : 8), ifunc_rel_(NULL),
1455    count_(0), ifunc_count_(0), global_ifuncs_(), local_ifuncs_()
1456{
1457  this->rel_ = new Reloc_section(false);
1458  layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA,
1459				  elfcpp::SHF_ALLOC, this->rel_,
1460				  ORDER_DYNAMIC_PLT_RELOCS, false);
1461}
1462
1463template<int size, bool big_endian>
1464void
1465Output_data_plt_sparc<size, big_endian>::do_adjust_output_section(Output_section* os)
1466{
1467  os->set_entsize(0);
1468}
1469
1470// Add an entry to the PLT.
1471
1472template<int size, bool big_endian>
1473void
1474Output_data_plt_sparc<size, big_endian>::add_entry(Symbol_table* symtab,
1475						   Layout* layout,
1476						   Symbol* gsym)
1477{
1478  gold_assert(!gsym->has_plt_offset());
1479
1480  section_offset_type plt_offset;
1481  unsigned int index;
1482
1483  if (gsym->type() == elfcpp::STT_GNU_IFUNC
1484      && gsym->can_use_relative_reloc(false))
1485    {
1486      index = this->ifunc_count_;
1487      plt_offset = plt_index_to_offset(index);
1488      gsym->set_plt_offset(plt_offset);
1489      ++this->ifunc_count_;
1490      Reloc_section* rel = this->rela_ifunc(symtab, layout);
1491
1492      struct Global_ifunc gi;
1493      gi.rel = rel;
1494      gi.gsym = gsym;
1495      gi.plt_index = index;
1496      this->global_ifuncs_.push_back(gi);
1497    }
1498  else
1499    {
1500      plt_offset = plt_index_to_offset(this->count_ + 4);
1501      gsym->set_plt_offset(plt_offset);
1502      ++this->count_;
1503      gsym->set_needs_dynsym_entry();
1504      this->rel_->add_global(gsym, elfcpp::R_SPARC_JMP_SLOT, this,
1505			     plt_offset, 0);
1506    }
1507
1508  // Note that we don't need to save the symbol.  The contents of the
1509  // PLT are independent of which symbols are used.  The symbols only
1510  // appear in the relocations.
1511}
1512
1513template<int size, bool big_endian>
1514unsigned int
1515Output_data_plt_sparc<size, big_endian>::add_local_ifunc_entry(
1516    Symbol_table* symtab,
1517    Layout* layout,
1518    Sized_relobj_file<size, big_endian>* relobj,
1519    unsigned int local_sym_index)
1520{
1521  unsigned int index = this->ifunc_count_;
1522  section_offset_type plt_offset;
1523
1524  plt_offset = plt_index_to_offset(index);
1525  ++this->ifunc_count_;
1526
1527  Reloc_section* rel = this->rela_ifunc(symtab, layout);
1528
1529  struct Local_ifunc li;
1530  li.rel = rel;
1531  li.object = relobj;
1532  li.local_sym_index = local_sym_index;
1533  li.plt_index = index;
1534  this->local_ifuncs_.push_back(li);
1535
1536  return plt_offset;
1537}
1538
1539// Emit any pending IFUNC plt relocations.
1540
1541template<int size, bool big_endian>
1542void
1543Output_data_plt_sparc<size, big_endian>::emit_pending_ifunc_relocs()
1544{
1545  // Emit any pending IFUNC relocs.
1546  for (typename std::vector<Global_ifunc>::const_iterator p =
1547	 this->global_ifuncs_.begin();
1548       p != this->global_ifuncs_.end();
1549       ++p)
1550    {
1551      section_offset_type plt_offset;
1552      unsigned int index;
1553
1554      index = this->count_ + p->plt_index + 4;
1555      plt_offset = this->plt_index_to_offset(index);
1556      p->rel->add_symbolless_global_addend(p->gsym, elfcpp::R_SPARC_JMP_IREL,
1557					   this, plt_offset, 0);
1558    }
1559
1560  for (typename std::vector<Local_ifunc>::const_iterator p =
1561	 this->local_ifuncs_.begin();
1562       p != this->local_ifuncs_.end();
1563       ++p)
1564    {
1565      section_offset_type plt_offset;
1566      unsigned int index;
1567
1568      index = this->count_ + p->plt_index + 4;
1569      plt_offset = this->plt_index_to_offset(index);
1570      p->rel->add_symbolless_local_addend(p->object, p->local_sym_index,
1571					  elfcpp::R_SPARC_JMP_IREL,
1572					  this, plt_offset, 0);
1573    }
1574}
1575
1576// Return where the IFUNC relocations should go in the PLT.  These
1577// follow the non-IFUNC relocations.
1578
1579template<int size, bool big_endian>
1580typename Output_data_plt_sparc<size, big_endian>::Reloc_section*
1581Output_data_plt_sparc<size, big_endian>::rela_ifunc(
1582	Symbol_table* symtab,
1583	Layout* layout)
1584{
1585  if (this->ifunc_rel_ == NULL)
1586    {
1587      this->ifunc_rel_ = new Reloc_section(false);
1588      layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA,
1589				      elfcpp::SHF_ALLOC, this->ifunc_rel_,
1590				      ORDER_DYNAMIC_PLT_RELOCS, false);
1591      gold_assert(this->ifunc_rel_->output_section()
1592		  == this->rel_->output_section());
1593
1594      if (parameters->doing_static_link())
1595	{
1596	  // A statically linked executable will only have a .rel.plt
1597	  // section to hold R_SPARC_IRELATIVE and R_SPARC_JMP_IREL
1598	  // relocs for STT_GNU_IFUNC symbols.  The library will use
1599	  // these symbols to locate the IRELATIVE and JMP_IREL relocs
1600	  // at program startup time.
1601	  symtab->define_in_output_data("__rela_iplt_start", NULL,
1602					Symbol_table::PREDEFINED,
1603					this->ifunc_rel_, 0, 0,
1604					elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
1605					elfcpp::STV_HIDDEN, 0, false, true);
1606	  symtab->define_in_output_data("__rela_iplt_end", NULL,
1607					Symbol_table::PREDEFINED,
1608					this->ifunc_rel_, 0, 0,
1609					elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
1610					elfcpp::STV_HIDDEN, 0, true, true);
1611	}
1612    }
1613  return this->ifunc_rel_;
1614}
1615
1616// Return the PLT address to use for a global symbol.
1617
1618template<int size, bool big_endian>
1619uint64_t
1620Output_data_plt_sparc<size, big_endian>::address_for_global(const Symbol* gsym)
1621{
1622  uint64_t offset = 0;
1623  if (gsym->type() == elfcpp::STT_GNU_IFUNC
1624      && gsym->can_use_relative_reloc(false))
1625    offset = plt_index_to_offset(this->count_ + 4);
1626  return this->address() + offset + gsym->plt_offset();
1627}
1628
1629// Return the PLT address to use for a local symbol.  These are always
1630// IRELATIVE relocs.
1631
1632template<int size, bool big_endian>
1633uint64_t
1634Output_data_plt_sparc<size, big_endian>::address_for_local(
1635	const Relobj* object,
1636	unsigned int r_sym)
1637{
1638  return (this->address()
1639	  + plt_index_to_offset(this->count_ + 4)
1640	  + object->local_plt_offset(r_sym));
1641}
1642
1643static const unsigned int sparc_nop = 0x01000000;
1644static const unsigned int sparc_sethi_g1 = 0x03000000;
1645static const unsigned int sparc_branch_always = 0x30800000;
1646static const unsigned int sparc_branch_always_pt = 0x30680000;
1647static const unsigned int sparc_mov = 0x80100000;
1648static const unsigned int sparc_mov_g0_o0 = 0x90100000;
1649static const unsigned int sparc_mov_o7_g5 = 0x8a10000f;
1650static const unsigned int sparc_call_plus_8 = 0x40000002;
1651static const unsigned int sparc_ldx_o7_imm_g1 = 0xc25be000;
1652static const unsigned int sparc_jmpl_o7_g1_g1 = 0x83c3c001;
1653static const unsigned int sparc_mov_g5_o7 = 0x9e100005;
1654
1655// Write out the PLT.
1656
1657template<int size, bool big_endian>
1658void
1659Output_data_plt_sparc<size, big_endian>::do_write(Output_file* of)
1660{
1661  const off_t offset = this->offset();
1662  const section_size_type oview_size =
1663    convert_to_section_size_type(this->data_size());
1664  unsigned char* const oview = of->get_output_view(offset, oview_size);
1665  unsigned char* pov = oview;
1666
1667  memset(pov, 0, base_plt_entry_size * 4);
1668  pov += this->first_plt_entry_offset();
1669
1670  unsigned int plt_offset = base_plt_entry_size * 4;
1671  const unsigned int count = this->entry_count();
1672
1673  if (size == 64)
1674    {
1675      unsigned int limit;
1676
1677      limit = (count > 32768 ? 32768 : count);
1678
1679      for (unsigned int i = 0; i < limit; ++i)
1680	{
1681	  elfcpp::Swap<32, true>::writeval(pov + 0x00,
1682					   sparc_sethi_g1 + plt_offset);
1683	  elfcpp::Swap<32, true>::writeval(pov + 0x04,
1684					   sparc_branch_always_pt +
1685					   (((base_plt_entry_size -
1686					      (plt_offset + 4)) >> 2) &
1687					    0x7ffff));
1688	  elfcpp::Swap<32, true>::writeval(pov + 0x08, sparc_nop);
1689	  elfcpp::Swap<32, true>::writeval(pov + 0x0c, sparc_nop);
1690	  elfcpp::Swap<32, true>::writeval(pov + 0x10, sparc_nop);
1691	  elfcpp::Swap<32, true>::writeval(pov + 0x14, sparc_nop);
1692	  elfcpp::Swap<32, true>::writeval(pov + 0x18, sparc_nop);
1693	  elfcpp::Swap<32, true>::writeval(pov + 0x1c, sparc_nop);
1694
1695	  pov += base_plt_entry_size;
1696	  plt_offset += base_plt_entry_size;
1697	}
1698
1699      if (count > 32768)
1700	{
1701	  unsigned int ext_cnt = count - 32768;
1702	  unsigned int blks = ext_cnt / plt_entries_per_block;
1703
1704	  for (unsigned int i = 0; i < blks; ++i)
1705	    {
1706	      unsigned int data_off = (plt_entries_per_block
1707				       * plt_insn_chunk_size) - 4;
1708
1709	      for (unsigned int j = 0; j < plt_entries_per_block; ++j)
1710		{
1711		  elfcpp::Swap<32, true>::writeval(pov + 0x00,
1712						   sparc_mov_o7_g5);
1713		  elfcpp::Swap<32, true>::writeval(pov + 0x04,
1714						   sparc_call_plus_8);
1715		  elfcpp::Swap<32, true>::writeval(pov + 0x08,
1716						   sparc_nop);
1717		  elfcpp::Swap<32, true>::writeval(pov + 0x0c,
1718						   sparc_ldx_o7_imm_g1 +
1719						   (data_off & 0x1fff));
1720		  elfcpp::Swap<32, true>::writeval(pov + 0x10,
1721						   sparc_jmpl_o7_g1_g1);
1722		  elfcpp::Swap<32, true>::writeval(pov + 0x14,
1723						   sparc_mov_g5_o7);
1724
1725		  elfcpp::Swap<64, big_endian>::writeval(
1726				pov + 0x4 + data_off,
1727				(elfcpp::Elf_Xword) (oview - (pov + 0x04)));
1728
1729		  pov += plt_insn_chunk_size;
1730		  data_off -= 16;
1731		}
1732	    }
1733
1734	  unsigned int sub_blk_cnt = ext_cnt % plt_entries_per_block;
1735	  for (unsigned int i = 0; i < sub_blk_cnt; ++i)
1736	    {
1737	      unsigned int data_off = (sub_blk_cnt
1738				       * plt_insn_chunk_size) - 4;
1739
1740	      for (unsigned int j = 0; j < plt_entries_per_block; ++j)
1741		{
1742		  elfcpp::Swap<32, true>::writeval(pov + 0x00,
1743						   sparc_mov_o7_g5);
1744		  elfcpp::Swap<32, true>::writeval(pov + 0x04,
1745						   sparc_call_plus_8);
1746		  elfcpp::Swap<32, true>::writeval(pov + 0x08,
1747						   sparc_nop);
1748		  elfcpp::Swap<32, true>::writeval(pov + 0x0c,
1749						   sparc_ldx_o7_imm_g1 +
1750						   (data_off & 0x1fff));
1751		  elfcpp::Swap<32, true>::writeval(pov + 0x10,
1752						   sparc_jmpl_o7_g1_g1);
1753		  elfcpp::Swap<32, true>::writeval(pov + 0x14,
1754						   sparc_mov_g5_o7);
1755
1756		  elfcpp::Swap<64, big_endian>::writeval(
1757				pov + 0x4 + data_off,
1758				(elfcpp::Elf_Xword) (oview - (pov + 0x04)));
1759
1760		  pov += plt_insn_chunk_size;
1761		  data_off -= 16;
1762		}
1763	    }
1764	}
1765    }
1766  else
1767    {
1768      for (unsigned int i = 0; i < count; ++i)
1769	{
1770	  elfcpp::Swap<32, true>::writeval(pov + 0x00,
1771					   sparc_sethi_g1 + plt_offset);
1772	  elfcpp::Swap<32, true>::writeval(pov + 0x04,
1773					   sparc_branch_always +
1774					   (((- (plt_offset + 4)) >> 2) &
1775					    0x003fffff));
1776	  elfcpp::Swap<32, true>::writeval(pov + 0x08, sparc_nop);
1777
1778	  pov += base_plt_entry_size;
1779	  plt_offset += base_plt_entry_size;
1780	}
1781
1782      elfcpp::Swap<32, true>::writeval(pov, sparc_nop);
1783      pov += 4;
1784    }
1785
1786  gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
1787
1788  of->write_output_view(offset, oview_size, oview);
1789}
1790
1791// Create the PLT section.
1792
1793template<int size, bool big_endian>
1794void
1795Target_sparc<size, big_endian>::make_plt_section(Symbol_table* symtab,
1796						 Layout* layout)
1797{
1798  // Create the GOT sections first.
1799  this->got_section(symtab, layout);
1800
1801  // Ensure that .rela.dyn always appears before .rela.plt  This is
1802  // necessary due to how, on Sparc and some other targets, .rela.dyn
1803  // needs to include .rela.plt in it's range.
1804  this->rela_dyn_section(layout);
1805
1806  this->plt_ = new Output_data_plt_sparc<size, big_endian>(layout);
1807  layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
1808				  (elfcpp::SHF_ALLOC
1809				   | elfcpp::SHF_EXECINSTR
1810				   | elfcpp::SHF_WRITE),
1811				  this->plt_, ORDER_NON_RELRO_FIRST, false);
1812
1813  // Define _PROCEDURE_LINKAGE_TABLE_ at the start of the .plt section.
1814  symtab->define_in_output_data("_PROCEDURE_LINKAGE_TABLE_", NULL,
1815				Symbol_table::PREDEFINED,
1816				this->plt_,
1817				0, 0, elfcpp::STT_OBJECT,
1818				elfcpp::STB_LOCAL,
1819				elfcpp::STV_HIDDEN, 0,
1820				false, false);
1821}
1822
1823// Create a PLT entry for a global symbol.
1824
1825template<int size, bool big_endian>
1826void
1827Target_sparc<size, big_endian>::make_plt_entry(Symbol_table* symtab,
1828					       Layout* layout,
1829					       Symbol* gsym)
1830{
1831  if (gsym->has_plt_offset())
1832    return;
1833
1834  if (this->plt_ == NULL)
1835    this->make_plt_section(symtab, layout);
1836
1837  this->plt_->add_entry(symtab, layout, gsym);
1838}
1839
1840// Make a PLT entry for a local STT_GNU_IFUNC symbol.
1841
1842template<int size, bool big_endian>
1843void
1844Target_sparc<size, big_endian>::make_local_ifunc_plt_entry(
1845	Symbol_table* symtab,
1846	Layout* layout,
1847	Sized_relobj_file<size, big_endian>* relobj,
1848	unsigned int local_sym_index)
1849{
1850  if (relobj->local_has_plt_offset(local_sym_index))
1851    return;
1852  if (this->plt_ == NULL)
1853    this->make_plt_section(symtab, layout);
1854  unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout,
1855							      relobj,
1856							      local_sym_index);
1857  relobj->set_local_plt_offset(local_sym_index, plt_offset);
1858}
1859
1860// Return the number of entries in the PLT.
1861
1862template<int size, bool big_endian>
1863unsigned int
1864Target_sparc<size, big_endian>::plt_entry_count() const
1865{
1866  if (this->plt_ == NULL)
1867    return 0;
1868  return this->plt_->entry_count();
1869}
1870
1871// Return the offset of the first non-reserved PLT entry.
1872
1873template<int size, bool big_endian>
1874unsigned int
1875Target_sparc<size, big_endian>::first_plt_entry_offset() const
1876{
1877  return Output_data_plt_sparc<size, big_endian>::first_plt_entry_offset();
1878}
1879
1880// Return the size of each PLT entry.
1881
1882template<int size, bool big_endian>
1883unsigned int
1884Target_sparc<size, big_endian>::plt_entry_size() const
1885{
1886  return Output_data_plt_sparc<size, big_endian>::get_plt_entry_size();
1887}
1888
1889// Create a GOT entry for the TLS module index.
1890
1891template<int size, bool big_endian>
1892unsigned int
1893Target_sparc<size, big_endian>::got_mod_index_entry(
1894     Symbol_table* symtab,
1895     Layout* layout,
1896     Sized_relobj_file<size, big_endian>* object)
1897{
1898  if (this->got_mod_index_offset_ == -1U)
1899    {
1900      gold_assert(symtab != NULL && layout != NULL && object != NULL);
1901      Reloc_section* rela_dyn = this->rela_dyn_section(layout);
1902      Output_data_got<size, big_endian>* got;
1903      unsigned int got_offset;
1904
1905      got = this->got_section(symtab, layout);
1906      got_offset = got->add_constant(0);
1907      rela_dyn->add_local(object, 0,
1908			  (size == 64 ?
1909			   elfcpp::R_SPARC_TLS_DTPMOD64 :
1910			   elfcpp::R_SPARC_TLS_DTPMOD32), got,
1911			  got_offset, 0);
1912      got->add_constant(0);
1913      this->got_mod_index_offset_ = got_offset;
1914    }
1915  return this->got_mod_index_offset_;
1916}
1917
1918// Optimize the TLS relocation type based on what we know about the
1919// symbol.  IS_FINAL is true if the final address of this symbol is
1920// known at link time.
1921
1922static tls::Tls_optimization
1923optimize_tls_reloc(bool is_final, int r_type)
1924{
1925  // If we are generating a shared library, then we can't do anything
1926  // in the linker.
1927  if (parameters->options().shared())
1928    return tls::TLSOPT_NONE;
1929
1930  switch (r_type)
1931    {
1932    case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic
1933    case elfcpp::R_SPARC_TLS_GD_LO10:
1934    case elfcpp::R_SPARC_TLS_GD_ADD:
1935    case elfcpp::R_SPARC_TLS_GD_CALL:
1936      // These are General-Dynamic which permits fully general TLS
1937      // access.  Since we know that we are generating an executable,
1938      // we can convert this to Initial-Exec.  If we also know that
1939      // this is a local symbol, we can further switch to Local-Exec.
1940      if (is_final)
1941	return tls::TLSOPT_TO_LE;
1942      return tls::TLSOPT_TO_IE;
1943
1944    case elfcpp::R_SPARC_TLS_LDM_HI22:	// Local-dynamic
1945    case elfcpp::R_SPARC_TLS_LDM_LO10:
1946    case elfcpp::R_SPARC_TLS_LDM_ADD:
1947    case elfcpp::R_SPARC_TLS_LDM_CALL:
1948      // This is Local-Dynamic, which refers to a local symbol in the
1949      // dynamic TLS block.  Since we know that we generating an
1950      // executable, we can switch to Local-Exec.
1951      return tls::TLSOPT_TO_LE;
1952
1953    case elfcpp::R_SPARC_TLS_LDO_HIX22:	// Alternate local-dynamic
1954    case elfcpp::R_SPARC_TLS_LDO_LOX10:
1955    case elfcpp::R_SPARC_TLS_LDO_ADD:
1956      // Another type of Local-Dynamic relocation.
1957      return tls::TLSOPT_TO_LE;
1958
1959    case elfcpp::R_SPARC_TLS_IE_HI22:	// Initial-exec
1960    case elfcpp::R_SPARC_TLS_IE_LO10:
1961    case elfcpp::R_SPARC_TLS_IE_LD:
1962    case elfcpp::R_SPARC_TLS_IE_LDX:
1963    case elfcpp::R_SPARC_TLS_IE_ADD:
1964      // These are Initial-Exec relocs which get the thread offset
1965      // from the GOT.  If we know that we are linking against the
1966      // local symbol, we can switch to Local-Exec, which links the
1967      // thread offset into the instruction.
1968      if (is_final)
1969	return tls::TLSOPT_TO_LE;
1970      return tls::TLSOPT_NONE;
1971
1972    case elfcpp::R_SPARC_TLS_LE_HIX22:	// Local-exec
1973    case elfcpp::R_SPARC_TLS_LE_LOX10:
1974      // When we already have Local-Exec, there is nothing further we
1975      // can do.
1976      return tls::TLSOPT_NONE;
1977
1978    default:
1979      gold_unreachable();
1980    }
1981}
1982
1983// Get the Reference_flags for a particular relocation.
1984
1985template<int size, bool big_endian>
1986int
1987Target_sparc<size, big_endian>::Scan::get_reference_flags(unsigned int r_type)
1988{
1989  r_type &= 0xff;
1990  switch (r_type)
1991    {
1992    case elfcpp::R_SPARC_NONE:
1993    case elfcpp::R_SPARC_REGISTER:
1994    case elfcpp::R_SPARC_GNU_VTINHERIT:
1995    case elfcpp::R_SPARC_GNU_VTENTRY:
1996      // No symbol reference.
1997      return 0;
1998
1999    case elfcpp::R_SPARC_UA64:
2000    case elfcpp::R_SPARC_64:
2001    case elfcpp::R_SPARC_HIX22:
2002    case elfcpp::R_SPARC_LOX10:
2003    case elfcpp::R_SPARC_H34:
2004    case elfcpp::R_SPARC_H44:
2005    case elfcpp::R_SPARC_M44:
2006    case elfcpp::R_SPARC_L44:
2007    case elfcpp::R_SPARC_HH22:
2008    case elfcpp::R_SPARC_HM10:
2009    case elfcpp::R_SPARC_LM22:
2010    case elfcpp::R_SPARC_HI22:
2011    case elfcpp::R_SPARC_LO10:
2012    case elfcpp::R_SPARC_OLO10:
2013    case elfcpp::R_SPARC_UA32:
2014    case elfcpp::R_SPARC_32:
2015    case elfcpp::R_SPARC_UA16:
2016    case elfcpp::R_SPARC_16:
2017    case elfcpp::R_SPARC_11:
2018    case elfcpp::R_SPARC_10:
2019    case elfcpp::R_SPARC_8:
2020    case elfcpp::R_SPARC_7:
2021    case elfcpp::R_SPARC_6:
2022    case elfcpp::R_SPARC_5:
2023      return Symbol::ABSOLUTE_REF;
2024
2025    case elfcpp::R_SPARC_DISP8:
2026    case elfcpp::R_SPARC_DISP16:
2027    case elfcpp::R_SPARC_DISP32:
2028    case elfcpp::R_SPARC_DISP64:
2029    case elfcpp::R_SPARC_PC_HH22:
2030    case elfcpp::R_SPARC_PC_HM10:
2031    case elfcpp::R_SPARC_PC_LM22:
2032    case elfcpp::R_SPARC_PC10:
2033    case elfcpp::R_SPARC_PC22:
2034    case elfcpp::R_SPARC_WDISP30:
2035    case elfcpp::R_SPARC_WDISP22:
2036    case elfcpp::R_SPARC_WDISP19:
2037    case elfcpp::R_SPARC_WDISP16:
2038    case elfcpp::R_SPARC_WDISP10:
2039      return Symbol::RELATIVE_REF;
2040
2041    case elfcpp::R_SPARC_PLT64:
2042    case elfcpp::R_SPARC_PLT32:
2043    case elfcpp::R_SPARC_HIPLT22:
2044    case elfcpp::R_SPARC_LOPLT10:
2045    case elfcpp::R_SPARC_PCPLT10:
2046      return Symbol::FUNCTION_CALL | Symbol::ABSOLUTE_REF;
2047
2048    case elfcpp::R_SPARC_PCPLT32:
2049    case elfcpp::R_SPARC_PCPLT22:
2050    case elfcpp::R_SPARC_WPLT30:
2051      return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
2052
2053    case elfcpp::R_SPARC_GOTDATA_OP:
2054    case elfcpp::R_SPARC_GOTDATA_OP_HIX22:
2055    case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
2056    case elfcpp::R_SPARC_GOT10:
2057    case elfcpp::R_SPARC_GOT13:
2058    case elfcpp::R_SPARC_GOT22:
2059      // Absolute in GOT.
2060      return Symbol::ABSOLUTE_REF;
2061
2062    case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic
2063    case elfcpp::R_SPARC_TLS_GD_LO10:
2064    case elfcpp::R_SPARC_TLS_GD_ADD:
2065    case elfcpp::R_SPARC_TLS_GD_CALL:
2066    case elfcpp::R_SPARC_TLS_LDM_HI22:	// Local-dynamic
2067    case elfcpp::R_SPARC_TLS_LDM_LO10:
2068    case elfcpp::R_SPARC_TLS_LDM_ADD:
2069    case elfcpp::R_SPARC_TLS_LDM_CALL:
2070    case elfcpp::R_SPARC_TLS_LDO_HIX22:	// Alternate local-dynamic
2071    case elfcpp::R_SPARC_TLS_LDO_LOX10:
2072    case elfcpp::R_SPARC_TLS_LDO_ADD:
2073    case elfcpp::R_SPARC_TLS_LE_HIX22:
2074    case elfcpp::R_SPARC_TLS_LE_LOX10:
2075    case elfcpp::R_SPARC_TLS_IE_HI22:	// Initial-exec
2076    case elfcpp::R_SPARC_TLS_IE_LO10:
2077    case elfcpp::R_SPARC_TLS_IE_LD:
2078    case elfcpp::R_SPARC_TLS_IE_LDX:
2079    case elfcpp::R_SPARC_TLS_IE_ADD:
2080      return Symbol::TLS_REF;
2081
2082    case elfcpp::R_SPARC_COPY:
2083    case elfcpp::R_SPARC_GLOB_DAT:
2084    case elfcpp::R_SPARC_JMP_SLOT:
2085    case elfcpp::R_SPARC_JMP_IREL:
2086    case elfcpp::R_SPARC_RELATIVE:
2087    case elfcpp::R_SPARC_IRELATIVE:
2088    case elfcpp::R_SPARC_TLS_DTPMOD64:
2089    case elfcpp::R_SPARC_TLS_DTPMOD32:
2090    case elfcpp::R_SPARC_TLS_DTPOFF64:
2091    case elfcpp::R_SPARC_TLS_DTPOFF32:
2092    case elfcpp::R_SPARC_TLS_TPOFF64:
2093    case elfcpp::R_SPARC_TLS_TPOFF32:
2094    default:
2095      // Not expected.  We will give an error later.
2096      return 0;
2097    }
2098}
2099
2100// Generate a PLT entry slot for a call to __tls_get_addr
2101template<int size, bool big_endian>
2102void
2103Target_sparc<size, big_endian>::Scan::generate_tls_call(Symbol_table* symtab,
2104							Layout* layout,
2105							Target_sparc<size, big_endian>* target)
2106{
2107  Symbol* gsym = target->tls_get_addr_sym(symtab);
2108
2109  target->make_plt_entry(symtab, layout, gsym);
2110}
2111
2112// Report an unsupported relocation against a local symbol.
2113
2114template<int size, bool big_endian>
2115void
2116Target_sparc<size, big_endian>::Scan::unsupported_reloc_local(
2117			Sized_relobj_file<size, big_endian>* object,
2118			unsigned int r_type)
2119{
2120  gold_error(_("%s: unsupported reloc %u against local symbol"),
2121	     object->name().c_str(), r_type);
2122}
2123
2124// We are about to emit a dynamic relocation of type R_TYPE.  If the
2125// dynamic linker does not support it, issue an error.
2126
2127template<int size, bool big_endian>
2128void
2129Target_sparc<size, big_endian>::Scan::check_non_pic(Relobj* object, unsigned int r_type)
2130{
2131  gold_assert(r_type != elfcpp::R_SPARC_NONE);
2132
2133  if (size == 64)
2134    {
2135      switch (r_type)
2136	{
2137	  // These are the relocation types supported by glibc for sparc 64-bit.
2138	case elfcpp::R_SPARC_RELATIVE:
2139	case elfcpp::R_SPARC_IRELATIVE:
2140	case elfcpp::R_SPARC_COPY:
2141	case elfcpp::R_SPARC_64:
2142	case elfcpp::R_SPARC_GLOB_DAT:
2143	case elfcpp::R_SPARC_JMP_SLOT:
2144	case elfcpp::R_SPARC_JMP_IREL:
2145	case elfcpp::R_SPARC_TLS_DTPMOD64:
2146	case elfcpp::R_SPARC_TLS_DTPOFF64:
2147	case elfcpp::R_SPARC_TLS_TPOFF64:
2148	case elfcpp::R_SPARC_TLS_LE_HIX22:
2149	case elfcpp::R_SPARC_TLS_LE_LOX10:
2150	case elfcpp::R_SPARC_8:
2151	case elfcpp::R_SPARC_16:
2152	case elfcpp::R_SPARC_DISP8:
2153	case elfcpp::R_SPARC_DISP16:
2154	case elfcpp::R_SPARC_DISP32:
2155	case elfcpp::R_SPARC_WDISP30:
2156	case elfcpp::R_SPARC_LO10:
2157	case elfcpp::R_SPARC_HI22:
2158	case elfcpp::R_SPARC_OLO10:
2159	case elfcpp::R_SPARC_H34:
2160	case elfcpp::R_SPARC_H44:
2161	case elfcpp::R_SPARC_M44:
2162	case elfcpp::R_SPARC_L44:
2163	case elfcpp::R_SPARC_HH22:
2164	case elfcpp::R_SPARC_HM10:
2165	case elfcpp::R_SPARC_LM22:
2166	case elfcpp::R_SPARC_UA16:
2167	case elfcpp::R_SPARC_UA32:
2168	case elfcpp::R_SPARC_UA64:
2169	  return;
2170
2171	default:
2172	  break;
2173	}
2174    }
2175  else
2176    {
2177      switch (r_type)
2178	{
2179	  // These are the relocation types supported by glibc for sparc 32-bit.
2180	case elfcpp::R_SPARC_RELATIVE:
2181	case elfcpp::R_SPARC_IRELATIVE:
2182	case elfcpp::R_SPARC_COPY:
2183	case elfcpp::R_SPARC_GLOB_DAT:
2184	case elfcpp::R_SPARC_32:
2185	case elfcpp::R_SPARC_JMP_SLOT:
2186	case elfcpp::R_SPARC_JMP_IREL:
2187	case elfcpp::R_SPARC_TLS_DTPMOD32:
2188	case elfcpp::R_SPARC_TLS_DTPOFF32:
2189	case elfcpp::R_SPARC_TLS_TPOFF32:
2190	case elfcpp::R_SPARC_TLS_LE_HIX22:
2191	case elfcpp::R_SPARC_TLS_LE_LOX10:
2192	case elfcpp::R_SPARC_8:
2193	case elfcpp::R_SPARC_16:
2194	case elfcpp::R_SPARC_DISP8:
2195	case elfcpp::R_SPARC_DISP16:
2196	case elfcpp::R_SPARC_DISP32:
2197	case elfcpp::R_SPARC_LO10:
2198	case elfcpp::R_SPARC_WDISP30:
2199	case elfcpp::R_SPARC_HI22:
2200	case elfcpp::R_SPARC_UA16:
2201	case elfcpp::R_SPARC_UA32:
2202	  return;
2203
2204	default:
2205	  break;
2206	}
2207    }
2208
2209  // This prevents us from issuing more than one error per reloc
2210  // section.  But we can still wind up issuing more than one
2211  // error per object file.
2212  if (this->issued_non_pic_error_)
2213    return;
2214  gold_assert(parameters->options().output_is_position_independent());
2215  object->error(_("requires unsupported dynamic reloc; "
2216		  "recompile with -fPIC"));
2217  this->issued_non_pic_error_ = true;
2218  return;
2219}
2220
2221// Return whether we need to make a PLT entry for a relocation of the
2222// given type against a STT_GNU_IFUNC symbol.
2223
2224template<int size, bool big_endian>
2225bool
2226Target_sparc<size, big_endian>::Scan::reloc_needs_plt_for_ifunc(
2227     Sized_relobj_file<size, big_endian>* object,
2228     unsigned int r_type)
2229{
2230  int flags = Scan::get_reference_flags(r_type);
2231  if (flags & Symbol::TLS_REF)
2232    gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"),
2233	       object->name().c_str(), r_type);
2234  return flags != 0;
2235}
2236
2237// Scan a relocation for a local symbol.
2238
2239template<int size, bool big_endian>
2240inline void
2241Target_sparc<size, big_endian>::Scan::local(
2242			Symbol_table* symtab,
2243			Layout* layout,
2244			Target_sparc<size, big_endian>* target,
2245			Sized_relobj_file<size, big_endian>* object,
2246			unsigned int data_shndx,
2247			Output_section* output_section,
2248			const elfcpp::Rela<size, big_endian>& reloc,
2249			unsigned int r_type,
2250			const elfcpp::Sym<size, big_endian>& lsym,
2251			bool is_discarded)
2252{
2253  if (is_discarded)
2254    return;
2255
2256  bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
2257  unsigned int orig_r_type = r_type;
2258  r_type &= 0xff;
2259
2260  if (is_ifunc
2261      && this->reloc_needs_plt_for_ifunc(object, r_type))
2262    {
2263      unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
2264      target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
2265    }
2266
2267  switch (r_type)
2268    {
2269    case elfcpp::R_SPARC_NONE:
2270    case elfcpp::R_SPARC_REGISTER:
2271    case elfcpp::R_SPARC_GNU_VTINHERIT:
2272    case elfcpp::R_SPARC_GNU_VTENTRY:
2273      break;
2274
2275    case elfcpp::R_SPARC_64:
2276    case elfcpp::R_SPARC_32:
2277      // If building a shared library (or a position-independent
2278      // executable), we need to create a dynamic relocation for
2279      // this location. The relocation applied at link time will
2280      // apply the link-time value, so we flag the location with
2281      // an R_SPARC_RELATIVE relocation so the dynamic loader can
2282      // relocate it easily.
2283      if (parameters->options().output_is_position_independent())
2284	{
2285	  Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2286	  unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
2287	  rela_dyn->add_local_relative(object, r_sym, elfcpp::R_SPARC_RELATIVE,
2288				       output_section, data_shndx,
2289				       reloc.get_r_offset(),
2290				       reloc.get_r_addend(), is_ifunc);
2291	}
2292      break;
2293
2294    case elfcpp::R_SPARC_HIX22:
2295    case elfcpp::R_SPARC_LOX10:
2296    case elfcpp::R_SPARC_H34:
2297    case elfcpp::R_SPARC_H44:
2298    case elfcpp::R_SPARC_M44:
2299    case elfcpp::R_SPARC_L44:
2300    case elfcpp::R_SPARC_HH22:
2301    case elfcpp::R_SPARC_HM10:
2302    case elfcpp::R_SPARC_LM22:
2303    case elfcpp::R_SPARC_UA64:
2304    case elfcpp::R_SPARC_UA32:
2305    case elfcpp::R_SPARC_UA16:
2306    case elfcpp::R_SPARC_HI22:
2307    case elfcpp::R_SPARC_LO10:
2308    case elfcpp::R_SPARC_OLO10:
2309    case elfcpp::R_SPARC_16:
2310    case elfcpp::R_SPARC_11:
2311    case elfcpp::R_SPARC_10:
2312    case elfcpp::R_SPARC_8:
2313    case elfcpp::R_SPARC_7:
2314    case elfcpp::R_SPARC_6:
2315    case elfcpp::R_SPARC_5:
2316      // If building a shared library (or a position-independent
2317      // executable), we need to create a dynamic relocation for
2318      // this location.
2319      if (parameters->options().output_is_position_independent())
2320	{
2321	  Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2322	  unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
2323
2324	  check_non_pic(object, r_type);
2325	  if (lsym.get_st_type() != elfcpp::STT_SECTION)
2326	    {
2327	      rela_dyn->add_local(object, r_sym, orig_r_type, output_section,
2328				  data_shndx, reloc.get_r_offset(),
2329				  reloc.get_r_addend());
2330	    }
2331	  else
2332	    {
2333	      gold_assert(lsym.get_st_value() == 0);
2334	      rela_dyn->add_symbolless_local_addend(object, r_sym, orig_r_type,
2335						    output_section, data_shndx,
2336						    reloc.get_r_offset(),
2337						    reloc.get_r_addend());
2338	    }
2339	}
2340      break;
2341
2342    case elfcpp::R_SPARC_WDISP30:
2343    case elfcpp::R_SPARC_WPLT30:
2344    case elfcpp::R_SPARC_WDISP22:
2345    case elfcpp::R_SPARC_WDISP19:
2346    case elfcpp::R_SPARC_WDISP16:
2347    case elfcpp::R_SPARC_WDISP10:
2348    case elfcpp::R_SPARC_DISP8:
2349    case elfcpp::R_SPARC_DISP16:
2350    case elfcpp::R_SPARC_DISP32:
2351    case elfcpp::R_SPARC_DISP64:
2352    case elfcpp::R_SPARC_PC10:
2353    case elfcpp::R_SPARC_PC22:
2354      break;
2355
2356    case elfcpp::R_SPARC_GOTDATA_OP:
2357    case elfcpp::R_SPARC_GOTDATA_OP_HIX22:
2358    case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
2359      // We will optimize this into a GOT relative relocation
2360      // and code transform the GOT load into an addition.
2361      break;
2362
2363    case elfcpp::R_SPARC_GOT10:
2364    case elfcpp::R_SPARC_GOT13:
2365    case elfcpp::R_SPARC_GOT22:
2366      {
2367	// The symbol requires a GOT entry.
2368	Output_data_got<size, big_endian>* got;
2369	unsigned int r_sym;
2370
2371	got = target->got_section(symtab, layout);
2372	r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
2373
2374	// If we are generating a shared object, we need to add a
2375	// dynamic relocation for this symbol's GOT entry.
2376	if (parameters->options().output_is_position_independent())
2377	  {
2378	    if (!object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD))
2379	      {
2380		Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2381		unsigned int off = got->add_constant(0);
2382		object->set_local_got_offset(r_sym, GOT_TYPE_STANDARD, off);
2383		rela_dyn->add_local_relative(object, r_sym,
2384					     elfcpp::R_SPARC_RELATIVE,
2385					     got, off, 0, is_ifunc);
2386	      }
2387	  }
2388	else
2389	  got->add_local(object, r_sym, GOT_TYPE_STANDARD);
2390      }
2391      break;
2392
2393      // These are initial TLS relocs, which are expected when
2394      // linking.
2395    case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic
2396    case elfcpp::R_SPARC_TLS_GD_LO10:
2397    case elfcpp::R_SPARC_TLS_GD_ADD:
2398    case elfcpp::R_SPARC_TLS_GD_CALL:
2399    case elfcpp::R_SPARC_TLS_LDM_HI22 :	// Local-dynamic
2400    case elfcpp::R_SPARC_TLS_LDM_LO10:
2401    case elfcpp::R_SPARC_TLS_LDM_ADD:
2402    case elfcpp::R_SPARC_TLS_LDM_CALL:
2403    case elfcpp::R_SPARC_TLS_LDO_HIX22:	// Alternate local-dynamic
2404    case elfcpp::R_SPARC_TLS_LDO_LOX10:
2405    case elfcpp::R_SPARC_TLS_LDO_ADD:
2406    case elfcpp::R_SPARC_TLS_IE_HI22:	// Initial-exec
2407    case elfcpp::R_SPARC_TLS_IE_LO10:
2408    case elfcpp::R_SPARC_TLS_IE_LD:
2409    case elfcpp::R_SPARC_TLS_IE_LDX:
2410    case elfcpp::R_SPARC_TLS_IE_ADD:
2411    case elfcpp::R_SPARC_TLS_LE_HIX22:	// Local-exec
2412    case elfcpp::R_SPARC_TLS_LE_LOX10:
2413      {
2414	bool output_is_shared = parameters->options().shared();
2415	const tls::Tls_optimization optimized_type
2416	    = optimize_tls_reloc(!output_is_shared, r_type);
2417	switch (r_type)
2418	  {
2419	  case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic
2420	  case elfcpp::R_SPARC_TLS_GD_LO10:
2421	  case elfcpp::R_SPARC_TLS_GD_ADD:
2422	  case elfcpp::R_SPARC_TLS_GD_CALL:
2423	    if (optimized_type == tls::TLSOPT_NONE)
2424	      {
2425		// Create a pair of GOT entries for the module index and
2426		// dtv-relative offset.
2427		Output_data_got<size, big_endian>* got
2428		    = target->got_section(symtab, layout);
2429		unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
2430		unsigned int shndx = lsym.get_st_shndx();
2431		bool is_ordinary;
2432		shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
2433		if (!is_ordinary)
2434		  object->error(_("local symbol %u has bad shndx %u"),
2435				r_sym, shndx);
2436		else
2437		  got->add_local_pair_with_rel(object, r_sym,
2438					       lsym.get_st_shndx(),
2439					       GOT_TYPE_TLS_PAIR,
2440					       target->rela_dyn_section(layout),
2441					       (size == 64
2442						? elfcpp::R_SPARC_TLS_DTPMOD64
2443						: elfcpp::R_SPARC_TLS_DTPMOD32));
2444		if (r_type == elfcpp::R_SPARC_TLS_GD_CALL)
2445		  generate_tls_call(symtab, layout, target);
2446	      }
2447	    else if (optimized_type != tls::TLSOPT_TO_LE)
2448	      unsupported_reloc_local(object, r_type);
2449	    break;
2450
2451	  case elfcpp::R_SPARC_TLS_LDM_HI22 :	// Local-dynamic
2452	  case elfcpp::R_SPARC_TLS_LDM_LO10:
2453	  case elfcpp::R_SPARC_TLS_LDM_ADD:
2454	  case elfcpp::R_SPARC_TLS_LDM_CALL:
2455	    if (optimized_type == tls::TLSOPT_NONE)
2456	      {
2457		// Create a GOT entry for the module index.
2458		target->got_mod_index_entry(symtab, layout, object);
2459
2460		if (r_type == elfcpp::R_SPARC_TLS_LDM_CALL)
2461		  generate_tls_call(symtab, layout, target);
2462	      }
2463	    else if (optimized_type != tls::TLSOPT_TO_LE)
2464	      unsupported_reloc_local(object, r_type);
2465	    break;
2466
2467	  case elfcpp::R_SPARC_TLS_LDO_HIX22:	// Alternate local-dynamic
2468	  case elfcpp::R_SPARC_TLS_LDO_LOX10:
2469	  case elfcpp::R_SPARC_TLS_LDO_ADD:
2470	    break;
2471
2472	  case elfcpp::R_SPARC_TLS_IE_HI22:	// Initial-exec
2473	  case elfcpp::R_SPARC_TLS_IE_LO10:
2474	  case elfcpp::R_SPARC_TLS_IE_LD:
2475	  case elfcpp::R_SPARC_TLS_IE_LDX:
2476	  case elfcpp::R_SPARC_TLS_IE_ADD:
2477	    layout->set_has_static_tls();
2478	    if (optimized_type == tls::TLSOPT_NONE)
2479	      {
2480		// Create a GOT entry for the tp-relative offset.
2481		Output_data_got<size, big_endian>* got
2482		  = target->got_section(symtab, layout);
2483		unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
2484
2485		if (!object->local_has_got_offset(r_sym, GOT_TYPE_TLS_OFFSET))
2486		  {
2487		    Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2488		    unsigned int off = got->add_constant(0);
2489
2490		    object->set_local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET, off);
2491
2492		    rela_dyn->add_symbolless_local_addend(object, r_sym,
2493							  (size == 64 ?
2494							   elfcpp::R_SPARC_TLS_TPOFF64 :
2495							   elfcpp::R_SPARC_TLS_TPOFF32),
2496							  got, off, 0);
2497		  }
2498	      }
2499	    else if (optimized_type != tls::TLSOPT_TO_LE)
2500	      unsupported_reloc_local(object, r_type);
2501	    break;
2502
2503	  case elfcpp::R_SPARC_TLS_LE_HIX22:	// Local-exec
2504	  case elfcpp::R_SPARC_TLS_LE_LOX10:
2505	    layout->set_has_static_tls();
2506	    if (output_is_shared)
2507	      {
2508		// We need to create a dynamic relocation.
2509		gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
2510		unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
2511		Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2512		rela_dyn->add_symbolless_local_addend(object, r_sym, r_type,
2513						      output_section, data_shndx,
2514						      reloc.get_r_offset(), 0);
2515	      }
2516	    break;
2517	  }
2518      }
2519      break;
2520
2521      // These are relocations which should only be seen by the
2522      // dynamic linker, and should never be seen here.
2523    case elfcpp::R_SPARC_COPY:
2524    case elfcpp::R_SPARC_GLOB_DAT:
2525    case elfcpp::R_SPARC_JMP_SLOT:
2526    case elfcpp::R_SPARC_JMP_IREL:
2527    case elfcpp::R_SPARC_RELATIVE:
2528    case elfcpp::R_SPARC_IRELATIVE:
2529    case elfcpp::R_SPARC_TLS_DTPMOD64:
2530    case elfcpp::R_SPARC_TLS_DTPMOD32:
2531    case elfcpp::R_SPARC_TLS_DTPOFF64:
2532    case elfcpp::R_SPARC_TLS_DTPOFF32:
2533    case elfcpp::R_SPARC_TLS_TPOFF64:
2534    case elfcpp::R_SPARC_TLS_TPOFF32:
2535      gold_error(_("%s: unexpected reloc %u in object file"),
2536		 object->name().c_str(), r_type);
2537      break;
2538
2539    default:
2540      unsupported_reloc_local(object, r_type);
2541      break;
2542    }
2543}
2544
2545// Report an unsupported relocation against a global symbol.
2546
2547template<int size, bool big_endian>
2548void
2549Target_sparc<size, big_endian>::Scan::unsupported_reloc_global(
2550			Sized_relobj_file<size, big_endian>* object,
2551			unsigned int r_type,
2552			Symbol* gsym)
2553{
2554  gold_error(_("%s: unsupported reloc %u against global symbol %s"),
2555	     object->name().c_str(), r_type, gsym->demangled_name().c_str());
2556}
2557
2558// Scan a relocation for a global symbol.
2559
2560template<int size, bool big_endian>
2561inline void
2562Target_sparc<size, big_endian>::Scan::global(
2563				Symbol_table* symtab,
2564				Layout* layout,
2565				Target_sparc<size, big_endian>* target,
2566				Sized_relobj_file<size, big_endian>* object,
2567				unsigned int data_shndx,
2568				Output_section* output_section,
2569				const elfcpp::Rela<size, big_endian>& reloc,
2570				unsigned int r_type,
2571				Symbol* gsym)
2572{
2573  unsigned int orig_r_type = r_type;
2574  bool is_ifunc = gsym->type() == elfcpp::STT_GNU_IFUNC;
2575
2576  // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
2577  // section.  We check here to avoid creating a dynamic reloc against
2578  // _GLOBAL_OFFSET_TABLE_.
2579  if (!target->has_got_section()
2580      && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
2581    target->got_section(symtab, layout);
2582
2583  r_type &= 0xff;
2584
2585  // A STT_GNU_IFUNC symbol may require a PLT entry.
2586  if (is_ifunc
2587      && this->reloc_needs_plt_for_ifunc(object, r_type))
2588    target->make_plt_entry(symtab, layout, gsym);
2589
2590  switch (r_type)
2591    {
2592    case elfcpp::R_SPARC_NONE:
2593    case elfcpp::R_SPARC_REGISTER:
2594    case elfcpp::R_SPARC_GNU_VTINHERIT:
2595    case elfcpp::R_SPARC_GNU_VTENTRY:
2596      break;
2597
2598    case elfcpp::R_SPARC_PLT64:
2599    case elfcpp::R_SPARC_PLT32:
2600    case elfcpp::R_SPARC_HIPLT22:
2601    case elfcpp::R_SPARC_LOPLT10:
2602    case elfcpp::R_SPARC_PCPLT32:
2603    case elfcpp::R_SPARC_PCPLT22:
2604    case elfcpp::R_SPARC_PCPLT10:
2605    case elfcpp::R_SPARC_WPLT30:
2606      // If the symbol is fully resolved, this is just a PC32 reloc.
2607      // Otherwise we need a PLT entry.
2608      if (gsym->final_value_is_known())
2609	break;
2610      // If building a shared library, we can also skip the PLT entry
2611      // if the symbol is defined in the output file and is protected
2612      // or hidden.
2613      if (gsym->is_defined()
2614	  && !gsym->is_from_dynobj()
2615	  && !gsym->is_preemptible())
2616	break;
2617      target->make_plt_entry(symtab, layout, gsym);
2618      break;
2619
2620    case elfcpp::R_SPARC_DISP8:
2621    case elfcpp::R_SPARC_DISP16:
2622    case elfcpp::R_SPARC_DISP32:
2623    case elfcpp::R_SPARC_DISP64:
2624    case elfcpp::R_SPARC_PC_HH22:
2625    case elfcpp::R_SPARC_PC_HM10:
2626    case elfcpp::R_SPARC_PC_LM22:
2627    case elfcpp::R_SPARC_PC10:
2628    case elfcpp::R_SPARC_PC22:
2629    case elfcpp::R_SPARC_WDISP30:
2630    case elfcpp::R_SPARC_WDISP22:
2631    case elfcpp::R_SPARC_WDISP19:
2632    case elfcpp::R_SPARC_WDISP16:
2633    case elfcpp::R_SPARC_WDISP10:
2634      {
2635	if (gsym->needs_plt_entry())
2636	  target->make_plt_entry(symtab, layout, gsym);
2637	// Make a dynamic relocation if necessary.
2638	if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
2639	  {
2640	    if (parameters->options().output_is_executable()
2641		&& gsym->may_need_copy_reloc())
2642	      {
2643		target->copy_reloc(symtab, layout, object,
2644				   data_shndx, output_section, gsym,
2645				   reloc);
2646	      }
2647	    else
2648	      {
2649		Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2650		check_non_pic(object, r_type);
2651		rela_dyn->add_global(gsym, orig_r_type, output_section, object,
2652				     data_shndx, reloc.get_r_offset(),
2653				     reloc.get_r_addend());
2654	      }
2655	  }
2656      }
2657      break;
2658
2659    case elfcpp::R_SPARC_UA64:
2660    case elfcpp::R_SPARC_64:
2661    case elfcpp::R_SPARC_HIX22:
2662    case elfcpp::R_SPARC_LOX10:
2663    case elfcpp::R_SPARC_H34:
2664    case elfcpp::R_SPARC_H44:
2665    case elfcpp::R_SPARC_M44:
2666    case elfcpp::R_SPARC_L44:
2667    case elfcpp::R_SPARC_HH22:
2668    case elfcpp::R_SPARC_HM10:
2669    case elfcpp::R_SPARC_LM22:
2670    case elfcpp::R_SPARC_HI22:
2671    case elfcpp::R_SPARC_LO10:
2672    case elfcpp::R_SPARC_OLO10:
2673    case elfcpp::R_SPARC_UA32:
2674    case elfcpp::R_SPARC_32:
2675    case elfcpp::R_SPARC_UA16:
2676    case elfcpp::R_SPARC_16:
2677    case elfcpp::R_SPARC_11:
2678    case elfcpp::R_SPARC_10:
2679    case elfcpp::R_SPARC_8:
2680    case elfcpp::R_SPARC_7:
2681    case elfcpp::R_SPARC_6:
2682    case elfcpp::R_SPARC_5:
2683      {
2684	// Make a PLT entry if necessary.
2685	if (gsym->needs_plt_entry())
2686	  {
2687	    target->make_plt_entry(symtab, layout, gsym);
2688	    // Since this is not a PC-relative relocation, we may be
2689	    // taking the address of a function. In that case we need to
2690	    // set the entry in the dynamic symbol table to the address of
2691	    // the PLT entry.
2692	    if (gsym->is_from_dynobj() && !parameters->options().shared())
2693	      gsym->set_needs_dynsym_value();
2694	  }
2695	// Make a dynamic relocation if necessary.
2696	if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
2697	  {
2698	    unsigned int r_off = reloc.get_r_offset();
2699
2700	    // The assembler can sometimes emit unaligned relocations
2701	    // for dwarf2 cfi directives.
2702	    switch (r_type)
2703	      {
2704	      case elfcpp::R_SPARC_16:
2705		if (r_off & 0x1)
2706		  orig_r_type = r_type = elfcpp::R_SPARC_UA16;
2707		break;
2708	      case elfcpp::R_SPARC_32:
2709		if (r_off & 0x3)
2710		  orig_r_type = r_type = elfcpp::R_SPARC_UA32;
2711		break;
2712	      case elfcpp::R_SPARC_64:
2713		if (r_off & 0x7)
2714		  orig_r_type = r_type = elfcpp::R_SPARC_UA64;
2715		break;
2716	      case elfcpp::R_SPARC_UA16:
2717		if (!(r_off & 0x1))
2718		  orig_r_type = r_type = elfcpp::R_SPARC_16;
2719		break;
2720	      case elfcpp::R_SPARC_UA32:
2721		if (!(r_off & 0x3))
2722		  orig_r_type = r_type = elfcpp::R_SPARC_32;
2723		break;
2724	      case elfcpp::R_SPARC_UA64:
2725		if (!(r_off & 0x7))
2726		  orig_r_type = r_type = elfcpp::R_SPARC_64;
2727		break;
2728	      }
2729
2730	    if (!parameters->options().output_is_position_independent()
2731		&& gsym->may_need_copy_reloc())
2732	      {
2733		target->copy_reloc(symtab, layout, object,
2734				   data_shndx, output_section, gsym, reloc);
2735	      }
2736	    else if (((size == 64 && r_type == elfcpp::R_SPARC_64)
2737		      || (size == 32 && r_type == elfcpp::R_SPARC_32))
2738		     && gsym->type() == elfcpp::STT_GNU_IFUNC
2739		     && gsym->can_use_relative_reloc(false)
2740		     && !gsym->is_from_dynobj()
2741		     && !gsym->is_undefined()
2742		     && !gsym->is_preemptible())
2743	      {
2744		// Use an IRELATIVE reloc for a locally defined
2745		// STT_GNU_IFUNC symbol.  This makes a function
2746		// address in a PIE executable match the address in a
2747		// shared library that it links against.
2748		Reloc_section* rela_dyn =
2749		  target->rela_ifunc_section(layout);
2750		unsigned int r_type = elfcpp::R_SPARC_IRELATIVE;
2751		rela_dyn->add_symbolless_global_addend(gsym, r_type,
2752						       output_section, object,
2753						       data_shndx,
2754						       reloc.get_r_offset(),
2755						       reloc.get_r_addend());
2756	      }
2757	    else if ((r_type == elfcpp::R_SPARC_32
2758		      || r_type == elfcpp::R_SPARC_64)
2759		     && gsym->can_use_relative_reloc(false))
2760	      {
2761		Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2762		rela_dyn->add_global_relative(gsym, elfcpp::R_SPARC_RELATIVE,
2763					      output_section, object,
2764					      data_shndx, reloc.get_r_offset(),
2765					      reloc.get_r_addend(), is_ifunc);
2766	      }
2767	    else
2768	      {
2769		Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2770
2771		check_non_pic(object, r_type);
2772		if (gsym->is_from_dynobj()
2773		    || gsym->is_undefined()
2774		    || gsym->is_preemptible())
2775		  rela_dyn->add_global(gsym, orig_r_type, output_section,
2776				       object, data_shndx,
2777				       reloc.get_r_offset(),
2778				       reloc.get_r_addend());
2779		else
2780		  rela_dyn->add_symbolless_global_addend(gsym, orig_r_type,
2781							 output_section,
2782							 object, data_shndx,
2783							 reloc.get_r_offset(),
2784							 reloc.get_r_addend());
2785	      }
2786	  }
2787      }
2788      break;
2789
2790    case elfcpp::R_SPARC_GOTDATA_OP:
2791    case elfcpp::R_SPARC_GOTDATA_OP_HIX22:
2792    case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
2793      if (gsym->is_defined()
2794	  && !gsym->is_from_dynobj()
2795	  && !gsym->is_preemptible()
2796	  && !is_ifunc)
2797	{
2798	  // We will optimize this into a GOT relative relocation
2799	  // and code transform the GOT load into an addition.
2800	  break;
2801	}
2802    case elfcpp::R_SPARC_GOT10:
2803    case elfcpp::R_SPARC_GOT13:
2804    case elfcpp::R_SPARC_GOT22:
2805      {
2806	// The symbol requires a GOT entry.
2807	Output_data_got<size, big_endian>* got;
2808
2809	got = target->got_section(symtab, layout);
2810	if (gsym->final_value_is_known())
2811	  {
2812	    // For a STT_GNU_IFUNC symbol we want the PLT address.
2813	    if (gsym->type() == elfcpp::STT_GNU_IFUNC)
2814	      got->add_global_plt(gsym, GOT_TYPE_STANDARD);
2815	    else
2816	      got->add_global(gsym, GOT_TYPE_STANDARD);
2817	  }
2818	else
2819	  {
2820	    // If this symbol is not fully resolved, we need to add a
2821	    // GOT entry with a dynamic relocation.
2822	    bool is_ifunc = gsym->type() == elfcpp::STT_GNU_IFUNC;
2823
2824	    // Use a GLOB_DAT rather than a RELATIVE reloc if:
2825	    //
2826	    // 1) The symbol may be defined in some other module.
2827	    //
2828	    // 2) We are building a shared library and this is a
2829	    // protected symbol; using GLOB_DAT means that the dynamic
2830	    // linker can use the address of the PLT in the main
2831	    // executable when appropriate so that function address
2832	    // comparisons work.
2833	    //
2834	    // 3) This is a STT_GNU_IFUNC symbol in position dependent
2835	    // code, again so that function address comparisons work.
2836	    Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2837	    if (gsym->is_from_dynobj()
2838		|| gsym->is_undefined()
2839		|| gsym->is_preemptible()
2840		|| (gsym->visibility() == elfcpp::STV_PROTECTED
2841		    && parameters->options().shared())
2842		|| (gsym->type() == elfcpp::STT_GNU_IFUNC
2843		    && parameters->options().output_is_position_independent()
2844		    && !gsym->is_forced_local()))
2845	      {
2846		unsigned int r_type = elfcpp::R_SPARC_GLOB_DAT;
2847
2848		// If this symbol is forced local, this relocation will
2849		// not work properly.  That's because ld.so on sparc
2850		// (and 32-bit powerpc) expects st_value in the r_addend
2851		// of relocations for STB_LOCAL symbols.  Curiously the
2852		// BFD linker does not promote global hidden symbols to be
2853		// STB_LOCAL in the dynamic symbol table like Gold does.
2854		gold_assert(!gsym->is_forced_local());
2855		got->add_global_with_rel(gsym, GOT_TYPE_STANDARD, rela_dyn,
2856					 r_type);
2857	      }
2858	    else if (!gsym->has_got_offset(GOT_TYPE_STANDARD))
2859	      {
2860		unsigned int off = got->add_constant(0);
2861
2862		gsym->set_got_offset(GOT_TYPE_STANDARD, off);
2863		if (is_ifunc)
2864		  {
2865		    // Tell the dynamic linker to use the PLT address
2866		    // when resolving relocations.
2867		    if (gsym->is_from_dynobj()
2868			&& !parameters->options().shared())
2869		      gsym->set_needs_dynsym_value();
2870		  }
2871		rela_dyn->add_global_relative(gsym, elfcpp::R_SPARC_RELATIVE,
2872					      got, off, 0, is_ifunc);
2873	      }
2874	  }
2875      }
2876      break;
2877
2878      // These are initial tls relocs, which are expected when
2879      // linking.
2880    case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic
2881    case elfcpp::R_SPARC_TLS_GD_LO10:
2882    case elfcpp::R_SPARC_TLS_GD_ADD:
2883    case elfcpp::R_SPARC_TLS_GD_CALL:
2884    case elfcpp::R_SPARC_TLS_LDM_HI22:	// Local-dynamic
2885    case elfcpp::R_SPARC_TLS_LDM_LO10:
2886    case elfcpp::R_SPARC_TLS_LDM_ADD:
2887    case elfcpp::R_SPARC_TLS_LDM_CALL:
2888    case elfcpp::R_SPARC_TLS_LDO_HIX22:	// Alternate local-dynamic
2889    case elfcpp::R_SPARC_TLS_LDO_LOX10:
2890    case elfcpp::R_SPARC_TLS_LDO_ADD:
2891    case elfcpp::R_SPARC_TLS_LE_HIX22:
2892    case elfcpp::R_SPARC_TLS_LE_LOX10:
2893    case elfcpp::R_SPARC_TLS_IE_HI22:	// Initial-exec
2894    case elfcpp::R_SPARC_TLS_IE_LO10:
2895    case elfcpp::R_SPARC_TLS_IE_LD:
2896    case elfcpp::R_SPARC_TLS_IE_LDX:
2897    case elfcpp::R_SPARC_TLS_IE_ADD:
2898      {
2899	const bool is_final = gsym->final_value_is_known();
2900	const tls::Tls_optimization optimized_type
2901	    = optimize_tls_reloc(is_final, r_type);
2902	switch (r_type)
2903	  {
2904	  case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic
2905	  case elfcpp::R_SPARC_TLS_GD_LO10:
2906	  case elfcpp::R_SPARC_TLS_GD_ADD:
2907	  case elfcpp::R_SPARC_TLS_GD_CALL:
2908	    if (optimized_type == tls::TLSOPT_NONE)
2909	      {
2910		// Create a pair of GOT entries for the module index and
2911		// dtv-relative offset.
2912		Output_data_got<size, big_endian>* got
2913		    = target->got_section(symtab, layout);
2914		got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
2915					      target->rela_dyn_section(layout),
2916					      (size == 64
2917					       ? elfcpp::R_SPARC_TLS_DTPMOD64
2918					       : elfcpp::R_SPARC_TLS_DTPMOD32),
2919					      (size == 64
2920					       ? elfcpp::R_SPARC_TLS_DTPOFF64
2921					       : elfcpp::R_SPARC_TLS_DTPOFF32));
2922
2923		// Emit R_SPARC_WPLT30 against "__tls_get_addr"
2924		if (r_type == elfcpp::R_SPARC_TLS_GD_CALL)
2925		  generate_tls_call(symtab, layout, target);
2926	      }
2927	    else if (optimized_type == tls::TLSOPT_TO_IE)
2928	      {
2929		// Create a GOT entry for the tp-relative offset.
2930		Output_data_got<size, big_endian>* got
2931		    = target->got_section(symtab, layout);
2932		got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
2933					 target->rela_dyn_section(layout),
2934					 (size == 64 ?
2935					  elfcpp::R_SPARC_TLS_TPOFF64 :
2936					  elfcpp::R_SPARC_TLS_TPOFF32));
2937	      }
2938	    else if (optimized_type != tls::TLSOPT_TO_LE)
2939	      unsupported_reloc_global(object, r_type, gsym);
2940	    break;
2941
2942	  case elfcpp::R_SPARC_TLS_LDM_HI22:	// Local-dynamic
2943	  case elfcpp::R_SPARC_TLS_LDM_LO10:
2944	  case elfcpp::R_SPARC_TLS_LDM_ADD:
2945	  case elfcpp::R_SPARC_TLS_LDM_CALL:
2946	    if (optimized_type == tls::TLSOPT_NONE)
2947	      {
2948		// Create a GOT entry for the module index.
2949		target->got_mod_index_entry(symtab, layout, object);
2950
2951		if (r_type == elfcpp::R_SPARC_TLS_LDM_CALL)
2952		  generate_tls_call(symtab, layout, target);
2953	      }
2954	    else if (optimized_type != tls::TLSOPT_TO_LE)
2955	      unsupported_reloc_global(object, r_type, gsym);
2956	    break;
2957
2958	  case elfcpp::R_SPARC_TLS_LDO_HIX22:	// Alternate local-dynamic
2959	  case elfcpp::R_SPARC_TLS_LDO_LOX10:
2960	  case elfcpp::R_SPARC_TLS_LDO_ADD:
2961	    break;
2962
2963	  case elfcpp::R_SPARC_TLS_LE_HIX22:
2964	  case elfcpp::R_SPARC_TLS_LE_LOX10:
2965	    layout->set_has_static_tls();
2966	    if (parameters->options().shared())
2967	      {
2968		Reloc_section* rela_dyn = target->rela_dyn_section(layout);
2969		rela_dyn->add_symbolless_global_addend(gsym, orig_r_type,
2970						       output_section, object,
2971						       data_shndx, reloc.get_r_offset(),
2972						       0);
2973	      }
2974	    break;
2975
2976	  case elfcpp::R_SPARC_TLS_IE_HI22:	// Initial-exec
2977	  case elfcpp::R_SPARC_TLS_IE_LO10:
2978	  case elfcpp::R_SPARC_TLS_IE_LD:
2979	  case elfcpp::R_SPARC_TLS_IE_LDX:
2980	  case elfcpp::R_SPARC_TLS_IE_ADD:
2981	    layout->set_has_static_tls();
2982	    if (optimized_type == tls::TLSOPT_NONE)
2983	      {
2984		// Create a GOT entry for the tp-relative offset.
2985		Output_data_got<size, big_endian>* got
2986		  = target->got_section(symtab, layout);
2987		got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
2988					 target->rela_dyn_section(layout),
2989					 (size == 64
2990					  ? elfcpp::R_SPARC_TLS_TPOFF64
2991					  : elfcpp::R_SPARC_TLS_TPOFF32));
2992	      }
2993	    else if (optimized_type != tls::TLSOPT_TO_LE)
2994	      unsupported_reloc_global(object, r_type, gsym);
2995	    break;
2996	  }
2997      }
2998      break;
2999
3000      // These are relocations which should only be seen by the
3001      // dynamic linker, and should never be seen here.
3002    case elfcpp::R_SPARC_COPY:
3003    case elfcpp::R_SPARC_GLOB_DAT:
3004    case elfcpp::R_SPARC_JMP_SLOT:
3005    case elfcpp::R_SPARC_JMP_IREL:
3006    case elfcpp::R_SPARC_RELATIVE:
3007    case elfcpp::R_SPARC_IRELATIVE:
3008    case elfcpp::R_SPARC_TLS_DTPMOD64:
3009    case elfcpp::R_SPARC_TLS_DTPMOD32:
3010    case elfcpp::R_SPARC_TLS_DTPOFF64:
3011    case elfcpp::R_SPARC_TLS_DTPOFF32:
3012    case elfcpp::R_SPARC_TLS_TPOFF64:
3013    case elfcpp::R_SPARC_TLS_TPOFF32:
3014      gold_error(_("%s: unexpected reloc %u in object file"),
3015		 object->name().c_str(), r_type);
3016      break;
3017
3018    default:
3019      unsupported_reloc_global(object, r_type, gsym);
3020      break;
3021    }
3022}
3023
3024// Process relocations for gc.
3025
3026template<int size, bool big_endian>
3027void
3028Target_sparc<size, big_endian>::gc_process_relocs(
3029			Symbol_table* symtab,
3030			Layout* layout,
3031			Sized_relobj_file<size, big_endian>* object,
3032			unsigned int data_shndx,
3033			unsigned int,
3034			const unsigned char* prelocs,
3035			size_t reloc_count,
3036			Output_section* output_section,
3037			bool needs_special_offset_handling,
3038			size_t local_symbol_count,
3039			const unsigned char* plocal_symbols)
3040{
3041  typedef Target_sparc<size, big_endian> Sparc;
3042  typedef typename Target_sparc<size, big_endian>::Scan Scan;
3043
3044  gold::gc_process_relocs<size, big_endian, Sparc, elfcpp::SHT_RELA, Scan,
3045			  typename Target_sparc::Relocatable_size_for_reloc>(
3046    symtab,
3047    layout,
3048    this,
3049    object,
3050    data_shndx,
3051    prelocs,
3052    reloc_count,
3053    output_section,
3054    needs_special_offset_handling,
3055    local_symbol_count,
3056    plocal_symbols);
3057}
3058
3059// Scan relocations for a section.
3060
3061template<int size, bool big_endian>
3062void
3063Target_sparc<size, big_endian>::scan_relocs(
3064			Symbol_table* symtab,
3065			Layout* layout,
3066			Sized_relobj_file<size, big_endian>* object,
3067			unsigned int data_shndx,
3068			unsigned int sh_type,
3069			const unsigned char* prelocs,
3070			size_t reloc_count,
3071			Output_section* output_section,
3072			bool needs_special_offset_handling,
3073			size_t local_symbol_count,
3074			const unsigned char* plocal_symbols)
3075{
3076  typedef Target_sparc<size, big_endian> Sparc;
3077  typedef typename Target_sparc<size, big_endian>::Scan Scan;
3078
3079  if (sh_type == elfcpp::SHT_REL)
3080    {
3081      gold_error(_("%s: unsupported REL reloc section"),
3082		 object->name().c_str());
3083      return;
3084    }
3085
3086  gold::scan_relocs<size, big_endian, Sparc, elfcpp::SHT_RELA, Scan>(
3087    symtab,
3088    layout,
3089    this,
3090    object,
3091    data_shndx,
3092    prelocs,
3093    reloc_count,
3094    output_section,
3095    needs_special_offset_handling,
3096    local_symbol_count,
3097    plocal_symbols);
3098}
3099
3100// Finalize the sections.
3101
3102template<int size, bool big_endian>
3103void
3104Target_sparc<size, big_endian>::do_finalize_sections(
3105    Layout* layout,
3106    const Input_objects*,
3107    Symbol_table* symtab)
3108{
3109  if (this->plt_)
3110    this->plt_->emit_pending_ifunc_relocs();
3111
3112  // Fill in some more dynamic tags.
3113  const Reloc_section* rel_plt = (this->plt_ == NULL
3114				  ? NULL
3115				  : this->plt_->rel_plt());
3116  layout->add_target_dynamic_tags(false, this->plt_, rel_plt,
3117				  this->rela_dyn_, true, true);
3118
3119  // Emit any relocs we saved in an attempt to avoid generating COPY
3120  // relocs.
3121  if (this->copy_relocs_.any_saved_relocs())
3122    this->copy_relocs_.emit(this->rela_dyn_section(layout));
3123
3124  if (parameters->doing_static_link()
3125      && (this->plt_ == NULL || !this->plt_->has_ifunc_section()))
3126    {
3127      // If linking statically, make sure that the __rela_iplt symbols
3128      // were defined if necessary, even if we didn't create a PLT.
3129      static const Define_symbol_in_segment syms[] =
3130	{
3131	  {
3132	    "__rela_iplt_start",	// name
3133	    elfcpp::PT_LOAD,		// segment_type
3134	    elfcpp::PF_W,		// segment_flags_set
3135	    elfcpp::PF(0),		// segment_flags_clear
3136	    0,				// value
3137	    0,				// size
3138	    elfcpp::STT_NOTYPE,		// type
3139	    elfcpp::STB_GLOBAL,		// binding
3140	    elfcpp::STV_HIDDEN,		// visibility
3141	    0,				// nonvis
3142	    Symbol::SEGMENT_START,	// offset_from_base
3143	    true			// only_if_ref
3144	  },
3145	  {
3146	    "__rela_iplt_end",		// name
3147	    elfcpp::PT_LOAD,		// segment_type
3148	    elfcpp::PF_W,		// segment_flags_set
3149	    elfcpp::PF(0),		// segment_flags_clear
3150	    0,				// value
3151	    0,				// size
3152	    elfcpp::STT_NOTYPE,		// type
3153	    elfcpp::STB_GLOBAL,		// binding
3154	    elfcpp::STV_HIDDEN,		// visibility
3155	    0,				// nonvis
3156	    Symbol::SEGMENT_START,	// offset_from_base
3157	    true			// only_if_ref
3158	  }
3159	};
3160
3161      symtab->define_symbols(layout, 2, syms,
3162			     layout->script_options()->saw_sections_clause());
3163    }
3164}
3165
3166// Perform a relocation.
3167
3168template<int size, bool big_endian>
3169inline bool
3170Target_sparc<size, big_endian>::Relocate::relocate(
3171			const Relocate_info<size, big_endian>* relinfo,
3172			Target_sparc* target,
3173			Output_section*,
3174			size_t relnum,
3175			const elfcpp::Rela<size, big_endian>& rela,
3176			unsigned int r_type,
3177			const Sized_symbol<size>* gsym,
3178			const Symbol_value<size>* psymval,
3179			unsigned char* view,
3180			typename elfcpp::Elf_types<size>::Elf_Addr address,
3181			section_size_type view_size)
3182{
3183  bool orig_is_ifunc = psymval->is_ifunc_symbol();
3184  r_type &= 0xff;
3185
3186  if (this->ignore_gd_add_)
3187    {
3188      if (r_type != elfcpp::R_SPARC_TLS_GD_ADD)
3189	gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
3190			       _("missing expected TLS relocation"));
3191      else
3192	{
3193	  this->ignore_gd_add_ = false;
3194	  return false;
3195	}
3196    }
3197
3198  if (view == NULL)
3199    return true;
3200
3201  if (this->reloc_adjust_addr_ == view)
3202    view -= 4;
3203
3204  typedef Sparc_relocate_functions<size, big_endian> Reloc;
3205  const Sized_relobj_file<size, big_endian>* object = relinfo->object;
3206
3207  // Pick the value to use for symbols defined in shared objects.
3208  Symbol_value<size> symval;
3209  if (gsym != NULL
3210      && gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
3211    {
3212      elfcpp::Elf_Xword value;
3213
3214      value = target->plt_address_for_global(gsym);
3215
3216      symval.set_output_value(value);
3217
3218      psymval = &symval;
3219    }
3220  else if (gsym == NULL && orig_is_ifunc)
3221    {
3222      unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info());
3223      if (object->local_has_plt_offset(r_sym))
3224	{
3225	  symval.set_output_value(target->plt_address_for_local(object, r_sym));
3226	  psymval = &symval;
3227	}
3228    }
3229
3230  const elfcpp::Elf_Xword addend = rela.get_r_addend();
3231
3232  // Get the GOT offset if needed.  Unlike i386 and x86_64, our GOT
3233  // pointer points to the beginning, not the end, of the table.
3234  // So we just use the plain offset.
3235  unsigned int got_offset = 0;
3236  bool gdop_valid = false;
3237  switch (r_type)
3238    {
3239    case elfcpp::R_SPARC_GOTDATA_OP:
3240    case elfcpp::R_SPARC_GOTDATA_OP_HIX22:
3241    case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
3242      // If this is local, we did not create a GOT entry because we
3243      // intend to transform this into a GOT relative relocation.
3244      if (gsym == NULL
3245	  || (gsym->is_defined()
3246	      && !gsym->is_from_dynobj()
3247	      && !gsym->is_preemptible()
3248	      && !orig_is_ifunc))
3249	{
3250	  got_offset = psymval->value(object, addend) - target->got_address();
3251	  gdop_valid = true;
3252	  break;
3253	}
3254    case elfcpp::R_SPARC_GOT10:
3255    case elfcpp::R_SPARC_GOT13:
3256    case elfcpp::R_SPARC_GOT22:
3257      if (gsym != NULL)
3258	{
3259	  gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
3260	  got_offset = gsym->got_offset(GOT_TYPE_STANDARD);
3261	}
3262      else
3263	{
3264	  unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info());
3265	  gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
3266	  got_offset = object->local_got_offset(r_sym, GOT_TYPE_STANDARD);
3267	}
3268      break;
3269
3270    default:
3271      break;
3272    }
3273
3274  switch (r_type)
3275    {
3276    case elfcpp::R_SPARC_NONE:
3277    case elfcpp::R_SPARC_REGISTER:
3278    case elfcpp::R_SPARC_GNU_VTINHERIT:
3279    case elfcpp::R_SPARC_GNU_VTENTRY:
3280      break;
3281
3282    case elfcpp::R_SPARC_8:
3283      Relocate_functions<size, big_endian>::rela8(view, object,
3284						  psymval, addend);
3285      break;
3286
3287    case elfcpp::R_SPARC_16:
3288      if (rela.get_r_offset() & 0x1)
3289	{
3290	  // The assembler can sometimes emit unaligned relocations
3291	  // for dwarf2 cfi directives.
3292	  Reloc::ua16(view, object, psymval, addend);
3293	}
3294      else
3295	Relocate_functions<size, big_endian>::rela16(view, object,
3296						     psymval, addend);
3297      break;
3298
3299    case elfcpp::R_SPARC_32:
3300      if (!parameters->options().output_is_position_independent())
3301	{
3302	  if (rela.get_r_offset() & 0x3)
3303	    {
3304	      // The assembler can sometimes emit unaligned relocations
3305	      // for dwarf2 cfi directives.
3306	      Reloc::ua32(view, object, psymval, addend);
3307	    }
3308	  else
3309	    Relocate_functions<size, big_endian>::rela32(view, object,
3310							 psymval, addend);
3311	}
3312      break;
3313
3314    case elfcpp::R_SPARC_DISP8:
3315      Reloc::disp8(view, object, psymval, addend, address);
3316      break;
3317
3318    case elfcpp::R_SPARC_DISP16:
3319      Reloc::disp16(view, object, psymval, addend, address);
3320      break;
3321
3322    case elfcpp::R_SPARC_DISP32:
3323      Reloc::disp32(view, object, psymval, addend, address);
3324      break;
3325
3326    case elfcpp::R_SPARC_DISP64:
3327      Reloc::disp64(view, object, psymval, addend, address);
3328      break;
3329
3330    case elfcpp::R_SPARC_WDISP30:
3331    case elfcpp::R_SPARC_WPLT30:
3332      Reloc::wdisp30(view, object, psymval, addend, address);
3333      if (target->may_relax())
3334	relax_call(target, view, rela, view_size);
3335      break;
3336
3337    case elfcpp::R_SPARC_WDISP22:
3338      Reloc::wdisp22(view, object, psymval, addend, address);
3339      break;
3340
3341    case elfcpp::R_SPARC_WDISP19:
3342      Reloc::wdisp19(view, object, psymval, addend, address);
3343      break;
3344
3345    case elfcpp::R_SPARC_WDISP16:
3346      Reloc::wdisp16(view, object, psymval, addend, address);
3347      break;
3348
3349    case elfcpp::R_SPARC_WDISP10:
3350      Reloc::wdisp10(view, object, psymval, addend, address);
3351      break;
3352
3353    case elfcpp::R_SPARC_HI22:
3354      Reloc::hi22(view, object, psymval, addend);
3355      break;
3356
3357    case elfcpp::R_SPARC_22:
3358      Reloc::rela32_22(view, object, psymval, addend);
3359      break;
3360
3361    case elfcpp::R_SPARC_13:
3362      Reloc::rela32_13(view, object, psymval, addend);
3363      break;
3364
3365    case elfcpp::R_SPARC_LO10:
3366      Reloc::lo10(view, object, psymval, addend);
3367      break;
3368
3369    case elfcpp::R_SPARC_GOT10:
3370      Reloc::lo10(view, got_offset, addend);
3371      break;
3372
3373    case elfcpp::R_SPARC_GOTDATA_OP:
3374      if (gdop_valid)
3375	{
3376	  typedef typename elfcpp::Swap<32, true>::Valtype Insntype;
3377	  Insntype* wv = reinterpret_cast<Insntype*>(view);
3378	  Insntype val;
3379
3380	  // {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd
3381	  val = elfcpp::Swap<32, true>::readval(wv);
3382	  val = 0x80000000 | (val & 0x3e07c01f);
3383	  elfcpp::Swap<32, true>::writeval(wv, val);
3384	}
3385      break;
3386
3387    case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
3388      if (gdop_valid)
3389	{
3390	  Reloc::gdop_lox10(view, got_offset);
3391	  break;
3392	}
3393      /* Fall through.  */
3394    case elfcpp::R_SPARC_GOT13:
3395      Reloc::rela32_13(view, got_offset, addend);
3396      break;
3397
3398    case elfcpp::R_SPARC_GOTDATA_OP_HIX22:
3399      if (gdop_valid)
3400	{
3401	  Reloc::gdop_hix22(view, got_offset);
3402	  break;
3403	}
3404      /* Fall through.  */
3405    case elfcpp::R_SPARC_GOT22:
3406      Reloc::hi22(view, got_offset, addend);
3407      break;
3408
3409    case elfcpp::R_SPARC_PC10:
3410      Reloc::pc10(view, object, psymval, addend, address);
3411      break;
3412
3413    case elfcpp::R_SPARC_PC22:
3414      Reloc::pc22(view, object, psymval, addend, address);
3415      break;
3416
3417    case elfcpp::R_SPARC_TLS_DTPOFF32:
3418    case elfcpp::R_SPARC_UA32:
3419      Reloc::ua32(view, object, psymval, addend);
3420      break;
3421
3422    case elfcpp::R_SPARC_PLT64:
3423      Relocate_functions<size, big_endian>::rela64(view, object,
3424						   psymval, addend);
3425      break;
3426
3427    case elfcpp::R_SPARC_PLT32:
3428      Relocate_functions<size, big_endian>::rela32(view, object,
3429						   psymval, addend);
3430      break;
3431
3432    case elfcpp::R_SPARC_HIPLT22:
3433      Reloc::hi22(view, object, psymval, addend);
3434      break;
3435
3436    case elfcpp::R_SPARC_LOPLT10:
3437      Reloc::lo10(view, object, psymval, addend);
3438      break;
3439
3440    case elfcpp::R_SPARC_PCPLT32:
3441      Reloc::disp32(view, object, psymval, addend, address);
3442      break;
3443
3444    case elfcpp::R_SPARC_PCPLT22:
3445      Reloc::pcplt22(view, object, psymval, addend, address);
3446      break;
3447
3448    case elfcpp::R_SPARC_PCPLT10:
3449      Reloc::lo10(view, object, psymval, addend, address);
3450      break;
3451
3452    case elfcpp::R_SPARC_64:
3453      if (!parameters->options().output_is_position_independent())
3454	{
3455	  if (rela.get_r_offset() & 0x7)
3456	    {
3457	      // The assembler can sometimes emit unaligned relocations
3458	      // for dwarf2 cfi directives.
3459	      Reloc::ua64(view, object, psymval, addend);
3460	    }
3461	  else
3462	    Relocate_functions<size, big_endian>::rela64(view, object,
3463							 psymval, addend);
3464	}
3465      break;
3466
3467    case elfcpp::R_SPARC_OLO10:
3468      {
3469	unsigned int addend2 = rela.get_r_info() & 0xffffffff;
3470	addend2 = ((addend2 >> 8) ^ 0x800000) - 0x800000;
3471	Reloc::olo10(view, object, psymval, addend, addend2);
3472      }
3473      break;
3474
3475    case elfcpp::R_SPARC_HH22:
3476      Reloc::hh22(view, object, psymval, addend);
3477      break;
3478
3479    case elfcpp::R_SPARC_PC_HH22:
3480      Reloc::pc_hh22(view, object, psymval, addend, address);
3481      break;
3482
3483    case elfcpp::R_SPARC_HM10:
3484      Reloc::hm10(view, object, psymval, addend);
3485      break;
3486
3487    case elfcpp::R_SPARC_PC_HM10:
3488      Reloc::pc_hm10(view, object, psymval, addend, address);
3489      break;
3490
3491    case elfcpp::R_SPARC_LM22:
3492      Reloc::hi22(view, object, psymval, addend);
3493      break;
3494
3495    case elfcpp::R_SPARC_PC_LM22:
3496      Reloc::pcplt22(view, object, psymval, addend, address);
3497      break;
3498
3499    case elfcpp::R_SPARC_11:
3500      Reloc::rela32_11(view, object, psymval, addend);
3501      break;
3502
3503    case elfcpp::R_SPARC_10:
3504      Reloc::rela32_10(view, object, psymval, addend);
3505      break;
3506
3507    case elfcpp::R_SPARC_7:
3508      Reloc::rela32_7(view, object, psymval, addend);
3509      break;
3510
3511    case elfcpp::R_SPARC_6:
3512      Reloc::rela32_6(view, object, psymval, addend);
3513      break;
3514
3515    case elfcpp::R_SPARC_5:
3516      Reloc::rela32_5(view, object, psymval, addend);
3517      break;
3518
3519    case elfcpp::R_SPARC_HIX22:
3520      Reloc::hix22(view, object, psymval, addend);
3521      break;
3522
3523    case elfcpp::R_SPARC_LOX10:
3524      Reloc::lox10(view, object, psymval, addend);
3525      break;
3526
3527    case elfcpp::R_SPARC_H34:
3528      Reloc::h34(view, object, psymval, addend);
3529      break;
3530
3531    case elfcpp::R_SPARC_H44:
3532      Reloc::h44(view, object, psymval, addend);
3533      break;
3534
3535    case elfcpp::R_SPARC_M44:
3536      Reloc::m44(view, object, psymval, addend);
3537      break;
3538
3539    case elfcpp::R_SPARC_L44:
3540      Reloc::l44(view, object, psymval, addend);
3541      break;
3542
3543    case elfcpp::R_SPARC_TLS_DTPOFF64:
3544    case elfcpp::R_SPARC_UA64:
3545      Reloc::ua64(view, object, psymval, addend);
3546      break;
3547
3548    case elfcpp::R_SPARC_UA16:
3549      Reloc::ua16(view, object, psymval, addend);
3550      break;
3551
3552    case elfcpp::R_SPARC_TLS_GD_HI22:
3553    case elfcpp::R_SPARC_TLS_GD_LO10:
3554    case elfcpp::R_SPARC_TLS_GD_ADD:
3555    case elfcpp::R_SPARC_TLS_GD_CALL:
3556    case elfcpp::R_SPARC_TLS_LDM_HI22:
3557    case elfcpp::R_SPARC_TLS_LDM_LO10:
3558    case elfcpp::R_SPARC_TLS_LDM_ADD:
3559    case elfcpp::R_SPARC_TLS_LDM_CALL:
3560    case elfcpp::R_SPARC_TLS_LDO_HIX22:
3561    case elfcpp::R_SPARC_TLS_LDO_LOX10:
3562    case elfcpp::R_SPARC_TLS_LDO_ADD:
3563    case elfcpp::R_SPARC_TLS_IE_HI22:
3564    case elfcpp::R_SPARC_TLS_IE_LO10:
3565    case elfcpp::R_SPARC_TLS_IE_LD:
3566    case elfcpp::R_SPARC_TLS_IE_LDX:
3567    case elfcpp::R_SPARC_TLS_IE_ADD:
3568    case elfcpp::R_SPARC_TLS_LE_HIX22:
3569    case elfcpp::R_SPARC_TLS_LE_LOX10:
3570      this->relocate_tls(relinfo, target, relnum, rela,
3571			 r_type, gsym, psymval, view,
3572			 address, view_size);
3573      break;
3574
3575    case elfcpp::R_SPARC_COPY:
3576    case elfcpp::R_SPARC_GLOB_DAT:
3577    case elfcpp::R_SPARC_JMP_SLOT:
3578    case elfcpp::R_SPARC_JMP_IREL:
3579    case elfcpp::R_SPARC_RELATIVE:
3580    case elfcpp::R_SPARC_IRELATIVE:
3581      // These are outstanding tls relocs, which are unexpected when
3582      // linking.
3583    case elfcpp::R_SPARC_TLS_DTPMOD64:
3584    case elfcpp::R_SPARC_TLS_DTPMOD32:
3585    case elfcpp::R_SPARC_TLS_TPOFF64:
3586    case elfcpp::R_SPARC_TLS_TPOFF32:
3587      gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
3588			     _("unexpected reloc %u in object file"),
3589			     r_type);
3590      break;
3591
3592    default:
3593      gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
3594			     _("unsupported reloc %u"),
3595			     r_type);
3596      break;
3597    }
3598
3599  return true;
3600}
3601
3602// Perform a TLS relocation.
3603
3604template<int size, bool big_endian>
3605inline void
3606Target_sparc<size, big_endian>::Relocate::relocate_tls(
3607			const Relocate_info<size, big_endian>* relinfo,
3608			Target_sparc<size, big_endian>* target,
3609			size_t relnum,
3610			const elfcpp::Rela<size, big_endian>& rela,
3611			unsigned int r_type,
3612			const Sized_symbol<size>* gsym,
3613			const Symbol_value<size>* psymval,
3614			unsigned char* view,
3615			typename elfcpp::Elf_types<size>::Elf_Addr address,
3616			section_size_type)
3617{
3618  Output_segment* tls_segment = relinfo->layout->tls_segment();
3619  typedef Sparc_relocate_functions<size, big_endian> Reloc;
3620  const Sized_relobj_file<size, big_endian>* object = relinfo->object;
3621  typedef typename elfcpp::Swap<32, true>::Valtype Insntype;
3622
3623  const elfcpp::Elf_Xword addend = rela.get_r_addend();
3624  typename elfcpp::Elf_types<size>::Elf_Addr value = psymval->value(object, 0);
3625
3626  const bool is_final =
3627    (gsym == NULL
3628     ? !parameters->options().output_is_position_independent()
3629     : gsym->final_value_is_known());
3630  const tls::Tls_optimization optimized_type
3631      = optimize_tls_reloc(is_final, r_type);
3632
3633  switch (r_type)
3634    {
3635    case elfcpp::R_SPARC_TLS_GD_HI22:
3636    case elfcpp::R_SPARC_TLS_GD_LO10:
3637    case elfcpp::R_SPARC_TLS_GD_ADD:
3638    case elfcpp::R_SPARC_TLS_GD_CALL:
3639      if (optimized_type == tls::TLSOPT_TO_LE)
3640	{
3641	  Insntype* wv = reinterpret_cast<Insntype*>(view);
3642	  Insntype val;
3643
3644	  value -= tls_segment->memsz();
3645
3646	  switch (r_type)
3647	    {
3648	    case elfcpp::R_SPARC_TLS_GD_HI22:
3649	      // TLS_GD_HI22 --> TLS_LE_HIX22
3650	      Reloc::hix22(view, value, addend);
3651	      break;
3652
3653	    case elfcpp::R_SPARC_TLS_GD_LO10:
3654	      // TLS_GD_LO10 --> TLS_LE_LOX10
3655	      Reloc::lox10(view, value, addend);
3656	      break;
3657
3658	    case elfcpp::R_SPARC_TLS_GD_ADD:
3659	      // add %reg1, %reg2, %reg3 --> mov %g7, %reg2, %reg3
3660	      val = elfcpp::Swap<32, true>::readval(wv);
3661	      val = (val & ~0x7c000) | 0x1c000;
3662	      elfcpp::Swap<32, true>::writeval(wv, val);
3663	      break;
3664	    case elfcpp::R_SPARC_TLS_GD_CALL:
3665	      // call __tls_get_addr --> nop
3666	      elfcpp::Swap<32, true>::writeval(wv, sparc_nop);
3667	      break;
3668	    }
3669	  break;
3670	}
3671      else
3672	{
3673	  unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE
3674				   ? GOT_TYPE_TLS_OFFSET
3675				   : GOT_TYPE_TLS_PAIR);
3676	  if (gsym != NULL)
3677	    {
3678	      gold_assert(gsym->has_got_offset(got_type));
3679	      value = gsym->got_offset(got_type);
3680	    }
3681	  else
3682	    {
3683	      unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info());
3684	      gold_assert(object->local_has_got_offset(r_sym, got_type));
3685	      value = object->local_got_offset(r_sym, got_type);
3686	    }
3687	  if (optimized_type == tls::TLSOPT_TO_IE)
3688	    {
3689	      Insntype* wv = reinterpret_cast<Insntype*>(view);
3690	      Insntype val;
3691
3692	      switch (r_type)
3693		{
3694		case elfcpp::R_SPARC_TLS_GD_HI22:
3695		  // TLS_GD_HI22 --> TLS_IE_HI22
3696		  Reloc::hi22(view, value, addend);
3697		  break;
3698
3699		case elfcpp::R_SPARC_TLS_GD_LO10:
3700		  // TLS_GD_LO10 --> TLS_IE_LO10
3701		  Reloc::lo10(view, value, addend);
3702		  break;
3703
3704		case elfcpp::R_SPARC_TLS_GD_ADD:
3705		  // add %reg1, %reg2, %reg3 --> ld [%reg1 + %reg2], %reg3
3706		  val = elfcpp::Swap<32, true>::readval(wv);
3707
3708		  if (size == 64)
3709		    val |= 0xc0580000;
3710		  else
3711		    val |= 0xc0000000;
3712
3713		  elfcpp::Swap<32, true>::writeval(wv, val);
3714		  break;
3715
3716		case elfcpp::R_SPARC_TLS_GD_CALL:
3717		  // The compiler can put the TLS_GD_ADD instruction
3718		  // into the delay slot of the call.  If so, we need
3719		  // to transpose the two instructions so that the
3720		  // new sequence works properly.
3721		  //
3722		  // The test we use is if the instruction in the
3723		  // delay slot is an add with destination register
3724		  // equal to %o0
3725		  val = elfcpp::Swap<32, true>::readval(wv + 1);
3726		  if ((val & 0x81f80000) == 0x80000000
3727		      && ((val >> 25) & 0x1f) == 0x8)
3728		    {
3729		      if (size == 64)
3730			val |= 0xc0580000;
3731		      else
3732			val |= 0xc0000000;
3733
3734		      elfcpp::Swap<32, true>::writeval(wv, val);
3735
3736		      wv += 1;
3737		      this->ignore_gd_add_ = true;
3738		    }
3739		  else
3740		    {
3741		      // Even if the delay slot isn't the TLS_GD_ADD
3742		      // instruction, we still have to handle the case
3743		      // where it sets up %o0 in some other way.
3744		      elfcpp::Swap<32, true>::writeval(wv, val);
3745		      wv += 1;
3746		      this->reloc_adjust_addr_ = view + 4;
3747		    }
3748		  // call __tls_get_addr --> add %g7, %o0, %o0
3749		  elfcpp::Swap<32, true>::writeval(wv, 0x9001c008);
3750		  break;
3751		}
3752	      break;
3753	    }
3754	  else if (optimized_type == tls::TLSOPT_NONE)
3755	    {
3756	      switch (r_type)
3757		{
3758		case elfcpp::R_SPARC_TLS_GD_HI22:
3759		  Reloc::hi22(view, value, addend);
3760		  break;
3761		case elfcpp::R_SPARC_TLS_GD_LO10:
3762		  Reloc::lo10(view, value, addend);
3763		  break;
3764		case elfcpp::R_SPARC_TLS_GD_ADD:
3765		  break;
3766		case elfcpp::R_SPARC_TLS_GD_CALL:
3767		  {
3768		    Symbol_value<size> symval;
3769		    elfcpp::Elf_Xword value;
3770		    Symbol* tsym;
3771
3772		    tsym = target->tls_get_addr_sym_;
3773		    gold_assert(tsym);
3774		    value = (target->plt_section()->address() +
3775			     tsym->plt_offset());
3776		    symval.set_output_value(value);
3777		    Reloc::wdisp30(view, object, &symval, addend, address);
3778		  }
3779		  break;
3780		}
3781	      break;
3782	    }
3783	}
3784      gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
3785			     _("unsupported reloc %u"),
3786			     r_type);
3787      break;
3788
3789    case elfcpp::R_SPARC_TLS_LDM_HI22:
3790    case elfcpp::R_SPARC_TLS_LDM_LO10:
3791    case elfcpp::R_SPARC_TLS_LDM_ADD:
3792    case elfcpp::R_SPARC_TLS_LDM_CALL:
3793      if (optimized_type == tls::TLSOPT_TO_LE)
3794	{
3795	  Insntype* wv = reinterpret_cast<Insntype*>(view);
3796
3797	  switch (r_type)
3798	    {
3799	    case elfcpp::R_SPARC_TLS_LDM_HI22:
3800	    case elfcpp::R_SPARC_TLS_LDM_LO10:
3801	    case elfcpp::R_SPARC_TLS_LDM_ADD:
3802	      elfcpp::Swap<32, true>::writeval(wv, sparc_nop);
3803	      break;
3804
3805	    case elfcpp::R_SPARC_TLS_LDM_CALL:
3806	      elfcpp::Swap<32, true>::writeval(wv, sparc_mov_g0_o0);
3807	      break;
3808	    }
3809	  break;
3810	}
3811      else if (optimized_type == tls::TLSOPT_NONE)
3812	{
3813	  // Relocate the field with the offset of the GOT entry for
3814	  // the module index.
3815	  unsigned int got_offset;
3816
3817	  got_offset = target->got_mod_index_entry(NULL, NULL, NULL);
3818	  switch (r_type)
3819	    {
3820	    case elfcpp::R_SPARC_TLS_LDM_HI22:
3821	      Reloc::hi22(view, got_offset, addend);
3822	      break;
3823	    case elfcpp::R_SPARC_TLS_LDM_LO10:
3824	      Reloc::lo10(view, got_offset, addend);
3825	      break;
3826	    case elfcpp::R_SPARC_TLS_LDM_ADD:
3827	      break;
3828	    case elfcpp::R_SPARC_TLS_LDM_CALL:
3829	      {
3830		Symbol_value<size> symval;
3831		elfcpp::Elf_Xword value;
3832		Symbol* tsym;
3833
3834		tsym = target->tls_get_addr_sym_;
3835		gold_assert(tsym);
3836		value = (target->plt_section()->address() +
3837			 tsym->plt_offset());
3838		symval.set_output_value(value);
3839		Reloc::wdisp30(view, object, &symval, addend, address);
3840	      }
3841	      break;
3842	    }
3843	  break;
3844	}
3845      gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
3846			     _("unsupported reloc %u"),
3847			     r_type);
3848      break;
3849
3850      // These relocs can appear in debugging sections, in which case
3851      // we won't see the TLS_LDM relocs.  The local_dynamic_type
3852      // field tells us this.
3853    case elfcpp::R_SPARC_TLS_LDO_HIX22:
3854      if (optimized_type == tls::TLSOPT_TO_LE)
3855	{
3856	  value -= tls_segment->memsz();
3857	  Reloc::hix22(view, value, addend);
3858	}
3859      else
3860	Reloc::ldo_hix22(view, value, addend);
3861      break;
3862    case elfcpp::R_SPARC_TLS_LDO_LOX10:
3863      if (optimized_type == tls::TLSOPT_TO_LE)
3864	{
3865	  value -= tls_segment->memsz();
3866	  Reloc::lox10(view, value, addend);
3867	}
3868      else
3869	Reloc::ldo_lox10(view, value, addend);
3870      break;
3871    case elfcpp::R_SPARC_TLS_LDO_ADD:
3872      if (optimized_type == tls::TLSOPT_TO_LE)
3873	{
3874	  Insntype* wv = reinterpret_cast<Insntype*>(view);
3875	  Insntype val;
3876
3877	  // add %reg1, %reg2, %reg3 --> add %g7, %reg2, %reg3
3878	  val = elfcpp::Swap<32, true>::readval(wv);
3879	  val = (val & ~0x7c000) | 0x1c000;
3880	  elfcpp::Swap<32, true>::writeval(wv, val);
3881	}
3882      break;
3883
3884      // When optimizing IE --> LE, the only relocation that is handled
3885      // differently is R_SPARC_TLS_IE_LD, it is rewritten from
3886      // 'ld{,x} [rs1 + rs2], rd' into 'mov rs2, rd' or simply a NOP is
3887      // rs2 and rd are the same.
3888    case elfcpp::R_SPARC_TLS_IE_LD:
3889    case elfcpp::R_SPARC_TLS_IE_LDX:
3890      if (optimized_type == tls::TLSOPT_TO_LE)
3891	{
3892	  Insntype* wv = reinterpret_cast<Insntype*>(view);
3893	  Insntype val = elfcpp::Swap<32, true>::readval(wv);
3894	  Insntype rs2 = val & 0x1f;
3895	  Insntype rd = (val >> 25) & 0x1f;
3896
3897	  if (rs2 == rd)
3898	    val = sparc_nop;
3899	  else
3900	    val = sparc_mov | (val & 0x3e00001f);
3901
3902	  elfcpp::Swap<32, true>::writeval(wv, val);
3903	}
3904      break;
3905
3906    case elfcpp::R_SPARC_TLS_IE_HI22:
3907    case elfcpp::R_SPARC_TLS_IE_LO10:
3908      if (optimized_type == tls::TLSOPT_TO_LE)
3909	{
3910	  value -= tls_segment->memsz();
3911	  switch (r_type)
3912	    {
3913	    case elfcpp::R_SPARC_TLS_IE_HI22:
3914	      // IE_HI22 --> LE_HIX22
3915	      Reloc::hix22(view, value, addend);
3916	      break;
3917	    case elfcpp::R_SPARC_TLS_IE_LO10:
3918	      // IE_LO10 --> LE_LOX10
3919	      Reloc::lox10(view, value, addend);
3920	      break;
3921	    }
3922	  break;
3923	}
3924      else if (optimized_type == tls::TLSOPT_NONE)
3925	{
3926	  // Relocate the field with the offset of the GOT entry for
3927	  // the tp-relative offset of the symbol.
3928	  if (gsym != NULL)
3929	    {
3930	      gold_assert(gsym->has_got_offset(GOT_TYPE_TLS_OFFSET));
3931	      value = gsym->got_offset(GOT_TYPE_TLS_OFFSET);
3932	    }
3933	  else
3934	    {
3935	      unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info());
3936	      gold_assert(object->local_has_got_offset(r_sym,
3937						       GOT_TYPE_TLS_OFFSET));
3938	      value = object->local_got_offset(r_sym,
3939					       GOT_TYPE_TLS_OFFSET);
3940	    }
3941	  switch (r_type)
3942	    {
3943	    case elfcpp::R_SPARC_TLS_IE_HI22:
3944	      Reloc::hi22(view, value, addend);
3945	      break;
3946	    case elfcpp::R_SPARC_TLS_IE_LO10:
3947	      Reloc::lo10(view, value, addend);
3948	      break;
3949	    }
3950	  break;
3951	}
3952      gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
3953			     _("unsupported reloc %u"),
3954			     r_type);
3955      break;
3956
3957    case elfcpp::R_SPARC_TLS_IE_ADD:
3958      // This seems to be mainly so that we can find the addition
3959      // instruction if there is one.  There doesn't seem to be any
3960      // actual relocation to apply.
3961      break;
3962
3963    case elfcpp::R_SPARC_TLS_LE_HIX22:
3964      // If we're creating a shared library, a dynamic relocation will
3965      // have been created for this location, so do not apply it now.
3966      if (!parameters->options().shared())
3967	{
3968	  value -= tls_segment->memsz();
3969	  Reloc::hix22(view, value, addend);
3970	}
3971      break;
3972
3973    case elfcpp::R_SPARC_TLS_LE_LOX10:
3974      // If we're creating a shared library, a dynamic relocation will
3975      // have been created for this location, so do not apply it now.
3976      if (!parameters->options().shared())
3977	{
3978	  value -= tls_segment->memsz();
3979	  Reloc::lox10(view, value, addend);
3980	}
3981      break;
3982    }
3983}
3984
3985// Relax a call instruction.
3986
3987template<int size, bool big_endian>
3988inline void
3989Target_sparc<size, big_endian>::Relocate::relax_call(
3990    Target_sparc<size, big_endian>* target,
3991    unsigned char* view,
3992    const elfcpp::Rela<size, big_endian>& rela,
3993    section_size_type view_size)
3994{
3995  typedef typename elfcpp::Swap<32, true>::Valtype Insntype;
3996  Insntype *wv = reinterpret_cast<Insntype*>(view);
3997  Insntype call_insn, delay_insn, set_insn;
3998  uint32_t op3, reg, off;
3999
4000  // This code tries to relax call instructions that meet
4001  // certain criteria.
4002  //
4003  // The first criteria is that the call must be such that the return
4004  // address which the call writes into %o7 is unused.  Two sequences
4005  // meet this criteria, and are used to implement tail calls.
4006  //
4007  // Leaf function tail call:
4008  //
4009  // or %o7, %g0, %ANY_REG
4010  // call FUNC
4011  //  or %ANY_REG, %g0, %o7
4012  //
4013  // Non-leaf function tail call:
4014  //
4015  // call FUNC
4016  //  restore
4017  //
4018  // The second criteria is that the call destination is close.  If
4019  // the displacement can fit in a signed 22-bit immediate field of a
4020  // pre-V9 branch, we can do it.  If we are generating a 64-bit
4021  // object or a 32-bit object with ELF machine type EF_SPARC32PLUS,
4022  // and the displacement fits in a signed 19-bit immediate field,
4023  // then we can use a V9 branch.
4024
4025  // Make sure the delay instruction can be safely accessed.
4026  if (rela.get_r_offset() + 8 > view_size)
4027    return;
4028
4029  call_insn = elfcpp::Swap<32, true>::readval(wv);
4030  delay_insn = elfcpp::Swap<32, true>::readval(wv + 1);
4031
4032  // Make sure it is really a call instruction.
4033  if (((call_insn >> 30) & 0x3) != 1)
4034    return;
4035
4036  if (((delay_insn >> 30) & 0x3) != 2)
4037    return;
4038
4039  // Accept only a restore or an integer arithmetic operation whose
4040  // sole side effect is to write the %o7 register (and perhaps set
4041  // the condition codes, which are considered clobbered across
4042  // function calls).
4043  //
4044  // For example, we don't want to match a tagged addition or
4045  // subtraction.  We also don't want to match something like a
4046  // divide.
4047  //
4048  // Specifically we accept add{,cc}, and{,cc}, or{,cc},
4049  // xor{,cc}, sub{,cc}, andn{,cc}, orn{,cc}, and xnor{,cc}.
4050
4051  op3 = (delay_insn >> 19) & 0x3f;
4052  reg = (delay_insn >> 25) & 0x1f;
4053  if (op3 != 0x3d
4054      && ((op3 & 0x28) != 0 || reg != 15))
4055    return;
4056
4057  // For non-restore instructions, make sure %o7 isn't
4058  // an input.
4059  if (op3 != 0x3d)
4060    {
4061      // First check RS1
4062      reg = (delay_insn >> 14) & 0x15;
4063      if (reg == 15)
4064	return;
4065
4066      // And if non-immediate, check RS2
4067      if (((delay_insn >> 13) & 1) == 0)
4068	{
4069	  reg = (delay_insn & 0x1f);
4070	  if (reg == 15)
4071	    return;
4072	}
4073    }
4074
4075  // Now check the branch distance.  We are called after the
4076  // call has been relocated, so we just have to peek at the
4077  // offset contained in the instruction.
4078  off = call_insn & 0x3fffffff;
4079  if ((off & 0x3fe00000) != 0
4080      && (off & 0x3fe00000) != 0x3fe00000)
4081    return;
4082
4083  if ((size == 64 || target->elf_machine_ == elfcpp::EM_SPARC32PLUS)
4084      && ((off & 0x3c0000) == 0
4085	  || (off & 0x3c0000) == 0x3c0000))
4086    {
4087      // ba,pt %xcc, FUNC
4088      call_insn = 0x10680000 | (off & 0x07ffff);
4089    }
4090  else
4091    {
4092      // ba FUNC
4093      call_insn = 0x10800000 | (off & 0x3fffff);
4094    }
4095  elfcpp::Swap<32, true>::writeval(wv, call_insn);
4096
4097  // See if we can NOP out the delay slot instruction.  We peek
4098  // at the instruction before the call to make sure we're dealing
4099  // with exactly the:
4100  //
4101  // or %o7, %g0, %ANY_REG
4102  // call
4103  //  or %ANY_REG, %g0, %o7
4104  //
4105  // case.  Otherwise this might be a tricky piece of hand written
4106  // assembler calculating %o7 in some non-trivial way, and therefore
4107  // we can't be sure that NOP'ing out the delay slot is safe.
4108  if (op3 == 0x02
4109      && rela.get_r_offset() >= 4)
4110    {
4111      if ((delay_insn & ~(0x1f << 14)) != 0x9e100000)
4112	return;
4113
4114      set_insn = elfcpp::Swap<32, true>::readval(wv - 1);
4115      if ((set_insn & ~(0x1f << 25)) != 0x8013c000)
4116	return;
4117
4118      reg = (set_insn >> 25) & 0x1f;
4119      if (reg == 0 || reg == 15)
4120	return;
4121      if (reg != ((delay_insn >> 14) & 0x1f))
4122	return;
4123
4124      // All tests pass, nop it out.
4125      elfcpp::Swap<32, true>::writeval(wv + 1, sparc_nop);
4126    }
4127}
4128
4129// Relocate section data.
4130
4131template<int size, bool big_endian>
4132void
4133Target_sparc<size, big_endian>::relocate_section(
4134			const Relocate_info<size, big_endian>* relinfo,
4135			unsigned int sh_type,
4136			const unsigned char* prelocs,
4137			size_t reloc_count,
4138			Output_section* output_section,
4139			bool needs_special_offset_handling,
4140			unsigned char* view,
4141			typename elfcpp::Elf_types<size>::Elf_Addr address,
4142			section_size_type view_size,
4143			const Reloc_symbol_changes* reloc_symbol_changes)
4144{
4145  typedef Target_sparc<size, big_endian> Sparc;
4146  typedef typename Target_sparc<size, big_endian>::Relocate Sparc_relocate;
4147
4148  gold_assert(sh_type == elfcpp::SHT_RELA);
4149
4150  gold::relocate_section<size, big_endian, Sparc, elfcpp::SHT_RELA,
4151			 Sparc_relocate, gold::Default_comdat_behavior>(
4152    relinfo,
4153    this,
4154    prelocs,
4155    reloc_count,
4156    output_section,
4157    needs_special_offset_handling,
4158    view,
4159    address,
4160    view_size,
4161    reloc_symbol_changes);
4162}
4163
4164// Return the size of a relocation while scanning during a relocatable
4165// link.
4166
4167template<int size, bool big_endian>
4168unsigned int
4169Target_sparc<size, big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
4170    unsigned int,
4171    Relobj*)
4172{
4173  // We are always SHT_RELA, so we should never get here.
4174  gold_unreachable();
4175  return 0;
4176}
4177
4178// Scan the relocs during a relocatable link.
4179
4180template<int size, bool big_endian>
4181void
4182Target_sparc<size, big_endian>::scan_relocatable_relocs(
4183			Symbol_table* symtab,
4184			Layout* layout,
4185			Sized_relobj_file<size, big_endian>* object,
4186			unsigned int data_shndx,
4187			unsigned int sh_type,
4188			const unsigned char* prelocs,
4189			size_t reloc_count,
4190			Output_section* output_section,
4191			bool needs_special_offset_handling,
4192			size_t local_symbol_count,
4193			const unsigned char* plocal_symbols,
4194			Relocatable_relocs* rr)
4195{
4196  gold_assert(sh_type == elfcpp::SHT_RELA);
4197
4198  typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_RELA,
4199    Relocatable_size_for_reloc> Scan_relocatable_relocs;
4200
4201  gold::scan_relocatable_relocs<size, big_endian, elfcpp::SHT_RELA,
4202      Scan_relocatable_relocs>(
4203    symtab,
4204    layout,
4205    object,
4206    data_shndx,
4207    prelocs,
4208    reloc_count,
4209    output_section,
4210    needs_special_offset_handling,
4211    local_symbol_count,
4212    plocal_symbols,
4213    rr);
4214}
4215
4216// Emit relocations for a section.
4217
4218template<int size, bool big_endian>
4219void
4220Target_sparc<size, big_endian>::relocate_relocs(
4221    const Relocate_info<size, big_endian>* relinfo,
4222    unsigned int sh_type,
4223    const unsigned char* prelocs,
4224    size_t reloc_count,
4225    Output_section* output_section,
4226    typename elfcpp::Elf_types<size>::Elf_Off offset_in_output_section,
4227    const Relocatable_relocs* rr,
4228    unsigned char* view,
4229    typename elfcpp::Elf_types<size>::Elf_Addr view_address,
4230    section_size_type view_size,
4231    unsigned char* reloc_view,
4232    section_size_type reloc_view_size)
4233{
4234  gold_assert(sh_type == elfcpp::SHT_RELA);
4235
4236  gold::relocate_relocs<size, big_endian, elfcpp::SHT_RELA>(
4237    relinfo,
4238    prelocs,
4239    reloc_count,
4240    output_section,
4241    offset_in_output_section,
4242    rr,
4243    view,
4244    view_address,
4245    view_size,
4246    reloc_view,
4247    reloc_view_size);
4248}
4249
4250// Return the value to use for a dynamic which requires special
4251// treatment.  This is how we support equality comparisons of function
4252// pointers across shared library boundaries, as described in the
4253// processor specific ABI supplement.
4254
4255template<int size, bool big_endian>
4256uint64_t
4257Target_sparc<size, big_endian>::do_dynsym_value(const Symbol* gsym) const
4258{
4259  gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
4260  return this->plt_section()->address() + gsym->plt_offset();
4261}
4262
4263// do_make_elf_object to override the same function in the base class.
4264// We need to use a target-specific sub-class of
4265// Sized_relobj_file<size, big_endian> to process SPARC specific bits
4266// of the ELF headers.  Hence we need to have our own ELF object creation.
4267
4268template<int size, bool big_endian>
4269Object*
4270Target_sparc<size, big_endian>::do_make_elf_object(
4271    const std::string& name,
4272    Input_file* input_file,
4273    off_t offset, const elfcpp::Ehdr<size, big_endian>& ehdr)
4274{
4275  elfcpp::Elf_Half machine = ehdr.get_e_machine();
4276  elfcpp::Elf_Word flags = ehdr.get_e_flags();
4277  elfcpp::Elf_Word omm, mm;
4278
4279  switch (machine)
4280    {
4281    case elfcpp::EM_SPARC32PLUS:
4282      this->elf_machine_ = elfcpp::EM_SPARC32PLUS;
4283      break;
4284
4285    case elfcpp::EM_SPARC:
4286    case elfcpp::EM_SPARCV9:
4287      break;
4288
4289    default:
4290      break;
4291    }
4292
4293  if (!this->elf_flags_set_)
4294    {
4295      this->elf_flags_ = flags;
4296      this->elf_flags_set_ = true;
4297    }
4298  else
4299    {
4300      // Accumulate cpu feature bits.
4301      this->elf_flags_ |= (flags & (elfcpp::EF_SPARC_32PLUS
4302				    | elfcpp::EF_SPARC_SUN_US1
4303				    | elfcpp::EF_SPARC_HAL_R1
4304				    | elfcpp::EF_SPARC_SUN_US3));
4305
4306      // Bump the memory model setting to the most restrictive
4307      // one we encounter.
4308      omm = (this->elf_flags_ & elfcpp::EF_SPARCV9_MM);
4309      mm = (flags & elfcpp::EF_SPARCV9_MM);
4310      if (omm != mm)
4311	{
4312	  if (mm == elfcpp::EF_SPARCV9_TSO)
4313	    {
4314	      this->elf_flags_ &= ~elfcpp::EF_SPARCV9_MM;
4315	      this->elf_flags_ |= elfcpp::EF_SPARCV9_TSO;
4316	    }
4317	  else if (mm == elfcpp::EF_SPARCV9_PSO
4318		   && omm == elfcpp::EF_SPARCV9_RMO)
4319	    {
4320	      this->elf_flags_ &= ~elfcpp::EF_SPARCV9_MM;
4321	      this->elf_flags_ |= elfcpp::EF_SPARCV9_PSO;
4322	    }
4323	}
4324    }
4325
4326  // Validate that the little-endian flag matches how we've
4327  // been instantiated.
4328  if (!(flags & elfcpp::EF_SPARC_LEDATA) != big_endian)
4329    {
4330      if (big_endian)
4331	gold_error(_("%s: little endian elf flag set on BE object"),
4332		     name.c_str());
4333      else
4334	gold_error(_("%s: little endian elf flag clear on LE object"),
4335		     name.c_str());
4336    }
4337
4338  return Target::do_make_elf_object(name, input_file, offset, ehdr);
4339}
4340
4341// Adjust ELF file header.
4342
4343template<int size, bool big_endian>
4344void
4345Target_sparc<size, big_endian>::do_adjust_elf_header(
4346    unsigned char* view,
4347    int len)
4348{
4349  elfcpp::Ehdr_write<size, big_endian> oehdr(view);
4350
4351  oehdr.put_e_machine(this->elf_machine_);
4352  oehdr.put_e_flags(this->elf_flags_);
4353
4354  Sized_target<size, big_endian>::do_adjust_elf_header(view, len);
4355}
4356
4357// The selector for sparc object files.
4358
4359template<int size, bool big_endian>
4360class Target_selector_sparc : public Target_selector
4361{
4362public:
4363  Target_selector_sparc()
4364    : Target_selector(elfcpp::EM_NONE, size, big_endian,
4365		      (size == 64 ? "elf64-sparc" : "elf32-sparc"),
4366		      (size == 64 ? "elf64_sparc" : "elf32_sparc"))
4367  { }
4368
4369  virtual Target*
4370  do_recognize(Input_file*, off_t, int machine, int, int)
4371  {
4372    switch (size)
4373      {
4374      case 64:
4375	if (machine != elfcpp::EM_SPARCV9)
4376	  return NULL;
4377	break;
4378
4379      case 32:
4380	if (machine != elfcpp::EM_SPARC
4381	    && machine != elfcpp::EM_SPARC32PLUS)
4382	  return NULL;
4383	break;
4384
4385      default:
4386	return NULL;
4387      }
4388
4389    return this->instantiate_target();
4390  }
4391
4392  virtual Target*
4393  do_instantiate_target()
4394  { return new Target_sparc<size, big_endian>(); }
4395};
4396
4397Target_selector_sparc<32, true> target_selector_sparc32;
4398Target_selector_sparc<64, true> target_selector_sparc64;
4399
4400} // End anonymous namespace.
4401