Fix incorrect casts.
[external/binutils.git] / gold / tilegx.cc
1 // tilegx.cc -- tilegx target support for gold.
2
3 // Copyright (C) 2012-2016 Free Software Foundation, Inc.
4 // Written by Jiong Wang (jiwang@tilera.com)
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 <cstring>
26
27 #include "elfcpp.h"
28 #include "dwarf.h"
29 #include "parameters.h"
30 #include "reloc.h"
31 #include "tilegx.h"
32 #include "object.h"
33 #include "symtab.h"
34 #include "layout.h"
35 #include "output.h"
36 #include "copy-relocs.h"
37 #include "target.h"
38 #include "target-reloc.h"
39 #include "target-select.h"
40 #include "tls.h"
41 #include "gc.h"
42 #include "icf.h"
43
44 // the first got entry reserved
45 const int32_t TILEGX_GOT_RESERVE_COUNT = 1;
46
47 // the first two .got.plt entry reserved
48 const int32_t TILEGX_GOTPLT_RESERVE_COUNT = 2;
49
50 // 1. for both 64/32 bit mode, the instruction bundle is always 64bit.
51 // 2. thus .plt section should always be aligned to 64 bit.
52 const int32_t TILEGX_INST_BUNDLE_SIZE = 64;
53
54 namespace
55 {
56
57 using namespace gold;
58
59 // A class to handle the PLT data.
60 // This is an abstract base class that handles most of the linker details
61 // but does not know the actual contents of PLT entries.  The derived
62 // classes below fill in those details.
63
64 template<int size, bool big_endian>
65 class Output_data_plt_tilegx : public Output_section_data
66 {
67  public:
68   typedef Output_data_reloc<elfcpp::SHT_RELA, true,size, big_endian>
69     Reloc_section;
70
71   Output_data_plt_tilegx(Layout* layout, uint64_t addralign,
72                          Output_data_got<size, big_endian>* got,
73                          Output_data_space* got_plt,
74                          Output_data_space* got_irelative)
75     : Output_section_data(addralign), layout_(layout),
76       irelative_rel_(NULL), got_(got), got_plt_(got_plt),
77       got_irelative_(got_irelative), count_(0),
78       irelative_count_(0), free_list_()
79   { this->init(layout); }
80
81   Output_data_plt_tilegx(Layout* layout, uint64_t plt_entry_size,
82                          Output_data_got<size, big_endian>* got,
83                          Output_data_space* got_plt,
84                          Output_data_space* got_irelative,
85                          unsigned int plt_count)
86     : Output_section_data((plt_count + 1) * plt_entry_size,
87                           TILEGX_INST_BUNDLE_SIZE, false),
88       layout_(layout), irelative_rel_(NULL), got_(got),
89       got_plt_(got_plt), got_irelative_(got_irelative), count_(plt_count),
90       irelative_count_(0), free_list_()
91   {
92     this->init(layout);
93
94     // Initialize the free list and reserve the first entry.
95     this->free_list_.init((plt_count + 1) * plt_entry_size, false);
96     this->free_list_.remove(0, plt_entry_size);
97   }
98
99   // Initialize the PLT section.
100   void
101   init(Layout* layout);
102
103   // Add an entry to the PLT.
104   void
105   add_entry(Symbol_table*, Layout*, Symbol* gsym);
106
107   // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
108   unsigned int
109   add_local_ifunc_entry(Symbol_table*, Layout*,
110     Sized_relobj_file<size, big_endian>*, unsigned int);
111
112   // Add the relocation for a PLT entry.
113   void
114   add_relocation(Symbol_table*, Layout*, Symbol*, unsigned int);
115
116   // Return the .rela.plt section data.
117   Reloc_section*
118   rela_plt()
119   { return this->rel_; }
120
121   // Return where the IRELATIVE relocations should go in the PLT
122   // relocations.
123   Reloc_section*
124   rela_irelative(Symbol_table*, Layout*);
125
126   // Return whether we created a section for IRELATIVE relocations.
127   bool
128   has_irelative_section() const
129   { return this->irelative_rel_ != NULL; }
130
131   // Return the number of PLT entries.
132   unsigned int
133   entry_count() const
134   { return this->count_ + this->irelative_count_; }
135
136   // Return the offset of the first non-reserved PLT entry.
137   unsigned int
138   first_plt_entry_offset()
139   { return this->get_plt_entry_size(); }
140
141   // Return the size of a PLT entry.
142   unsigned int
143   get_plt_entry_size() const
144   { return plt_entry_size; }
145
146   // Reserve a slot in the PLT for an existing symbol in an incremental update.
147   void
148   reserve_slot(unsigned int plt_index)
149   {
150     this->free_list_.remove((plt_index + 1) * this->get_plt_entry_size(),
151                             (plt_index + 2) * this->get_plt_entry_size());
152   }
153
154   // Return the PLT address to use for a global symbol.
155   uint64_t
156   address_for_global(const Symbol*);
157
158   // Return the PLT address to use for a local symbol.
159   uint64_t
160   address_for_local(const Relobj*, unsigned int symndx);
161
162  protected:
163   // Fill in the first PLT entry.
164   void
165   fill_first_plt_entry(unsigned char*);
166
167   // Fill in a normal PLT entry.  Returns the offset into the entry that
168   // should be the initial GOT slot value.
169   void
170   fill_plt_entry(unsigned char*,
171                  typename elfcpp::Elf_types<size>::Elf_Addr,
172                  unsigned int,
173                  typename elfcpp::Elf_types<size>::Elf_Addr,
174                  unsigned int, unsigned int);
175
176   void
177   do_adjust_output_section(Output_section* os);
178
179   // Write to a map file.
180   void
181   do_print_to_mapfile(Mapfile* mapfile) const
182   { mapfile->print_output_data(this, _("** PLT")); }
183
184  private:
185   // Set the final size.
186   void
187   set_final_data_size();
188
189   // Write out the PLT data.
190   void
191   do_write(Output_file*);
192
193   // A pointer to the Layout class, so that we can find the .dynamic
194   // section when we write out the GOT PLT section.
195   Layout* layout_;
196   // The reloc section.
197   Reloc_section* rel_;
198   // The IRELATIVE relocs, if necessary.  These must follow the
199   // regular PLT relocations.
200   Reloc_section* irelative_rel_;
201   // The .got section.
202   Output_data_got<size, big_endian>* got_;
203   // The .got.plt section.
204   Output_data_space* got_plt_;
205   // The part of the .got.plt section used for IRELATIVE relocs.
206   Output_data_space* got_irelative_;
207   // The number of PLT entries.
208   unsigned int count_;
209   // Number of PLT entries with R_TILEGX_IRELATIVE relocs.  These
210   // follow the regular PLT entries.
211   unsigned int irelative_count_;
212   // List of available regions within the section, for incremental
213   // update links.
214   Free_list free_list_;
215   // The size of an entry in the PLT.
216   static const int plt_entry_size = 40;
217   // The first entry in the PLT.
218   static const unsigned char first_plt_entry[plt_entry_size];
219   // Other entries in the PLT for an executable.
220   static const unsigned char plt_entry[plt_entry_size];
221 };
222
223 // The tilegx target class.
224 // See the ABI at
225 //   http://www.tilera.com/scm
226 // TLS info comes from
227 //   http://people.redhat.com/drepper/tls.pdf
228
229 template<int size, bool big_endian>
230 class Target_tilegx : public Sized_target<size, big_endian>
231 {
232  public:
233   // TileGX use RELA
234   typedef Output_data_reloc<elfcpp::SHT_RELA, true, size, big_endian>
235     Reloc_section;
236
237   Target_tilegx(const Target::Target_info* info = &tilegx_info)
238     : Sized_target<size, big_endian>(info),
239       got_(NULL), plt_(NULL), got_plt_(NULL), got_irelative_(NULL),
240       global_offset_table_(NULL), tilegx_dynamic_(NULL), rela_dyn_(NULL),
241       rela_irelative_(NULL), copy_relocs_(elfcpp::R_TILEGX_COPY),
242       got_mod_index_offset_(-1U),
243       tls_get_addr_sym_defined_(false)
244   { }
245
246   // Scan the relocations to look for symbol adjustments.
247   void
248   gc_process_relocs(Symbol_table* symtab,
249                     Layout* layout,
250                     Sized_relobj_file<size, big_endian>* object,
251                     unsigned int data_shndx,
252                     unsigned int sh_type,
253                     const unsigned char* prelocs,
254                     size_t reloc_count,
255                     Output_section* output_section,
256                     bool needs_special_offset_handling,
257                     size_t local_symbol_count,
258                     const unsigned char* plocal_symbols);
259
260   // Scan the relocations to look for symbol adjustments.
261   void
262   scan_relocs(Symbol_table* symtab,
263               Layout* layout,
264               Sized_relobj_file<size, big_endian>* object,
265               unsigned int data_shndx,
266               unsigned int sh_type,
267               const unsigned char* prelocs,
268               size_t reloc_count,
269               Output_section* output_section,
270               bool needs_special_offset_handling,
271               size_t local_symbol_count,
272               const unsigned char* plocal_symbols);
273
274   // Finalize the sections.
275   void
276   do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
277
278   // Return the value to use for a dynamic which requires special
279   // treatment.
280   uint64_t
281   do_dynsym_value(const Symbol*) const;
282
283   // Relocate a section.
284   void
285   relocate_section(const Relocate_info<size, big_endian>*,
286                    unsigned int sh_type,
287                    const unsigned char* prelocs,
288                    size_t reloc_count,
289                    Output_section* output_section,
290                    bool needs_special_offset_handling,
291                    unsigned char* view,
292                    typename elfcpp::Elf_types<size>::Elf_Addr view_address,
293                    section_size_type view_size,
294                    const Reloc_symbol_changes*);
295
296   // Scan the relocs during a relocatable link.
297   void
298   scan_relocatable_relocs(Symbol_table* symtab,
299                           Layout* layout,
300                           Sized_relobj_file<size, big_endian>* object,
301                           unsigned int data_shndx,
302                           unsigned int sh_type,
303                           const unsigned char* prelocs,
304                           size_t reloc_count,
305                           Output_section* output_section,
306                           bool needs_special_offset_handling,
307                           size_t local_symbol_count,
308                           const unsigned char* plocal_symbols,
309                           Relocatable_relocs*);
310
311   // Scan the relocs for --emit-relocs.
312   void
313   emit_relocs_scan(Symbol_table* symtab,
314                    Layout* layout,
315                    Sized_relobj_file<size, big_endian>* object,
316                    unsigned int data_shndx,
317                    unsigned int sh_type,
318                    const unsigned char* prelocs,
319                    size_t reloc_count,
320                    Output_section* output_section,
321                    bool needs_special_offset_handling,
322                    size_t local_symbol_count,
323                    const unsigned char* plocal_syms,
324                    Relocatable_relocs* rr);
325
326   // Relocate a section during a relocatable link.
327   void
328   relocate_relocs(
329       const Relocate_info<size, big_endian>*,
330       unsigned int sh_type,
331       const unsigned char* prelocs,
332       size_t reloc_count,
333       Output_section* output_section,
334       typename elfcpp::Elf_types<size>::Elf_Off offset_in_output_section,
335       unsigned char* view,
336       typename elfcpp::Elf_types<size>::Elf_Addr view_address,
337       section_size_type view_size,
338       unsigned char* reloc_view,
339       section_size_type reloc_view_size);
340
341   // Return whether SYM is defined by the ABI.
342   bool
343   do_is_defined_by_abi(const Symbol* sym) const
344   { return strcmp(sym->name(), "__tls_get_addr") == 0; }
345
346   // define tilegx specific symbols
347   virtual void
348   do_define_standard_symbols(Symbol_table*, Layout*);
349
350   // Return the PLT section.
351   uint64_t
352   do_plt_address_for_global(const Symbol* gsym) const
353   { return this->plt_section()->address_for_global(gsym); }
354
355   uint64_t
356   do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const
357   { return this->plt_section()->address_for_local(relobj, symndx); }
358
359   // This function should be defined in targets that can use relocation
360   // types to determine (implemented in local_reloc_may_be_function_pointer
361   // and global_reloc_may_be_function_pointer)
362   // if a function's pointer is taken.  ICF uses this in safe mode to only
363   // fold those functions whose pointer is defintely not taken.  For tilegx
364   // pie binaries, safe ICF cannot be done by looking at relocation types.
365   bool
366   do_can_check_for_function_pointers() const
367   { return true; }
368
369   // Return the base for a DW_EH_PE_datarel encoding.
370   uint64_t
371   do_ehframe_datarel_base() const;
372
373   // Return whether there is a GOT section.
374   bool
375   has_got_section() const
376   { return this->got_ != NULL; }
377
378   // Return the size of the GOT section.
379   section_size_type
380   got_size() const
381   {
382     gold_assert(this->got_ != NULL);
383     return this->got_->data_size();
384   }
385
386   // Return the number of entries in the GOT.
387   unsigned int
388   got_entry_count() const
389   {
390     if (this->got_ == NULL)
391       return 0;
392     return this->got_size() / (size / 8);
393   }
394
395   // Return the number of entries in the PLT.
396   unsigned int
397   plt_entry_count() const;
398
399   // Return the offset of the first non-reserved PLT entry.
400   unsigned int
401   first_plt_entry_offset() const;
402
403   // Return the size of each PLT entry.
404   unsigned int
405   plt_entry_size() const;
406
407   // Create the GOT section for an incremental update.
408   Output_data_got_base*
409   init_got_plt_for_update(Symbol_table* symtab,
410                           Layout* layout,
411                           unsigned int got_count,
412                           unsigned int plt_count);
413
414   // Reserve a GOT entry for a local symbol, and regenerate any
415   // necessary dynamic relocations.
416   void
417   reserve_local_got_entry(unsigned int got_index,
418                           Sized_relobj<size, big_endian>* obj,
419                           unsigned int r_sym,
420                           unsigned int got_type);
421
422   // Reserve a GOT entry for a global symbol, and regenerate any
423   // necessary dynamic relocations.
424   void
425   reserve_global_got_entry(unsigned int got_index, Symbol* gsym,
426                            unsigned int got_type);
427
428   // Register an existing PLT entry for a global symbol.
429   void
430   register_global_plt_entry(Symbol_table*, Layout*, unsigned int plt_index,
431                             Symbol* gsym);
432
433   // Force a COPY relocation for a given symbol.
434   void
435   emit_copy_reloc(Symbol_table*, Symbol*, Output_section*, off_t);
436
437   // Apply an incremental relocation.
438   void
439   apply_relocation(const Relocate_info<size, big_endian>* relinfo,
440                    typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
441                    unsigned int r_type,
442                    typename elfcpp::Elf_types<size>::Elf_Swxword r_addend,
443                    const Symbol* gsym,
444                    unsigned char* view,
445                    typename elfcpp::Elf_types<size>::Elf_Addr address,
446                    section_size_type view_size);
447
448  private:
449   // The class which scans relocations.
450   class Scan
451   {
452   public:
453     Scan()
454       : issued_non_pic_error_(false)
455     { }
456
457     static inline int
458     get_reference_flags(unsigned int r_type);
459
460     inline void
461     local(Symbol_table* symtab, Layout* layout, Target_tilegx* target,
462           Sized_relobj_file<size, big_endian>* object,
463           unsigned int data_shndx,
464           Output_section* output_section,
465           const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
466           const elfcpp::Sym<size, big_endian>& lsym,
467           bool is_discarded);
468
469     inline void
470     global(Symbol_table* symtab, Layout* layout, Target_tilegx* target,
471            Sized_relobj_file<size, big_endian>* object,
472            unsigned int data_shndx,
473            Output_section* output_section,
474            const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
475            Symbol* gsym);
476
477     inline bool
478     local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
479                             Target_tilegx* target,
480                             Sized_relobj_file<size, big_endian>* object,
481                             unsigned int data_shndx,
482                             Output_section* output_section,
483                             const elfcpp::Rela<size, big_endian>& reloc,
484                             unsigned int r_type,
485                             const elfcpp::Sym<size, big_endian>& lsym);
486
487     inline bool
488     global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
489                             Target_tilegx* target,
490                             Sized_relobj_file<size, big_endian>* object,
491                             unsigned int data_shndx,
492                             Output_section* output_section,
493                             const elfcpp::Rela<size, big_endian>& reloc,
494                             unsigned int r_type,
495                             Symbol* gsym);
496
497   private:
498     static void
499     unsupported_reloc_local(Sized_relobj_file<size, big_endian>*,
500                             unsigned int r_type);
501
502     static void
503     unsupported_reloc_global(Sized_relobj_file<size, big_endian>*,
504                              unsigned int r_type, Symbol*);
505
506     void
507     check_non_pic(Relobj*, unsigned int r_type);
508
509     inline bool
510     possible_function_pointer_reloc(unsigned int r_type);
511
512     bool
513     reloc_needs_plt_for_ifunc(Sized_relobj_file<size, big_endian>*,
514                               unsigned int r_type);
515
516     // Whether we have issued an error about a non-PIC compilation.
517     bool issued_non_pic_error_;
518   };
519
520   // The class which implements relocation.
521   class Relocate
522   {
523    public:
524     Relocate()
525     { }
526
527     ~Relocate()
528     {
529     }
530
531     // Do a relocation.  Return false if the caller should not issue
532     // any warnings about this relocation.
533     inline bool
534     relocate(const Relocate_info<size, big_endian>*, unsigned int,
535              Target_tilegx*, Output_section*, size_t, const unsigned char*,
536              const Sized_symbol<size>*, const Symbol_value<size>*,
537              unsigned char*, typename elfcpp::Elf_types<size>::Elf_Addr,
538              section_size_type);
539   };
540
541   // Adjust TLS relocation type based on the options and whether this
542   // is a local symbol.
543   static tls::Tls_optimization
544   optimize_tls_reloc(bool is_final, int r_type);
545
546   // Get the GOT section, creating it if necessary.
547   Output_data_got<size, big_endian>*
548   got_section(Symbol_table*, Layout*);
549
550   // Get the GOT PLT section.
551   Output_data_space*
552   got_plt_section() const
553   {
554     gold_assert(this->got_plt_ != NULL);
555     return this->got_plt_;
556   }
557
558   // Create the PLT section.
559   void
560   make_plt_section(Symbol_table* symtab, Layout* layout);
561
562   // Create a PLT entry for a global symbol.
563   void
564   make_plt_entry(Symbol_table*, Layout*, Symbol*);
565
566   // Create a PLT entry for a local STT_GNU_IFUNC symbol.
567   void
568   make_local_ifunc_plt_entry(Symbol_table*, Layout*,
569                              Sized_relobj_file<size, big_endian>* relobj,
570                              unsigned int local_sym_index);
571
572   // Create a GOT entry for the TLS module index.
573   unsigned int
574   got_mod_index_entry(Symbol_table* symtab, Layout* layout,
575                       Sized_relobj_file<size, big_endian>* object);
576
577   // Get the PLT section.
578   Output_data_plt_tilegx<size, big_endian>*
579   plt_section() const
580   {
581     gold_assert(this->plt_ != NULL);
582     return this->plt_;
583   }
584
585   // Get the dynamic reloc section, creating it if necessary.
586   Reloc_section*
587   rela_dyn_section(Layout*);
588
589   // Get the section to use for IRELATIVE relocations.
590   Reloc_section*
591   rela_irelative_section(Layout*);
592
593   // Add a potential copy relocation.
594   void
595   copy_reloc(Symbol_table* symtab, Layout* layout,
596              Sized_relobj_file<size, big_endian>* object,
597              unsigned int shndx, Output_section* output_section,
598              Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
599   {
600     unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
601     this->copy_relocs_.copy_reloc(symtab, layout,
602                                   symtab->get_sized_symbol<size>(sym),
603                                   object, shndx, output_section,
604                                   r_type, reloc.get_r_offset(),
605                                   reloc.get_r_addend(),
606                                   this->rela_dyn_section(layout));
607   }
608
609   // Information about this specific target which we pass to the
610   // general Target structure.
611   static const Target::Target_info tilegx_info;
612
613   // The types of GOT entries needed for this platform.
614   // These values are exposed to the ABI in an incremental link.
615   // Do not renumber existing values without changing the version
616   // number of the .gnu_incremental_inputs section.
617   enum Got_type
618   {
619     GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
620     GOT_TYPE_TLS_OFFSET = 1,    // GOT entry for TLS offset
621     GOT_TYPE_TLS_PAIR = 2,      // GOT entry for TLS module/offset pair
622     GOT_TYPE_TLS_DESC = 3       // GOT entry for TLS_DESC pair
623   };
624
625   // This type is used as the argument to the target specific
626   // relocation routines.  The only target specific reloc is
627   // R_X86_64_TLSDESC against a local symbol.
628   struct Tlsdesc_info
629   {
630     Tlsdesc_info(Sized_relobj_file<size, big_endian>* a_object,
631                  unsigned int a_r_sym)
632       : object(a_object), r_sym(a_r_sym)
633     { }
634
635     // The object in which the local symbol is defined.
636     Sized_relobj_file<size, big_endian>* object;
637     // The local symbol index in the object.
638     unsigned int r_sym;
639   };
640
641   // The GOT section.
642   Output_data_got<size, big_endian>* got_;
643   // The PLT section.
644   Output_data_plt_tilegx<size, big_endian>* plt_;
645   // The GOT PLT section.
646   Output_data_space* got_plt_;
647   // The GOT section for IRELATIVE relocations.
648   Output_data_space* got_irelative_;
649   // The _GLOBAL_OFFSET_TABLE_ symbol.
650   Symbol* global_offset_table_;
651   // The _TILEGX_DYNAMIC_ symbol.
652   Symbol* tilegx_dynamic_;
653   // The dynamic reloc section.
654   Reloc_section* rela_dyn_;
655   // The section to use for IRELATIVE relocs.
656   Reloc_section* rela_irelative_;
657   // Relocs saved to avoid a COPY reloc.
658   Copy_relocs<elfcpp::SHT_RELA, size, big_endian> copy_relocs_;
659   // Offset of the GOT entry for the TLS module index.
660   unsigned int got_mod_index_offset_;
661   // True if the _tls_get_addr symbol has been defined.
662   bool tls_get_addr_sym_defined_;
663 };
664
665 template<>
666 const Target::Target_info Target_tilegx<64, false>::tilegx_info =
667 {
668   64,                   // size
669   false,                // is_big_endian
670   elfcpp::EM_TILEGX,    // machine_code
671   false,                // has_make_symbol
672   false,                // has_resolve
673   false,                // has_code_fill
674   true,                 // is_default_stack_executable
675   false,                // can_icf_inline_merge_sections
676   '\0',                 // wrap_char
677   "/lib/ld.so.1",       // program interpreter
678   0x10000,              // default_text_segment_address
679   0x10000,              // abi_pagesize (overridable by -z max-page-size)
680   0x10000,              // common_pagesize (overridable by -z common-page-size)
681   false,                // isolate_execinstr
682   0,                    // rosegment_gap
683   elfcpp::SHN_UNDEF,    // small_common_shndx
684   elfcpp::SHN_UNDEF,    // large_common_shndx
685   0,                    // small_common_section_flags
686   0,                    // large_common_section_flags
687   NULL,                 // attributes_section
688   NULL,                 // attributes_vendor
689   "_start",             // entry_symbol_name
690   32,                   // hash_entry_size
691 };
692
693 template<>
694 const Target::Target_info Target_tilegx<32, false>::tilegx_info =
695 {
696   32,                   // size
697   false,                // is_big_endian
698   elfcpp::EM_TILEGX,    // machine_code
699   false,                // has_make_symbol
700   false,                // has_resolve
701   false,                // has_code_fill
702   true,                 // is_default_stack_executable
703   false,                // can_icf_inline_merge_sections
704   '\0',                 // wrap_char
705   "/lib32/ld.so.1",     // program interpreter
706   0x10000,              // default_text_segment_address
707   0x10000,              // abi_pagesize (overridable by -z max-page-size)
708   0x10000,              // common_pagesize (overridable by -z common-page-size)
709   false,                // isolate_execinstr
710   0,                    // rosegment_gap
711   elfcpp::SHN_UNDEF,    // small_common_shndx
712   elfcpp::SHN_UNDEF,    // large_common_shndx
713   0,                    // small_common_section_flags
714   0,                    // large_common_section_flags
715   NULL,                 // attributes_section
716   NULL,                 // attributes_vendor
717   "_start",             // entry_symbol_name
718   32,                   // hash_entry_size
719 };
720
721 template<>
722 const Target::Target_info Target_tilegx<64, true>::tilegx_info =
723 {
724   64,                   // size
725   true,                 // is_big_endian
726   elfcpp::EM_TILEGX,    // machine_code
727   false,                // has_make_symbol
728   false,                // has_resolve
729   false,                // has_code_fill
730   true,                 // is_default_stack_executable
731   false,                // can_icf_inline_merge_sections
732   '\0',                 // wrap_char
733   "/lib/ld.so.1",       // program interpreter
734   0x10000,              // default_text_segment_address
735   0x10000,              // abi_pagesize (overridable by -z max-page-size)
736   0x10000,              // common_pagesize (overridable by -z common-page-size)
737   false,                // isolate_execinstr
738   0,                    // rosegment_gap
739   elfcpp::SHN_UNDEF,    // small_common_shndx
740   elfcpp::SHN_UNDEF,    // large_common_shndx
741   0,                    // small_common_section_flags
742   0,                    // large_common_section_flags
743   NULL,                 // attributes_section
744   NULL,                 // attributes_vendor
745   "_start",             // entry_symbol_name
746   32,                   // hash_entry_size
747 };
748
749 template<>
750 const Target::Target_info Target_tilegx<32, true>::tilegx_info =
751 {
752   32,                   // size
753   true,                 // is_big_endian
754   elfcpp::EM_TILEGX,    // machine_code
755   false,                // has_make_symbol
756   false,                // has_resolve
757   false,                // has_code_fill
758   true,                 // is_default_stack_executable
759   false,                // can_icf_inline_merge_sections
760   '\0',                 // wrap_char
761   "/lib32/ld.so.1",     // program interpreter
762   0x10000,              // default_text_segment_address
763   0x10000,              // abi_pagesize (overridable by -z max-page-size)
764   0x10000,              // common_pagesize (overridable by -z common-page-size)
765   false,                // isolate_execinstr
766   0,                    // rosegment_gap
767   elfcpp::SHN_UNDEF,    // small_common_shndx
768   elfcpp::SHN_UNDEF,    // large_common_shndx
769   0,                    // small_common_section_flags
770   0,                    // large_common_section_flags
771   NULL,                 // attributes_section
772   NULL,                  // attributes_vendor
773   "_start",             // entry_symbol_name
774   32,                   // hash_entry_size
775 };
776
777 // tilegx relocation handlers
778 template<int size, bool big_endian>
779 class Tilegx_relocate_functions
780 {
781 public:
782   // overflow check will be supported later
783   typedef enum
784   {
785     STATUS_OKAY,        // No error during relocation.
786     STATUS_OVERFLOW,    // Relocation overflow.
787     STATUS_BAD_RELOC    // Relocation cannot be applied.
788   } Status;
789
790   struct Tilegx_howto
791   {
792     // right shift operand by this number of bits.
793     unsigned char srshift;
794
795     // the offset to apply relocation.
796     unsigned char doffset;
797
798     // set to 1 for pc-relative relocation.
799     unsigned char is_pcrel;
800
801     // size in bits, or 0 if this table entry should be ignored.
802     unsigned char bsize;
803
804     // whether we need to check overflow.
805     unsigned char overflow;
806   };
807
808   static const Tilegx_howto howto[elfcpp::R_TILEGX_NUM];
809
810 private:
811
812   // Do a simple rela relocation
813   template<int valsize>
814   static inline void
815   rela(unsigned char* view,
816        const Sized_relobj_file<size, big_endian>* object,
817        const Symbol_value<size>* psymval,
818        typename elfcpp::Swap<size, big_endian>::Valtype addend,
819        elfcpp::Elf_Xword srshift, elfcpp::Elf_Xword doffset,
820        elfcpp::Elf_Xword bitmask)
821   {
822     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
823     Valtype* wv = reinterpret_cast<Valtype*>(view);
824     Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv);
825     Valtype reloc = 0;
826     if (size == 32)
827       reloc = Bits<32>::sign_extend(psymval->value(object, addend)) >> srshift;
828     else
829       reloc = psymval->value(object, addend) >> srshift;
830
831     elfcpp::Elf_Xword dst_mask = bitmask << doffset;
832
833     val &= ~dst_mask;
834     reloc &= bitmask;
835
836     elfcpp::Swap<valsize, big_endian>::writeval(wv, val | (reloc<<doffset));
837   }
838
839   // Do a simple rela relocation
840   template<int valsize>
841   static inline void
842   rela_ua(unsigned char* view,
843           const Sized_relobj_file<size, big_endian>* object,
844           const Symbol_value<size>* psymval,
845           typename elfcpp::Swap<size, big_endian>::Valtype addend,
846           elfcpp::Elf_Xword srshift, elfcpp::Elf_Xword doffset,
847           elfcpp::Elf_Xword bitmask)
848   {
849     typedef typename elfcpp::Swap_unaligned<valsize, big_endian>::Valtype
850       Valtype;
851     unsigned char* wv = view;
852     Valtype val = elfcpp::Swap_unaligned<valsize, big_endian>::readval(wv);
853     Valtype reloc = 0;
854     if (size == 32)
855       reloc = Bits<32>::sign_extend(psymval->value(object, addend)) >> srshift;
856     else
857       reloc = psymval->value(object, addend) >> srshift;
858
859     elfcpp::Elf_Xword dst_mask = bitmask << doffset;
860
861     val &= ~dst_mask;
862     reloc &= bitmask;
863
864     elfcpp::Swap_unaligned<valsize, big_endian>::writeval(wv,
865       val | (reloc<<doffset));
866   }
867
868   template<int valsize>
869   static inline void
870   rela(unsigned char* view,
871        const Sized_relobj_file<size, big_endian>* object,
872        const Symbol_value<size>* psymval,
873        typename elfcpp::Swap<size, big_endian>::Valtype addend,
874        elfcpp::Elf_Xword srshift, elfcpp::Elf_Xword doffset1,
875        elfcpp::Elf_Xword bitmask1, elfcpp::Elf_Xword doffset2,
876        elfcpp::Elf_Xword bitmask2)
877   {
878     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
879     Valtype* wv = reinterpret_cast<Valtype*>(view);
880     Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv);
881     Valtype reloc = 0;
882     if (size == 32)
883       reloc = Bits<32>::sign_extend(psymval->value(object, addend)) >> srshift;
884     else
885       reloc = psymval->value(object, addend) >> srshift;
886
887     elfcpp::Elf_Xword dst_mask = (bitmask1 << doffset1)
888                                   | (bitmask2 << doffset2);
889     val &= ~dst_mask;
890     reloc = ((reloc & bitmask1) << doffset1)
891              | ((reloc & bitmask2) << doffset2);
892
893     elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc);
894
895   }
896
897   // Do a simple PC relative relocation with a Symbol_value with the
898   // addend in the relocation.
899   template<int valsize>
900   static inline void
901   pcrela(unsigned char* view,
902          const Sized_relobj_file<size, big_endian>* object,
903          const Symbol_value<size>* psymval,
904          typename elfcpp::Swap<size, big_endian>::Valtype addend,
905          typename elfcpp::Elf_types<size>::Elf_Addr address,
906          elfcpp::Elf_Xword srshift, elfcpp::Elf_Xword doffset,
907          elfcpp::Elf_Xword bitmask)
908
909   {
910     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
911     Valtype* wv = reinterpret_cast<Valtype*>(view);
912     Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv);
913     Valtype reloc = 0;
914     if (size == 32)
915       reloc = Bits<32>::sign_extend(psymval->value(object, addend) - address)
916                >> srshift;
917     else
918       reloc = (psymval->value(object, addend) - address) >> srshift;
919
920     elfcpp::Elf_Xword dst_mask = bitmask << doffset;
921     val &= ~dst_mask;
922     reloc &= bitmask;
923
924     elfcpp::Swap<valsize, big_endian>::writeval(wv, val | (reloc<<doffset));
925   }
926
927   template<int valsize>
928   static inline void
929   pcrela_ua(unsigned char* view,
930            const Sized_relobj_file<size, big_endian>* object,
931            const Symbol_value<size>* psymval,
932            typename elfcpp::Swap<size, big_endian>::Valtype addend,
933            typename elfcpp::Elf_types<size>::Elf_Addr address,
934            elfcpp::Elf_Xword srshift, elfcpp::Elf_Xword doffset,
935            elfcpp::Elf_Xword bitmask)
936
937   {
938     typedef typename elfcpp::Swap_unaligned<valsize, big_endian>::Valtype
939       Valtype;
940     unsigned char* wv = view;
941     Valtype reloc = 0;
942     if (size == 32)
943       reloc = Bits<32>::sign_extend(psymval->value(object, addend) - address)
944                >> srshift;
945     else
946       reloc = (psymval->value(object, addend) - address) >> srshift;
947
948     reloc &= bitmask;
949
950     elfcpp::Swap<valsize, big_endian>::writeval(wv, reloc << doffset);
951   }
952
953   template<int valsize>
954   static inline void
955   pcrela(unsigned char* view,
956          const Sized_relobj_file<size, big_endian>* object,
957          const Symbol_value<size>* psymval,
958          typename elfcpp::Swap<size, big_endian>::Valtype addend,
959          typename elfcpp::Elf_types<size>::Elf_Addr address,
960          elfcpp::Elf_Xword srshift, elfcpp::Elf_Xword doffset1,
961          elfcpp::Elf_Xword bitmask1, elfcpp::Elf_Xword doffset2,
962          elfcpp::Elf_Xword bitmask2)
963
964   {
965     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
966     Valtype* wv = reinterpret_cast<Valtype*>(view);
967     Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv);
968     Valtype reloc = 0;
969     if (size == 32)
970       reloc = Bits<32>::sign_extend(psymval->value(object, addend) - address)
971                >> srshift;
972     else
973       reloc = (psymval->value(object, addend) - address) >> srshift;
974
975     elfcpp::Elf_Xword dst_mask = (bitmask1 << doffset1)
976                                   | (bitmask2 << doffset2);
977     val &= ~dst_mask;
978     reloc = ((reloc & bitmask1) << doffset1)
979              | ((reloc & bitmask2) << doffset2);
980
981     elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc);
982   }
983
984   typedef Tilegx_relocate_functions<size, big_endian> This;
985   typedef Relocate_functions<size, big_endian> Base;
986
987 public:
988
989   static inline void
990   abs64(unsigned char* view,
991         const Sized_relobj_file<size, big_endian>* object,
992         const Symbol_value<size>* psymval,
993         typename elfcpp::Elf_types<size>::Elf_Addr addend)
994   {
995     This::template rela_ua<64>(view, object, psymval, addend, 0, 0,
996                                0xffffffffffffffffllu);
997   }
998
999   static inline void
1000   abs32(unsigned char* view,
1001         const Sized_relobj_file<size, big_endian>* object,
1002         const Symbol_value<size>* psymval,
1003         typename elfcpp::Elf_types<size>::Elf_Addr addend)
1004   {
1005     This::template rela_ua<32>(view, object, psymval, addend, 0, 0,
1006                                0xffffffff);
1007   }
1008
1009   static inline void
1010   abs16(unsigned char* view,
1011         const Sized_relobj_file<size, big_endian>* object,
1012         const Symbol_value<size>* psymval,
1013         typename elfcpp::Elf_types<size>::Elf_Addr addend)
1014   {
1015     This::template rela_ua<16>(view, object, psymval, addend, 0, 0,
1016                                0xffff);
1017   }
1018
1019   static inline void
1020   pc_abs64(unsigned char* view,
1021         const Sized_relobj_file<size, big_endian>* object,
1022         const Symbol_value<size>* psymval,
1023         typename elfcpp::Elf_types<size>::Elf_Addr addend,
1024             typename elfcpp::Elf_types<size>::Elf_Addr address)
1025   {
1026     This::template pcrela_ua<64>(view, object, psymval, addend, address, 0, 0,
1027                                0xffffffffffffffffllu);
1028   }
1029
1030   static inline void
1031   pc_abs32(unsigned char* view,
1032         const Sized_relobj_file<size, big_endian>* object,
1033         const Symbol_value<size>* psymval,
1034         typename elfcpp::Elf_types<size>::Elf_Addr addend,
1035             typename elfcpp::Elf_types<size>::Elf_Addr address)
1036   {
1037     This::template pcrela_ua<32>(view, object, psymval, addend, address, 0, 0,
1038                                  0xffffffff);
1039   }
1040
1041   static inline void
1042   pc_abs16(unsigned char* view,
1043         const Sized_relobj_file<size, big_endian>* object,
1044         const Symbol_value<size>* psymval,
1045         typename elfcpp::Elf_types<size>::Elf_Addr addend,
1046             typename elfcpp::Elf_types<size>::Elf_Addr address)
1047   {
1048     This::template pcrela_ua<16>(view, object, psymval, addend, address, 0, 0,
1049                                  0xffff);
1050   }
1051
1052   static inline void
1053   imm_x_general(unsigned char* view,
1054                 const Sized_relobj_file<size, big_endian>* object,
1055                 const Symbol_value<size>* psymval,
1056                 typename elfcpp::Elf_types<size>::Elf_Addr addend,
1057                 Tilegx_howto &r_howto)
1058   {
1059     This::template rela<64>(view, object, psymval, addend,
1060                             (elfcpp::Elf_Xword)(r_howto.srshift),
1061                             (elfcpp::Elf_Xword)(r_howto.doffset),
1062                             (elfcpp::Elf_Xword)((1 << r_howto.bsize) - 1));
1063   }
1064
1065   static inline void
1066   imm_x_pcrel_general(unsigned char* view,
1067                       const Sized_relobj_file<size, big_endian>* object,
1068                       const Symbol_value<size>* psymval,
1069                       typename elfcpp::Elf_types<size>::Elf_Addr addend,
1070                       typename elfcpp::Elf_types<size>::Elf_Addr address,
1071                       Tilegx_howto &r_howto)
1072   {
1073     This::template pcrela<64>(view, object, psymval, addend, address,
1074                               (elfcpp::Elf_Xword)(r_howto.srshift),
1075                               (elfcpp::Elf_Xword)(r_howto.doffset),
1076                               (elfcpp::Elf_Xword)((1 << r_howto.bsize) - 1));
1077   }
1078
1079   static inline void
1080   imm_x_two_part_general(unsigned char* view,
1081                          const Sized_relobj_file<size, big_endian>* object,
1082                          const Symbol_value<size>* psymval,
1083                          typename elfcpp::Elf_types<size>::Elf_Addr addend,
1084                          typename elfcpp::Elf_types<size>::Elf_Addr address,
1085                          unsigned int r_type)
1086   {
1087
1088     elfcpp::Elf_Xword doffset1 = 0llu;
1089     elfcpp::Elf_Xword doffset2 = 0llu;
1090     elfcpp::Elf_Xword dmask1   = 0llu;
1091     elfcpp::Elf_Xword dmask2   = 0llu;
1092     elfcpp::Elf_Xword rshift   = 0llu;
1093     unsigned int pc_rel        = 0;
1094
1095     switch (r_type)
1096       {
1097       case elfcpp::R_TILEGX_BROFF_X1:
1098         doffset1 = 31llu;
1099         doffset2 = 37llu;
1100         dmask1   = 0x3fllu;
1101         dmask2   = 0x1ffc0llu;
1102         rshift   = 3llu;
1103         pc_rel   = 1;
1104         break;
1105       case elfcpp::R_TILEGX_DEST_IMM8_X1:
1106         doffset1 = 31llu;
1107         doffset2 = 43llu;
1108         dmask1   = 0x3fllu;
1109         dmask2   = 0xc0llu;
1110         rshift   = 0llu;
1111         break;
1112       }
1113
1114     if (pc_rel)
1115       This::template pcrela<64>(view, object, psymval, addend, address,
1116                                 rshift, doffset1, dmask1, doffset2, dmask2);
1117     else
1118       This::template rela<64>(view, object, psymval, addend, rshift,
1119                               doffset1, dmask1, doffset2, dmask2);
1120
1121   }
1122
1123   static inline void
1124   tls_relax(unsigned char* view, unsigned int r_type,
1125             tls::Tls_optimization opt_t)
1126   {
1127
1128     const uint64_t TILEGX_X_MOVE_R0_R0 = 0x283bf8005107f000llu;
1129     const uint64_t TILEGX_Y_MOVE_R0_R0 = 0xae05f800540bf000llu;
1130     const uint64_t TILEGX_X_LD         = 0x286ae80000000000llu;
1131     const uint64_t TILEGX_X_LD4S       = 0x286a980000000000llu;
1132     const uint64_t TILEGX_X1_FULL_MASK = 0x3fffffff80000000llu;
1133     const uint64_t TILEGX_X0_RRR_MASK  = 0x000000007ffc0000llu;
1134     const uint64_t TILEGX_X1_RRR_MASK  = 0x3ffe000000000000llu;
1135     const uint64_t TILEGX_Y0_RRR_MASK  = 0x00000000780c0000llu;
1136     const uint64_t TILEGX_Y1_RRR_MASK  = 0x3c06000000000000llu;
1137     const uint64_t TILEGX_X0_RRR_SRCB_MASK = 0x000000007ffff000llu;
1138     const uint64_t TILEGX_X1_RRR_SRCB_MASK = 0x3ffff80000000000llu;
1139     const uint64_t TILEGX_Y0_RRR_SRCB_MASK = 0x00000000780ff000llu;
1140     const uint64_t TILEGX_Y1_RRR_SRCB_MASK = 0x3c07f80000000000llu;
1141     const uint64_t TILEGX_X_ADD_R0_R0_TP   = 0x2807a800500f5000llu;
1142     const uint64_t TILEGX_Y_ADD_R0_R0_TP   = 0x9a13a8002c275000llu;
1143     const uint64_t TILEGX_X_ADDX_R0_R0_TP  = 0x2805a800500b5000llu;
1144     const uint64_t TILEGX_Y_ADDX_R0_R0_TP  = 0x9a01a8002c035000llu;
1145
1146     const uint64_t R_TILEGX_IMM8_X0_TLS_ADD_MASK =
1147       (TILEGX_X0_RRR_MASK | (0x3Fllu << 12));
1148
1149     const uint64_t R_TILEGX_IMM8_X1_TLS_ADD_MASK =
1150       (TILEGX_X1_RRR_MASK | (0x3Fllu << 43));
1151
1152     const uint64_t R_TILEGX_IMM8_Y0_TLS_ADD_MASK =
1153       (TILEGX_Y0_RRR_MASK | (0x3Fllu << 12));
1154
1155     const uint64_t R_TILEGX_IMM8_Y1_TLS_ADD_MASK =
1156       (TILEGX_Y1_RRR_MASK | (0x3Fllu << 43));
1157
1158     const uint64_t R_TILEGX_IMM8_X0_TLS_ADD_LE_MASK =
1159       (TILEGX_X0_RRR_SRCB_MASK | (0x3Fllu << 6));
1160
1161     const uint64_t R_TILEGX_IMM8_X1_TLS_ADD_LE_MASK =
1162       (TILEGX_X1_RRR_SRCB_MASK | (0x3Fllu << 37));
1163
1164     const uint64_t R_TILEGX_IMM8_Y0_TLS_ADD_LE_MASK =
1165       (TILEGX_Y0_RRR_SRCB_MASK | (0x3Fllu << 6));
1166
1167     const uint64_t R_TILEGX_IMM8_Y1_TLS_ADD_LE_MASK =
1168       (TILEGX_Y1_RRR_SRCB_MASK | (0x3Fllu << 37));
1169
1170     typedef typename elfcpp::Swap<64, big_endian>::Valtype Valtype;
1171     Valtype* wv = reinterpret_cast<Valtype*>(view);
1172     Valtype val = elfcpp::Swap<64, big_endian>::readval(wv);
1173     Valtype reloc = 0;
1174
1175     switch (r_type)
1176     {
1177       case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
1178         if (opt_t == tls::TLSOPT_NONE) {
1179           // GD/IE: 1. copy dest operand into the second source operand
1180           //        2. change the opcode to "add"
1181           reloc = (val & 0x3Fllu) << 12;  // featch the dest reg
1182           reloc |= ((size == 32
1183                      ? TILEGX_X_ADDX_R0_R0_TP
1184                      : TILEGX_X_ADD_R0_R0_TP)
1185                     & TILEGX_X0_RRR_MASK);  // change opcode
1186           val &= ~R_TILEGX_IMM8_X0_TLS_ADD_MASK;
1187         } else if (opt_t == tls::TLSOPT_TO_LE) {
1188           // LE: 1. copy dest operand into the first source operand
1189           //     2. change the opcode to "move"
1190           reloc = (val & 0x3Fllu) << 6;
1191           reloc |= (TILEGX_X_MOVE_R0_R0 & TILEGX_X0_RRR_SRCB_MASK);
1192           val &= ~R_TILEGX_IMM8_X0_TLS_ADD_LE_MASK;
1193         } else
1194           gold_unreachable();
1195         break;
1196       case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
1197         if (opt_t == tls::TLSOPT_NONE) {
1198           reloc = (val & (0x3Fllu << 31)) << 12;
1199           reloc |= ((size == 32
1200                      ? TILEGX_X_ADDX_R0_R0_TP
1201                      : TILEGX_X_ADD_R0_R0_TP)
1202                     & TILEGX_X1_RRR_MASK);
1203           val &= ~R_TILEGX_IMM8_X1_TLS_ADD_MASK;
1204         } else if (opt_t == tls::TLSOPT_TO_LE) {
1205           reloc = (val & (0x3Fllu << 31)) << 6;
1206           reloc |= (TILEGX_X_MOVE_R0_R0 & TILEGX_X1_RRR_SRCB_MASK);
1207           val &= ~R_TILEGX_IMM8_X1_TLS_ADD_LE_MASK;
1208         } else
1209           gold_unreachable();
1210         break;
1211       case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
1212         if (opt_t == tls::TLSOPT_NONE) {
1213           reloc = (val & 0x3Fllu) << 12;
1214           reloc |= ((size == 32
1215                      ? TILEGX_Y_ADDX_R0_R0_TP
1216                      : TILEGX_Y_ADD_R0_R0_TP)
1217                     & TILEGX_Y0_RRR_MASK);
1218           val &= ~R_TILEGX_IMM8_Y0_TLS_ADD_MASK;
1219         } else if (opt_t == tls::TLSOPT_TO_LE) {
1220           reloc = (val & 0x3Fllu) << 6;
1221           reloc |= (TILEGX_Y_MOVE_R0_R0 & TILEGX_Y0_RRR_SRCB_MASK);
1222           val &= ~R_TILEGX_IMM8_Y0_TLS_ADD_LE_MASK;
1223         } else
1224           gold_unreachable();
1225         break;
1226       case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
1227         if (opt_t == tls::TLSOPT_NONE) {
1228           reloc = (val & (0x3Fllu << 31)) << 12;
1229           reloc |= ((size == 32
1230                      ? TILEGX_Y_ADDX_R0_R0_TP
1231                      : TILEGX_Y_ADD_R0_R0_TP)
1232                     & TILEGX_Y1_RRR_MASK);
1233           val &= ~R_TILEGX_IMM8_Y1_TLS_ADD_MASK;
1234         } else if (opt_t == tls::TLSOPT_TO_LE) {
1235           reloc = (val & (0x3Fllu << 31)) << 6;
1236           reloc |= (TILEGX_Y_MOVE_R0_R0 & TILEGX_Y1_RRR_SRCB_MASK);
1237           val &= ~R_TILEGX_IMM8_Y1_TLS_ADD_LE_MASK;
1238         } else
1239           gold_unreachable();
1240         break;
1241       case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
1242         if (opt_t == tls::TLSOPT_NONE) {
1243           // GD see comments for optimize_tls_reloc
1244           reloc = TILEGX_X_MOVE_R0_R0 & TILEGX_X0_RRR_SRCB_MASK;
1245           val &= ~TILEGX_X0_RRR_SRCB_MASK;
1246         } else if (opt_t == tls::TLSOPT_TO_IE
1247                    || opt_t == tls::TLSOPT_TO_LE) {
1248           // IE/LE
1249           reloc = (size == 32
1250                    ? TILEGX_X_ADDX_R0_R0_TP
1251                    : TILEGX_X_ADD_R0_R0_TP)
1252                    & TILEGX_X0_RRR_SRCB_MASK;
1253           val &= ~TILEGX_X0_RRR_SRCB_MASK;
1254         }
1255         break;
1256       case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
1257         if (opt_t == tls::TLSOPT_NONE) {
1258           reloc = TILEGX_X_MOVE_R0_R0 & TILEGX_X1_RRR_SRCB_MASK;
1259           val &= ~TILEGX_X1_RRR_SRCB_MASK;
1260         } else if (opt_t == tls::TLSOPT_TO_IE
1261                    || opt_t == tls::TLSOPT_TO_LE) {
1262           reloc = (size == 32
1263                    ? TILEGX_X_ADDX_R0_R0_TP
1264                    : TILEGX_X_ADD_R0_R0_TP)
1265                    & TILEGX_X1_RRR_SRCB_MASK;
1266           val &= ~TILEGX_X1_RRR_SRCB_MASK;
1267         }
1268         break;
1269       case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
1270         if (opt_t == tls::TLSOPT_NONE) {
1271           reloc = TILEGX_Y_MOVE_R0_R0 & TILEGX_Y0_RRR_SRCB_MASK;
1272           val &= ~TILEGX_Y0_RRR_SRCB_MASK;
1273         } else if (opt_t == tls::TLSOPT_TO_IE
1274                    || opt_t == tls::TLSOPT_TO_LE) {
1275           reloc = (size == 32
1276                    ? TILEGX_Y_ADDX_R0_R0_TP
1277                    : TILEGX_Y_ADD_R0_R0_TP)
1278                    & TILEGX_Y0_RRR_SRCB_MASK;
1279           val &= ~TILEGX_Y0_RRR_SRCB_MASK;
1280         }
1281         break;
1282       case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
1283         if (opt_t == tls::TLSOPT_NONE) {
1284           reloc = TILEGX_Y_MOVE_R0_R0 & TILEGX_Y1_RRR_SRCB_MASK;
1285           val &= ~TILEGX_Y1_RRR_SRCB_MASK;
1286         } else if (opt_t == tls::TLSOPT_TO_IE
1287                    || opt_t == tls::TLSOPT_TO_LE) {
1288           reloc = (size == 32
1289                    ? TILEGX_Y_ADDX_R0_R0_TP
1290                    : TILEGX_Y_ADD_R0_R0_TP)
1291                    & TILEGX_Y1_RRR_SRCB_MASK;
1292           val &= ~TILEGX_Y1_RRR_SRCB_MASK;
1293         }
1294         break;
1295       case elfcpp::R_TILEGX_TLS_IE_LOAD:
1296         if (opt_t == tls::TLSOPT_NONE) {
1297           // IE
1298           reloc = (size == 32
1299                    ? TILEGX_X_LD4S
1300                    : TILEGX_X_LD)
1301                    & TILEGX_X1_RRR_SRCB_MASK;
1302           val &= ~TILEGX_X1_RRR_SRCB_MASK;
1303         } else if (opt_t == tls::TLSOPT_TO_LE) {
1304           // LE
1305           reloc = TILEGX_X_MOVE_R0_R0 & TILEGX_X1_RRR_SRCB_MASK;
1306           val &= ~TILEGX_X1_RRR_SRCB_MASK;
1307         } else
1308           gold_unreachable();
1309         break;
1310       case elfcpp::R_TILEGX_TLS_GD_CALL:
1311         if (opt_t == tls::TLSOPT_TO_IE) {
1312           // ld/ld4s r0, r0
1313           reloc = (size == 32
1314                   ? TILEGX_X_LD4S
1315                   : TILEGX_X_LD) & TILEGX_X1_FULL_MASK;
1316           val &= ~TILEGX_X1_FULL_MASK;
1317         } else if (opt_t == tls::TLSOPT_TO_LE) {
1318           // move r0, r0
1319           reloc = TILEGX_X_MOVE_R0_R0 & TILEGX_X1_FULL_MASK;
1320           val &= ~TILEGX_X1_FULL_MASK;
1321         } else
1322           // should be handled in ::relocate
1323           gold_unreachable();
1324         break;
1325       default:
1326         gold_unreachable();
1327         break;
1328     }
1329     elfcpp::Swap<64, big_endian>::writeval(wv, val | reloc);
1330   }
1331 };
1332
1333 template<>
1334 const Tilegx_relocate_functions<64, false>::Tilegx_howto
1335 Tilegx_relocate_functions<64, false>::howto[elfcpp::R_TILEGX_NUM] =
1336 {
1337   {  0,  0, 0,  0, 0}, // R_TILEGX_NONE
1338   {  0,  0, 0, 64, 0}, // R_TILEGX_64
1339   {  0,  0, 0, 32, 0}, // R_TILEGX_32
1340   {  0,  0, 0, 16, 0}, // R_TILEGX_16
1341   {  0,  0, 0,  8, 0}, // R_TILEGX_8
1342   {  0,  0, 1, 64, 0}, // R_TILEGX_64_PCREL
1343   {  0,  0, 1, 32, 0}, // R_TILEGX_32_PCREL
1344   {  0,  0, 1, 16, 0}, // R_TILEGX_16_PCREL
1345   {  0,  0, 1,  8, 0}, // R_TILEGX_8_PCREL
1346   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0
1347   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1
1348   { 32,  0, 0,  0, 0}, // R_TILEGX_HW2
1349   { 48,  0, 0,  0, 0}, // R_TILEGX_HW3
1350   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0_LAST
1351   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1_LAST
1352   { 32,  0, 0,  0, 0}, // R_TILEGX_HW2_LAST
1353   {  0,  0, 0,  0, 0}, // R_TILEGX_COPY
1354   {  0,  0, 0,  8, 0}, // R_TILEGX_GLOB_DAT
1355   {  0,  0, 0,  0, 0}, // R_TILEGX_JMP_SLOT
1356   {  0,  0, 0,  0, 0}, // R_TILEGX_RELATIVE
1357   {  3,  1, 1,  0, 0}, // R_TILEGX_BROFF_X1
1358   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1
1359   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1_PLT
1360   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X0
1361   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y0
1362   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X1
1363   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y1
1364   {  0,  1, 0,  8, 0}, // R_TILEGX_DEST_IMM8_X1
1365   {  0,  1, 0,  8, 0}, // R_TILEGX_MT_IMM14_X1
1366   {  0,  1, 0,  8, 0}, // R_TILEGX_MF_IMM14_X1
1367   {  0,  1, 0,  8, 0}, // R_TILEGX_MMSTART_X0
1368   {  0,  1, 0,  8, 0}, // R_TILEGX_MMEND_X0
1369   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X0
1370   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X1
1371   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y0
1372   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y1
1373   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0
1374   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0
1375   { 16, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW1
1376   { 16, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW1
1377   { 32, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW2
1378   { 32, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW2
1379   { 48, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW3
1380   { 48, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW3
1381   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST
1382   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST
1383   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST
1384   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST
1385   { 32, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST
1386   { 32, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST
1387   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PCREL
1388   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PCREL
1389   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PCREL
1390   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PCREL
1391   { 32, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PCREL
1392   { 32, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PCREL
1393   { 48, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW3_PCREL
1394   { 48, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW3_PCREL
1395   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PCREL
1396   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PCREL
1397   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PCREL
1398   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PCREL
1399   { 32, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PCREL
1400   { 32, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PCREL
1401   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_GOT
1402   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_GOT
1403   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PLT_PCREL
1404   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PLT_PCREL
1405   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PLT_PCREL
1406   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PLT_PCREL
1407   { 32, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PLT_PCREL
1408   { 32, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PLT_PCREL
1409   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_GOT
1410   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_GOT
1411   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_GOT
1412   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_GOT
1413   { 32, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_GOT
1414   { 32, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_GOT
1415   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_GD
1416   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_GD
1417   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_LE
1418   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_LE
1419   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
1420   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
1421   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
1422   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
1423   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
1424   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
1425   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
1426   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
1427   {  0,  0, 0,  0, 0}, // R_TILEGX_IRELATIVE
1428   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1429   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_IE
1430   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_IE
1431   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
1432   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
1433   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
1434   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
1435   { 32, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
1436   { 32, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
1437   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
1438   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
1439   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
1440   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
1441   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1442   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1443   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD64
1444   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF64
1445   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF64
1446   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD32
1447   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF32
1448   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF32
1449   {  3, 31, 1, 27, 0}, // R_TILEGX_TLS_GD_CALL
1450   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_GD_ADD
1451   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_GD_ADD
1452   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_GD_ADD
1453   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_GD_ADD
1454   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_IE_LOAD
1455   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_ADD
1456   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_ADD
1457   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_ADD
1458   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_ADD
1459   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTINHERIT
1460   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTENTRY
1461 };
1462
1463 template<>
1464 const Tilegx_relocate_functions<32, false>::Tilegx_howto
1465 Tilegx_relocate_functions<32, false>::howto[elfcpp::R_TILEGX_NUM] =
1466 {
1467   {  0,  0, 0,  0, 0}, // R_TILEGX_NONE
1468   {  0,  0, 0, 64, 0}, // R_TILEGX_64
1469   {  0,  0, 0, 32, 0}, // R_TILEGX_32
1470   {  0,  0, 0, 16, 0}, // R_TILEGX_16
1471   {  0,  0, 0,  8, 0}, // R_TILEGX_8
1472   {  0,  0, 1, 64, 0}, // R_TILEGX_64_PCREL
1473   {  0,  0, 1, 32, 0}, // R_TILEGX_32_PCREL
1474   {  0,  0, 1, 16, 0}, // R_TILEGX_16_PCREL
1475   {  0,  0, 1,  8, 0}, // R_TILEGX_8_PCREL
1476   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0
1477   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1
1478   { 31,  0, 0,  0, 0}, // R_TILEGX_HW2
1479   { 31,  0, 0,  0, 0}, // R_TILEGX_HW3
1480   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0_LAST
1481   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1_LAST
1482   { 31,  0, 0,  0, 0}, // R_TILEGX_HW2_LAST
1483   {  0,  0, 0,  0, 0}, // R_TILEGX_COPY
1484   {  0,  0, 0,  8, 0}, // R_TILEGX_GLOB_DAT
1485   {  0,  0, 0,  0, 0}, // R_TILEGX_JMP_SLOT
1486   {  0,  0, 0,  0, 0}, // R_TILEGX_RELATIVE
1487   {  3,  1, 1,  0, 0}, // R_TILEGX_BROFF_X1
1488   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1
1489   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1_PLT
1490   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X0
1491   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y0
1492   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X1
1493   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y1
1494   {  0,  1, 0,  8, 0}, // R_TILEGX_DEST_IMM8_X1
1495   {  0,  1, 0,  8, 0}, // R_TILEGX_MT_IMM14_X1
1496   {  0,  1, 0,  8, 0}, // R_TILEGX_MF_IMM14_X1
1497   {  0,  1, 0,  8, 0}, // R_TILEGX_MMSTART_X0
1498   {  0,  1, 0,  8, 0}, // R_TILEGX_MMEND_X0
1499   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X0
1500   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X1
1501   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y0
1502   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y1
1503   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0
1504   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0
1505   { 16, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW1
1506   { 16, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW1
1507   { 31, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW2
1508   { 31, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW2
1509   { 31, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW3
1510   { 31, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW3
1511   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST
1512   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST
1513   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST
1514   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST
1515   { 31, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST
1516   { 31, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST
1517   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PCREL
1518   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PCREL
1519   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PCREL
1520   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PCREL
1521   { 31, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PCREL
1522   { 31, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PCREL
1523   { 31, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW3_PCREL
1524   { 31, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW3_PCREL
1525   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PCREL
1526   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PCREL
1527   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PCREL
1528   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PCREL
1529   { 31, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PCREL
1530   { 31, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PCREL
1531   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_GOT
1532   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_GOT
1533   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PLT_PCREL
1534   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PLT_PCREL
1535   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PLT_PCREL
1536   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PLT_PCREL
1537   { 31, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PLT_PCREL
1538   { 31, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PLT_PCREL
1539   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_GOT
1540   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_GOT
1541   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_GOT
1542   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_GOT
1543   { 31, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_GOT
1544   { 31, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_GOT
1545   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_GD
1546   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_GD
1547   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_LE
1548   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_LE
1549   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
1550   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
1551   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
1552   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
1553   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
1554   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
1555   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
1556   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
1557   {  0,  0, 0,  0, 0}, // R_TILEGX_IRELATIVE
1558   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1559   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_IE
1560   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_IE
1561   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
1562   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
1563   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
1564   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
1565   { 31, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
1566   { 31, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
1567   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
1568   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
1569   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
1570   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
1571   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1572   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1573   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD64
1574   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF64
1575   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF64
1576   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD32
1577   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF32
1578   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF32
1579   {  3, 31, 1, 27, 0}, // R_TILEGX_TLS_GD_CALL
1580   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_GD_ADD
1581   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_GD_ADD
1582   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_GD_ADD
1583   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_GD_ADD
1584   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_IE_LOAD
1585   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_ADD
1586   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_ADD
1587   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_ADD
1588   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_ADD
1589   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTINHERIT
1590   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTENTRY
1591 };
1592
1593 template<>
1594 const Tilegx_relocate_functions<64, true>::Tilegx_howto
1595 Tilegx_relocate_functions<64, true>::howto[elfcpp::R_TILEGX_NUM] =
1596 {
1597   {  0,  0, 0,  0, 0}, // R_TILEGX_NONE
1598   {  0,  0, 0, 64, 0}, // R_TILEGX_64
1599   {  0,  0, 0, 32, 0}, // R_TILEGX_32
1600   {  0,  0, 0, 16, 0}, // R_TILEGX_16
1601   {  0,  0, 0,  8, 0}, // R_TILEGX_8
1602   {  0,  0, 1, 64, 0}, // R_TILEGX_64_PCREL
1603   {  0,  0, 1, 32, 0}, // R_TILEGX_32_PCREL
1604   {  0,  0, 1, 16, 0}, // R_TILEGX_16_PCREL
1605   {  0,  0, 1,  8, 0}, // R_TILEGX_8_PCREL
1606   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0
1607   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1
1608   { 32,  0, 0,  0, 0}, // R_TILEGX_HW2
1609   { 48,  0, 0,  0, 0}, // R_TILEGX_HW3
1610   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0_LAST
1611   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1_LAST
1612   { 32,  0, 0,  0, 0}, // R_TILEGX_HW2_LAST
1613   {  0,  0, 0,  0, 0}, // R_TILEGX_COPY
1614   {  0,  0, 0,  8, 0}, // R_TILEGX_GLOB_DAT
1615   {  0,  0, 0,  0, 0}, // R_TILEGX_JMP_SLOT
1616   {  0,  0, 0,  0, 0}, // R_TILEGX_RELATIVE
1617   {  3,  1, 1,  0, 0}, // R_TILEGX_BROFF_X1
1618   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1
1619   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1_PLT
1620   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X0
1621   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y0
1622   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X1
1623   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y1
1624   {  0,  1, 0,  8, 0}, // R_TILEGX_DEST_IMM8_X1
1625   {  0,  1, 0,  8, 0}, // R_TILEGX_MT_IMM14_X1
1626   {  0,  1, 0,  8, 0}, // R_TILEGX_MF_IMM14_X1
1627   {  0,  1, 0,  8, 0}, // R_TILEGX_MMSTART_X0
1628   {  0,  1, 0,  8, 0}, // R_TILEGX_MMEND_X0
1629   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X0
1630   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X1
1631   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y0
1632   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y1
1633   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0
1634   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0
1635   { 16, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW1
1636   { 16, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW1
1637   { 32, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW2
1638   { 32, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW2
1639   { 48, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW3
1640   { 48, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW3
1641   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST
1642   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST
1643   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST
1644   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST
1645   { 32, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST
1646   { 32, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST
1647   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PCREL
1648   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PCREL
1649   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PCREL
1650   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PCREL
1651   { 32, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PCREL
1652   { 32, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PCREL
1653   { 48, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW3_PCREL
1654   { 48, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW3_PCREL
1655   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PCREL
1656   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PCREL
1657   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PCREL
1658   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PCREL
1659   { 32, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PCREL
1660   { 32, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PCREL
1661   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_GOT
1662   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_GOT
1663   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PLT_PCREL
1664   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PLT_PCREL
1665   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PLT_PCREL
1666   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PLT_PCREL
1667   { 32, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PLT_PCREL
1668   { 32, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PLT_PCREL
1669   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_GOT
1670   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_GOT
1671   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_GOT
1672   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_GOT
1673   { 32, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_GOT
1674   { 32, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_GOT
1675   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_GD
1676   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_GD
1677   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_LE
1678   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_LE
1679   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
1680   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
1681   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
1682   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
1683   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
1684   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
1685   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
1686   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
1687   {  0,  0, 0,  0, 0}, // R_TILEGX_IRELATIVE
1688   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1689   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_IE
1690   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_IE
1691   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
1692   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
1693   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
1694   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
1695   { 32, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
1696   { 32, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
1697   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
1698   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
1699   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
1700   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
1701   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1702   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1703   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD64
1704   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF64
1705   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF64
1706   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD32
1707   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF32
1708   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF32
1709   {  3, 31, 1, 27, 0}, // R_TILEGX_TLS_GD_CALL
1710   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_GD_ADD
1711   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_GD_ADD
1712   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_GD_ADD
1713   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_GD_ADD
1714   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_IE_LOAD
1715   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_ADD
1716   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_ADD
1717   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_ADD
1718   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_ADD
1719   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTINHERIT
1720   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTENTRY
1721 };
1722
1723 template<>
1724 const Tilegx_relocate_functions<32, true>::Tilegx_howto
1725 Tilegx_relocate_functions<32, true>::howto[elfcpp::R_TILEGX_NUM] =
1726 {
1727   {  0,  0, 0,  0, 0}, // R_TILEGX_NONE
1728   {  0,  0, 0, 64, 0}, // R_TILEGX_64
1729   {  0,  0, 0, 32, 0}, // R_TILEGX_32
1730   {  0,  0, 0, 16, 0}, // R_TILEGX_16
1731   {  0,  0, 0,  8, 0}, // R_TILEGX_8
1732   {  0,  0, 1, 64, 0}, // R_TILEGX_64_PCREL
1733   {  0,  0, 1, 32, 0}, // R_TILEGX_32_PCREL
1734   {  0,  0, 1, 16, 0}, // R_TILEGX_16_PCREL
1735   {  0,  0, 1,  8, 0}, // R_TILEGX_8_PCREL
1736   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0
1737   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1
1738   { 31,  0, 0,  0, 0}, // R_TILEGX_HW2
1739   { 31,  0, 0,  0, 0}, // R_TILEGX_HW3
1740   {  0,  0, 0,  0, 0}, // R_TILEGX_HW0_LAST
1741   { 16,  0, 0,  0, 0}, // R_TILEGX_HW1_LAST
1742   { 31,  0, 0,  0, 0}, // R_TILEGX_HW2_LAST
1743   {  0,  0, 0,  0, 0}, // R_TILEGX_COPY
1744   {  0,  0, 0,  8, 0}, // R_TILEGX_GLOB_DAT
1745   {  0,  0, 0,  0, 0}, // R_TILEGX_JMP_SLOT
1746   {  0,  0, 0,  0, 0}, // R_TILEGX_RELATIVE
1747   {  3,  1, 1,  0, 0}, // R_TILEGX_BROFF_X1
1748   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1
1749   {  3, 31, 1, 27, 0}, // R_TILEGX_JUMPOFF_X1_PLT
1750   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X0
1751   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y0
1752   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_X1
1753   {  0,  1, 0,  8, 0}, // R_TILEGX_IMM8_Y1
1754   {  0,  1, 0,  8, 0}, // R_TILEGX_DEST_IMM8_X1
1755   {  0,  1, 0,  8, 0}, // R_TILEGX_MT_IMM14_X1
1756   {  0,  1, 0,  8, 0}, // R_TILEGX_MF_IMM14_X1
1757   {  0,  1, 0,  8, 0}, // R_TILEGX_MMSTART_X0
1758   {  0,  1, 0,  8, 0}, // R_TILEGX_MMEND_X0
1759   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X0
1760   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_X1
1761   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y0
1762   {  0,  1, 0,  8, 0}, // R_TILEGX_SHAMT_Y1
1763   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0
1764   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0
1765   { 16, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW1
1766   { 16, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW1
1767   { 31, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW2
1768   { 31, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW2
1769   { 31, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW3
1770   { 31, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW3
1771   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST
1772   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST
1773   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST
1774   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST
1775   { 31, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST
1776   { 31, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST
1777   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PCREL
1778   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PCREL
1779   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PCREL
1780   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PCREL
1781   { 31, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PCREL
1782   { 31, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PCREL
1783   { 31, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW3_PCREL
1784   { 31, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW3_PCREL
1785   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PCREL
1786   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PCREL
1787   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PCREL
1788   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PCREL
1789   { 31, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PCREL
1790   { 31, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PCREL
1791   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_GOT
1792   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_GOT
1793   {  0, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW0_PLT_PCREL
1794   {  0, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW0_PLT_PCREL
1795   { 16, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW1_PLT_PCREL
1796   { 16, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW1_PLT_PCREL
1797   { 31, 12, 1, 16, 0}, // R_TILEGX_IMM16_X0_HW2_PLT_PCREL
1798   { 31, 43, 1, 16, 0}, // R_TILEGX_IMM16_X1_HW2_PLT_PCREL
1799   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_GOT
1800   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_GOT
1801   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_GOT
1802   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_GOT
1803   { 31, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_GOT
1804   { 31, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_GOT
1805   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_GD
1806   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_GD
1807   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_LE
1808   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_LE
1809   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
1810   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
1811   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
1812   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
1813   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
1814   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
1815   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
1816   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
1817   {  0,  0, 0,  0, 0}, // R_TILEGX_IRELATIVE
1818   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1819   {  0, 12, 0, 16, 0}, // R_TILEGX_IMM16_X0_HW0_TLS_IE
1820   {  0, 43, 0, 16, 0}, // R_TILEGX_IMM16_X1_HW0_TLS_IE
1821   {  0, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
1822   {  0, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
1823   { 16, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
1824   { 16, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
1825   { 31, 12, 1, 16, 1}, // R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
1826   { 31, 43, 1, 16, 1}, // R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
1827   {  0, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
1828   {  0, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
1829   { 16, 12, 0, 16, 1}, // R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
1830   { 16, 43, 0, 16, 1}, // R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
1831   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1832   {  0,  0, 0,  0, 0}, // R_TILEGX_INVALID
1833   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD64
1834   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF64
1835   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF64
1836   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPMOD32
1837   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_DTPOFF32
1838   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_TPOFF32
1839   {  3, 31, 1, 27, 0}, // R_TILEGX_TLS_GD_CALL
1840   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_GD_ADD
1841   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_GD_ADD
1842   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_GD_ADD
1843   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_GD_ADD
1844   {  0,  0, 0,  0, 0}, // R_TILEGX_TLS_IE_LOAD
1845   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X0_TLS_ADD
1846   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_X1_TLS_ADD
1847   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y0_TLS_ADD
1848   {  0,  0, 0,  0, 0}, // R_TILEGX_IMM8_Y1_TLS_ADD
1849   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTINHERIT
1850   {  0,  0, 0,  0, 0}, // R_TILEGX_GNU_VTENTRY
1851 };
1852
1853 // Get the GOT section, creating it if necessary.
1854
1855 template<int size, bool big_endian>
1856 Output_data_got<size, big_endian>*
1857 Target_tilegx<size, big_endian>::got_section(Symbol_table* symtab,
1858                                              Layout* layout)
1859 {
1860   if (this->got_ == NULL)
1861     {
1862       gold_assert(symtab != NULL && layout != NULL);
1863
1864       // When using -z now, we can treat .got.plt as a relro section.
1865       // Without -z now, it is modified after program startup by lazy
1866       // PLT relocations.
1867       bool is_got_plt_relro = parameters->options().now();
1868       Output_section_order got_order = (is_got_plt_relro
1869                                         ? ORDER_RELRO
1870                                         : ORDER_RELRO_LAST);
1871       Output_section_order got_plt_order = (is_got_plt_relro
1872                                             ? ORDER_RELRO
1873                                             : ORDER_NON_RELRO_FIRST);
1874
1875       this->got_ = new Output_data_got<size, big_endian>();
1876
1877       layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
1878                                       (elfcpp::SHF_ALLOC
1879                                        | elfcpp::SHF_WRITE),
1880                                       this->got_, got_order, true);
1881
1882       // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
1883       this->global_offset_table_ =
1884         symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
1885                                       Symbol_table::PREDEFINED,
1886                                       this->got_,
1887                                       0, 0, elfcpp::STT_OBJECT,
1888                                       elfcpp::STB_LOCAL,
1889                                       elfcpp::STV_HIDDEN, 0,
1890                                       false, false);
1891
1892       if (parameters->options().shared()) {
1893         // we need to keep the address of .dynamic section in the
1894         // first got entry for .so
1895         this->tilegx_dynamic_ =
1896           symtab->define_in_output_data("_TILEGX_DYNAMIC_", NULL,
1897                                         Symbol_table::PREDEFINED,
1898                                         layout->dynamic_section(),
1899                                         0, 0, elfcpp::STT_OBJECT,
1900                                         elfcpp::STB_LOCAL,
1901                                         elfcpp::STV_HIDDEN, 0,
1902                                         false, false);
1903
1904         this->got_->add_global(this->tilegx_dynamic_, GOT_TYPE_STANDARD);
1905       } else
1906         // for executable, just set the first entry to zero.
1907         this->got_->set_current_data_size(size / 8);
1908
1909       this->got_plt_ = new Output_data_space(size / 8, "** GOT PLT");
1910       layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
1911                                       (elfcpp::SHF_ALLOC
1912                                        | elfcpp::SHF_WRITE),
1913                                       this->got_plt_, got_plt_order,
1914                                       is_got_plt_relro);
1915
1916       // The first two entries are reserved.
1917       this->got_plt_->set_current_data_size
1918              (TILEGX_GOTPLT_RESERVE_COUNT * (size / 8));
1919
1920       if (!is_got_plt_relro)
1921         {
1922           // Those bytes can go into the relro segment.
1923           layout->increase_relro(size / 8);
1924         }
1925
1926
1927       // If there are any IRELATIVE relocations, they get GOT entries
1928       // in .got.plt after the jump slot entries.
1929       this->got_irelative_
1930          = new Output_data_space(size / 8, "** GOT IRELATIVE PLT");
1931       layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
1932                                       (elfcpp::SHF_ALLOC
1933                                        | elfcpp::SHF_WRITE),
1934                                       this->got_irelative_,
1935                                       got_plt_order, is_got_plt_relro);
1936     }
1937
1938   return this->got_;
1939 }
1940
1941 // Get the dynamic reloc section, creating it if necessary.
1942
1943 template<int size, bool big_endian>
1944 typename Target_tilegx<size, big_endian>::Reloc_section*
1945 Target_tilegx<size, big_endian>::rela_dyn_section(Layout* layout)
1946 {
1947   if (this->rela_dyn_ == NULL)
1948     {
1949       gold_assert(layout != NULL);
1950       this->rela_dyn_ = new Reloc_section(parameters->options().combreloc());
1951       layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA,
1952                                       elfcpp::SHF_ALLOC, this->rela_dyn_,
1953                                       ORDER_DYNAMIC_RELOCS, false);
1954     }
1955   return this->rela_dyn_;
1956 }
1957
1958 // Get the section to use for IRELATIVE relocs, creating it if
1959 // necessary.  These go in .rela.dyn, but only after all other dynamic
1960 // relocations.  They need to follow the other dynamic relocations so
1961 // that they can refer to global variables initialized by those
1962 // relocs.
1963
1964 template<int size, bool big_endian>
1965 typename Target_tilegx<size, big_endian>::Reloc_section*
1966 Target_tilegx<size, big_endian>::rela_irelative_section(Layout* layout)
1967 {
1968   if (this->rela_irelative_ == NULL)
1969     {
1970       // Make sure we have already created the dynamic reloc section.
1971       this->rela_dyn_section(layout);
1972       this->rela_irelative_ = new Reloc_section(false);
1973       layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA,
1974                                       elfcpp::SHF_ALLOC, this->rela_irelative_,
1975                                       ORDER_DYNAMIC_RELOCS, false);
1976       gold_assert(this->rela_dyn_->output_section()
1977                   == this->rela_irelative_->output_section());
1978     }
1979   return this->rela_irelative_;
1980 }
1981
1982 // Initialize the PLT section.
1983
1984 template<int size, bool big_endian>
1985 void
1986 Output_data_plt_tilegx<size, big_endian>::init(Layout* layout)
1987 {
1988   this->rel_ = new Reloc_section(false);
1989   layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA,
1990                                   elfcpp::SHF_ALLOC, this->rel_,
1991                                   ORDER_DYNAMIC_PLT_RELOCS, false);
1992 }
1993
1994 template<int size, bool big_endian>
1995 void
1996 Output_data_plt_tilegx<size, big_endian>::do_adjust_output_section(
1997   Output_section* os)
1998 {
1999   os->set_entsize(this->get_plt_entry_size());
2000 }
2001
2002 // Add an entry to the PLT.
2003
2004 template<int size, bool big_endian>
2005 void
2006 Output_data_plt_tilegx<size, big_endian>::add_entry(Symbol_table* symtab,
2007   Layout* layout, Symbol* gsym)
2008 {
2009   gold_assert(!gsym->has_plt_offset());
2010
2011   unsigned int plt_index;
2012   off_t plt_offset;
2013   section_offset_type got_offset;
2014
2015   unsigned int* pcount;
2016   unsigned int reserved;
2017   Output_data_space* got;
2018   if (gsym->type() == elfcpp::STT_GNU_IFUNC
2019       && gsym->can_use_relative_reloc(false))
2020     {
2021       pcount = &this->irelative_count_;
2022       reserved = 0;
2023       got = this->got_irelative_;
2024     }
2025   else
2026     {
2027       pcount = &this->count_;
2028       reserved = TILEGX_GOTPLT_RESERVE_COUNT;
2029       got = this->got_plt_;
2030     }
2031
2032   if (!this->is_data_size_valid())
2033     {
2034       plt_index = *pcount;
2035
2036       // TILEGX .plt section layout
2037       //
2038       //  ----
2039       //   plt_header
2040       //  ----
2041       //   plt stub
2042       //  ----
2043       //   ...
2044       //  ----
2045       //
2046       // TILEGX .got.plt section layout
2047       //
2048       //  ----
2049       //  reserv1
2050       //  ----
2051       //  reserv2
2052       //  ----
2053       //   entries for normal function
2054       //  ----
2055       //   ...
2056       //  ----
2057       //   entries for ifunc
2058       //  ----
2059       //   ...
2060       //  ----
2061       if (got == this->got_irelative_)
2062         plt_offset = plt_index * this->get_plt_entry_size();
2063       else
2064         plt_offset = (plt_index + 1) * this->get_plt_entry_size();
2065
2066       ++*pcount;
2067
2068       got_offset = (plt_index + reserved) * (size / 8);
2069       gold_assert(got_offset == got->current_data_size());
2070
2071       // Every PLT entry needs a GOT entry which points back to the PLT
2072       // entry (this will be changed by the dynamic linker, normally
2073       // lazily when the function is called).
2074       got->set_current_data_size(got_offset + size / 8);
2075     }
2076   else
2077     {
2078       // FIXME: This is probably not correct for IRELATIVE relocs.
2079
2080       // For incremental updates, find an available slot.
2081       plt_offset = this->free_list_.allocate(this->get_plt_entry_size(),
2082                                              this->get_plt_entry_size(), 0);
2083       if (plt_offset == -1)
2084         gold_fallback(_("out of patch space (PLT);"
2085                         " relink with --incremental-full"));
2086
2087       // The GOT and PLT entries have a 1-1 correspondance, so the GOT offset
2088       // can be calculated from the PLT index, adjusting for the three
2089       // reserved entries at the beginning of the GOT.
2090       plt_index = plt_offset / this->get_plt_entry_size() - 1;
2091       got_offset = (plt_index + reserved) * (size / 8);
2092     }
2093
2094   gsym->set_plt_offset(plt_offset);
2095
2096   // Every PLT entry needs a reloc.
2097   this->add_relocation(symtab, layout, gsym, got_offset);
2098
2099   // Note that we don't need to save the symbol.  The contents of the
2100   // PLT are independent of which symbols are used.  The symbols only
2101   // appear in the relocations.
2102 }
2103
2104 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.  Return
2105 // the PLT offset.
2106
2107 template<int size, bool big_endian>
2108 unsigned int
2109 Output_data_plt_tilegx<size, big_endian>::add_local_ifunc_entry(
2110     Symbol_table* symtab,
2111     Layout* layout,
2112     Sized_relobj_file<size, big_endian>* relobj,
2113     unsigned int local_sym_index)
2114 {
2115   unsigned int plt_offset =
2116     this->irelative_count_ * this->get_plt_entry_size();
2117   ++this->irelative_count_;
2118
2119   section_offset_type got_offset = this->got_irelative_->current_data_size();
2120
2121   // Every PLT entry needs a GOT entry which points back to the PLT
2122   // entry.
2123   this->got_irelative_->set_current_data_size(got_offset + size / 8);
2124
2125   // Every PLT entry needs a reloc.
2126   Reloc_section* rela = this->rela_irelative(symtab, layout);
2127   rela->add_symbolless_local_addend(relobj, local_sym_index,
2128                                     elfcpp::R_TILEGX_IRELATIVE,
2129                                     this->got_irelative_, got_offset, 0);
2130
2131   return plt_offset;
2132 }
2133
2134 // Add the relocation for a PLT entry.
2135
2136 template<int size, bool big_endian>
2137 void
2138 Output_data_plt_tilegx<size, big_endian>::add_relocation(Symbol_table* symtab,
2139                                              Layout* layout,
2140                                              Symbol* gsym,
2141                                              unsigned int got_offset)
2142 {
2143   if (gsym->type() == elfcpp::STT_GNU_IFUNC
2144       && gsym->can_use_relative_reloc(false))
2145     {
2146       Reloc_section* rela = this->rela_irelative(symtab, layout);
2147       rela->add_symbolless_global_addend(gsym, elfcpp::R_TILEGX_IRELATIVE,
2148                                          this->got_irelative_, got_offset, 0);
2149     }
2150   else
2151     {
2152       gsym->set_needs_dynsym_entry();
2153       this->rel_->add_global(gsym, elfcpp::R_TILEGX_JMP_SLOT, this->got_plt_,
2154                              got_offset, 0);
2155     }
2156 }
2157
2158 // Return where the IRELATIVE relocations should go in the PLT.  These
2159 // follow the JUMP_SLOT and the TLSDESC relocations.
2160
2161 template<int size, bool big_endian>
2162 typename Output_data_plt_tilegx<size, big_endian>::Reloc_section*
2163 Output_data_plt_tilegx<size, big_endian>::rela_irelative(Symbol_table* symtab,
2164                                                          Layout* layout)
2165 {
2166   if (this->irelative_rel_ == NULL)
2167     {
2168       // case we see any later on.
2169       this->irelative_rel_ = new Reloc_section(false);
2170       layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA,
2171                                       elfcpp::SHF_ALLOC, this->irelative_rel_,
2172                                       ORDER_DYNAMIC_PLT_RELOCS, false);
2173       gold_assert(this->irelative_rel_->output_section()
2174                   == this->rel_->output_section());
2175
2176       if (parameters->doing_static_link())
2177         {
2178           // A statically linked executable will only have a .rela.plt
2179           // section to hold R_TILEGX_IRELATIVE relocs for
2180           // STT_GNU_IFUNC symbols.  The library will use these
2181           // symbols to locate the IRELATIVE relocs at program startup
2182           // time.
2183           symtab->define_in_output_data("__rela_iplt_start", NULL,
2184                                         Symbol_table::PREDEFINED,
2185                                         this->irelative_rel_, 0, 0,
2186                                         elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
2187                                         elfcpp::STV_HIDDEN, 0, false, true);
2188           symtab->define_in_output_data("__rela_iplt_end", NULL,
2189                                         Symbol_table::PREDEFINED,
2190                                         this->irelative_rel_, 0, 0,
2191                                         elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
2192                                         elfcpp::STV_HIDDEN, 0, true, true);
2193         }
2194     }
2195   return this->irelative_rel_;
2196 }
2197
2198 // Return the PLT address to use for a global symbol.
2199
2200 template<int size, bool big_endian>
2201 uint64_t
2202 Output_data_plt_tilegx<size, big_endian>::address_for_global(
2203   const Symbol* gsym)
2204 {
2205   uint64_t offset = 0;
2206   if (gsym->type() == elfcpp::STT_GNU_IFUNC
2207       && gsym->can_use_relative_reloc(false))
2208     offset = (this->count_ + 1) * this->get_plt_entry_size();
2209   return this->address() + offset + gsym->plt_offset();
2210 }
2211
2212 // Return the PLT address to use for a local symbol.  These are always
2213 // IRELATIVE relocs.
2214
2215 template<int size, bool big_endian>
2216 uint64_t
2217 Output_data_plt_tilegx<size, big_endian>::address_for_local(
2218     const Relobj* object,
2219     unsigned int r_sym)
2220 {
2221   return (this->address()
2222           + (this->count_ + 1) * this->get_plt_entry_size()
2223           + object->local_plt_offset(r_sym));
2224 }
2225
2226 // Set the final size.
2227 template<int size, bool big_endian>
2228 void
2229 Output_data_plt_tilegx<size, big_endian>::set_final_data_size()
2230 {
2231   unsigned int count = this->count_ + this->irelative_count_;
2232   this->set_data_size((count + 1) * this->get_plt_entry_size());
2233 }
2234
2235 // The first entry in the PLT for an executable.
2236 template<>
2237 const unsigned char
2238 Output_data_plt_tilegx<64, false>::first_plt_entry[plt_entry_size] =
2239 {
2240   0x00, 0x30, 0x48, 0x51,
2241   0x6e, 0x43, 0xa0, 0x18, // { ld_add r28, r27, 8 }
2242   0x00, 0x30, 0xbc, 0x35,
2243   0x00, 0x40, 0xde, 0x9e, // { ld r27, r27 }
2244   0xff, 0xaf, 0x30, 0x40,
2245   0x60, 0x73, 0x6a, 0x28, // { info 10 ; jr r27 }
2246   // padding
2247   0x00, 0x00, 0x00, 0x00,
2248   0x00, 0x00, 0x00, 0x00,
2249   0x00, 0x00, 0x00, 0x00,
2250   0x00, 0x00, 0x00, 0x00
2251 };
2252
2253 template<>
2254 const unsigned char
2255 Output_data_plt_tilegx<32, false>::first_plt_entry[plt_entry_size] =
2256 {
2257   0x00, 0x30, 0x48, 0x51,
2258   0x6e, 0x23, 0x58, 0x18, // { ld4s_add r28, r27, 4 }
2259   0x00, 0x30, 0xbc, 0x35,
2260   0x00, 0x40, 0xde, 0x9c, // { ld4s r27, r27 }
2261   0xff, 0xaf, 0x30, 0x40,
2262   0x60, 0x73, 0x6a, 0x28, // { info 10 ; jr r27 }
2263   // padding
2264   0x00, 0x00, 0x00, 0x00,
2265   0x00, 0x00, 0x00, 0x00,
2266   0x00, 0x00, 0x00, 0x00,
2267   0x00, 0x00, 0x00, 0x00
2268 };
2269
2270 template<>
2271 const unsigned char
2272 Output_data_plt_tilegx<64, true>::first_plt_entry[plt_entry_size] =
2273 {
2274   0x00, 0x30, 0x48, 0x51,
2275   0x6e, 0x43, 0xa0, 0x18, // { ld_add r28, r27, 8 }
2276   0x00, 0x30, 0xbc, 0x35,
2277   0x00, 0x40, 0xde, 0x9e, // { ld r27, r27 }
2278   0xff, 0xaf, 0x30, 0x40,
2279   0x60, 0x73, 0x6a, 0x28, // { info 10 ; jr r27 }
2280   // padding
2281   0x00, 0x00, 0x00, 0x00,
2282   0x00, 0x00, 0x00, 0x00,
2283   0x00, 0x00, 0x00, 0x00,
2284   0x00, 0x00, 0x00, 0x00
2285 };
2286
2287 template<>
2288 const unsigned char
2289 Output_data_plt_tilegx<32, true>::first_plt_entry[plt_entry_size] =
2290 {
2291   0x00, 0x30, 0x48, 0x51,
2292   0x6e, 0x23, 0x58, 0x18, // { ld4s_add r28, r27, 4 }
2293   0x00, 0x30, 0xbc, 0x35,
2294   0x00, 0x40, 0xde, 0x9c, // { ld4s r27, r27 }
2295   0xff, 0xaf, 0x30, 0x40,
2296   0x60, 0x73, 0x6a, 0x28, // { info 10 ; jr r27 }
2297   // padding
2298   0x00, 0x00, 0x00, 0x00,
2299   0x00, 0x00, 0x00, 0x00,
2300   0x00, 0x00, 0x00, 0x00,
2301   0x00, 0x00, 0x00, 0x00
2302 };
2303
2304 template<int size, bool big_endian>
2305 void
2306 Output_data_plt_tilegx<size, big_endian>::fill_first_plt_entry(
2307   unsigned char* pov)
2308 {
2309   memcpy(pov, first_plt_entry, plt_entry_size);
2310 }
2311
2312 // Subsequent entries in the PLT for an executable.
2313
2314 template<>
2315 const unsigned char
2316 Output_data_plt_tilegx<64, false>::plt_entry[plt_entry_size] =
2317 {
2318   0xdc, 0x0f, 0x00, 0x10,
2319   0x0d, 0xf0, 0x6a, 0x28, // { moveli r28, 0 ; lnk r26 }
2320   0xdb, 0x0f, 0x00, 0x10,
2321   0x8e, 0x03, 0x00, 0x38, // { moveli r27, 0 ; shl16insli r28, r28, 0 }
2322   0x9c, 0xc6, 0x0d, 0xd0,
2323   0x6d, 0x03, 0x00, 0x38, // { add r28, r26, r28 ; shl16insli r27, r27, 0 }
2324   0x9b, 0xb6, 0xc5, 0xad,
2325   0xff, 0x57, 0xe0, 0x8e, // { add r27, r26, r27 ; info 10 ; ld r28, r28 }
2326   0xdd, 0x0f, 0x00, 0x70,
2327   0x80, 0x73, 0x6a, 0x28, // { shl16insli r29, zero, 0 ; jr r28 }
2328
2329 };
2330
2331 template<>
2332 const unsigned char
2333 Output_data_plt_tilegx<32, false>::plt_entry[plt_entry_size] =
2334 {
2335   0xdc, 0x0f, 0x00, 0x10,
2336   0x0d, 0xf0, 0x6a, 0x28, // { moveli r28, 0 ; lnk r26 }
2337   0xdb, 0x0f, 0x00, 0x10,
2338   0x8e, 0x03, 0x00, 0x38, // { moveli r27, 0 ; shl16insli r28, r28, 0 }
2339   0x9c, 0xc6, 0x0d, 0xd0,
2340   0x6d, 0x03, 0x00, 0x38, // { add r28, r26, r28 ; shl16insli r27, r27, 0 }
2341   0x9b, 0xb6, 0xc5, 0xad,
2342   0xff, 0x57, 0xe0, 0x8c, // { add r27, r26, r27 ; info 10 ; ld4s r28, r28 }
2343   0xdd, 0x0f, 0x00, 0x70,
2344   0x80, 0x73, 0x6a, 0x28, // { shl16insli r29, zero, 0 ; jr r28 }
2345 };
2346
2347 template<>
2348 const unsigned char
2349 Output_data_plt_tilegx<64, true>::plt_entry[plt_entry_size] =
2350 {
2351   0xdc, 0x0f, 0x00, 0x10,
2352   0x0d, 0xf0, 0x6a, 0x28, // { moveli r28, 0 ; lnk r26 }
2353   0xdb, 0x0f, 0x00, 0x10,
2354   0x8e, 0x03, 0x00, 0x38, // { moveli r27, 0 ; shl16insli r28, r28, 0 }
2355   0x9c, 0xc6, 0x0d, 0xd0,
2356   0x6d, 0x03, 0x00, 0x38, // { add r28, r26, r28 ; shl16insli r27, r27, 0 }
2357   0x9b, 0xb6, 0xc5, 0xad,
2358   0xff, 0x57, 0xe0, 0x8e, // { add r27, r26, r27 ; info 10 ; ld r28, r28 }
2359   0xdd, 0x0f, 0x00, 0x70,
2360   0x80, 0x73, 0x6a, 0x28, // { shl16insli r29, zero, 0 ; jr r28 }
2361
2362 };
2363
2364 template<>
2365 const unsigned char
2366 Output_data_plt_tilegx<32, true>::plt_entry[plt_entry_size] =
2367 {
2368   0xdc, 0x0f, 0x00, 0x10,
2369   0x0d, 0xf0, 0x6a, 0x28, // { moveli r28, 0 ; lnk r26 }
2370   0xdb, 0x0f, 0x00, 0x10,
2371   0x8e, 0x03, 0x00, 0x38, // { moveli r27, 0 ; shl16insli r28, r28, 0 }
2372   0x9c, 0xc6, 0x0d, 0xd0,
2373   0x6d, 0x03, 0x00, 0x38, // { add r28, r26, r28 ; shl16insli r27, r27, 0 }
2374   0x9b, 0xb6, 0xc5, 0xad,
2375   0xff, 0x57, 0xe0, 0x8c, // { add r27, r26, r27 ; info 10 ; ld4s r28, r28 }
2376   0xdd, 0x0f, 0x00, 0x70,
2377   0x80, 0x73, 0x6a, 0x28, // { shl16insli r29, zero, 0 ; jr r28 }
2378 };
2379
2380 template<int size, bool big_endian>
2381 void
2382 Output_data_plt_tilegx<size, big_endian>::fill_plt_entry(
2383                  unsigned char* pov,
2384                  typename elfcpp::Elf_types<size>::Elf_Addr gotplt_base,
2385                  unsigned int got_offset,
2386                  typename elfcpp::Elf_types<size>::Elf_Addr plt_base,
2387                  unsigned int plt_offset, unsigned int plt_index)
2388 {
2389
2390   const uint32_t TILEGX_IMM16_MASK = 0xFFFF;
2391   const uint32_t TILEGX_X0_IMM16_BITOFF = 12;
2392   const uint32_t TILEGX_X1_IMM16_BITOFF = 43;
2393
2394   typedef typename elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::Valtype
2395     Valtype;
2396   memcpy(pov, plt_entry, plt_entry_size);
2397
2398   // first bundle in plt stub - x0
2399   Valtype* wv = reinterpret_cast<Valtype*>(pov);
2400   Valtype val = elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::readval(wv);
2401   Valtype reloc =
2402     ((gotplt_base + got_offset) - (plt_base + plt_offset + 8)) >> 16;
2403   elfcpp::Elf_Xword dst_mask =
2404     (elfcpp::Elf_Xword)(TILEGX_IMM16_MASK) << TILEGX_X0_IMM16_BITOFF;
2405   val &= ~dst_mask;
2406   reloc &= TILEGX_IMM16_MASK;
2407   elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::writeval(wv,
2408     val | (reloc<<TILEGX_X0_IMM16_BITOFF));
2409
2410   // second bundle in plt stub - x1
2411   wv = reinterpret_cast<Valtype*>(pov + 8);
2412   val = elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::readval(wv);
2413   reloc = (gotplt_base + got_offset) - (plt_base + plt_offset + 8);
2414   dst_mask = (elfcpp::Elf_Xword)(TILEGX_IMM16_MASK) << TILEGX_X1_IMM16_BITOFF;
2415   val &= ~dst_mask;
2416   reloc &= TILEGX_IMM16_MASK;
2417   elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::writeval(wv,
2418     val | (reloc<<TILEGX_X1_IMM16_BITOFF));
2419
2420   // second bundle in plt stub - x0
2421   wv = reinterpret_cast<Valtype*>(pov + 8);
2422   val = elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::readval(wv);
2423   reloc = (gotplt_base - (plt_base + plt_offset + 8)) >> 16;
2424   dst_mask = (elfcpp::Elf_Xword)(TILEGX_IMM16_MASK) << TILEGX_X0_IMM16_BITOFF;
2425   val &= ~dst_mask;
2426   reloc &= TILEGX_IMM16_MASK;
2427   elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::writeval(wv,
2428     val | (reloc<<TILEGX_X0_IMM16_BITOFF));
2429
2430   // third bundle in plt stub - x1
2431   wv = reinterpret_cast<Valtype*>(pov + 16);
2432   val = elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::readval(wv);
2433   reloc = gotplt_base - (plt_base + plt_offset + 8);
2434   dst_mask = (elfcpp::Elf_Xword)(TILEGX_IMM16_MASK) << TILEGX_X1_IMM16_BITOFF;
2435   val &= ~dst_mask;
2436   reloc &= TILEGX_IMM16_MASK;
2437   elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::writeval(wv,
2438     val | (reloc<<TILEGX_X1_IMM16_BITOFF));
2439
2440   // fifth bundle in plt stub - carry plt_index x0
2441   wv = reinterpret_cast<Valtype*>(pov + 32);
2442   val = elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::readval(wv);
2443   dst_mask = (elfcpp::Elf_Xword)(TILEGX_IMM16_MASK) << TILEGX_X0_IMM16_BITOFF;
2444   val &= ~dst_mask;
2445   plt_index &= TILEGX_IMM16_MASK;
2446   elfcpp::Swap<TILEGX_INST_BUNDLE_SIZE, big_endian>::writeval(wv,
2447     val | (plt_index<<TILEGX_X0_IMM16_BITOFF));
2448
2449 }
2450
2451 // Write out the PLT.  This uses the hand-coded instructions above.
2452
2453 template<int size, bool big_endian>
2454 void
2455 Output_data_plt_tilegx<size, big_endian>::do_write(Output_file* of)
2456 {
2457   const off_t offset = this->offset();
2458   const section_size_type oview_size =
2459     convert_to_section_size_type(this->data_size());
2460   unsigned char* const oview = of->get_output_view(offset, oview_size);
2461
2462   const off_t got_file_offset = this->got_plt_->offset();
2463   gold_assert(parameters->incremental_update()
2464               || (got_file_offset + this->got_plt_->data_size()
2465                   == this->got_irelative_->offset()));
2466   const section_size_type got_size =
2467     convert_to_section_size_type(this->got_plt_->data_size()
2468                                  + this->got_irelative_->data_size());
2469   unsigned char* const got_view = of->get_output_view(got_file_offset,
2470                                                       got_size);
2471
2472   unsigned char* pov = oview;
2473
2474   // The base address of the .plt section.
2475   typename elfcpp::Elf_types<size>::Elf_Addr plt_address = this->address();
2476   typename elfcpp::Elf_types<size>::Elf_Addr got_address =
2477     this->got_plt_->address();
2478
2479   this->fill_first_plt_entry(pov);
2480   pov += this->get_plt_entry_size();
2481
2482   unsigned char* got_pov = got_view;
2483
2484   // first entry of .got.plt are set to -1
2485   // second entry of .got.plt are set to 0
2486   memset(got_pov, 0xff, size / 8);
2487   got_pov += size / 8;
2488   memset(got_pov, 0x0, size / 8);
2489   got_pov += size / 8;
2490
2491   unsigned int plt_offset = this->get_plt_entry_size();
2492   const unsigned int count = this->count_ + this->irelative_count_;
2493   unsigned int got_offset = (size / 8) * TILEGX_GOTPLT_RESERVE_COUNT;
2494   for (unsigned int plt_index = 0;
2495        plt_index < count;
2496        ++plt_index,
2497          pov += this->get_plt_entry_size(),
2498          got_pov += size / 8,
2499          plt_offset += this->get_plt_entry_size(),
2500          got_offset += size / 8)
2501     {
2502       // Set and adjust the PLT entry itself.
2503       this->fill_plt_entry(pov, got_address, got_offset,
2504                            plt_address, plt_offset, plt_index);
2505
2506       // Initialize entry in .got.plt to plt start address
2507       elfcpp::Swap<size, big_endian>::writeval(got_pov, plt_address);
2508     }
2509
2510   gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
2511   gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
2512
2513   of->write_output_view(offset, oview_size, oview);
2514   of->write_output_view(got_file_offset, got_size, got_view);
2515 }
2516
2517 // Create the PLT section.
2518
2519 template<int size, bool big_endian>
2520 void
2521 Target_tilegx<size, big_endian>::make_plt_section(Symbol_table* symtab,
2522                                                   Layout* layout)
2523 {
2524   if (this->plt_ == NULL)
2525     {
2526       // Create the GOT sections first.
2527       this->got_section(symtab, layout);
2528
2529       // Ensure that .rela.dyn always appears before .rela.plt,
2530       // becuase on TILE-Gx, .rela.dyn needs to include .rela.plt
2531       // in it's range.
2532       this->rela_dyn_section(layout);
2533
2534       this->plt_ = new Output_data_plt_tilegx<size, big_endian>(layout,
2535         TILEGX_INST_BUNDLE_SIZE, this->got_, this->got_plt_,
2536         this->got_irelative_);
2537
2538       layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
2539                                       (elfcpp::SHF_ALLOC
2540                                        | elfcpp::SHF_EXECINSTR),
2541                                       this->plt_, ORDER_NON_RELRO_FIRST,
2542                                       false);
2543
2544       // Make the sh_info field of .rela.plt point to .plt.
2545       Output_section* rela_plt_os = this->plt_->rela_plt()->output_section();
2546       rela_plt_os->set_info_section(this->plt_->output_section());
2547     }
2548 }
2549
2550 // Create a PLT entry for a global symbol.
2551
2552 template<int size, bool big_endian>
2553 void
2554 Target_tilegx<size, big_endian>::make_plt_entry(Symbol_table* symtab,
2555                                                 Layout* layout, Symbol* gsym)
2556 {
2557   if (gsym->has_plt_offset())
2558     return;
2559
2560   if (this->plt_ == NULL)
2561     this->make_plt_section(symtab, layout);
2562
2563   this->plt_->add_entry(symtab, layout, gsym);
2564 }
2565
2566 // Make a PLT entry for a local STT_GNU_IFUNC symbol.
2567
2568 template<int size, bool big_endian>
2569 void
2570 Target_tilegx<size, big_endian>::make_local_ifunc_plt_entry(
2571     Symbol_table* symtab, Layout* layout,
2572     Sized_relobj_file<size, big_endian>* relobj,
2573     unsigned int local_sym_index)
2574 {
2575   if (relobj->local_has_plt_offset(local_sym_index))
2576     return;
2577   if (this->plt_ == NULL)
2578     this->make_plt_section(symtab, layout);
2579   unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout,
2580                                                               relobj,
2581                                                               local_sym_index);
2582   relobj->set_local_plt_offset(local_sym_index, plt_offset);
2583 }
2584
2585 // Return the number of entries in the PLT.
2586
2587 template<int size, bool big_endian>
2588 unsigned int
2589 Target_tilegx<size, big_endian>::plt_entry_count() const
2590 {
2591   if (this->plt_ == NULL)
2592     return 0;
2593   return this->plt_->entry_count();
2594 }
2595
2596 // Return the offset of the first non-reserved PLT entry.
2597
2598 template<int size, bool big_endian>
2599 unsigned int
2600 Target_tilegx<size, big_endian>::first_plt_entry_offset() const
2601 {
2602   return this->plt_->first_plt_entry_offset();
2603 }
2604
2605 // Return the size of each PLT entry.
2606
2607 template<int size, bool big_endian>
2608 unsigned int
2609 Target_tilegx<size, big_endian>::plt_entry_size() const
2610 {
2611   return this->plt_->get_plt_entry_size();
2612 }
2613
2614 // Create the GOT and PLT sections for an incremental update.
2615
2616 template<int size, bool big_endian>
2617 Output_data_got_base*
2618 Target_tilegx<size, big_endian>::init_got_plt_for_update(Symbol_table* symtab,
2619                                        Layout* layout,
2620                                        unsigned int got_count,
2621                                        unsigned int plt_count)
2622 {
2623   gold_assert(this->got_ == NULL);
2624
2625   this->got_ =
2626     new Output_data_got<size, big_endian>((got_count
2627                                            + TILEGX_GOT_RESERVE_COUNT)
2628                                           * (size / 8));
2629   layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
2630                                   (elfcpp::SHF_ALLOC
2631                                    | elfcpp::SHF_WRITE),
2632                                   this->got_, ORDER_RELRO_LAST,
2633                                   true);
2634
2635   // Define _GLOBAL_OFFSET_TABLE_ at the start of the GOT.
2636   this->global_offset_table_ =
2637     symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
2638                                   Symbol_table::PREDEFINED,
2639                                   this->got_,
2640                                   0, 0, elfcpp::STT_OBJECT,
2641                                   elfcpp::STB_LOCAL,
2642                                   elfcpp::STV_HIDDEN, 0,
2643                                   false, false);
2644
2645   if (parameters->options().shared()) {
2646     this->tilegx_dynamic_ =
2647             symtab->define_in_output_data("_TILEGX_DYNAMIC_", NULL,
2648                             Symbol_table::PREDEFINED,
2649                             layout->dynamic_section(),
2650                             0, 0, elfcpp::STT_OBJECT,
2651                             elfcpp::STB_LOCAL,
2652                             elfcpp::STV_HIDDEN, 0,
2653                             false, false);
2654
2655     this->got_->add_global(this->tilegx_dynamic_, GOT_TYPE_STANDARD);
2656   } else
2657     this->got_->set_current_data_size(size / 8);
2658
2659   // Add the two reserved entries.
2660   this->got_plt_
2661      = new Output_data_space((plt_count + TILEGX_GOTPLT_RESERVE_COUNT)
2662                               * (size / 8), size / 8, "** GOT PLT");
2663   layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
2664                                   (elfcpp::SHF_ALLOC
2665                                    | elfcpp::SHF_WRITE),
2666                                   this->got_plt_, ORDER_NON_RELRO_FIRST,
2667                                   false);
2668
2669   // If there are any IRELATIVE relocations, they get GOT entries in
2670   // .got.plt after the jump slot.
2671   this->got_irelative_
2672      = new Output_data_space(0, size / 8, "** GOT IRELATIVE PLT");
2673   layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
2674                                   elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE,
2675                                   this->got_irelative_,
2676                                   ORDER_NON_RELRO_FIRST, false);
2677
2678   // Create the PLT section.
2679   this->plt_ = new Output_data_plt_tilegx<size, big_endian>(layout,
2680     this->plt_entry_size(), this->got_, this->got_plt_, this->got_irelative_,
2681     plt_count);
2682
2683   layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
2684                                   elfcpp::SHF_ALLOC | elfcpp::SHF_EXECINSTR,
2685                                   this->plt_, ORDER_PLT, false);
2686
2687   // Make the sh_info field of .rela.plt point to .plt.
2688   Output_section* rela_plt_os = this->plt_->rela_plt()->output_section();
2689   rela_plt_os->set_info_section(this->plt_->output_section());
2690
2691   // Create the rela_dyn section.
2692   this->rela_dyn_section(layout);
2693
2694   return this->got_;
2695 }
2696
2697 // Reserve a GOT entry for a local symbol, and regenerate any
2698 // necessary dynamic relocations.
2699
2700 template<int size, bool big_endian>
2701 void
2702 Target_tilegx<size, big_endian>::reserve_local_got_entry(
2703     unsigned int got_index,
2704     Sized_relobj<size, big_endian>* obj,
2705     unsigned int r_sym,
2706     unsigned int got_type)
2707 {
2708   unsigned int got_offset = (got_index + TILEGX_GOT_RESERVE_COUNT)
2709                             * (size / 8);
2710   Reloc_section* rela_dyn = this->rela_dyn_section(NULL);
2711
2712   this->got_->reserve_local(got_index, obj, r_sym, got_type);
2713   switch (got_type)
2714     {
2715     case GOT_TYPE_STANDARD:
2716       if (parameters->options().output_is_position_independent())
2717         rela_dyn->add_local_relative(obj, r_sym, elfcpp::R_TILEGX_RELATIVE,
2718                                      this->got_, got_offset, 0, false);
2719       break;
2720     case GOT_TYPE_TLS_OFFSET:
2721       rela_dyn->add_local(obj, r_sym,
2722                           size == 32 ? elfcpp::R_TILEGX_TLS_DTPOFF32
2723                                        : elfcpp::R_TILEGX_TLS_DTPOFF64,
2724                           this->got_, got_offset, 0);
2725       break;
2726     case GOT_TYPE_TLS_PAIR:
2727       this->got_->reserve_slot(got_index + 1);
2728       rela_dyn->add_local(obj, r_sym,
2729                           size == 32 ? elfcpp::R_TILEGX_TLS_DTPMOD32
2730                                        : elfcpp::R_TILEGX_TLS_DTPMOD64,
2731                           this->got_, got_offset, 0);
2732       break;
2733     case GOT_TYPE_TLS_DESC:
2734       gold_fatal(_("TLS_DESC not yet supported for incremental linking"));
2735       break;
2736     default:
2737       gold_unreachable();
2738     }
2739 }
2740
2741 // Reserve a GOT entry for a global symbol, and regenerate any
2742 // necessary dynamic relocations.
2743
2744 template<int size, bool big_endian>
2745 void
2746 Target_tilegx<size, big_endian>::reserve_global_got_entry(
2747   unsigned int got_index, Symbol* gsym, unsigned int got_type)
2748 {
2749   unsigned int got_offset = (got_index + TILEGX_GOT_RESERVE_COUNT)
2750                             * (size / 8);
2751   Reloc_section* rela_dyn = this->rela_dyn_section(NULL);
2752
2753   this->got_->reserve_global(got_index, gsym, got_type);
2754   switch (got_type)
2755     {
2756     case GOT_TYPE_STANDARD:
2757       if (!gsym->final_value_is_known())
2758         {
2759           if (gsym->is_from_dynobj()
2760               || gsym->is_undefined()
2761               || gsym->is_preemptible()
2762               || gsym->type() == elfcpp::STT_GNU_IFUNC)
2763             rela_dyn->add_global(gsym, elfcpp::R_TILEGX_GLOB_DAT,
2764                                  this->got_, got_offset, 0);
2765           else
2766             rela_dyn->add_global_relative(gsym, elfcpp::R_TILEGX_RELATIVE,
2767                                           this->got_, got_offset, 0, false);
2768         }
2769       break;
2770     case GOT_TYPE_TLS_OFFSET:
2771       rela_dyn->add_global_relative(gsym,
2772                                     size == 32 ? elfcpp::R_TILEGX_TLS_TPOFF32
2773                                                : elfcpp::R_TILEGX_TLS_TPOFF64,
2774                                     this->got_, got_offset, 0, false);
2775       break;
2776     case GOT_TYPE_TLS_PAIR:
2777       this->got_->reserve_slot(got_index + 1);
2778       rela_dyn->add_global_relative(gsym,
2779                                     size == 32 ? elfcpp::R_TILEGX_TLS_DTPMOD32
2780                                                : elfcpp::R_TILEGX_TLS_DTPMOD64,
2781                                     this->got_, got_offset, 0, false);
2782       rela_dyn->add_global_relative(gsym,
2783                                     size == 32 ? elfcpp::R_TILEGX_TLS_DTPOFF32
2784                                                : elfcpp::R_TILEGX_TLS_DTPOFF64,
2785                                     this->got_, got_offset + size / 8,
2786                                     0, false);
2787       break;
2788     case GOT_TYPE_TLS_DESC:
2789       gold_fatal(_("TLS_DESC not yet supported for TILEGX"));
2790       break;
2791     default:
2792       gold_unreachable();
2793     }
2794 }
2795
2796 // Register an existing PLT entry for a global symbol.
2797
2798 template<int size, bool big_endian>
2799 void
2800 Target_tilegx<size, big_endian>::register_global_plt_entry(
2801   Symbol_table* symtab, Layout* layout, unsigned int plt_index, Symbol* gsym)
2802 {
2803   gold_assert(this->plt_ != NULL);
2804   gold_assert(!gsym->has_plt_offset());
2805
2806   this->plt_->reserve_slot(plt_index);
2807
2808   gsym->set_plt_offset((plt_index + 1) * this->plt_entry_size());
2809
2810   unsigned int got_offset = (plt_index + 2) * (size / 8);
2811   this->plt_->add_relocation(symtab, layout, gsym, got_offset);
2812 }
2813
2814 // Force a COPY relocation for a given symbol.
2815
2816 template<int size, bool big_endian>
2817 void
2818 Target_tilegx<size, big_endian>::emit_copy_reloc(
2819     Symbol_table* symtab, Symbol* sym, Output_section* os, off_t offset)
2820 {
2821   this->copy_relocs_.emit_copy_reloc(symtab,
2822                                      symtab->get_sized_symbol<size>(sym),
2823                                      os,
2824                                      offset,
2825                                      this->rela_dyn_section(NULL));
2826 }
2827
2828 // Create a GOT entry for the TLS module index.
2829
2830 template<int size, bool big_endian>
2831 unsigned int
2832 Target_tilegx<size, big_endian>::got_mod_index_entry(Symbol_table* symtab,
2833                                   Layout* layout,
2834                                   Sized_relobj_file<size, big_endian>* object)
2835 {
2836   if (this->got_mod_index_offset_ == -1U)
2837     {
2838       gold_assert(symtab != NULL && layout != NULL && object != NULL);
2839       Reloc_section* rela_dyn = this->rela_dyn_section(layout);
2840       Output_data_got<size, big_endian>* got
2841          = this->got_section(symtab, layout);
2842       unsigned int got_offset = got->add_constant(0);
2843       rela_dyn->add_local(object, 0,
2844                           size == 32 ? elfcpp::R_TILEGX_TLS_DTPMOD32
2845                                        : elfcpp::R_TILEGX_TLS_DTPMOD64, got,
2846                           got_offset, 0);
2847       got->add_constant(0);
2848       this->got_mod_index_offset_ = got_offset;
2849     }
2850   return this->got_mod_index_offset_;
2851 }
2852
2853 // Optimize the TLS relocation type based on what we know about the
2854 // symbol.  IS_FINAL is true if the final address of this symbol is
2855 // known at link time.
2856 //
2857 // the transformation rules is described below:
2858 //
2859 //   compiler GD reference
2860 //    |
2861 //    V
2862 //     moveli      tmp, hw1_last_tls_gd(x)     X0/X1
2863 //     shl16insli  r0,  tmp, hw0_tls_gd(x)     X0/X1
2864 //     addi        r0, got, tls_add(x)         Y0/Y1/X0/X1
2865 //     jal         tls_gd_call(x)              X1
2866 //     addi        adr, r0,  tls_gd_add(x)     Y0/Y1/X0/X1
2867 //
2868 //     linker tranformation of GD insn sequence
2869 //      |
2870 //      V
2871 //      ==> GD:
2872 //       moveli      tmp, hw1_last_tls_gd(x)     X0/X1
2873 //       shl16insli  r0,  tmp, hw0_tls_gd(x)     X0/X1
2874 //       add         r0,  got, r0                Y0/Y1/X0/X1
2875 //       jal         plt(__tls_get_addr)         X1
2876 //       move        adr, r0                     Y0/Y1/X0/X1
2877 //      ==> IE:
2878 //       moveli      tmp, hw1_last_tls_ie(x)     X0/X1
2879 //       shl16insli  r0,  tmp, hw0_tls_ie(x)     X0/X1
2880 //       add         r0,  got, r0                Y0/Y1/X0/X1
2881 //       ld          r0,  r0                     X1
2882 //       add         adr, r0, tp                 Y0/Y1/X0/X1
2883 //      ==> LE:
2884 //       moveli      tmp, hw1_last_tls_le(x)     X0/X1
2885 //       shl16insli  r0,  tmp, hw0_tls_le(x)     X0/X1
2886 //       move        r0,  r0                     Y0/Y1/X0/X1
2887 //       move        r0,  r0                     Y0/Y1/X0/X1
2888 //       add         adr, r0, tp                 Y0/Y1/X0/X1
2889 //
2890 //
2891 //   compiler IE reference
2892 //    |
2893 //    V
2894 //     moveli      tmp, hw1_last_tls_ie(x)     X0/X1
2895 //     shl16insli  tmp, tmp, hw0_tls_ie(x)     X0/X1
2896 //     addi        tmp, got, tls_add(x)        Y0/Y1/X0/X1
2897 //     ld_tls      tmp, tmp, tls_ie_load(x)    X1
2898 //     add         adr, tmp, tp                Y0/Y1/X0/X1
2899 //
2900 //     linker transformation for IE insn sequence
2901 //      |
2902 //      V
2903 //      ==> IE:
2904 //       moveli      tmp, hw1_last_tls_ie(x)     X0/X1
2905 //       shl16insli  tmp, tmp, hw0_tls_ie(x)     X0/X1
2906 //       add         tmp, got, tmp               Y0/Y1/X0/X1
2907 //       ld          tmp, tmp                    X1
2908 //       add         adr, tmp, tp                Y0/Y1/X0/X1
2909 //      ==> LE:
2910 //       moveli      tmp, hw1_last_tls_le(x)     X0/X1
2911 //       shl16insli  tmp, tmp, hw0_tls_le(x)     X0/X1
2912 //       move        tmp, tmp                    Y0/Y1/X0/X1
2913 //       move        tmp, tmp                    Y0/Y1/X0/X1
2914 //
2915 //
2916 //   compiler LE reference
2917 //    |
2918 //    V
2919 //     moveli        tmp, hw1_last_tls_le(x)     X0/X1
2920 //     shl16insli    tmp, tmp, hw0_tls_le(x)     X0/X1
2921 //     add           adr, tmp, tp                Y0/Y1/X0/X1
2922
2923 template<int size, bool big_endian>
2924 tls::Tls_optimization
2925 Target_tilegx<size, big_endian>::optimize_tls_reloc(bool is_final, int r_type)
2926 {
2927   // If we are generating a shared library, then we can't do anything
2928   // in the linker.
2929   if (parameters->options().shared())
2930     return tls::TLSOPT_NONE;
2931
2932   switch (r_type)
2933     {
2934     // unique GD relocations
2935     case elfcpp::R_TILEGX_TLS_GD_CALL:
2936     case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
2937     case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
2938     case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
2939     case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
2940     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
2941     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
2942     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
2943     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
2944     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
2945     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
2946       // These are General-Dynamic which permits fully general TLS
2947       // access.  Since we know that we are generating an executable,
2948       // we can convert this to Initial-Exec.  If we also know that
2949       // this is a local symbol, we can further switch to Local-Exec.
2950       if (is_final)
2951         return tls::TLSOPT_TO_LE;
2952       return tls::TLSOPT_TO_IE;
2953
2954     // unique IE relocations
2955     case elfcpp::R_TILEGX_TLS_IE_LOAD:
2956     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
2957     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
2958     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
2959     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
2960     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
2961     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
2962       // These are Initial-Exec relocs which get the thread offset
2963       // from the GOT.  If we know that we are linking against the
2964       // local symbol, we can switch to Local-Exec, which links the
2965       // thread offset into the instruction.
2966       if (is_final)
2967         return tls::TLSOPT_TO_LE;
2968       return tls::TLSOPT_NONE;
2969
2970     // could be created for both GD and IE
2971     // but they are expanded into the same
2972     // instruction in GD and IE.
2973     case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
2974     case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
2975     case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
2976     case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
2977       if (is_final)
2978         return tls::TLSOPT_TO_LE;
2979       return tls::TLSOPT_NONE;
2980
2981     // unique LE relocations
2982     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
2983     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
2984     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
2985     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
2986     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
2987     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
2988       // When we already have Local-Exec, there is nothing further we
2989       // can do.
2990       return tls::TLSOPT_NONE;
2991
2992     default:
2993       gold_unreachable();
2994     }
2995 }
2996
2997 // Get the Reference_flags for a particular relocation.
2998
2999 template<int size, bool big_endian>
3000 int
3001 Target_tilegx<size, big_endian>::Scan::get_reference_flags(unsigned int r_type)
3002 {
3003   switch (r_type)
3004     {
3005     case elfcpp::R_TILEGX_NONE:
3006     case elfcpp::R_TILEGX_GNU_VTINHERIT:
3007     case elfcpp::R_TILEGX_GNU_VTENTRY:
3008       // No symbol reference.
3009       return 0;
3010
3011     case elfcpp::R_TILEGX_64:
3012     case elfcpp::R_TILEGX_32:
3013     case elfcpp::R_TILEGX_16:
3014     case elfcpp::R_TILEGX_8:
3015       return Symbol::ABSOLUTE_REF;
3016
3017     case elfcpp::R_TILEGX_BROFF_X1:
3018     case elfcpp::R_TILEGX_64_PCREL:
3019     case elfcpp::R_TILEGX_32_PCREL:
3020     case elfcpp::R_TILEGX_16_PCREL:
3021     case elfcpp::R_TILEGX_8_PCREL:
3022     case elfcpp::R_TILEGX_IMM16_X0_HW0_PCREL:
3023     case elfcpp::R_TILEGX_IMM16_X1_HW0_PCREL:
3024     case elfcpp::R_TILEGX_IMM16_X0_HW1_PCREL:
3025     case elfcpp::R_TILEGX_IMM16_X1_HW1_PCREL:
3026     case elfcpp::R_TILEGX_IMM16_X0_HW2_PCREL:
3027     case elfcpp::R_TILEGX_IMM16_X1_HW2_PCREL:
3028     case elfcpp::R_TILEGX_IMM16_X0_HW3_PCREL:
3029     case elfcpp::R_TILEGX_IMM16_X1_HW3_PCREL:
3030     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
3031     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
3032     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
3033     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
3034     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
3035     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
3036       return Symbol::RELATIVE_REF;
3037
3038     case elfcpp::R_TILEGX_JUMPOFF_X1:
3039     case elfcpp::R_TILEGX_JUMPOFF_X1_PLT:
3040     case elfcpp::R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
3041     case elfcpp::R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
3042     case elfcpp::R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
3043     case elfcpp::R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
3044     case elfcpp::R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
3045     case elfcpp::R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
3046     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
3047     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
3048     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
3049     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
3050     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
3051     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
3052       return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
3053
3054     case elfcpp::R_TILEGX_IMM16_X0_HW0:
3055     case elfcpp::R_TILEGX_IMM16_X1_HW0:
3056     case elfcpp::R_TILEGX_IMM16_X0_HW1:
3057     case elfcpp::R_TILEGX_IMM16_X1_HW1:
3058     case elfcpp::R_TILEGX_IMM16_X0_HW2:
3059     case elfcpp::R_TILEGX_IMM16_X1_HW2:
3060     case elfcpp::R_TILEGX_IMM16_X0_HW3:
3061     case elfcpp::R_TILEGX_IMM16_X1_HW3:
3062     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST:
3063     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST:
3064     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST:
3065     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST:
3066     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST:
3067     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST:
3068       return Symbol::ABSOLUTE_REF;
3069
3070     case elfcpp::R_TILEGX_IMM16_X0_HW0_GOT:
3071     case elfcpp::R_TILEGX_IMM16_X1_HW0_GOT:
3072     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_GOT:
3073     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_GOT:
3074     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_GOT:
3075     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_GOT:
3076       // Absolute in GOT.
3077       return Symbol::ABSOLUTE_REF;
3078
3079     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
3080     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
3081     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
3082     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
3083     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
3084     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
3085     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
3086     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
3087     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
3088     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
3089     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
3090     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
3091     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
3092     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
3093     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
3094     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
3095     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
3096     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
3097     case elfcpp::R_TILEGX_TLS_DTPOFF64:
3098     case elfcpp::R_TILEGX_TLS_DTPMOD32:
3099     case elfcpp::R_TILEGX_TLS_DTPOFF32:
3100     case elfcpp::R_TILEGX_TLS_TPOFF32:
3101     case elfcpp::R_TILEGX_TLS_GD_CALL:
3102     case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
3103     case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
3104     case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
3105     case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
3106     case elfcpp::R_TILEGX_TLS_IE_LOAD:
3107     case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
3108     case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
3109     case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
3110     case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
3111       return Symbol::TLS_REF;
3112
3113     case elfcpp::R_TILEGX_COPY:
3114     case elfcpp::R_TILEGX_GLOB_DAT:
3115     case elfcpp::R_TILEGX_JMP_SLOT:
3116     case elfcpp::R_TILEGX_RELATIVE:
3117     case elfcpp::R_TILEGX_TLS_TPOFF64:
3118     case elfcpp::R_TILEGX_TLS_DTPMOD64:
3119     default:
3120       // Not expected.  We will give an error later.
3121       return 0;
3122     }
3123 }
3124
3125 // Report an unsupported relocation against a local symbol.
3126
3127 template<int size, bool big_endian>
3128 void
3129 Target_tilegx<size, big_endian>::Scan::unsupported_reloc_local(
3130      Sized_relobj_file<size, big_endian>* object,
3131      unsigned int r_type)
3132 {
3133   gold_error(_("%s: unsupported reloc %u against local symbol"),
3134              object->name().c_str(), r_type);
3135 }
3136
3137 // We are about to emit a dynamic relocation of type R_TYPE.  If the
3138 // dynamic linker does not support it, issue an error.
3139 template<int size, bool big_endian>
3140 void
3141 Target_tilegx<size, big_endian>::Scan::check_non_pic(Relobj* object,
3142                                                      unsigned int r_type)
3143 {
3144   switch (r_type)
3145     {
3146       // These are the relocation types supported by glibc for tilegx
3147       // which should always work.
3148     case elfcpp::R_TILEGX_RELATIVE:
3149     case elfcpp::R_TILEGX_GLOB_DAT:
3150     case elfcpp::R_TILEGX_JMP_SLOT:
3151     case elfcpp::R_TILEGX_TLS_DTPMOD64:
3152     case elfcpp::R_TILEGX_TLS_DTPOFF64:
3153     case elfcpp::R_TILEGX_TLS_TPOFF64:
3154     case elfcpp::R_TILEGX_8:
3155     case elfcpp::R_TILEGX_16:
3156     case elfcpp::R_TILEGX_32:
3157     case elfcpp::R_TILEGX_64:
3158     case elfcpp::R_TILEGX_COPY:
3159     case elfcpp::R_TILEGX_IMM16_X0_HW0:
3160     case elfcpp::R_TILEGX_IMM16_X1_HW0:
3161     case elfcpp::R_TILEGX_IMM16_X0_HW1:
3162     case elfcpp::R_TILEGX_IMM16_X1_HW1:
3163     case elfcpp::R_TILEGX_IMM16_X0_HW2:
3164     case elfcpp::R_TILEGX_IMM16_X1_HW2:
3165     case elfcpp::R_TILEGX_IMM16_X0_HW3:
3166     case elfcpp::R_TILEGX_IMM16_X1_HW3:
3167     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST:
3168     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST:
3169     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST:
3170     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST:
3171     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST:
3172     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST:
3173     case elfcpp::R_TILEGX_BROFF_X1:
3174     case elfcpp::R_TILEGX_JUMPOFF_X1:
3175     case elfcpp::R_TILEGX_IMM16_X0_HW0_PCREL:
3176     case elfcpp::R_TILEGX_IMM16_X1_HW0_PCREL:
3177     case elfcpp::R_TILEGX_IMM16_X0_HW1_PCREL:
3178     case elfcpp::R_TILEGX_IMM16_X1_HW1_PCREL:
3179     case elfcpp::R_TILEGX_IMM16_X0_HW2_PCREL:
3180     case elfcpp::R_TILEGX_IMM16_X1_HW2_PCREL:
3181     case elfcpp::R_TILEGX_IMM16_X0_HW3_PCREL:
3182     case elfcpp::R_TILEGX_IMM16_X1_HW3_PCREL:
3183     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
3184     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
3185     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
3186     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
3187     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
3188     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
3189       return;
3190
3191     default:
3192       // This prevents us from issuing more than one error per reloc
3193       // section.  But we can still wind up issuing more than one
3194       // error per object file.
3195       if (this->issued_non_pic_error_)
3196         return;
3197       gold_assert(parameters->options().output_is_position_independent());
3198       object->error(_("requires unsupported dynamic reloc %u; "
3199                       "recompile with -fPIC"),
3200                     r_type);
3201       this->issued_non_pic_error_ = true;
3202       return;
3203
3204     case elfcpp::R_TILEGX_NONE:
3205       gold_unreachable();
3206     }
3207 }
3208
3209 // Return whether we need to make a PLT entry for a relocation of the
3210 // given type against a STT_GNU_IFUNC symbol.
3211
3212 template<int size, bool big_endian>
3213 bool
3214 Target_tilegx<size, big_endian>::Scan::reloc_needs_plt_for_ifunc(
3215      Sized_relobj_file<size, big_endian>* object, unsigned int r_type)
3216 {
3217   int flags = Scan::get_reference_flags(r_type);
3218   if (flags & Symbol::TLS_REF)
3219     gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"),
3220                object->name().c_str(), r_type);
3221   return flags != 0;
3222 }
3223
3224 // Scan a relocation for a local symbol.
3225
3226 template<int size, bool big_endian>
3227 inline void
3228 Target_tilegx<size, big_endian>::Scan::local(Symbol_table* symtab,
3229                                  Layout* layout,
3230                                  Target_tilegx<size, big_endian>* target,
3231                                  Sized_relobj_file<size, big_endian>* object,
3232                                  unsigned int data_shndx,
3233                                  Output_section* output_section,
3234                                  const elfcpp::Rela<size, big_endian>& reloc,
3235                                  unsigned int r_type,
3236                                  const elfcpp::Sym<size, big_endian>& lsym,
3237                                  bool is_discarded)
3238 {
3239   if (is_discarded)
3240     return;
3241
3242   // A local STT_GNU_IFUNC symbol may require a PLT entry.
3243   bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
3244   if (is_ifunc && this->reloc_needs_plt_for_ifunc(object, r_type))
3245     {
3246       unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3247       target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
3248     }
3249
3250   switch (r_type)
3251     {
3252     case elfcpp::R_TILEGX_NONE:
3253     case elfcpp::R_TILEGX_GNU_VTINHERIT:
3254     case elfcpp::R_TILEGX_GNU_VTENTRY:
3255       break;
3256
3257     // If building a shared library (or a position-independent
3258     // executable), because the runtime address needs plus
3259     // the module base address, so generate a R_TILEGX_RELATIVE.
3260     case elfcpp::R_TILEGX_32:
3261     case elfcpp::R_TILEGX_64:
3262       if (parameters->options().output_is_position_independent())
3263         {
3264           unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3265           Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3266           rela_dyn->add_local_relative(object, r_sym,
3267                                        elfcpp::R_TILEGX_RELATIVE,
3268                                        output_section, data_shndx,
3269                                        reloc.get_r_offset(),
3270                                        reloc.get_r_addend(), is_ifunc);
3271         }
3272       break;
3273
3274     // If building a shared library (or a position-independent
3275     // executable), we need to create a dynamic relocation for this
3276     // location.
3277     case elfcpp::R_TILEGX_8:
3278     case elfcpp::R_TILEGX_16:
3279     case elfcpp::R_TILEGX_IMM16_X0_HW0:
3280     case elfcpp::R_TILEGX_IMM16_X1_HW0:
3281     case elfcpp::R_TILEGX_IMM16_X0_HW1:
3282     case elfcpp::R_TILEGX_IMM16_X1_HW1:
3283     case elfcpp::R_TILEGX_IMM16_X0_HW2:
3284     case elfcpp::R_TILEGX_IMM16_X1_HW2:
3285     case elfcpp::R_TILEGX_IMM16_X0_HW3:
3286     case elfcpp::R_TILEGX_IMM16_X1_HW3:
3287     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST:
3288     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST:
3289     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST:
3290     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST:
3291     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST:
3292     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST:
3293       if (parameters->options().output_is_position_independent())
3294         {
3295           this->check_non_pic(object, r_type);
3296
3297           Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3298           unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3299           if (lsym.get_st_type() != elfcpp::STT_SECTION)
3300             rela_dyn->add_local(object, r_sym, r_type, output_section,
3301                                 data_shndx, reloc.get_r_offset(),
3302                                 reloc.get_r_addend());
3303           else
3304             {
3305               gold_assert(lsym.get_st_value() == 0);
3306               rela_dyn->add_symbolless_local_addend(object, r_sym, r_type,
3307                                                     output_section,
3308                                                     data_shndx,
3309                                                     reloc.get_r_offset(),
3310                                                     reloc.get_r_addend());
3311
3312             }
3313         }
3314       break;
3315
3316     // R_TILEGX_JUMPOFF_X1_PLT against local symbol
3317     // may happen for ifunc case.
3318     case elfcpp::R_TILEGX_JUMPOFF_X1_PLT:
3319     case elfcpp::R_TILEGX_JUMPOFF_X1:
3320     case elfcpp::R_TILEGX_64_PCREL:
3321     case elfcpp::R_TILEGX_32_PCREL:
3322     case elfcpp::R_TILEGX_16_PCREL:
3323     case elfcpp::R_TILEGX_8_PCREL:
3324     case elfcpp::R_TILEGX_BROFF_X1:
3325     case elfcpp::R_TILEGX_IMM16_X0_HW0_PCREL:
3326     case elfcpp::R_TILEGX_IMM16_X1_HW0_PCREL:
3327     case elfcpp::R_TILEGX_IMM16_X0_HW1_PCREL:
3328     case elfcpp::R_TILEGX_IMM16_X1_HW1_PCREL:
3329     case elfcpp::R_TILEGX_IMM16_X0_HW2_PCREL:
3330     case elfcpp::R_TILEGX_IMM16_X1_HW2_PCREL:
3331     case elfcpp::R_TILEGX_IMM16_X0_HW3_PCREL:
3332     case elfcpp::R_TILEGX_IMM16_X1_HW3_PCREL:
3333     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
3334     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
3335     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
3336     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
3337     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
3338     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
3339     case elfcpp::R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
3340     case elfcpp::R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
3341     case elfcpp::R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
3342     case elfcpp::R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
3343     case elfcpp::R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
3344     case elfcpp::R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
3345     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
3346     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
3347     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
3348     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
3349     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
3350     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
3351       break;
3352
3353     case elfcpp::R_TILEGX_IMM16_X0_HW0_GOT:
3354     case elfcpp::R_TILEGX_IMM16_X1_HW0_GOT:
3355     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_GOT:
3356     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_GOT:
3357     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_GOT:
3358     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_GOT:
3359       {
3360         // The symbol requires a GOT entry.
3361         Output_data_got<size, big_endian>* got
3362            = target->got_section(symtab, layout);
3363         unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3364
3365         // For a STT_GNU_IFUNC symbol we want the PLT offset.  That
3366         // lets function pointers compare correctly with shared
3367         // libraries.  Otherwise we would need an IRELATIVE reloc.
3368         bool is_new;
3369         if (is_ifunc)
3370           is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD);
3371         else
3372           is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD);
3373         if (is_new)
3374           {
3375             // tilegx dynamic linker will not update local got entry,
3376             // so, if we are generating a shared object, we need to add a
3377             // dynamic relocation for this symbol's GOT entry to inform
3378             // dynamic linker plus the load base explictly.
3379             if (parameters->options().output_is_position_independent())
3380               {
3381                unsigned int got_offset
3382                   = object->local_got_offset(r_sym, GOT_TYPE_STANDARD);
3383
3384                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3385                 rela_dyn->add_local_relative(object, r_sym,
3386                                              r_type,
3387                                              got, got_offset, 0, is_ifunc);
3388               }
3389           }
3390       }
3391       break;
3392
3393     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
3394     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
3395     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
3396     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
3397     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
3398     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
3399     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
3400     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
3401     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
3402     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
3403     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
3404     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
3405     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
3406     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
3407     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
3408     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
3409     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
3410     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
3411     case elfcpp::R_TILEGX_TLS_GD_CALL:
3412     case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
3413     case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
3414     case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
3415     case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
3416     case elfcpp::R_TILEGX_TLS_IE_LOAD:
3417     case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
3418     case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
3419     case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
3420     case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
3421       {
3422          bool output_is_shared = parameters->options().shared();
3423          const tls::Tls_optimization opt_t =
3424           Target_tilegx<size, big_endian>::optimize_tls_reloc(
3425             !output_is_shared, r_type);
3426
3427          switch (r_type)
3428            {
3429              case elfcpp::R_TILEGX_TLS_GD_CALL:
3430                // FIXME: predefine __tls_get_addr
3431                //
3432                // R_TILEGX_TLS_GD_CALL implicitly reference __tls_get_addr,
3433                // while all other target, x86/arm/mips/powerpc/sparc
3434                // generate tls relocation against __tls_get_addr explictly,
3435                // so for TILEGX, we need the following hack.
3436                if (opt_t == tls::TLSOPT_NONE) {
3437                  if (!target->tls_get_addr_sym_defined_) {
3438                    Symbol* sym = NULL;
3439                    options::parse_set(NULL, "__tls_get_addr",
3440                                      (gold::options::String_set*)
3441                                      &parameters->options().undefined());
3442                    symtab->add_undefined_symbols_from_command_line(layout);
3443                    target->tls_get_addr_sym_defined_ = true;
3444                    sym = symtab->lookup("__tls_get_addr");
3445                    sym->set_in_reg();
3446                  }
3447                  target->make_plt_entry(symtab, layout,
3448                                         symtab->lookup("__tls_get_addr"));
3449                }
3450                break;
3451
3452              // only make effect when applying relocation
3453              case elfcpp::R_TILEGX_TLS_IE_LOAD:
3454              case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
3455              case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
3456              case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
3457              case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
3458              case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
3459              case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
3460              case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
3461              case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
3462                break;
3463
3464              // GD: requires two GOT entry for module index and offset
3465              // IE: requires one GOT entry for tp-relative offset
3466              // LE: shouldn't happen for global symbol
3467              case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
3468              case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
3469              case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
3470              case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
3471              case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
3472              case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
3473                {
3474                  if (opt_t == tls::TLSOPT_NONE) {
3475                    Output_data_got<size, big_endian> *got
3476                       = target->got_section(symtab, layout);
3477                    unsigned int r_sym
3478                       = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3479                    unsigned int shndx = lsym.get_st_shndx();
3480                    bool is_ordinary;
3481                    shndx = object->adjust_sym_shndx(r_sym, shndx,
3482                                                     &is_ordinary);
3483                    if (!is_ordinary)
3484                      object->error(_("local symbol %u has bad shndx %u"),
3485                                    r_sym, shndx);
3486                    else
3487                      got->add_local_pair_with_rel(object, r_sym, shndx,
3488                                            GOT_TYPE_TLS_PAIR,
3489                                            target->rela_dyn_section(layout),
3490                                            size == 32
3491                                            ? elfcpp::R_TILEGX_TLS_DTPMOD32
3492                                            : elfcpp::R_TILEGX_TLS_DTPMOD64);
3493                   } else if (opt_t == tls::TLSOPT_TO_IE) {
3494                     Output_data_got<size, big_endian>* got
3495                        = target->got_section(symtab, layout);
3496                     Reloc_section* rela_dyn
3497                        = target->rela_dyn_section(layout);
3498                     unsigned int r_sym
3499                        = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3500                     unsigned int off = got->add_constant(0);
3501                     object->set_local_got_offset(r_sym,
3502                                                  GOT_TYPE_TLS_OFFSET,off);
3503                     rela_dyn->add_symbolless_local_addend(object, r_sym,
3504                                             size == 32
3505                                             ? elfcpp::R_TILEGX_TLS_TPOFF32
3506                                             : elfcpp::R_TILEGX_TLS_TPOFF64,
3507                                             got, off, 0);
3508                   } else if (opt_t != tls::TLSOPT_TO_LE)
3509                     // only TO_LE is allowed for local symbol
3510                     unsupported_reloc_local(object, r_type);
3511                }
3512                break;
3513
3514              // IE
3515              case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
3516              case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
3517              case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
3518              case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
3519              case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
3520              case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
3521                {
3522                  layout->set_has_static_tls();
3523                  if (opt_t == tls::TLSOPT_NONE) {
3524                    Output_data_got<size, big_endian>* got
3525                       = target->got_section(symtab, layout);
3526                    Reloc_section* rela_dyn
3527                       = target->rela_dyn_section(layout);
3528                    unsigned int r_sym
3529                       = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3530                    unsigned int off = got->add_constant(0);
3531                    object->set_local_got_offset(r_sym,
3532                                                 GOT_TYPE_TLS_OFFSET, off);
3533                    rela_dyn->add_symbolless_local_addend(object, r_sym,
3534                                             size == 32
3535                                             ? elfcpp::R_TILEGX_TLS_TPOFF32
3536                                             : elfcpp::R_TILEGX_TLS_TPOFF64,
3537                                             got, off, 0);
3538                  } else if (opt_t != tls::TLSOPT_TO_LE)
3539                    unsupported_reloc_local(object, r_type);
3540                }
3541                break;
3542
3543              // LE
3544              case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
3545              case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
3546              case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
3547              case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
3548              case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
3549              case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
3550                layout->set_has_static_tls();
3551                if (parameters->options().shared()) {
3552                  // defer to dynamic linker
3553                  gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
3554                  unsigned int r_sym
3555                     = elfcpp::elf_r_sym<size>(reloc.get_r_info());
3556                  Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3557                  rela_dyn->add_symbolless_local_addend(object, r_sym, r_type,
3558                                                   output_section, data_shndx,
3559                                                   reloc.get_r_offset(), 0);
3560                }
3561                break;
3562
3563              default:
3564                gold_unreachable();
3565            }
3566       }
3567       break;
3568
3569     case elfcpp::R_TILEGX_COPY:
3570     case elfcpp::R_TILEGX_GLOB_DAT:
3571     case elfcpp::R_TILEGX_JMP_SLOT:
3572     case elfcpp::R_TILEGX_RELATIVE:
3573       // These are outstanding tls relocs, which are unexpected when linking
3574     case elfcpp::R_TILEGX_TLS_TPOFF32:
3575     case elfcpp::R_TILEGX_TLS_TPOFF64:
3576     case elfcpp::R_TILEGX_TLS_DTPMOD32:
3577     case elfcpp::R_TILEGX_TLS_DTPMOD64:
3578     case elfcpp::R_TILEGX_TLS_DTPOFF32:
3579     case elfcpp::R_TILEGX_TLS_DTPOFF64:
3580       gold_error(_("%s: unexpected reloc %u in object file"),
3581                  object->name().c_str(), r_type);
3582       break;
3583
3584     default:
3585       gold_error(_("%s: unsupported reloc %u against local symbol"),
3586                  object->name().c_str(), r_type);
3587       break;
3588     }
3589 }
3590
3591
3592 // Report an unsupported relocation against a global symbol.
3593
3594 template<int size, bool big_endian>
3595 void
3596 Target_tilegx<size, big_endian>::Scan::unsupported_reloc_global(
3597     Sized_relobj_file<size, big_endian>* object,
3598     unsigned int r_type,
3599     Symbol* gsym)
3600 {
3601   gold_error(_("%s: unsupported reloc %u against global symbol %s"),
3602              object->name().c_str(), r_type, gsym->demangled_name().c_str());
3603 }
3604
3605 // Returns true if this relocation type could be that of a function pointer.
3606 template<int size, bool big_endian>
3607 inline bool
3608 Target_tilegx<size, big_endian>::Scan::possible_function_pointer_reloc(
3609   unsigned int r_type)
3610 {
3611   switch (r_type)
3612     {
3613       case elfcpp::R_TILEGX_IMM16_X0_HW0:
3614       case elfcpp::R_TILEGX_IMM16_X1_HW0:
3615       case elfcpp::R_TILEGX_IMM16_X0_HW1:
3616       case elfcpp::R_TILEGX_IMM16_X1_HW1:
3617       case elfcpp::R_TILEGX_IMM16_X0_HW2:
3618       case elfcpp::R_TILEGX_IMM16_X1_HW2:
3619       case elfcpp::R_TILEGX_IMM16_X0_HW3:
3620       case elfcpp::R_TILEGX_IMM16_X1_HW3:
3621       case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST:
3622       case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST:
3623       case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST:
3624       case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST:
3625       case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST:
3626       case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST:
3627       case elfcpp::R_TILEGX_IMM16_X0_HW0_PCREL:
3628       case elfcpp::R_TILEGX_IMM16_X1_HW0_PCREL:
3629       case elfcpp::R_TILEGX_IMM16_X0_HW1_PCREL:
3630       case elfcpp::R_TILEGX_IMM16_X1_HW1_PCREL:
3631       case elfcpp::R_TILEGX_IMM16_X0_HW2_PCREL:
3632       case elfcpp::R_TILEGX_IMM16_X1_HW2_PCREL:
3633       case elfcpp::R_TILEGX_IMM16_X0_HW3_PCREL:
3634       case elfcpp::R_TILEGX_IMM16_X1_HW3_PCREL:
3635       case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
3636       case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
3637       case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
3638       case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
3639       case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
3640       case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
3641       case elfcpp::R_TILEGX_IMM16_X0_HW0_GOT:
3642       case elfcpp::R_TILEGX_IMM16_X1_HW0_GOT:
3643       case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_GOT:
3644       case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_GOT:
3645       case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_GOT:
3646       case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_GOT:
3647       {
3648         return true;
3649       }
3650     }
3651   return false;
3652 }
3653
3654 // For safe ICF, scan a relocation for a local symbol to check if it
3655 // corresponds to a function pointer being taken.  In that case mark
3656 // the function whose pointer was taken as not foldable.
3657
3658 template<int size, bool big_endian>
3659 inline bool
3660 Target_tilegx<size, big_endian>::Scan::local_reloc_may_be_function_pointer(
3661   Symbol_table* ,
3662   Layout* ,
3663   Target_tilegx<size, big_endian>* ,
3664   Sized_relobj_file<size, big_endian>* ,
3665   unsigned int ,
3666   Output_section* ,
3667   const elfcpp::Rela<size, big_endian>& ,
3668   unsigned int r_type,
3669   const elfcpp::Sym<size, big_endian>&)
3670 {
3671   return possible_function_pointer_reloc(r_type);
3672 }
3673
3674 // For safe ICF, scan a relocation for a global symbol to check if it
3675 // corresponds to a function pointer being taken.  In that case mark
3676 // the function whose pointer was taken as not foldable.
3677
3678 template<int size, bool big_endian>
3679 inline bool
3680 Target_tilegx<size, big_endian>::Scan::global_reloc_may_be_function_pointer(
3681   Symbol_table*,
3682   Layout* ,
3683   Target_tilegx<size, big_endian>* ,
3684   Sized_relobj_file<size, big_endian>* ,
3685   unsigned int ,
3686   Output_section* ,
3687   const elfcpp::Rela<size, big_endian>& ,
3688   unsigned int r_type,
3689   Symbol* gsym)
3690 {
3691   // GOT is not a function.
3692   if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
3693     return false;
3694
3695   // When building a shared library, do not fold symbols whose visibility
3696   // is hidden, internal or protected.
3697   return ((parameters->options().shared()
3698            && (gsym->visibility() == elfcpp::STV_INTERNAL
3699                || gsym->visibility() == elfcpp::STV_PROTECTED
3700                || gsym->visibility() == elfcpp::STV_HIDDEN))
3701           || possible_function_pointer_reloc(r_type));
3702 }
3703
3704 // Scan a relocation for a global symbol.
3705
3706 template<int size, bool big_endian>
3707 inline void
3708 Target_tilegx<size, big_endian>::Scan::global(Symbol_table* symtab,
3709                             Layout* layout,
3710                             Target_tilegx<size, big_endian>* target,
3711                             Sized_relobj_file<size, big_endian>* object,
3712                             unsigned int data_shndx,
3713                             Output_section* output_section,
3714                             const elfcpp::Rela<size, big_endian>& reloc,
3715                             unsigned int r_type,
3716                             Symbol* gsym)
3717 {
3718   // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
3719   // section.  We check here to avoid creating a dynamic reloc against
3720   // _GLOBAL_OFFSET_TABLE_.
3721   if (!target->has_got_section()
3722       && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
3723     target->got_section(symtab, layout);
3724
3725   // A STT_GNU_IFUNC symbol may require a PLT entry.
3726   if (gsym->type() == elfcpp::STT_GNU_IFUNC
3727       && this->reloc_needs_plt_for_ifunc(object, r_type))
3728     target->make_plt_entry(symtab, layout, gsym);
3729
3730   switch (r_type)
3731     {
3732     case elfcpp::R_TILEGX_NONE:
3733     case elfcpp::R_TILEGX_GNU_VTINHERIT:
3734     case elfcpp::R_TILEGX_GNU_VTENTRY:
3735       break;
3736
3737     case elfcpp::R_TILEGX_DEST_IMM8_X1:
3738     case elfcpp::R_TILEGX_IMM16_X0_HW0:
3739     case elfcpp::R_TILEGX_IMM16_X1_HW0:
3740     case elfcpp::R_TILEGX_IMM16_X0_HW1:
3741     case elfcpp::R_TILEGX_IMM16_X1_HW1:
3742     case elfcpp::R_TILEGX_IMM16_X0_HW2:
3743     case elfcpp::R_TILEGX_IMM16_X1_HW2:
3744     case elfcpp::R_TILEGX_IMM16_X0_HW3:
3745     case elfcpp::R_TILEGX_IMM16_X1_HW3:
3746     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST:
3747     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST:
3748     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST:
3749     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST:
3750     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST:
3751     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST:
3752     case elfcpp::R_TILEGX_64:
3753     case elfcpp::R_TILEGX_32:
3754     case elfcpp::R_TILEGX_16:
3755     case elfcpp::R_TILEGX_8:
3756       {
3757         // Make a PLT entry if necessary.
3758         if (gsym->needs_plt_entry())
3759           {
3760             target->make_plt_entry(symtab, layout, gsym);
3761             // Since this is not a PC-relative relocation, we may be
3762             // taking the address of a function. In that case we need to
3763             // set the entry in the dynamic symbol table to the address of
3764             // the PLT entry.
3765             if (gsym->is_from_dynobj() && !parameters->options().shared())
3766               gsym->set_needs_dynsym_value();
3767           }
3768         // Make a dynamic relocation if necessary.
3769         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
3770           {
3771             if (!parameters->options().output_is_position_independent()
3772                 && gsym->may_need_copy_reloc())
3773               {
3774                 target->copy_reloc(symtab, layout, object,
3775                                    data_shndx, output_section, gsym, reloc);
3776               }
3777             else if (((size == 64 && r_type == elfcpp::R_TILEGX_64)
3778                       || (size == 32 && r_type == elfcpp::R_TILEGX_32))
3779                      && gsym->type() == elfcpp::STT_GNU_IFUNC
3780                      && gsym->can_use_relative_reloc(false)
3781                      && !gsym->is_from_dynobj()
3782                      && !gsym->is_undefined()
3783                      && !gsym->is_preemptible())
3784               {
3785                 // Use an IRELATIVE reloc for a locally defined
3786                 // STT_GNU_IFUNC symbol.  This makes a function
3787                 // address in a PIE executable match the address in a
3788                 // shared library that it links against.
3789                 Reloc_section* rela_dyn =
3790                   target->rela_irelative_section(layout);
3791                 unsigned int r_type = elfcpp::R_TILEGX_IRELATIVE;
3792                 rela_dyn->add_symbolless_global_addend(gsym, r_type,
3793                                                    output_section, object,
3794                                                    data_shndx,
3795                                                    reloc.get_r_offset(),
3796                                                    reloc.get_r_addend());
3797               } else if ((r_type == elfcpp::R_TILEGX_64
3798                           || r_type == elfcpp::R_TILEGX_32)
3799                          && gsym->can_use_relative_reloc(false))
3800               {
3801                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3802                 rela_dyn->add_global_relative(gsym, elfcpp::R_TILEGX_RELATIVE,
3803                                               output_section, object,
3804                                               data_shndx,
3805                                               reloc.get_r_offset(),
3806                                               reloc.get_r_addend(), false);
3807               }
3808             else
3809               {
3810                 this->check_non_pic(object, r_type);
3811                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3812                 rela_dyn->add_global(gsym, r_type, output_section, object,
3813                                      data_shndx, reloc.get_r_offset(),
3814                                      reloc.get_r_addend());
3815               }
3816           }
3817       }
3818       break;
3819
3820     case elfcpp::R_TILEGX_BROFF_X1:
3821     case elfcpp::R_TILEGX_IMM16_X0_HW0_PCREL:
3822     case elfcpp::R_TILEGX_IMM16_X1_HW0_PCREL:
3823     case elfcpp::R_TILEGX_IMM16_X0_HW1_PCREL:
3824     case elfcpp::R_TILEGX_IMM16_X1_HW1_PCREL:
3825     case elfcpp::R_TILEGX_IMM16_X0_HW2_PCREL:
3826     case elfcpp::R_TILEGX_IMM16_X1_HW2_PCREL:
3827     case elfcpp::R_TILEGX_IMM16_X0_HW3_PCREL:
3828     case elfcpp::R_TILEGX_IMM16_X1_HW3_PCREL:
3829     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
3830     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
3831     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
3832     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
3833     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
3834     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
3835     case elfcpp::R_TILEGX_64_PCREL:
3836     case elfcpp::R_TILEGX_32_PCREL:
3837     case elfcpp::R_TILEGX_16_PCREL:
3838     case elfcpp::R_TILEGX_8_PCREL:
3839       {
3840         // Make a PLT entry if necessary.
3841         if (gsym->needs_plt_entry())
3842           target->make_plt_entry(symtab, layout, gsym);
3843         // Make a dynamic relocation if necessary.
3844         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
3845           {
3846             if (parameters->options().output_is_executable()
3847                 && gsym->may_need_copy_reloc())
3848               {
3849                 target->copy_reloc(symtab, layout, object,
3850                                    data_shndx, output_section, gsym, reloc);
3851               }
3852             else
3853               {
3854                 this->check_non_pic(object, r_type);
3855                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3856                 rela_dyn->add_global(gsym, r_type, output_section, object,
3857                                      data_shndx, reloc.get_r_offset(),
3858                                      reloc.get_r_addend());
3859               }
3860           }
3861       }
3862       break;
3863
3864     case elfcpp::R_TILEGX_IMM16_X0_HW0_GOT:
3865     case elfcpp::R_TILEGX_IMM16_X1_HW0_GOT:
3866     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_GOT:
3867     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_GOT:
3868     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_GOT:
3869     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_GOT:
3870       {
3871         // The symbol requires a GOT entry.
3872         Output_data_got<size, big_endian>* got
3873            = target->got_section(symtab, layout);
3874         if (gsym->final_value_is_known())
3875           {
3876             // For a STT_GNU_IFUNC symbol we want the PLT address.
3877             if (gsym->type() == elfcpp::STT_GNU_IFUNC)
3878               got->add_global_plt(gsym, GOT_TYPE_STANDARD);
3879             else
3880               got->add_global(gsym, GOT_TYPE_STANDARD);
3881           }
3882         else
3883           {
3884             // If this symbol is not fully resolved, we need to add a
3885             // dynamic relocation for it.
3886             Reloc_section* rela_dyn = target->rela_dyn_section(layout);
3887
3888             // Use a GLOB_DAT rather than a RELATIVE reloc if:
3889             //
3890             // 1) The symbol may be defined in some other module.
3891             //
3892             // 2) We are building a shared library and this is a
3893             // protected symbol; using GLOB_DAT means that the dynamic
3894             // linker can use the address of the PLT in the main
3895             // executable when appropriate so that function address
3896             // comparisons work.
3897             //
3898             // 3) This is a STT_GNU_IFUNC symbol in position dependent
3899             // code, again so that function address comparisons work.
3900             if (gsym->is_from_dynobj()
3901                 || gsym->is_undefined()
3902                 || gsym->is_preemptible()
3903                 || (gsym->visibility() == elfcpp::STV_PROTECTED
3904                     && parameters->options().shared())
3905                 || (gsym->type() == elfcpp::STT_GNU_IFUNC
3906                     && parameters->options().output_is_position_independent()))
3907               got->add_global_with_rel(gsym, GOT_TYPE_STANDARD, rela_dyn,
3908                                        elfcpp::R_TILEGX_GLOB_DAT);
3909             else
3910               {
3911                 // For a STT_GNU_IFUNC symbol we want to write the PLT
3912                 // offset into the GOT, so that function pointer
3913                 // comparisons work correctly.
3914                 bool is_new;
3915                 if (gsym->type() != elfcpp::STT_GNU_IFUNC)
3916                   is_new = got->add_global(gsym, GOT_TYPE_STANDARD);
3917                 else
3918                   {
3919                     is_new = got->add_global_plt(gsym, GOT_TYPE_STANDARD);
3920                     // Tell the dynamic linker to use the PLT address
3921                     // when resolving relocations.
3922                     if (gsym->is_from_dynobj()
3923                         && !parameters->options().shared())
3924                       gsym->set_needs_dynsym_value();
3925                   }
3926                 if (is_new)
3927                   {
3928                     unsigned int got_off = gsym->got_offset(GOT_TYPE_STANDARD);
3929                     rela_dyn->add_global_relative(gsym,
3930                                                   r_type,
3931                                                   got, got_off, 0, false);
3932                   }
3933               }
3934           }
3935       }
3936       break;
3937
3938     // a minor difference here for R_TILEGX_JUMPOFF_X1
3939     // between bfd linker and gold linker for gold, when
3940     // R_TILEGX_JUMPOFF_X1 against global symbol, we
3941     // turn it into JUMPOFF_X1_PLT, otherwise the distance
3942     // to the symbol function may overflow at runtime.
3943     case elfcpp::R_TILEGX_JUMPOFF_X1:
3944
3945     case elfcpp::R_TILEGX_JUMPOFF_X1_PLT:
3946     case elfcpp::R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
3947     case elfcpp::R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
3948     case elfcpp::R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
3949     case elfcpp::R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
3950     case elfcpp::R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
3951     case elfcpp::R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
3952     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
3953     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
3954     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
3955     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
3956     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
3957     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
3958       // If the symbol is fully resolved, this is just a PC32 reloc.
3959       // Otherwise we need a PLT entry.
3960       if (gsym->final_value_is_known())
3961         break;
3962       // If building a shared library, we can also skip the PLT entry
3963       // if the symbol is defined in the output file and is protected
3964       // or hidden.
3965       if (gsym->is_defined()
3966           && !gsym->is_from_dynobj()
3967           && !gsym->is_preemptible())
3968         break;
3969       target->make_plt_entry(symtab, layout, gsym);
3970       break;
3971
3972
3973     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
3974     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
3975     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
3976     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
3977     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
3978     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
3979     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
3980     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
3981     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
3982     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
3983     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
3984     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
3985     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
3986     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
3987     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
3988     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
3989     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
3990     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
3991     case elfcpp::R_TILEGX_TLS_GD_CALL:
3992     case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
3993     case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
3994     case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
3995     case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
3996     case elfcpp::R_TILEGX_TLS_IE_LOAD:
3997     case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
3998     case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
3999     case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
4000     case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
4001       {
4002          const bool is_final = gsym->final_value_is_known();
4003          const tls::Tls_optimization opt_t =
4004           Target_tilegx<size, big_endian>::optimize_tls_reloc(is_final,
4005                                                               r_type);
4006
4007          switch (r_type)
4008            {
4009               // only expand to plt against __tls_get_addr in GD model
4010               case elfcpp::R_TILEGX_TLS_GD_CALL:
4011                 if (opt_t == tls::TLSOPT_NONE) {
4012                   // FIXME:  it's better '__tls_get_addr' referenced explictly
4013                   if (!target->tls_get_addr_sym_defined_) {
4014                     Symbol* sym = NULL;
4015                     options::parse_set(NULL, "__tls_get_addr",
4016                                        (gold::options::String_set*)
4017                                        &parameters->options().undefined());
4018                     symtab->add_undefined_symbols_from_command_line(layout);
4019                     target->tls_get_addr_sym_defined_ = true;
4020                     sym = symtab->lookup("__tls_get_addr");
4021                     sym->set_in_reg();
4022                   }
4023                   target->make_plt_entry(symtab, layout,
4024                                          symtab->lookup("__tls_get_addr"));
4025                 }
4026                 break;
4027
4028               // only make effect when applying relocation
4029               case elfcpp::R_TILEGX_TLS_IE_LOAD:
4030               case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
4031               case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
4032               case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
4033               case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
4034               case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
4035               case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
4036               case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
4037               case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
4038                 break;
4039
4040               // GD: requires two GOT entry for module index and offset
4041               // IE: requires one GOT entry for tp-relative offset
4042               // LE: shouldn't happen for global symbol
4043               case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
4044               case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
4045               case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
4046               case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
4047               case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
4048               case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
4049                 {
4050                   if (opt_t == tls::TLSOPT_NONE) {
4051                       Output_data_got<size, big_endian>* got
4052                         = target->got_section(symtab, layout);
4053                       got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
4054                                              target->rela_dyn_section(layout),
4055                                              size == 32
4056                                            ? elfcpp::R_TILEGX_TLS_DTPMOD32
4057                                            : elfcpp::R_TILEGX_TLS_DTPMOD64,
4058                                              size == 32
4059                                            ? elfcpp::R_TILEGX_TLS_DTPOFF32
4060                                            : elfcpp::R_TILEGX_TLS_DTPOFF64);
4061                   } else if (opt_t == tls::TLSOPT_TO_IE) {
4062                     // Create a GOT entry for the tp-relative offset.
4063                     Output_data_got<size, big_endian>* got
4064                        = target->got_section(symtab, layout);
4065                     got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
4066                                            target->rela_dyn_section(layout),
4067                                            size == 32
4068                                            ? elfcpp::R_TILEGX_TLS_TPOFF32
4069                                            : elfcpp::R_TILEGX_TLS_TPOFF64);
4070                   } else if (opt_t != tls::TLSOPT_TO_LE)
4071                     // exteranl symbol should not be optimized to TO_LE
4072                     unsupported_reloc_global(object, r_type, gsym);
4073                 }
4074                 break;
4075
4076               // IE
4077               case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
4078               case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
4079               case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
4080               case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
4081               case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
4082               case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
4083                 {
4084                     layout->set_has_static_tls();
4085                   if (opt_t == tls::TLSOPT_NONE) {
4086                     // Create a GOT entry for the tp-relative offset.
4087                     Output_data_got<size, big_endian>* got
4088                        = target->got_section(symtab, layout);
4089                     got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
4090                                            target->rela_dyn_section(layout),
4091                                            size == 32
4092                                            ? elfcpp::R_TILEGX_TLS_TPOFF32
4093                                            : elfcpp::R_TILEGX_TLS_TPOFF64);
4094                   } else if (opt_t != tls::TLSOPT_TO_LE)
4095                     unsupported_reloc_global(object, r_type, gsym);
4096                 }
4097                 break;
4098
4099               // LE
4100               case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
4101               case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
4102               case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
4103               case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
4104               case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
4105               case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
4106                   layout->set_has_static_tls();
4107                 if (parameters->options().shared()) {
4108                   // defer to dynamic linker
4109                   Reloc_section* rela_dyn = target->rela_dyn_section(layout);
4110                   rela_dyn->add_symbolless_global_addend(gsym, r_type,
4111                                                       output_section, object,
4112                                                       data_shndx,
4113                                                       reloc.get_r_offset(), 0);
4114                   }
4115                 break;
4116
4117               default:
4118                 gold_unreachable();
4119            }
4120       }
4121       break;
4122
4123     // below are outstanding relocs
4124     // should not existed in static linking stage
4125     case elfcpp::R_TILEGX_COPY:
4126     case elfcpp::R_TILEGX_GLOB_DAT:
4127     case elfcpp::R_TILEGX_JMP_SLOT:
4128     case elfcpp::R_TILEGX_RELATIVE:
4129     case elfcpp::R_TILEGX_TLS_TPOFF32:
4130     case elfcpp::R_TILEGX_TLS_TPOFF64:
4131     case elfcpp::R_TILEGX_TLS_DTPMOD32:
4132     case elfcpp::R_TILEGX_TLS_DTPMOD64:
4133     case elfcpp::R_TILEGX_TLS_DTPOFF32:
4134     case elfcpp::R_TILEGX_TLS_DTPOFF64:
4135       gold_error(_("%s: unexpected reloc %u in object file"),
4136                  object->name().c_str(), r_type);
4137       break;
4138
4139     default:
4140       gold_error(_("%s: unsupported reloc %u against global symbol %s"),
4141                  object->name().c_str(), r_type,
4142                  gsym->demangled_name().c_str());
4143       break;
4144     }
4145 }
4146
4147 template<int size, bool big_endian>
4148 void
4149 Target_tilegx<size, big_endian>::gc_process_relocs(Symbol_table* symtab,
4150                                   Layout* layout,
4151                                   Sized_relobj_file<size, big_endian>* object,
4152                                   unsigned int data_shndx,
4153                                   unsigned int sh_type,
4154                                   const unsigned char* prelocs,
4155                                   size_t reloc_count,
4156                                   Output_section* output_section,
4157                                   bool needs_special_offset_handling,
4158                                   size_t local_symbol_count,
4159                                   const unsigned char* plocal_symbols)
4160 {
4161   typedef Target_tilegx<size, big_endian> Tilegx;
4162   typedef typename Target_tilegx<size, big_endian>::Scan Scan;
4163   typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian>
4164       Classify_reloc;
4165
4166   if (sh_type == elfcpp::SHT_REL)
4167     {
4168       return;
4169     }
4170
4171    gold::gc_process_relocs<size, big_endian, Tilegx, Scan, Classify_reloc>(
4172      symtab,
4173      layout,
4174      this,
4175      object,
4176      data_shndx,
4177      prelocs,
4178      reloc_count,
4179      output_section,
4180      needs_special_offset_handling,
4181      local_symbol_count,
4182      plocal_symbols);
4183 }
4184 // Scan relocations for a section.
4185
4186 template<int size, bool big_endian>
4187 void
4188 Target_tilegx<size, big_endian>::scan_relocs(Symbol_table* symtab,
4189                                  Layout* layout,
4190                                  Sized_relobj_file<size, big_endian>* object,
4191                                  unsigned int data_shndx,
4192                                  unsigned int sh_type,
4193                                  const unsigned char* prelocs,
4194                                  size_t reloc_count,
4195                                  Output_section* output_section,
4196                                  bool needs_special_offset_handling,
4197                                  size_t local_symbol_count,
4198                                  const unsigned char* plocal_symbols)
4199 {
4200   typedef Target_tilegx<size, big_endian> Tilegx;
4201   typedef typename Target_tilegx<size, big_endian>::Scan Scan;
4202   typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian>
4203       Classify_reloc;
4204
4205   if (sh_type == elfcpp::SHT_REL)
4206     {
4207       gold_error(_("%s: unsupported REL reloc section"),
4208                  object->name().c_str());
4209       return;
4210     }
4211
4212   gold::scan_relocs<size, big_endian, Tilegx, Scan, Classify_reloc>(
4213     symtab,
4214     layout,
4215     this,
4216     object,
4217     data_shndx,
4218     prelocs,
4219     reloc_count,
4220     output_section,
4221     needs_special_offset_handling,
4222     local_symbol_count,
4223     plocal_symbols);
4224 }
4225
4226 template<int size, bool big_endian>
4227 void
4228 Target_tilegx<size, big_endian>::do_define_standard_symbols(
4229     Symbol_table* symtab,
4230     Layout* layout)
4231 {
4232   Output_section* feedback_section = layout->find_output_section(".feedback");
4233
4234   if (feedback_section != NULL)
4235     {
4236       symtab->define_in_output_data("__feedback_section_end",
4237                     NULL,
4238                     Symbol_table::PREDEFINED,
4239                     feedback_section,
4240                     0,
4241                     0,
4242                     elfcpp::STT_NOTYPE,
4243                     elfcpp::STB_GLOBAL,
4244                     elfcpp::STV_HIDDEN,
4245                     0,
4246                     true, // offset_is_from_end
4247                     false);
4248     }
4249 }
4250
4251 // Finalize the sections.
4252
4253 template<int size, bool big_endian>
4254 void
4255 Target_tilegx<size, big_endian>::do_finalize_sections(
4256     Layout* layout,
4257     const Input_objects*,
4258     Symbol_table* symtab)
4259 {
4260   const Reloc_section* rel_plt = (this->plt_ == NULL
4261                                   ? NULL
4262                                   : this->plt_->rela_plt());
4263   layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt,
4264                                   this->rela_dyn_, true, true);
4265
4266   // Emit any relocs we saved in an attempt to avoid generating COPY
4267   // relocs.
4268   if (this->copy_relocs_.any_saved_relocs())
4269     this->copy_relocs_.emit(this->rela_dyn_section(layout));
4270
4271   // Set the size of the _GLOBAL_OFFSET_TABLE_ symbol to the size of
4272   // the .got section.
4273   Symbol* sym = this->global_offset_table_;
4274   if (sym != NULL)
4275     {
4276       uint64_t data_size = this->got_->current_data_size();
4277       symtab->get_sized_symbol<size>(sym)->set_symsize(data_size);
4278
4279       // If the .got section is more than 0x8000 bytes, we add
4280       // 0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16
4281       // bit relocations have a greater chance of working.
4282       if (data_size >= 0x8000)
4283         symtab->get_sized_symbol<size>(sym)->set_value(
4284           symtab->get_sized_symbol<size>(sym)->value() + 0x8000);
4285     }
4286
4287   if (parameters->doing_static_link()
4288       && (this->plt_ == NULL || !this->plt_->has_irelative_section()))
4289     {
4290       // If linking statically, make sure that the __rela_iplt symbols
4291       // were defined if necessary, even if we didn't create a PLT.
4292       static const Define_symbol_in_segment syms[] =
4293         {
4294           {
4295             "__rela_iplt_start",        // name
4296             elfcpp::PT_LOAD,            // segment_type
4297             elfcpp::PF_W,               // segment_flags_set
4298             elfcpp::PF(0),              // segment_flags_clear
4299             0,                          // value
4300             0,                          // size
4301             elfcpp::STT_NOTYPE,         // type
4302             elfcpp::STB_GLOBAL,         // binding
4303             elfcpp::STV_HIDDEN,         // visibility
4304             0,                          // nonvis
4305             Symbol::SEGMENT_START,      // offset_from_base
4306             true                        // only_if_ref
4307           },
4308           {
4309             "__rela_iplt_end",          // name
4310             elfcpp::PT_LOAD,            // segment_type
4311             elfcpp::PF_W,               // segment_flags_set
4312             elfcpp::PF(0),              // segment_flags_clear
4313             0,                          // value
4314             0,                          // size
4315             elfcpp::STT_NOTYPE,         // type
4316             elfcpp::STB_GLOBAL,         // binding
4317             elfcpp::STV_HIDDEN,         // visibility
4318             0,                          // nonvis
4319             Symbol::SEGMENT_START,      // offset_from_base
4320             true                        // only_if_ref
4321           }
4322         };
4323
4324       symtab->define_symbols(layout, 2, syms,
4325                              layout->script_options()->saw_sections_clause());
4326     }
4327 }
4328
4329 // Perform a relocation.
4330
4331 template<int size, bool big_endian>
4332 inline bool
4333 Target_tilegx<size, big_endian>::Relocate::relocate(
4334     const Relocate_info<size, big_endian>* relinfo,
4335     unsigned int,
4336     Target_tilegx<size, big_endian>* target,
4337     Output_section*,
4338     size_t relnum,
4339     const unsigned char* preloc,
4340     const Sized_symbol<size>* gsym,
4341     const Symbol_value<size>* psymval,
4342     unsigned char* view,
4343     typename elfcpp::Elf_types<size>::Elf_Addr address,
4344     section_size_type)
4345 {
4346   if (view == NULL)
4347     return true;
4348
4349   typedef Tilegx_relocate_functions<size, big_endian> TilegxReloc;
4350   typename TilegxReloc::Tilegx_howto r_howto;
4351
4352   const elfcpp::Rela<size, big_endian> rela(preloc);
4353   unsigned int r_type = elfcpp::elf_r_type<size>(rela.get_r_info());
4354   const Sized_relobj_file<size, big_endian>* object = relinfo->object;
4355
4356   // Pick the value to use for symbols defined in the PLT.
4357   Symbol_value<size> symval;
4358   if (gsym != NULL
4359       && gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
4360     {
4361       symval.set_output_value(target->plt_address_for_global(gsym));
4362       psymval = &symval;
4363     }
4364   else if (gsym == NULL && psymval->is_ifunc_symbol())
4365     {
4366       unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info());
4367       if (object->local_has_plt_offset(r_sym))
4368         {
4369           symval.set_output_value(target->plt_address_for_local(object, r_sym));
4370           psymval = &symval;
4371         }
4372     }
4373
4374   elfcpp::Elf_Xword addend = rela.get_r_addend();
4375
4376   // Get the GOT offset if needed.
4377   // For tilegx, the GOT pointer points to the start of the GOT section.
4378   bool have_got_offset = false;
4379   int got_offset = 0;
4380   int got_base = target->got_ != NULL
4381                  ? target->got_->current_data_size() >= 0x8000 ? 0x8000 : 0
4382                  : 0;
4383   unsigned int got_type = GOT_TYPE_STANDARD;
4384   bool always_apply_relocation = false;
4385   switch (r_type)
4386     {
4387     case elfcpp::R_TILEGX_IMM16_X0_HW0_GOT:
4388     case elfcpp::R_TILEGX_IMM16_X1_HW0_GOT:
4389     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_GOT:
4390     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_GOT:
4391     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_GOT:
4392     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_GOT:
4393       if (gsym != NULL)
4394         {
4395           gold_assert(gsym->has_got_offset(got_type));
4396           got_offset = gsym->got_offset(got_type) - got_base;
4397         }
4398       else
4399         {
4400           unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info());
4401           gold_assert(object->local_has_got_offset(r_sym, got_type));
4402           got_offset =
4403             object->local_got_offset(r_sym, got_type) - got_base;
4404         }
4405       have_got_offset = true;
4406       break;
4407
4408     default:
4409       break;
4410     }
4411
4412   r_howto = TilegxReloc::howto[r_type];
4413   switch (r_type)
4414     {
4415     case elfcpp::R_TILEGX_NONE:
4416     case elfcpp::R_TILEGX_GNU_VTINHERIT:
4417     case elfcpp::R_TILEGX_GNU_VTENTRY:
4418       break;
4419
4420     case elfcpp::R_TILEGX_IMM16_X0_HW0_GOT:
4421     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_GOT:
4422     case elfcpp::R_TILEGX_IMM16_X1_HW0_GOT:
4423     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_GOT:
4424     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_GOT:
4425     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_GOT:
4426       gold_assert(have_got_offset);
4427       symval.set_output_value(got_offset);
4428       psymval = &symval;
4429       always_apply_relocation = true;
4430       addend = 0;
4431
4432     // when under PIC mode, these relocations are deferred to rtld
4433     case elfcpp::R_TILEGX_IMM16_X0_HW0:
4434     case elfcpp::R_TILEGX_IMM16_X1_HW0:
4435     case elfcpp::R_TILEGX_IMM16_X0_HW1:
4436     case elfcpp::R_TILEGX_IMM16_X1_HW1:
4437     case elfcpp::R_TILEGX_IMM16_X0_HW2:
4438     case elfcpp::R_TILEGX_IMM16_X1_HW2:
4439     case elfcpp::R_TILEGX_IMM16_X0_HW3:
4440     case elfcpp::R_TILEGX_IMM16_X1_HW3:
4441     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST:
4442     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST:
4443     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST:
4444     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST:
4445     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST:
4446     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST:
4447       if (always_apply_relocation
4448           || !parameters->options().output_is_position_independent())
4449         TilegxReloc::imm_x_general(view, object, psymval, addend, r_howto);
4450       break;
4451
4452     case elfcpp::R_TILEGX_JUMPOFF_X1:
4453     case elfcpp::R_TILEGX_JUMPOFF_X1_PLT:
4454       gold_assert(gsym == NULL
4455                   || gsym->has_plt_offset()
4456                   || gsym->final_value_is_known()
4457                   || (gsym->is_defined()
4458                       && !gsym->is_from_dynobj()
4459                       && !gsym->is_preemptible()));
4460       TilegxReloc::imm_x_pcrel_general(view, object, psymval, addend,
4461                                        address, r_howto);
4462       break;
4463
4464
4465     case elfcpp::R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
4466     case elfcpp::R_TILEGX_IMM16_X0_HW0_PCREL:
4467     case elfcpp::R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
4468     case elfcpp::R_TILEGX_IMM16_X1_HW0_PCREL:
4469     case elfcpp::R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
4470     case elfcpp::R_TILEGX_IMM16_X0_HW1_PCREL:
4471     case elfcpp::R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
4472     case elfcpp::R_TILEGX_IMM16_X1_HW1_PCREL:
4473     case elfcpp::R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
4474     case elfcpp::R_TILEGX_IMM16_X0_HW2_PCREL:
4475     case elfcpp::R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
4476     case elfcpp::R_TILEGX_IMM16_X1_HW2_PCREL:
4477     case elfcpp::R_TILEGX_IMM16_X0_HW3_PCREL:
4478     case elfcpp::R_TILEGX_IMM16_X1_HW3_PCREL:
4479     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
4480     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
4481     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
4482     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
4483     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
4484     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
4485     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
4486     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
4487     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
4488     case elfcpp::R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
4489     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
4490     case elfcpp::R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
4491       TilegxReloc::imm_x_pcrel_general(view, object, psymval, addend,
4492                                        address, r_howto);
4493       break;
4494
4495     case elfcpp::R_TILEGX_BROFF_X1:
4496     case elfcpp::R_TILEGX_DEST_IMM8_X1:
4497       TilegxReloc::imm_x_two_part_general(view, object, psymval,
4498                                           addend, address, r_type);
4499       break;
4500
4501
4502     // below are general relocation types, which can be
4503     // handled by target-independent handlers
4504     case elfcpp::R_TILEGX_64:
4505       TilegxReloc::abs64(view, object, psymval, addend);
4506       break;
4507
4508     case elfcpp::R_TILEGX_64_PCREL:
4509       TilegxReloc::pc_abs64(view, object, psymval, addend, address);
4510       break;
4511
4512     case elfcpp::R_TILEGX_32:
4513       TilegxReloc::abs32(view, object, psymval, addend);
4514       break;
4515
4516     case elfcpp::R_TILEGX_32_PCREL:
4517       TilegxReloc::pc_abs32(view, object, psymval, addend, address);
4518       break;
4519
4520     case elfcpp::R_TILEGX_16:
4521       TilegxReloc::abs16(view, object, psymval, addend);
4522       break;
4523
4524     case elfcpp::R_TILEGX_16_PCREL:
4525       TilegxReloc::pc_abs16(view, object, psymval, addend, address);
4526       break;
4527
4528     case elfcpp::R_TILEGX_8:
4529       Relocate_functions<size, big_endian>::rela8(view, object,
4530                                                   psymval, addend);
4531       break;
4532
4533     case elfcpp::R_TILEGX_8_PCREL:
4534       Relocate_functions<size, big_endian>::pcrela8(view, object,
4535                                                     psymval, addend, address);
4536       break;
4537
4538     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
4539     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
4540     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
4541     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
4542     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
4543     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
4544     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
4545     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
4546     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
4547     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
4548     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
4549     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
4550     case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
4551     case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
4552     case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
4553     case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
4554     case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
4555     case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
4556     case elfcpp::R_TILEGX_TLS_GD_CALL:
4557     case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
4558     case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
4559     case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
4560     case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
4561     case elfcpp::R_TILEGX_TLS_IE_LOAD:
4562     case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
4563     case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
4564     case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
4565     case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
4566       {
4567         const bool is_final = (gsym == NULL
4568                                ? !parameters->options().shared()
4569                                : gsym->final_value_is_known());
4570         tls::Tls_optimization opt_t =
4571           Target_tilegx<size, big_endian>::optimize_tls_reloc(is_final,
4572                                                               r_type);
4573
4574         switch (r_type)
4575           {
4576
4577             case elfcpp::R_TILEGX_TLS_GD_CALL:
4578               {
4579                 if (opt_t == tls::TLSOPT_NONE) {
4580                   Symbol *tls_sym = relinfo->symtab->lookup("__tls_get_addr");
4581                   symval.set_output_value(
4582                     target->plt_address_for_global(tls_sym));
4583                   psymval = &symval;
4584                   TilegxReloc::imm_x_pcrel_general(view, object, psymval,
4585                                                    addend, address, r_howto);
4586                 }
4587                 else if (opt_t == tls::TLSOPT_TO_IE
4588                          || opt_t == tls::TLSOPT_TO_LE)
4589                   TilegxReloc::tls_relax(view, r_type, opt_t);
4590               }
4591               break;
4592
4593             // XX_TLS_GD is the same as normal X_GOT relocation
4594             // except allocating a got entry pair,
4595             case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_GD:
4596             case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_GD:
4597             case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
4598             case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
4599             case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
4600             case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
4601               if (opt_t == tls::TLSOPT_NONE) {
4602                 got_type = GOT_TYPE_TLS_PAIR;
4603                 have_got_offset = true;
4604               } else if (opt_t == tls::TLSOPT_TO_IE) {
4605                 got_type = GOT_TYPE_TLS_OFFSET;
4606                 have_got_offset = true;
4607               }
4608               goto do_update_value;
4609             // XX_TLS_IE is the same as normal X_GOT relocation
4610             // except allocating one additional runtime relocation
4611             case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_IE:
4612             case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_IE:
4613             case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
4614             case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
4615             case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
4616             case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
4617               if (opt_t == tls::TLSOPT_NONE) {
4618                 got_type = GOT_TYPE_TLS_OFFSET;
4619                 have_got_offset = true;
4620               }
4621             do_update_value:
4622               if (have_got_offset) {
4623                 if (gsym != NULL) {
4624                   gold_assert(gsym->has_got_offset(got_type));
4625                   got_offset = gsym->got_offset(got_type) - got_base;
4626                 } else {
4627                   unsigned int r_sym
4628                      = elfcpp::elf_r_sym<size>(rela.get_r_info());
4629                   gold_assert(object->local_has_got_offset(r_sym, got_type));
4630                   got_offset =
4631                     object->local_got_offset(r_sym, got_type) - got_base;
4632                 }
4633               }
4634
4635               if (opt_t == tls::TLSOPT_NONE
4636                   || opt_t == tls::TLSOPT_TO_IE) {
4637                 // for both GD/IE, these relocations
4638                 // actually calculate got offset, so
4639                 // there behavior are the same
4640                 gold_assert(have_got_offset);
4641                 symval.set_output_value(got_offset);
4642                 psymval = &symval;
4643                 addend = 0;
4644                 TilegxReloc::imm_x_general(view, object, psymval,
4645                                            addend, r_howto);
4646                 break;
4647               } // else if (opt_t == tls::TLSOPT_TO_LE)
4648                 //   both GD/IE are turned into LE, which
4649                 //   is absolute relocation.
4650                 //
4651                 //  |  go through
4652                 //  |
4653                 //  V
4654             // LE
4655             //
4656             // tp
4657             // |
4658             // V
4659             //  t_var1 | t_var2 | t_var3 | ...
4660             //  --------------------------------------------------
4661             //
4662             //  so offset to tp should be negative, we get offset
4663             //  from the following formular for LE
4664             //
4665             //    t_var1_off = t_var1_sym_value - tls_section_start
4666             //
4667             case elfcpp::R_TILEGX_IMM16_X0_HW0_TLS_LE:
4668             case elfcpp::R_TILEGX_IMM16_X1_HW0_TLS_LE:
4669             case elfcpp::R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
4670             case elfcpp::R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
4671             case elfcpp::R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
4672             case elfcpp::R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
4673               {
4674                 Output_segment *tls_segment = relinfo->layout->tls_segment();
4675                 if (tls_segment == NULL) {
4676                   gold_assert(parameters->errors()->error_count() > 0
4677                               || issue_undefined_symbol_error(gsym));
4678                   return false;
4679                 }
4680
4681                 typename elfcpp::Elf_types<size>::Elf_Addr value
4682                   = psymval->value(relinfo->object, 0);
4683                 symval.set_output_value(value);
4684                 psymval = &symval;
4685                 TilegxReloc::imm_x_general(view, object, psymval,
4686                                            addend, r_howto);
4687               }
4688               break;
4689
4690             // tls relaxation
4691             case elfcpp::R_TILEGX_TLS_IE_LOAD:
4692             case elfcpp::R_TILEGX_IMM8_X0_TLS_ADD:
4693             case elfcpp::R_TILEGX_IMM8_X1_TLS_ADD:
4694             case elfcpp::R_TILEGX_IMM8_Y0_TLS_ADD:
4695             case elfcpp::R_TILEGX_IMM8_Y1_TLS_ADD:
4696             case elfcpp::R_TILEGX_IMM8_X0_TLS_GD_ADD:
4697             case elfcpp::R_TILEGX_IMM8_X1_TLS_GD_ADD:
4698             case elfcpp::R_TILEGX_IMM8_Y0_TLS_GD_ADD:
4699             case elfcpp::R_TILEGX_IMM8_Y1_TLS_GD_ADD:
4700               TilegxReloc::tls_relax(view, r_type, opt_t);
4701               break;
4702
4703             default:
4704               gold_unreachable();
4705           }
4706       }
4707       break;
4708
4709     // below are outstanding relocs
4710     // should not existed in static linking stage
4711     case elfcpp::R_TILEGX_COPY:
4712     case elfcpp::R_TILEGX_GLOB_DAT:
4713     case elfcpp::R_TILEGX_JMP_SLOT:
4714     case elfcpp::R_TILEGX_RELATIVE:
4715     case elfcpp::R_TILEGX_TLS_TPOFF32:
4716     case elfcpp::R_TILEGX_TLS_TPOFF64:
4717     case elfcpp::R_TILEGX_TLS_DTPMOD32:
4718     case elfcpp::R_TILEGX_TLS_DTPMOD64:
4719     case elfcpp::R_TILEGX_TLS_DTPOFF32:
4720     case elfcpp::R_TILEGX_TLS_DTPOFF64:
4721       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
4722                              _("unexpected reloc %u in object file"),
4723                              r_type);
4724       break;
4725
4726     default:
4727       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
4728                              _("unsupported reloc %u"),
4729                              r_type);
4730       break;
4731     }
4732
4733   return true;
4734 }
4735
4736 // Relocate section data.
4737
4738 template<int size, bool big_endian>
4739 void
4740 Target_tilegx<size, big_endian>::relocate_section(
4741     const Relocate_info<size, big_endian>* relinfo,
4742     unsigned int sh_type,
4743     const unsigned char* prelocs,
4744     size_t reloc_count,
4745     Output_section* output_section,
4746     bool needs_special_offset_handling,
4747     unsigned char* view,
4748     typename elfcpp::Elf_types<size>::Elf_Addr address,
4749     section_size_type view_size,
4750     const Reloc_symbol_changes* reloc_symbol_changes)
4751 {
4752   typedef Target_tilegx<size, big_endian> Tilegx;
4753   typedef typename Target_tilegx<size, big_endian>::Relocate Tilegx_relocate;
4754   typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian>
4755       Classify_reloc;
4756
4757   gold_assert(sh_type == elfcpp::SHT_RELA);
4758
4759   gold::relocate_section<size, big_endian, Tilegx, Tilegx_relocate,
4760                          gold::Default_comdat_behavior, Classify_reloc>(
4761     relinfo,
4762     this,
4763     prelocs,
4764     reloc_count,
4765     output_section,
4766     needs_special_offset_handling,
4767     view,
4768     address,
4769     view_size,
4770     reloc_symbol_changes);
4771 }
4772
4773 // Apply an incremental relocation.  Incremental relocations always refer
4774 // to global symbols.
4775
4776 template<int size, bool big_endian>
4777 void
4778 Target_tilegx<size, big_endian>::apply_relocation(
4779     const Relocate_info<size, big_endian>* relinfo,
4780     typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
4781     unsigned int r_type,
4782     typename elfcpp::Elf_types<size>::Elf_Swxword r_addend,
4783     const Symbol* gsym,
4784     unsigned char* view,
4785     typename elfcpp::Elf_types<size>::Elf_Addr address,
4786     section_size_type view_size)
4787 {
4788   gold::apply_relocation<size, big_endian, Target_tilegx<size, big_endian>,
4789                          typename Target_tilegx<size, big_endian>::Relocate>(
4790     relinfo,
4791     this,
4792     r_offset,
4793     r_type,
4794     r_addend,
4795     gsym,
4796     view,
4797     address,
4798     view_size);
4799 }
4800
4801 // Scan the relocs during a relocatable link.
4802
4803 template<int size, bool big_endian>
4804 void
4805 Target_tilegx<size, big_endian>::scan_relocatable_relocs(
4806     Symbol_table* symtab,
4807     Layout* layout,
4808     Sized_relobj_file<size, big_endian>* object,
4809     unsigned int data_shndx,
4810     unsigned int sh_type,
4811     const unsigned char* prelocs,
4812     size_t reloc_count,
4813     Output_section* output_section,
4814     bool needs_special_offset_handling,
4815     size_t local_symbol_count,
4816     const unsigned char* plocal_symbols,
4817     Relocatable_relocs* rr)
4818 {
4819   typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian>
4820       Classify_reloc;
4821   typedef gold::Default_scan_relocatable_relocs<Classify_reloc>
4822       Scan_relocatable_relocs;
4823
4824   gold_assert(sh_type == elfcpp::SHT_RELA);
4825
4826   gold::scan_relocatable_relocs<size, big_endian, Scan_relocatable_relocs>(
4827     symtab,
4828     layout,
4829     object,
4830     data_shndx,
4831     prelocs,
4832     reloc_count,
4833     output_section,
4834     needs_special_offset_handling,
4835     local_symbol_count,
4836     plocal_symbols,
4837     rr);
4838 }
4839
4840 // Scan the relocs for --emit-relocs.
4841
4842 template<int size, bool big_endian>
4843 void
4844 Target_tilegx<size, big_endian>::emit_relocs_scan(
4845     Symbol_table* symtab,
4846     Layout* layout,
4847     Sized_relobj_file<size, big_endian>* object,
4848     unsigned int data_shndx,
4849     unsigned int sh_type,
4850     const unsigned char* prelocs,
4851     size_t reloc_count,
4852     Output_section* output_section,
4853     bool needs_special_offset_handling,
4854     size_t local_symbol_count,
4855     const unsigned char* plocal_syms,
4856     Relocatable_relocs* rr)
4857 {
4858   typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian>
4859       Classify_reloc;
4860   typedef gold::Default_emit_relocs_strategy<Classify_reloc>
4861       Emit_relocs_strategy;
4862
4863   gold_assert(sh_type == elfcpp::SHT_RELA);
4864
4865   gold::scan_relocatable_relocs<size, big_endian, Emit_relocs_strategy>(
4866     symtab,
4867     layout,
4868     object,
4869     data_shndx,
4870     prelocs,
4871     reloc_count,
4872     output_section,
4873     needs_special_offset_handling,
4874     local_symbol_count,
4875     plocal_syms,
4876     rr);
4877 }
4878
4879 // Relocate a section during a relocatable link.
4880
4881 template<int size, bool big_endian>
4882 void
4883 Target_tilegx<size, big_endian>::relocate_relocs(
4884     const Relocate_info<size, big_endian>* relinfo,
4885     unsigned int sh_type,
4886     const unsigned char* prelocs,
4887     size_t reloc_count,
4888     Output_section* output_section,
4889     typename elfcpp::Elf_types<size>::Elf_Off offset_in_output_section,
4890     unsigned char* view,
4891     typename elfcpp::Elf_types<size>::Elf_Addr view_address,
4892     section_size_type view_size,
4893     unsigned char* reloc_view,
4894     section_size_type reloc_view_size)
4895 {
4896   typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian>
4897       Classify_reloc;
4898
4899   gold_assert(sh_type == elfcpp::SHT_RELA);
4900
4901   gold::relocate_relocs<size, big_endian, Classify_reloc>(
4902     relinfo,
4903     prelocs,
4904     reloc_count,
4905     output_section,
4906     offset_in_output_section,
4907     view,
4908     view_address,
4909     view_size,
4910     reloc_view,
4911     reloc_view_size);
4912 }
4913
4914 // Return the value to use for a dynamic which requires special
4915 // treatment.  This is how we support equality comparisons of function
4916 // pointers across shared library boundaries, as described in the
4917 // processor specific ABI supplement.
4918
4919 template<int size, bool big_endian>
4920 uint64_t
4921 Target_tilegx<size, big_endian>::do_dynsym_value(const Symbol* gsym) const
4922 {
4923   gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
4924   return this->plt_address_for_global(gsym);
4925 }
4926
4927 // Return the value to use for the base of a DW_EH_PE_datarel offset
4928 // in an FDE.  Solaris and SVR4 use DW_EH_PE_datarel because their
4929 // assembler can not write out the difference between two labels in
4930 // different sections, so instead of using a pc-relative value they
4931 // use an offset from the GOT.
4932
4933 template<int size, bool big_endian>
4934 uint64_t
4935 Target_tilegx<size, big_endian>::do_ehframe_datarel_base() const
4936 {
4937   gold_assert(this->global_offset_table_ != NULL);
4938   Symbol* sym = this->global_offset_table_;
4939   Sized_symbol<size>* ssym = static_cast<Sized_symbol<size>*>(sym);
4940   return ssym->value();
4941 }
4942
4943 // The selector for tilegx object files.
4944
4945 template<int size, bool big_endian>
4946 class Target_selector_tilegx : public Target_selector
4947 {
4948 public:
4949   Target_selector_tilegx()
4950     : Target_selector(elfcpp::EM_TILEGX, size, big_endian,
4951                       (size == 64
4952                        ? (big_endian ? "elf64-tilegx-be" : "elf64-tilegx-le")
4953                           : (big_endian ? "elf32-tilegx-be"
4954                                            : "elf32-tilegx-le")),
4955                       (size == 64
4956                        ? (big_endian ? "elf64tilegx_be" : "elf64tilegx")
4957                           : (big_endian ? "elf32tilegx_be" : "elf32tilegx")))
4958   { }
4959
4960   Target*
4961   do_instantiate_target()
4962   { return new Target_tilegx<size, big_endian>(); }
4963
4964 };
4965
4966 Target_selector_tilegx<64, false> target_selector_tilegx64_le;
4967 Target_selector_tilegx<32, false> target_selector_tilegx32_le;
4968 Target_selector_tilegx<64, true> target_selector_tilegx64_be;
4969 Target_selector_tilegx<32, true> target_selector_tilegx32_be;
4970 } // End anonymous namespace.