Merge branch 'vendor/DIALOG'
[dragonfly.git] / contrib / binutils-2.24 / gold / reloc.h
1 // reloc.h -- relocate input files for gold   -*- C++ -*-
2
3 // Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
4 // Free Software Foundation, Inc.
5 // Written by Ian Lance Taylor <iant@google.com>.
6
7 // This file is part of gold.
8
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 3 of the License, or
12 // (at your option) any later version.
13
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 // GNU General Public License for more details.
18
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 // MA 02110-1301, USA.
23
24 #ifndef GOLD_RELOC_H
25 #define GOLD_RELOC_H
26
27 #include <vector>
28 #ifdef HAVE_BYTESWAP_H
29 #include <byteswap.h>
30 #endif
31
32 #include "elfcpp.h"
33 #include "workqueue.h"
34
35 namespace gold
36 {
37
38 class General_options;
39 class Object;
40 class Relobj;
41 struct Read_relocs_data;
42 class Symbol;
43 class Layout;
44 class Output_data;
45 class Output_section;
46
47 template<int size>
48 class Sized_symbol;
49
50 template<int size, bool big_endian>
51 class Sized_relobj_file;
52
53 template<int size>
54 class Symbol_value;
55
56 template<int sh_type, bool dynamic, int size, bool big_endian>
57 class Output_data_reloc;
58
59 // A class to read the relocations for an object file, and then queue
60 // up a task to see if they require any GOT/PLT/COPY relocations in
61 // the symbol table.
62
63 class Read_relocs : public Task
64 {
65  public:
66   //   THIS_BLOCKER and NEXT_BLOCKER are passed along to a Scan_relocs
67   // or Gc_process_relocs task, so that they run in a deterministic
68   // order.
69   Read_relocs(Symbol_table* symtab, Layout* layout, Relobj* object,
70               Task_token* this_blocker, Task_token* next_blocker)
71     : symtab_(symtab), layout_(layout), object_(object),
72       this_blocker_(this_blocker), next_blocker_(next_blocker)
73   { }
74
75   // The standard Task methods.
76
77   Task_token*
78   is_runnable();
79
80   void
81   locks(Task_locker*);
82
83   void
84   run(Workqueue*);
85
86   std::string
87   get_name() const;
88
89  private:
90   Symbol_table* symtab_;
91   Layout* layout_;
92   Relobj* object_;
93   Task_token* this_blocker_;
94   Task_token* next_blocker_;
95 };
96
97 // Process the relocs to figure out which sections are garbage.
98 // Very similar to scan relocs.
99
100 class Gc_process_relocs : public Task
101 {
102  public:
103   // THIS_BLOCKER prevents this task from running until the previous
104   // one is finished.  NEXT_BLOCKER prevents the next task from
105   // running.
106   Gc_process_relocs(Symbol_table* symtab, Layout* layout, Relobj* object,
107                     Read_relocs_data* rd, Task_token* this_blocker,
108                     Task_token* next_blocker)
109     : symtab_(symtab), layout_(layout), object_(object), rd_(rd),
110       this_blocker_(this_blocker), next_blocker_(next_blocker)
111   { }
112
113   ~Gc_process_relocs();
114
115   // The standard Task methods.
116
117   Task_token*
118   is_runnable();
119
120   void
121   locks(Task_locker*);
122
123   void
124   run(Workqueue*);
125
126   std::string
127   get_name() const;
128
129  private:
130   Symbol_table* symtab_;
131   Layout* layout_;
132   Relobj* object_;
133   Read_relocs_data* rd_;
134   Task_token* this_blocker_;
135   Task_token* next_blocker_;
136 };
137
138 // Scan the relocations for an object to see if they require any
139 // GOT/PLT/COPY relocations.
140
141 class Scan_relocs : public Task
142 {
143  public:
144   // THIS_BLOCKER prevents this task from running until the previous
145   // one is finished.  NEXT_BLOCKER prevents the next task from
146   // running.
147   Scan_relocs(Symbol_table* symtab, Layout* layout, Relobj* object,
148               Read_relocs_data* rd, Task_token* this_blocker,
149               Task_token* next_blocker)
150     : symtab_(symtab), layout_(layout), object_(object), rd_(rd),
151       this_blocker_(this_blocker), next_blocker_(next_blocker)
152   { }
153
154   ~Scan_relocs();
155
156   // The standard Task methods.
157
158   Task_token*
159   is_runnable();
160
161   void
162   locks(Task_locker*);
163
164   void
165   run(Workqueue*);
166
167   std::string
168   get_name() const;
169
170  private:
171   Symbol_table* symtab_;
172   Layout* layout_;
173   Relobj* object_;
174   Read_relocs_data* rd_;
175   Task_token* this_blocker_;
176   Task_token* next_blocker_;
177 };
178
179 // A class to perform all the relocations for an object file.
180
181 class Relocate_task : public Task
182 {
183  public:
184   Relocate_task(const Symbol_table* symtab, const Layout* layout,
185                 Relobj* object, Output_file* of,
186                 Task_token* input_sections_blocker,
187                 Task_token* output_sections_blocker, Task_token* final_blocker)
188     : symtab_(symtab), layout_(layout), object_(object), of_(of),
189       input_sections_blocker_(input_sections_blocker),
190       output_sections_blocker_(output_sections_blocker),
191       final_blocker_(final_blocker)
192   { }
193
194   // The standard Task methods.
195
196   Task_token*
197   is_runnable();
198
199   void
200   locks(Task_locker*);
201
202   void
203   run(Workqueue*);
204
205   std::string
206   get_name() const;
207
208  private:
209   const Symbol_table* symtab_;
210   const Layout* layout_;
211   Relobj* object_;
212   Output_file* of_;
213   Task_token* input_sections_blocker_;
214   Task_token* output_sections_blocker_;
215   Task_token* final_blocker_;
216 };
217
218 // During a relocatable link, this class records how relocations
219 // should be handled for a single input reloc section.  An instance of
220 // this class is created while scanning relocs, and it is used while
221 // processing relocs.
222
223 class Relocatable_relocs
224 {
225  public:
226   // We use a vector of unsigned char to indicate how the input relocs
227   // should be handled.  Each element is one of the following values.
228   // We create this vector when we initially scan the relocations.
229   enum Reloc_strategy
230   {
231     // Copy the input reloc.  Don't modify it other than updating the
232     // r_offset field and the r_sym part of the r_info field.
233     RELOC_COPY,
234     // Copy the input reloc which is against an STT_SECTION symbol.
235     // Update the r_offset and r_sym part of the r_info field.  Adjust
236     // the addend by subtracting the value of the old local symbol and
237     // adding the value of the new local symbol.  The addend is in the
238     // SHT_RELA reloc and the contents of the data section do not need
239     // to be changed.
240     RELOC_ADJUST_FOR_SECTION_RELA,
241     // Like RELOC_ADJUST_FOR_SECTION_RELA but the addend should not be
242     // adjusted.
243     RELOC_ADJUST_FOR_SECTION_0,
244     // Like RELOC_ADJUST_FOR_SECTION_RELA but the contents of the
245     // section need to be changed.  The number indicates the number of
246     // bytes in the addend in the section contents.
247     RELOC_ADJUST_FOR_SECTION_1,
248     RELOC_ADJUST_FOR_SECTION_2,
249     RELOC_ADJUST_FOR_SECTION_4,
250     RELOC_ADJUST_FOR_SECTION_8,
251     // Like RELOC_ADJUST_FOR_SECTION_4 but for unaligned relocs.
252     RELOC_ADJUST_FOR_SECTION_4_UNALIGNED,
253     // Discard the input reloc--process it completely when relocating
254     // the data section contents.
255     RELOC_DISCARD,
256     // An input reloc which is not discarded, but which requires
257     // target specific processing in order to update it.
258     RELOC_SPECIAL
259   };
260
261   Relocatable_relocs()
262     : reloc_strategies_(), output_reloc_count_(0), posd_(NULL)
263   { }
264
265   // Record the number of relocs.
266   void
267   set_reloc_count(size_t reloc_count)
268   { this->reloc_strategies_.reserve(reloc_count); }
269
270   // Record what to do for the next reloc.
271   void
272   set_next_reloc_strategy(Reloc_strategy strategy)
273   {
274     this->reloc_strategies_.push_back(static_cast<unsigned char>(strategy));
275     if (strategy != RELOC_DISCARD)
276       ++this->output_reloc_count_;
277   }
278
279   // Record the Output_data associated with this reloc section.
280   void
281   set_output_data(Output_data* posd)
282   {
283     gold_assert(this->posd_ == NULL);
284     this->posd_ = posd;
285   }
286
287   // Return the Output_data associated with this reloc section.
288   Output_data*
289   output_data() const
290   { return this->posd_; }
291
292   // Return what to do for reloc I.
293   Reloc_strategy
294   strategy(unsigned int i) const
295   {
296     gold_assert(i < this->reloc_strategies_.size());
297     return static_cast<Reloc_strategy>(this->reloc_strategies_[i]);
298   }
299
300   // Return the number of relocations to create in the output file.
301   size_t
302   output_reloc_count() const
303   { return this->output_reloc_count_; }
304
305  private:
306   typedef std::vector<unsigned char> Reloc_strategies;
307
308   // The strategies for the input reloc.  There is one entry in this
309   // vector for each relocation in the input section.
310   Reloc_strategies reloc_strategies_;
311   // The number of relocations to be created in the output file.
312   size_t output_reloc_count_;
313   // The output data structure associated with this relocation.
314   Output_data* posd_;
315 };
316
317 // Standard relocation routines which are used on many targets.  Here
318 // SIZE and BIG_ENDIAN refer to the target, not the relocation type.
319
320 template<int size, bool big_endian>
321 class Relocate_functions
322 {
323 private:
324   // Do a simple relocation with the addend in the section contents.
325   // VALSIZE is the size of the value.
326   template<int valsize>
327   static inline void
328   rel(unsigned char* view,
329       typename elfcpp::Swap<valsize, big_endian>::Valtype value)
330   {
331     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
332     Valtype* wv = reinterpret_cast<Valtype*>(view);
333     Valtype x = elfcpp::Swap<valsize, big_endian>::readval(wv);
334     elfcpp::Swap<valsize, big_endian>::writeval(wv, x + value);
335   }
336
337   // Like the above but for relocs at unaligned addresses.
338   template<int valsize>
339   static inline void
340   rel_unaligned(unsigned char* view,
341                 typename elfcpp::Swap<valsize, big_endian>::Valtype value)
342   {
343     typedef typename elfcpp::Swap_unaligned<valsize, big_endian>::Valtype
344         Valtype;
345     Valtype x = elfcpp::Swap_unaligned<valsize, big_endian>::readval(view);
346     elfcpp::Swap_unaligned<valsize, big_endian>::writeval(view, x + value);
347   }
348
349   // Do a simple relocation using a Symbol_value with the addend in
350   // the section contents.  VALSIZE is the size of the value to
351   // relocate.
352   template<int valsize>
353   static inline void
354   rel(unsigned char* view,
355       const Sized_relobj_file<size, big_endian>* object,
356       const Symbol_value<size>* psymval)
357   {
358     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
359     Valtype* wv = reinterpret_cast<Valtype*>(view);
360     Valtype x = elfcpp::Swap<valsize, big_endian>::readval(wv);
361     x = psymval->value(object, x);
362     elfcpp::Swap<valsize, big_endian>::writeval(wv, x);
363   }
364
365   // Like the above but for relocs at unaligned addresses.
366   template<int valsize>
367   static inline void
368   rel_unaligned(unsigned char* view,
369                 const Sized_relobj_file<size, big_endian>* object,
370                 const Symbol_value<size>* psymval)
371   {
372     typedef typename elfcpp::Swap_unaligned<valsize, big_endian>::Valtype
373         Valtype;
374     Valtype x = elfcpp::Swap_unaligned<valsize, big_endian>::readval(view);
375     x = psymval->value(object, x);
376     elfcpp::Swap_unaligned<valsize, big_endian>::writeval(view, x);
377   }
378
379   // Do a simple relocation with the addend in the relocation.
380   // VALSIZE is the size of the value.
381   template<int valsize>
382   static inline void
383   rela(unsigned char* view,
384        typename elfcpp::Swap<valsize, big_endian>::Valtype value,
385        typename elfcpp::Swap<valsize, big_endian>::Valtype addend)
386   {
387     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
388     Valtype* wv = reinterpret_cast<Valtype*>(view);
389     elfcpp::Swap<valsize, big_endian>::writeval(wv, value + addend);
390   }
391
392   // Do a simple relocation using a symbol value with the addend in
393   // the relocation.  VALSIZE is the size of the value.
394   template<int valsize>
395   static inline void
396   rela(unsigned char* view,
397        const Sized_relobj_file<size, big_endian>* object,
398        const Symbol_value<size>* psymval,
399        typename elfcpp::Swap<valsize, big_endian>::Valtype addend)
400   {
401     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
402     Valtype* wv = reinterpret_cast<Valtype*>(view);
403     Valtype x = psymval->value(object, addend);
404     elfcpp::Swap<valsize, big_endian>::writeval(wv, x);
405   }
406
407   // Do a simple PC relative relocation with the addend in the section
408   // contents.  VALSIZE is the size of the value.
409   template<int valsize>
410   static inline void
411   pcrel(unsigned char* view,
412         typename elfcpp::Swap<valsize, big_endian>::Valtype value,
413         typename elfcpp::Elf_types<size>::Elf_Addr address)
414   {
415     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
416     Valtype* wv = reinterpret_cast<Valtype*>(view);
417     Valtype x = elfcpp::Swap<valsize, big_endian>::readval(wv);
418     elfcpp::Swap<valsize, big_endian>::writeval(wv, x + value - address);
419   }
420
421   // Like the above but for relocs at unaligned addresses.
422   template<int valsize>
423   static inline void
424   pcrel_unaligned(unsigned char* view,
425                   typename elfcpp::Swap<valsize, big_endian>::Valtype value,
426                   typename elfcpp::Elf_types<size>::Elf_Addr address)
427   {
428     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
429     Valtype x = elfcpp::Swap_unaligned<valsize, big_endian>::readval(view);
430     elfcpp::Swap_unaligned<valsize, big_endian>::writeval(view,
431                                                           x + value - address);
432   }
433
434   // Do a simple PC relative relocation with a Symbol_value with the
435   // addend in the section contents.  VALSIZE is the size of the
436   // value.
437   template<int valsize>
438   static inline void
439   pcrel(unsigned char* view,
440         const Sized_relobj_file<size, big_endian>* object,
441         const Symbol_value<size>* psymval,
442         typename elfcpp::Elf_types<size>::Elf_Addr address)
443   {
444     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
445     Valtype* wv = reinterpret_cast<Valtype*>(view);
446     Valtype x = elfcpp::Swap<valsize, big_endian>::readval(wv);
447     x = psymval->value(object, x);
448     elfcpp::Swap<valsize, big_endian>::writeval(wv, x - address);
449   }
450
451   // Do a simple PC relative relocation with the addend in the
452   // relocation.  VALSIZE is the size of the value.
453   template<int valsize>
454   static inline void
455   pcrela(unsigned char* view,
456          typename elfcpp::Swap<valsize, big_endian>::Valtype value,
457          typename elfcpp::Swap<valsize, big_endian>::Valtype addend,
458          typename elfcpp::Elf_types<size>::Elf_Addr address)
459   {
460     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
461     Valtype* wv = reinterpret_cast<Valtype*>(view);
462     elfcpp::Swap<valsize, big_endian>::writeval(wv, value + addend - address);
463   }
464
465   // Do a simple PC relative relocation with a Symbol_value with the
466   // addend in the relocation.  VALSIZE is the size of the value.
467   template<int valsize>
468   static inline void
469   pcrela(unsigned char* view,
470          const Sized_relobj_file<size, big_endian>* object,
471          const Symbol_value<size>* psymval,
472          typename elfcpp::Swap<valsize, big_endian>::Valtype addend,
473          typename elfcpp::Elf_types<size>::Elf_Addr address)
474   {
475     typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype;
476     Valtype* wv = reinterpret_cast<Valtype*>(view);
477     Valtype x = psymval->value(object, addend);
478     elfcpp::Swap<valsize, big_endian>::writeval(wv, x - address);
479   }
480
481   typedef Relocate_functions<size, big_endian> This;
482
483 public:
484   // Do a simple 8-bit REL relocation with the addend in the section
485   // contents.
486   static inline void
487   rel8(unsigned char* view, unsigned char value)
488   { This::template rel<8>(view, value); }
489
490   static inline void
491   rel8(unsigned char* view,
492        const Sized_relobj_file<size, big_endian>* object,
493        const Symbol_value<size>* psymval)
494   { This::template rel<8>(view, object, psymval); }
495
496   // Do an 8-bit RELA relocation with the addend in the relocation.
497   static inline void
498   rela8(unsigned char* view, unsigned char value, unsigned char addend)
499   { This::template rela<8>(view, value, addend); }
500
501   static inline void
502   rela8(unsigned char* view,
503         const Sized_relobj_file<size, big_endian>* object,
504         const Symbol_value<size>* psymval,
505         unsigned char addend)
506   { This::template rela<8>(view, object, psymval, addend); }
507
508   // Do a simple 8-bit PC relative relocation with the addend in the
509   // section contents.
510   static inline void
511   pcrel8(unsigned char* view, unsigned char value,
512          typename elfcpp::Elf_types<size>::Elf_Addr address)
513   { This::template pcrel<8>(view, value, address); }
514
515   static inline void
516   pcrel8(unsigned char* view,
517          const Sized_relobj_file<size, big_endian>* object,
518          const Symbol_value<size>* psymval,
519          typename elfcpp::Elf_types<size>::Elf_Addr address)
520   { This::template pcrel<8>(view, object, psymval, address); }
521
522   // Do a simple 8-bit PC relative RELA relocation with the addend in
523   // the reloc.
524   static inline void
525   pcrela8(unsigned char* view, unsigned char value, unsigned char addend,
526           typename elfcpp::Elf_types<size>::Elf_Addr address)
527   { This::template pcrela<8>(view, value, addend, address); }
528
529   static inline void
530   pcrela8(unsigned char* view,
531           const Sized_relobj_file<size, big_endian>* object,
532           const Symbol_value<size>* psymval,
533           unsigned char addend,
534           typename elfcpp::Elf_types<size>::Elf_Addr address)
535   { This::template pcrela<8>(view, object, psymval, addend, address); }
536
537   // Do a simple 16-bit REL relocation with the addend in the section
538   // contents.
539   static inline void
540   rel16(unsigned char* view, elfcpp::Elf_Half value)
541   { This::template rel<16>(view, value); }
542
543   static inline void
544   rel16(unsigned char* view,
545         const Sized_relobj_file<size, big_endian>* object,
546         const Symbol_value<size>* psymval)
547   { This::template rel<16>(view, object, psymval); }
548
549   // Do an 16-bit RELA relocation with the addend in the relocation.
550   static inline void
551   rela16(unsigned char* view, elfcpp::Elf_Half value, elfcpp::Elf_Half addend)
552   { This::template rela<16>(view, value, addend); }
553
554   static inline void
555   rela16(unsigned char* view,
556          const Sized_relobj_file<size, big_endian>* object,
557          const Symbol_value<size>* psymval,
558          elfcpp::Elf_Half addend)
559   { This::template rela<16>(view, object, psymval, addend); }
560
561   // Do a simple 16-bit PC relative REL relocation with the addend in
562   // the section contents.
563   static inline void
564   pcrel16(unsigned char* view, elfcpp::Elf_Half value,
565           typename elfcpp::Elf_types<size>::Elf_Addr address)
566   { This::template pcrel<16>(view, value, address); }
567
568   static inline void
569   pcrel16(unsigned char* view,
570           const Sized_relobj_file<size, big_endian>* object,
571           const Symbol_value<size>* psymval,
572           typename elfcpp::Elf_types<size>::Elf_Addr address)
573   { This::template pcrel<16>(view, object, psymval, address); }
574
575   // Do a simple 16-bit PC relative RELA relocation with the addend in
576   // the reloc.
577   static inline void
578   pcrela16(unsigned char* view, elfcpp::Elf_Half value,
579            elfcpp::Elf_Half addend,
580            typename elfcpp::Elf_types<size>::Elf_Addr address)
581   { This::template pcrela<16>(view, value, addend, address); }
582
583   static inline void
584   pcrela16(unsigned char* view,
585            const Sized_relobj_file<size, big_endian>* object,
586            const Symbol_value<size>* psymval,
587            elfcpp::Elf_Half addend,
588            typename elfcpp::Elf_types<size>::Elf_Addr address)
589   { This::template pcrela<16>(view, object, psymval, addend, address); }
590
591   // Do a simple 32-bit REL relocation with the addend in the section
592   // contents.
593   static inline void
594   rel32(unsigned char* view, elfcpp::Elf_Word value)
595   { This::template rel<32>(view, value); }
596
597   // Like above but for relocs at unaligned addresses.
598   static inline void
599   rel32_unaligned(unsigned char* view, elfcpp::Elf_Word value)
600   { This::template rel_unaligned<32>(view, value); }
601
602   static inline void
603   rel32(unsigned char* view,
604         const Sized_relobj_file<size, big_endian>* object,
605         const Symbol_value<size>* psymval)
606   { This::template rel<32>(view, object, psymval); }
607
608   // Like above but for relocs at unaligned addresses.
609   static inline void
610   rel32_unaligned(unsigned char* view,
611                   const Sized_relobj_file<size, big_endian>* object,
612                   const Symbol_value<size>* psymval)
613   { This::template rel_unaligned<32>(view, object, psymval); }
614
615   // Do an 32-bit RELA relocation with the addend in the relocation.
616   static inline void
617   rela32(unsigned char* view, elfcpp::Elf_Word value, elfcpp::Elf_Word addend)
618   { This::template rela<32>(view, value, addend); }
619
620   static inline void
621   rela32(unsigned char* view,
622          const Sized_relobj_file<size, big_endian>* object,
623          const Symbol_value<size>* psymval,
624          elfcpp::Elf_Word addend)
625   { This::template rela<32>(view, object, psymval, addend); }
626
627   // Do a simple 32-bit PC relative REL relocation with the addend in
628   // the section contents.
629   static inline void
630   pcrel32(unsigned char* view, elfcpp::Elf_Word value,
631           typename elfcpp::Elf_types<size>::Elf_Addr address)
632   { This::template pcrel<32>(view, value, address); }
633
634   // Unaligned version of the above.
635   static inline void
636   pcrel32_unaligned(unsigned char* view, elfcpp::Elf_Word value,
637                     typename elfcpp::Elf_types<size>::Elf_Addr address)
638   { This::template pcrel_unaligned<32>(view, value, address); }
639
640   static inline void
641   pcrel32(unsigned char* view,
642           const Sized_relobj_file<size, big_endian>* object,
643           const Symbol_value<size>* psymval,
644           typename elfcpp::Elf_types<size>::Elf_Addr address)
645   { This::template pcrel<32>(view, object, psymval, address); }
646
647   // Do a simple 32-bit PC relative RELA relocation with the addend in
648   // the relocation.
649   static inline void
650   pcrela32(unsigned char* view, elfcpp::Elf_Word value,
651            elfcpp::Elf_Word addend,
652            typename elfcpp::Elf_types<size>::Elf_Addr address)
653   { This::template pcrela<32>(view, value, addend, address); }
654
655   static inline void
656   pcrela32(unsigned char* view,
657            const Sized_relobj_file<size, big_endian>* object,
658            const Symbol_value<size>* psymval,
659            elfcpp::Elf_Word addend,
660            typename elfcpp::Elf_types<size>::Elf_Addr address)
661   { This::template pcrela<32>(view, object, psymval, addend, address); }
662
663   // Do a simple 64-bit REL relocation with the addend in the section
664   // contents.
665   static inline void
666   rel64(unsigned char* view, elfcpp::Elf_Xword value)
667   { This::template rel<64>(view, value); }
668
669   static inline void
670   rel64(unsigned char* view,
671         const Sized_relobj_file<size, big_endian>* object,
672         const Symbol_value<size>* psymval)
673   { This::template rel<64>(view, object, psymval); }
674
675   // Do a 64-bit RELA relocation with the addend in the relocation.
676   static inline void
677   rela64(unsigned char* view, elfcpp::Elf_Xword value,
678          elfcpp::Elf_Xword addend)
679   { This::template rela<64>(view, value, addend); }
680
681   static inline void
682   rela64(unsigned char* view,
683          const Sized_relobj_file<size, big_endian>* object,
684          const Symbol_value<size>* psymval,
685          elfcpp::Elf_Xword addend)
686   { This::template rela<64>(view, object, psymval, addend); }
687
688   // Do a simple 64-bit PC relative REL relocation with the addend in
689   // the section contents.
690   static inline void
691   pcrel64(unsigned char* view, elfcpp::Elf_Xword value,
692           typename elfcpp::Elf_types<size>::Elf_Addr address)
693   { This::template pcrel<64>(view, value, address); }
694
695   static inline void
696   pcrel64(unsigned char* view,
697           const Sized_relobj_file<size, big_endian>* object,
698           const Symbol_value<size>* psymval,
699           typename elfcpp::Elf_types<size>::Elf_Addr address)
700   { This::template pcrel<64>(view, object, psymval, address); }
701
702   // Do a simple 64-bit PC relative RELA relocation with the addend in
703   // the relocation.
704   static inline void
705   pcrela64(unsigned char* view, elfcpp::Elf_Xword value,
706            elfcpp::Elf_Xword addend,
707            typename elfcpp::Elf_types<size>::Elf_Addr address)
708   { This::template pcrela<64>(view, value, addend, address); }
709
710   static inline void
711   pcrela64(unsigned char* view,
712            const Sized_relobj_file<size, big_endian>* object,
713            const Symbol_value<size>* psymval,
714            elfcpp::Elf_Xword addend,
715            typename elfcpp::Elf_types<size>::Elf_Addr address)
716   { This::template pcrela<64>(view, object, psymval, addend, address); }
717 };
718
719 // Integer manipulation functions used by various targets when
720 // performing relocations.
721
722 template<int bits>
723 class Bits
724 {
725  public:
726   // Sign extend an n-bit unsigned integer stored in a uint32_t into
727   // an int32_t.  BITS must be between 1 and 32.
728   static inline int32_t
729   sign_extend32(uint32_t val)
730   {
731     gold_assert(bits > 0 && bits <= 32);
732     if (bits == 32)
733       return static_cast<int32_t>(val);
734     uint32_t mask = (~static_cast<uint32_t>(0)) >> (32 - bits);
735     val &= mask;
736     uint32_t top_bit = 1U << (bits - 1);
737     int32_t as_signed = static_cast<int32_t>(val);
738     if ((val & top_bit) != 0)
739       as_signed -= static_cast<int32_t>(top_bit * 2);
740     return as_signed;    
741   }
742
743   // Return true if VAL (stored in a uint32_t) has overflowed a signed
744   // value with BITS bits.
745   static inline bool
746   has_overflow32(uint32_t val)
747   {
748     gold_assert(bits > 0 && bits <= 32);
749     if (bits == 32)
750       return false;
751     int32_t max = (1 << (bits - 1)) - 1;
752     int32_t min = -(1 << (bits - 1));
753     int32_t as_signed = static_cast<int32_t>(val);
754     return as_signed > max || as_signed < min;
755   }
756
757   // Return true if VAL (stored in a uint32_t) has overflowed both a
758   // signed and an unsigned value.  E.g.,
759   // Bits<8>::has_signed_unsigned_overflow32 would check -128 <= VAL <
760   // 255.
761   static inline bool
762   has_signed_unsigned_overflow32(uint32_t val)
763   {
764     gold_assert(bits > 0 && bits <= 32);
765     if (bits == 32)
766       return false;
767     int32_t max = static_cast<int32_t>((1U << bits) - 1);
768     int32_t min = -(1 << (bits - 1));
769     int32_t as_signed = static_cast<int32_t>(val);
770     return as_signed > max || as_signed < min;
771   }
772
773   // Select bits from A and B using bits in MASK.  For each n in
774   // [0..31], the n-th bit in the result is chosen from the n-th bits
775   // of A and B.  A zero selects A and a one selects B.
776   static inline uint32_t
777   bit_select32(uint32_t a, uint32_t b, uint32_t mask)
778   { return (a & ~mask) | (b & mask); }
779
780   // Sign extend an n-bit unsigned integer stored in a uint64_t into
781   // an int64_t.  BITS must be between 1 and 64.
782   static inline int64_t
783   sign_extend(uint64_t val)
784   {
785     gold_assert(bits > 0 && bits <= 64);
786     if (bits == 64)
787       return static_cast<int64_t>(val);
788     uint64_t mask = (~static_cast<uint64_t>(0)) >> (64 - bits);
789     val &= mask;
790     uint64_t top_bit = static_cast<uint64_t>(1) << (bits - 1);
791     int64_t as_signed = static_cast<int64_t>(val);
792     if ((val & top_bit) != 0)
793       as_signed -= static_cast<int64_t>(top_bit * 2);
794     return as_signed;    
795   }
796
797   // Return true if VAL (stored in a uint64_t) has overflowed a signed
798   // value with BITS bits.
799   static inline bool
800   has_overflow(uint64_t val)
801   {
802     gold_assert(bits > 0 && bits <= 64);
803     if (bits == 64)
804       return false;
805     int64_t max = (static_cast<int64_t>(1) << (bits - 1)) - 1;
806     int64_t min = -(static_cast<int64_t>(1) << (bits - 1));
807     int64_t as_signed = static_cast<int64_t>(val);
808     return as_signed > max || as_signed < min;
809   }
810
811   // Return true if VAL (stored in a uint64_t) has overflowed both a
812   // signed and an unsigned value.  E.g.,
813   // Bits<8>::has_signed_unsigned_overflow would check -128 <= VAL <
814   // 255.
815   static inline bool
816   has_signed_unsigned_overflow64(uint64_t val)
817   {
818     gold_assert(bits > 0 && bits <= 64);
819     if (bits == 64)
820       return false;
821     int64_t max = static_cast<int64_t>((static_cast<uint64_t>(1) << bits) - 1);
822     int64_t min = -(static_cast<int64_t>(1) << (bits - 1));
823     int64_t as_signed = static_cast<int64_t>(val);
824     return as_signed > max || as_signed < min;
825   }
826
827   // Select bits from A and B using bits in MASK.  For each n in
828   // [0..31], the n-th bit in the result is chosen from the n-th bits
829   // of A and B.  A zero selects A and a one selects B.
830   static inline uint64_t
831   bit_select64(uint64_t a, uint64_t b, uint64_t mask)
832   { return (a & ~mask) | (b & mask); }
833 };
834
835 // Track relocations while reading a section.  This lets you ask for
836 // the relocation at a certain offset, and see how relocs occur
837 // between points of interest.
838
839 template<int size, bool big_endian>
840 class Track_relocs
841 {
842  public:
843   Track_relocs()
844     : prelocs_(NULL), len_(0), pos_(0), reloc_size_(0)
845   { }
846
847   // Initialize the Track_relocs object.  OBJECT is the object holding
848   // the reloc section, RELOC_SHNDX is the section index of the reloc
849   // section, and RELOC_TYPE is the type of the reloc section
850   // (elfcpp::SHT_REL or elfcpp::SHT_RELA).  This returns false if
851   // something went wrong.
852   bool
853   initialize(Object* object, unsigned int reloc_shndx,
854              unsigned int reloc_type);
855
856   // Return the offset in the data section to which the next reloc
857   // applies.  This returns -1 if there is no next reloc.
858   off_t
859   next_offset() const;
860
861   // Return the symbol index of the next reloc.  This returns -1U if
862   // there is no next reloc.
863   unsigned int
864   next_symndx() const;
865
866   // Return the addend of the next reloc.  This returns 0 if there is
867   // no next reloc.
868   uint64_t
869   next_addend() const;
870
871   // Advance to OFFSET within the data section, and return the number
872   // of relocs which would be skipped.
873   int
874   advance(off_t offset);
875
876   // Checkpoint the current position in the reloc section.
877   section_size_type
878   checkpoint() const
879   { return this->pos_; }
880
881   // Reset the position to CHECKPOINT.
882   void
883   reset(section_size_type checkpoint)
884   { this->pos_ = checkpoint; }
885
886  private:
887   // The contents of the input object's reloc section.
888   const unsigned char* prelocs_;
889   // The length of the reloc section.
890   section_size_type len_;
891   // Our current position in the reloc section.
892   section_size_type pos_;
893   // The size of the relocs in the section.
894   int reloc_size_;
895 };
896
897 } // End namespace gold.
898
899 #endif // !defined(GOLD_RELOC_H)